Skip to content

Commit c97f8ff

Browse files
authored
Merge pull request #5 from pomponchik/develop
0.0.5
2 parents a025b84 + f8209ca commit c97f8ff

5 files changed

Lines changed: 445 additions & 608 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "simtypes"
7-
version = "0.0.4"
7+
version = "0.0.5"
88
authors = [{ name = "Evgeniy Blinov", email = "zheni-b@yandex.ru" }]
99
description = 'Type checking in runtime without stupid games'
1010
readme = "README.md"

simtypes/check.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,18 @@ def check(value: Any, type: Type[ExpectedType], strict: bool = False, lists_are_
3030
elif origin_type is list and strict:
3131
if not isinstance(value, list):
3232
return False
33-
return all(check(subvalue, get_args(type)[0], strict=strict, lists_are_tuples=lists_are_tuples) for subvalue in value)
33+
arguments = get_args(type)
34+
if not arguments:
35+
return True
36+
return all(check(subvalue, arguments[0], strict=strict, lists_are_tuples=lists_are_tuples) for subvalue in value)
3437

3538
elif origin_type is dict and strict:
3639
if not isinstance(value, dict):
3740
return False
38-
return all(check(key, get_args(type)[0], strict=strict, lists_are_tuples=lists_are_tuples) and check(subvalue, get_args(type)[1], strict=strict, lists_are_tuples=lists_are_tuples) for key, subvalue in value.items())
41+
arguments = get_args(type)
42+
if not arguments:
43+
return True
44+
return all(check(key, arguments[0], strict=strict, lists_are_tuples=lists_are_tuples) and check(subvalue, arguments[1], strict=strict, lists_are_tuples=lists_are_tuples) for key, subvalue in value.items())
3945

4046
elif origin_type is tuple and strict:
4147
types_to_check: List[Union[Type[list], Type[tuple]]] = [tuple] if not lists_are_tuples else [tuple, list]
@@ -48,7 +54,7 @@ def check(value: Any, type: Type[ExpectedType], strict: bool = False, lists_are_
4854
return True
4955

5056
if len(arguments) == 2 and arguments[1] is Ellipsis:
51-
return all(check(subvalue, get_args(type)[0], strict=strict, lists_are_tuples=lists_are_tuples) for subvalue in value)
57+
return all(check(subvalue, arguments[0], strict=strict, lists_are_tuples=lists_are_tuples) for subvalue in value)
5258

5359
if len(arguments) != len(value):
5460
return False

tests/units/conftest.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import sys
2+
from typing import Tuple, List, Set, Dict, Union, Optional
3+
4+
import pytest
5+
6+
7+
@pytest.fixture(params=[1, 2])
8+
def new_style(request):
9+
return request.param
10+
11+
12+
@pytest.fixture(params=[Dict, dict])
13+
def dict_type(request):
14+
return request.param
15+
16+
17+
@pytest.fixture(params=[List, list])
18+
def list_type(request):
19+
return request.param
20+
21+
22+
@pytest.fixture(params=[Tuple, tuple])
23+
def tuple_type(request):
24+
return request.param
25+
26+
27+
@pytest.fixture(params=[Set, set])
28+
def set_type(request):
29+
return request.param
30+
31+
32+
@pytest.fixture(params=[True, False])
33+
def make_union(request):
34+
def function(first, second):
35+
if request.param:
36+
return first | second
37+
return Union[first, second]
38+
if request.param and sys.version_info < (3, 10):
39+
pytest.skip('This operation became available in Python 3.10')
40+
return function
41+
42+
43+
@pytest.fixture(params=[True, False])
44+
def make_optional(request):
45+
def function(hint):
46+
if request.param:
47+
return hint | None
48+
return Optional[hint]
49+
if request.param and sys.version_info < (3, 10):
50+
pytest.skip('Union type expressions appeared in Python 3.10')
51+
return function
52+
53+
54+
@pytest.fixture(params=([List] if sys.version_info < (3, 9) else [List, list]))
55+
def subscribable_list_type(request):
56+
return request.param
57+
58+
59+
@pytest.fixture(params=([Dict] if sys.version_info < (3, 9) else [Dict, dict]))
60+
def subscribable_dict_type(request):
61+
return request.param
62+
63+
64+
@pytest.fixture(params=([Tuple] if sys.version_info < (3, 9) else [Tuple, tuple])) # type: ignore[list-item]
65+
def subscribable_tuple_type(request):
66+
return request.param

0 commit comments

Comments
 (0)