diff --git a/Makefile b/Makefile index b50bf5a..8a5d6b7 100644 --- a/Makefile +++ b/Makefile @@ -7,13 +7,18 @@ lint: test: docker-compose run --rm dev pytest --cov --cov-report term-missing:skip-covered +test38: + docker-compose run --rm test38 +test39: + docker-compose run --rm test39 +test310: + docker-compose run --rm test310 test311: docker-compose run --rm test311 - test312: docker-compose run --rm test312 -ci: build lint test test311 test312 +ci: build lint test test38 test39 test310 test311 test312 sdist: docker-compose run --rm dev python setup.py sdist diff --git a/docker-compose.yml b/docker-compose.yml index 8d05846..c17b6df 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,31 @@ services: - ./src:/src - ./README.rst:/src/README.rst - ./LICENSE:/src/LICENSE + + test38: + build: + context: . + dockerfile: dockerfiles/dev.dockerfile + args: + PYTHON_VERSION: '3.8' + command: pytest + + test39: + build: + context: . + dockerfile: dockerfiles/dev.dockerfile + args: + PYTHON_VERSION: '3.9' + command: pytest + + test310: + build: + context: . + dockerfile: dockerfiles/dev.dockerfile + args: + PYTHON_VERSION: '3.10' + command: pytest + test311: build: context: . diff --git a/docs/conf.py b/docs/conf.py index de54063..1aed149 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -38,8 +38,8 @@ copyright = '2024, ken-morel' author = 'ken-morel' -release = '1.1.3' -version = '1.1.3' +release = '2.0.0' +version = '2.0.0' # -- General configuration diff --git a/docs/index.rst b/docs/index.rst index cb4e135..b0dc0e9 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,5 +1,5 @@ -Welcome to pyoload's documentation! +Welcome to pyoload v|version| documentation! =================================== .. image:: https://github.com/ken-morel/pyoload/actions/workflows/python-publish.yml/badge.svg diff --git a/src/pyoload/__init__.py b/src/pyoload/__init__.py index c742304..087d37f 100644 --- a/src/pyoload/__init__.py +++ b/src/pyoload/__init__.py @@ -98,11 +98,15 @@ class Check: """ checks_list = {} - def __init_subclass__(cls: Any, subclass: Any): + def __init_subclass__(cls: Any): """ register's subclasses as chexks """ - cls.register(cls.name, cls.__call__) + if hasattr(cls, 'name'): + name = cls.name + else: + name = cls.__name__ + Check.register(name)(cls()) @classmethod def register( @@ -733,5 +737,5 @@ def new_setter(self: Any, name: str, value: Any) -> Any: return cls -__version__ = '1.1.3' +__version__ = '2.0.0' __author__ = 'ken-morel' diff --git a/src/tests/OverloadTest.py b/src/tests/OverloadTest.py deleted file mode 100644 index b138e72..0000000 --- a/src/tests/OverloadTest.py +++ /dev/null @@ -1,45 +0,0 @@ -import pyoload - -from pyoload import Any -from pyoload import Checks -from pyoload import get_name -from pyoload import overload - -assert pyoload.__version__ == '1.1.2' - - -@overload -def div(a: str, b: str): - return str(float(a) / float(b)) - - -@overload(get_name(div)) -def div_(a: str, b: Checks(eq=0)): - return 'Infinity' - - -@overload(get_name(div)) -def div__(a: Any, b: Checks(eq=0)): - return NotImplemented - - -@div_.overload -def div___(a: str, b: int): - return int(float(a) / b) - - -@div.overload -def div____(a: float, b: float): - return float(float(a) / b) - - -def OverloadTest(): - assert div('4', '2') == '2.0' - assert div('3', 0) == 'Infinity' - assert div(None, 0) == NotImplemented - assert div('4', 2) == 2 - assert div(3.0, 1.0) == 3.0 - - -if __name__ == '__main__': - OverloadTest() diff --git a/src/tests/test_cast.py b/src/tests/test_cast.py index 00a9b5a..545a061 100644 --- a/src/tests/test_cast.py +++ b/src/tests/test_cast.py @@ -6,7 +6,7 @@ from pyoload import annotate from pyoload import typeMatch -assert pyoload.__version__ == '1.1.3' +assert pyoload.__version__ == '2.0.0' @annotate diff --git a/src/tests/test_check.py b/src/tests/test_check.py index 6e62d86..eb7322b 100644 --- a/src/tests/test_check.py +++ b/src/tests/test_check.py @@ -7,7 +7,7 @@ from pyoload import Check from pyoload import annotate -assert pyoload.__version__ == '1.1.3' +assert pyoload.__version__ == '2.0.0' @annotate @@ -19,6 +19,18 @@ def __init__(self: Any, bar: Checks(func=bool)) -> Any: pass +@Check.register('test1 test2') +def __(param, val): + print(param, val) + + +class IsInt(Check): + name = 'isint' + + def __call__(self, a, b): + return a == isinstance(b, int) + + def test_check(): try: foo(0) @@ -36,11 +48,17 @@ def test_check(): else: raise Exception() - @Check.register('test1 test2') - def test(param, val): - print(param, val) Checks(test1=3)(3) Checks(test2=4)(4) + Checks(ge=2, gt=1, lt=2.1, le=2, eq=2)(2) + Checks(ge=-2.5, gt=-3, lt=-2, le=2, eq=-2.5)(-2.5) + Checks(len=(2, 5))('abcd') + Checks(type=dict[str | int, tuple[int]])({ + '#': (12,), + 20: (21, 45), + }) + Checks(isinstance=float)(1.5) + Checks(isint=True)(5) if __name__ == '__main__': diff --git a/src/tests/test_overload.py b/src/tests/test_overload.py index 612b3be..65bab68 100644 --- a/src/tests/test_overload.py +++ b/src/tests/test_overload.py @@ -5,7 +5,7 @@ from pyoload import get_name from pyoload import overload -assert pyoload.__version__ == '1.1.3' +assert pyoload.__version__ == '2.0.0' @overload diff --git a/src/tests/test_values.py b/src/tests/test_values.py new file mode 100644 index 0000000..9c609dc --- /dev/null +++ b/src/tests/test_values.py @@ -0,0 +1,24 @@ +from pyoload import annotate +from pyoload import Values +from pyoload import AnnotationError +import pyoload + + +assert pyoload.__version__ == '2.0.0' + + +@annotate +def odd(a: Values(range(10))) -> bool: + return a % 2 == 1 + + +def test_values(): + assert odd(3), '3 reported not odd' + assert not odd(2), '2 reported odd' + + try: + odd(10) + except AnnotationError: + pass + else: + raise AssertionError('Values did not crash')