Compare commits

...

3 Commits

Author SHA1 Message Date
Maximilian Hils
be19ac8be6 bump version to 1.0.2 2016-12-28 15:36:34 +01:00
Maximilian Hils
d0411a62ee fix IO type checking 2016-12-28 15:35:47 +01:00
Maximilian Hils
c4e643d3bd fix compat with Python 3.5.0 2016-12-28 15:35:37 +01:00
3 changed files with 33 additions and 9 deletions

View File

@@ -1,5 +1,4 @@
import typing import typing
import sys
def check_type(attr_name: str, value: typing.Any, typeinfo: type) -> None: 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) typename = str(typeinfo)
if typename.startswith("typing.Union"): if typename.startswith("typing.Union"):
if sys.version_info < (3, 6): try:
types = typeinfo.__union_params__
else:
types = typeinfo.__args__ types = typeinfo.__args__
except AttributeError:
# Python 3.5.x
types = typeinfo.__union_params__
for T in types: for T in types:
try: try:
@@ -39,10 +39,11 @@ def check_type(attr_name: str, value: typing.Any, typeinfo: type) -> None:
return return
raise e raise e
elif typename.startswith("typing.Tuple"): elif typename.startswith("typing.Tuple"):
if sys.version_info < (3, 6): try:
types = typeinfo.__tuple_params__
else:
types = typeinfo.__args__ types = typeinfo.__args__
except AttributeError:
# Python 3.5.x
types = typeinfo.__tuple_params__
if not isinstance(value, (tuple, list)): if not isinstance(value, (tuple, list)):
raise e 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) check_type("{}[{}]".format(attr_name, i), x, T)
return return
elif typename.startswith("typing.Sequence"): 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)): if not isinstance(value, (tuple, list)):
raise e raise e
for v in value: 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"): elif typename.startswith("typing.IO"):
if hasattr(value, "read"): if hasattr(value, "read"):
return return
else:
raise e
elif not isinstance(value, typeinfo): elif not isinstance(value, typeinfo):
raise e raise e

View File

@@ -1,4 +1,4 @@
IVERSION = (1, 0, 1) IVERSION = (1, 0, 2)
VERSION = ".".join(str(i) for i in IVERSION) VERSION = ".".join(str(i) for i in IVERSION)
PATHOD = "pathod " + VERSION PATHOD = "pathod " + VERSION
MITMPROXY = "mitmproxy " + VERSION MITMPROXY = "mitmproxy " + VERSION

View File

@@ -1,6 +1,9 @@
import io
import typing import typing
import mock
import pytest import pytest
from mitmproxy.utils import typecheck from mitmproxy.utils import typecheck
@@ -57,3 +60,17 @@ def test_check_sequence():
typecheck.check_type("foo", [10, "foo"], typing.Sequence[int]) typecheck.check_type("foo", [10, "foo"], typing.Sequence[int])
with pytest.raises(TypeError): with pytest.raises(TypeError):
typecheck.check_type("foo", [b"foo"], typing.Sequence[str]) 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])