Metadata-Version: 2.1
Name: enforce-typing
Version: 1.0.0
Summary: An easy to use decorator to enforce static typing for function and dataclasses.
Home-page: https://github.com/matchawine/python-enforce-typing
Author: Joshua Logan
Author-email: joshua@matcha.wine
License: GPL
Keywords: decorators typing
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Plugins
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: GNU General Public License (GPL)
Classifier: Operating System :: OS Independent
Classifier: Natural Language :: English
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.5
Description-Content-Type: text/markdown

Adds a simple decorator `enforce_types` that enables enforcing strict
typing on a function or dataclass using annotations.

Works with collection types and subtypes for example `Dict[str,
Tuple[int, int]]`, and with special types as `Optional` and `Any`.

Seeing as this uses type annotations from
[PEP 484](https://www.python.org/dev/peps/pep-0484/), \>=Python 3.5 is
required.

PyPi project page: \[TBU\]

## Installation

Other than downloading from PyPi with
<span class="title-ref">pip</span>, you may also clone the repository
and run the usual setuptools process:

    $> git clone https://github.com/matchawine/python-enforce-typing.git && cd python-enforce-typing
    $> python setup.py {build,install}

## Usage

``` python
from typing import Any, Union, Optional
from dataclasses import dataclass
from enforce_typing import enforce_types

@enforce_types
@dataclass(frozen=True)
class Toto(object):
    this_or_that: Union[str, int]
    anything: Any
    name: str = ""
    value: int = 1
    maybe_not: Optional[bool] = None

>>> Toto(this_or_that=list(), anything=2)
TypeError: Expected type 'typing.Union[str, int]' for attribute 'this_or_that' but received type '<class 'list'>')

>>> Toto(this_or_that=1, anything=2, maybe_not=0)
TypeError: Expected type 'typing.Union[bool, NoneType]' for attribute 'maybe_not' but received type '<class 'int'>')

>>> Toto(this_or_that=1, anything=2, name=3)
TypeError: Expected type '<class 'str'>' for attribute 'name' but received type '<class 'int'>')

>>> Toto(this_or_that=1, anything=2, value=3.0)
TypeError: Expected type '<class 'int'>' for attribute 'value' but received type '<class 'float'>')

>>> Toto(this_or_that=1, anything=2)
Toto(this_or_that=1, anything=2, name='', value=1, maybe_not=None)

>>> Toto(this_or_that="titi", anything=list(), maybe_not=False)
Toto(this_or_that='titi', anything=[], name='', value=1, maybe_not=False)
```


