aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2016-12-28 15:35:07 +0100
committerGitHub <noreply@github.com>2016-12-28 15:35:07 +0100
commit973406f327ceb488d4fa269b57d1e4f342e59d2c (patch)
tree142f7777a79de03845ff715237d8164ffd5ca325
parent8185cf27243a7c982ff4c3151045b3d494396740 (diff)
parenteab360a02b13b0dcc659546ddde383cc5a5b88bb (diff)
downloadmitmproxy-973406f327ceb488d4fa269b57d1e4f342e59d2c.tar.gz
mitmproxy-973406f327ceb488d4fa269b57d1e4f342e59d2c.tar.bz2
mitmproxy-973406f327ceb488d4fa269b57d1e4f342e59d2c.zip
Merge pull request #1896 from mhils/3.5.0-compat
Fix compat with Python 3.5.0
-rw-r--r--mitmproxy/utils/typecheck.py23
-rw-r--r--test/mitmproxy/utils/test_typecheck.py17
2 files changed, 32 insertions, 8 deletions
diff --git a/mitmproxy/utils/typecheck.py b/mitmproxy/utils/typecheck.py
index 0b29f6a4..ae1a507d 100644
--- a/mitmproxy/utils/typecheck.py
+++ b/mitmproxy/utils/typecheck.py
@@ -1,5 +1,4 @@
import typing
-import sys
def check_type(attr_name: str, value: typing.Any, typeinfo: type) -> None:
@@ -25,10 +24,11 @@ def check_type(attr_name: str, value: typing.Any, typeinfo: type) -> None:
typename = str(typeinfo)
if typename.startswith("typing.Union"):
- if sys.version_info < (3, 6):
- types = typeinfo.__union_params__
- else:
+ try:
types = typeinfo.__args__
+ except AttributeError:
+ # Python 3.5.x
+ types = typeinfo.__union_params__
for T in types:
try:
@@ -39,10 +39,11 @@ def check_type(attr_name: str, value: typing.Any, typeinfo: type) -> None:
return
raise e
elif typename.startswith("typing.Tuple"):
- if sys.version_info < (3, 6):
- types = typeinfo.__tuple_params__
- else:
+ try:
types = typeinfo.__args__
+ except AttributeError:
+ # Python 3.5.x
+ types = typeinfo.__tuple_params__
if not isinstance(value, (tuple, list)):
raise e
@@ -52,7 +53,11 @@ def check_type(attr_name: str, value: typing.Any, typeinfo: type) -> None:
check_type("{}[{}]".format(attr_name, i), x, T)
return
elif typename.startswith("typing.Sequence"):
- T = typeinfo.__args__[0]
+ try:
+ T = typeinfo.__args__[0]
+ except AttributeError:
+ # Python 3.5.0
+ T = typeinfo.__parameters__[0]
if not isinstance(value, (tuple, list)):
raise e
for v in value:
@@ -60,6 +65,8 @@ def check_type(attr_name: str, value: typing.Any, typeinfo: type) -> None:
elif typename.startswith("typing.IO"):
if hasattr(value, "read"):
return
+ else:
+ raise e
elif not isinstance(value, typeinfo):
raise e
diff --git a/test/mitmproxy/utils/test_typecheck.py b/test/mitmproxy/utils/test_typecheck.py
index 3ec74b20..0ed440eb 100644
--- a/test/mitmproxy/utils/test_typecheck.py
+++ b/test/mitmproxy/utils/test_typecheck.py
@@ -1,6 +1,9 @@
+import io
import typing
+import mock
import pytest
+
from mitmproxy.utils import typecheck
@@ -57,3 +60,17 @@ def test_check_sequence():
typecheck.check_type("foo", [10, "foo"], typing.Sequence[int])
with pytest.raises(TypeError):
typecheck.check_type("foo", [b"foo"], typing.Sequence[str])
+ with pytest.raises(TypeError):
+ typecheck.check_type("foo", "foo", typing.Sequence[str])
+
+ # Python 3.5.0 only defines __parameters__
+ m = mock.Mock()
+ m.__str__ = lambda self: "typing.Sequence"
+ m.__parameters__ = (int,)
+ typecheck.check_type("foo", [10], m)
+
+
+def test_check_io():
+ typecheck.check_type("foo", io.StringIO(), typing.IO[str])
+ with pytest.raises(TypeError):
+ typecheck.check_type("foo", "foo", typing.IO[str])