automated terminal push
This commit is contained in:
@@ -0,0 +1 @@
|
||||
pip
|
||||
@@ -0,0 +1,161 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: cattrs
|
||||
Version: 24.1.3
|
||||
Summary: Composable complex class support for attrs and dataclasses.
|
||||
Project-URL: Homepage, https://catt.rs
|
||||
Project-URL: Changelog, https://catt.rs/en/latest/history.html
|
||||
Project-URL: Bug Tracker, https://github.com/python-attrs/cattrs/issues
|
||||
Project-URL: Repository, https://github.com/python-attrs/cattrs
|
||||
Project-URL: Documentation, https://catt.rs/en/stable/
|
||||
Author-email: Tin Tvrtkovic <tinchester@gmail.com>
|
||||
License: MIT
|
||||
License-File: LICENSE
|
||||
Keywords: attrs,dataclasses,serialization
|
||||
Classifier: Development Status :: 5 - Production/Stable
|
||||
Classifier: Intended Audience :: Developers
|
||||
Classifier: License :: OSI Approved :: MIT License
|
||||
Classifier: Programming Language :: Python :: 3.8
|
||||
Classifier: Programming Language :: Python :: 3.9
|
||||
Classifier: Programming Language :: Python :: 3.10
|
||||
Classifier: Programming Language :: Python :: 3.11
|
||||
Classifier: Programming Language :: Python :: 3.12
|
||||
Classifier: Programming Language :: Python :: Implementation :: CPython
|
||||
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
||||
Classifier: Typing :: Typed
|
||||
Requires-Python: >=3.8
|
||||
Requires-Dist: attrs>=23.1.0
|
||||
Requires-Dist: exceptiongroup>=1.1.1; python_version < '3.11'
|
||||
Requires-Dist: typing-extensions!=4.6.3,>=4.1.0; python_version < '3.11'
|
||||
Provides-Extra: bson
|
||||
Requires-Dist: pymongo>=4.4.0; extra == 'bson'
|
||||
Provides-Extra: cbor2
|
||||
Requires-Dist: cbor2>=5.4.6; extra == 'cbor2'
|
||||
Provides-Extra: msgpack
|
||||
Requires-Dist: msgpack>=1.0.5; extra == 'msgpack'
|
||||
Provides-Extra: msgspec
|
||||
Requires-Dist: msgspec>=0.18.5; (implementation_name == 'cpython') and extra == 'msgspec'
|
||||
Provides-Extra: orjson
|
||||
Requires-Dist: orjson>=3.9.2; (implementation_name == 'cpython') and extra == 'orjson'
|
||||
Provides-Extra: pyyaml
|
||||
Requires-Dist: pyyaml>=6.0; extra == 'pyyaml'
|
||||
Provides-Extra: tomlkit
|
||||
Requires-Dist: tomlkit>=0.11.8; extra == 'tomlkit'
|
||||
Provides-Extra: ujson
|
||||
Requires-Dist: ujson>=5.7.0; extra == 'ujson'
|
||||
Description-Content-Type: text/markdown
|
||||
|
||||
# *cattrs*: Flexible Object Serialization and Validation
|
||||
|
||||
*Because validation belongs to the edges.*
|
||||
|
||||
[](https://catt.rs/)
|
||||
[](https://github.com/hynek/stamina/blob/main/LICENSE)
|
||||
[](https://pypi.python.org/pypi/cattrs)
|
||||
[](https://github.com/python-attrs/cattrs)
|
||||
[](https://pepy.tech/project/cattrs)
|
||||
[](https://github.com/python-attrs/cattrs/actions/workflows/main.yml)
|
||||
|
||||
---
|
||||
|
||||
<!-- begin-teaser -->
|
||||
|
||||
**cattrs** is a Swiss Army knife for (un)structuring and validating data in Python.
|
||||
In practice, that means it converts **unstructured dictionaries** into **proper classes** and back, while **validating** their contents.
|
||||
|
||||
<!-- end-teaser -->
|
||||
|
||||
|
||||
## Example
|
||||
|
||||
<!-- begin-example -->
|
||||
|
||||
_cattrs_ works best with [_attrs_](https://www.attrs.org/) classes, and [dataclasses](https://docs.python.org/3/library/dataclasses.html) where simple (un-)structuring works out of the box, even for nested data, without polluting your data model with serialization details:
|
||||
|
||||
```python
|
||||
>>> from attrs import define
|
||||
>>> from cattrs import structure, unstructure
|
||||
>>> @define
|
||||
... class C:
|
||||
... a: int
|
||||
... b: list[str]
|
||||
>>> instance = structure({'a': 1, 'b': ['x', 'y']}, C)
|
||||
>>> instance
|
||||
C(a=1, b=['x', 'y'])
|
||||
>>> unstructure(instance)
|
||||
{'a': 1, 'b': ['x', 'y']}
|
||||
```
|
||||
|
||||
<!-- end-teaser -->
|
||||
<!-- end-example -->
|
||||
|
||||
Have a look at [*Why *cattrs*?*](https://catt.rs/en/latest/why.html) for more examples!
|
||||
|
||||
<!-- begin-why -->
|
||||
|
||||
## Features
|
||||
|
||||
### Recursive Unstructuring
|
||||
|
||||
- _attrs_ classes and dataclasses are converted into dictionaries in a way similar to `attrs.asdict()`, or into tuples in a way similar to `attrs.astuple()`.
|
||||
- Enumeration instances are converted to their values.
|
||||
- Other types are let through without conversion. This includes types such as integers, dictionaries, lists and instances of non-_attrs_ classes.
|
||||
- Custom converters for any type can be registered using `register_unstructure_hook`.
|
||||
|
||||
|
||||
### Recursive Structuring
|
||||
|
||||
Converts unstructured data into structured data, recursively, according to your specification given as a type.
|
||||
The following types are supported:
|
||||
|
||||
- `typing.Optional[T]` and its 3.10+ form, `T | None`.
|
||||
- `list[T]`, `typing.List[T]`, `typing.MutableSequence[T]`, `typing.Sequence[T]` convert to a lists.
|
||||
- `tuple` and `typing.Tuple` (both variants, `tuple[T, ...]` and `tuple[X, Y, Z]`).
|
||||
- `set[T]`, `typing.MutableSet[T]`, and `typing.Set[T]` convert to a sets.
|
||||
- `frozenset[T]`, and `typing.FrozenSet[T]` convert to a frozensets.
|
||||
- `dict[K, V]`, `typing.Dict[K, V]`, `typing.MutableMapping[K, V]`, and `typing.Mapping[K, V]` convert to a dictionaries.
|
||||
- [`typing.TypedDict`](https://docs.python.org/3/library/typing.html#typing.TypedDict), ordinary and generic.
|
||||
- [`typing.NewType`](https://docs.python.org/3/library/typing.html#newtype)
|
||||
- [PEP 695 type aliases](https://docs.python.org/3/library/typing.html#type-aliases) on 3.12+
|
||||
- _attrs_ classes with simple attributes and the usual `__init__`[^simple].
|
||||
- All _attrs_ classes and dataclasses with the usual `__init__`, if their complex attributes have type metadata.
|
||||
- Unions of supported _attrs_ classes, given that all of the classes have a unique field.
|
||||
- Unions of anything, if you provide a disambiguation function for it.
|
||||
- Custom converters for any type can be registered using `register_structure_hook`.
|
||||
|
||||
[^simple]: Simple attributes are attributes that can be assigned unstructured data, like numbers, strings, and collections of unstructured data.
|
||||
|
||||
|
||||
### Batteries Included
|
||||
|
||||
_cattrs_ comes with pre-configured converters for a number of serialization libraries, including JSON (standard library, [_orjson_](https://pypi.org/project/orjson/), [UltraJSON](https://pypi.org/project/ujson/)), [_msgpack_](https://pypi.org/project/msgpack/), [_cbor2_](https://pypi.org/project/cbor2/), [_bson_](https://pypi.org/project/bson/), [PyYAML](https://pypi.org/project/PyYAML/), [_tomlkit_](https://pypi.org/project/tomlkit/) and [_msgspec_](https://pypi.org/project/msgspec/) (supports only JSON at this time).
|
||||
|
||||
For details, see the [cattrs.preconf package](https://catt.rs/en/stable/preconf.html).
|
||||
|
||||
|
||||
## Design Decisions
|
||||
|
||||
_cattrs_ is based on a few fundamental design decisions:
|
||||
|
||||
- Un/structuring rules are separate from the models.
|
||||
This allows models to have a one-to-many relationship with un/structuring rules, and to create un/structuring rules for models which you do not own and you cannot change.
|
||||
(_cattrs_ can be configured to use un/structuring rules from models using the [`use_class_methods` strategy](https://catt.rs/en/latest/strategies.html#using-class-specific-structure-and-unstructure-methods).)
|
||||
- Invent as little as possible; reuse existing ordinary Python instead.
|
||||
For example, _cattrs_ did not have a custom exception type to group exceptions until the sanctioned Python [`exceptiongroups`](https://docs.python.org/3/library/exceptions.html#ExceptionGroup).
|
||||
A side-effect of this design decision is that, in a lot of cases, when you're solving _cattrs_ problems you're actually learning Python instead of learning _cattrs_.
|
||||
- Resist the temptation to guess.
|
||||
If there are two ways of solving a problem, _cattrs_ should refuse to guess and let the user configure it themselves.
|
||||
|
||||
A foolish consistency is the hobgoblin of little minds, so these decisions can and are sometimes broken, but they have proven to be a good foundation.
|
||||
|
||||
|
||||
<!-- end-why -->
|
||||
|
||||
## Credits
|
||||
|
||||
Major credits to Hynek Schlawack for creating [attrs](https://attrs.org) and its predecessor, [characteristic](https://github.com/hynek/characteristic).
|
||||
|
||||
_cattrs_ is tested with [Hypothesis](http://hypothesis.readthedocs.io/en/latest/), by David R. MacIver.
|
||||
|
||||
_cattrs_ is benchmarked using [perf](https://github.com/haypo/perf) and [pytest-benchmark](https://pytest-benchmark.readthedocs.io/en/latest/index.html).
|
||||
|
||||
This package was created with [Cookiecutter](https://github.com/audreyr/cookiecutter) and the [`audreyr/cookiecutter-pypackage`](https://github.com/audreyr/cookiecutter-pypackage) project template.
|
||||
@@ -0,0 +1,95 @@
|
||||
cattr/__init__.py,sha256=pODFKaZ7MisyHe_XPc9X6KKG73mqduHUvQO142XwijY,906
|
||||
cattr/__pycache__/__init__.cpython-312.pyc,,
|
||||
cattr/__pycache__/converters.cpython-312.pyc,,
|
||||
cattr/__pycache__/disambiguators.cpython-312.pyc,,
|
||||
cattr/__pycache__/dispatch.cpython-312.pyc,,
|
||||
cattr/__pycache__/errors.cpython-312.pyc,,
|
||||
cattr/__pycache__/gen.cpython-312.pyc,,
|
||||
cattr/converters.py,sha256=rQhY4J8r7QTZh5WICuFe4GWO1v0DS3DgQ9r569zd6jg,192
|
||||
cattr/disambiguators.py,sha256=ugD1fq1Z5x1pGu5P1lMzcT-IEi1q7IfQJIHEdmg62vM,103
|
||||
cattr/dispatch.py,sha256=uVEOgHWR9Hn5tm-wIw-bDccqrxJByVi8yRKaYyvL67k,125
|
||||
cattr/errors.py,sha256=V4RhoCObwGrlaM3oyn1H_FYxGR8iAB9dG5NxFDYM548,343
|
||||
cattr/gen.py,sha256=hWyKoZ_d2D36Jz_npspyGw8s9pWtUA69sXf0R3uOvgM,597
|
||||
cattr/preconf/__init__.py,sha256=NqPE7uhVfcP-PggkUpsbfAutMo8oHjcoB1cvjgLft-s,78
|
||||
cattr/preconf/__pycache__/__init__.cpython-312.pyc,,
|
||||
cattr/preconf/__pycache__/bson.cpython-312.pyc,,
|
||||
cattr/preconf/__pycache__/json.cpython-312.pyc,,
|
||||
cattr/preconf/__pycache__/msgpack.cpython-312.pyc,,
|
||||
cattr/preconf/__pycache__/orjson.cpython-312.pyc,,
|
||||
cattr/preconf/__pycache__/pyyaml.cpython-312.pyc,,
|
||||
cattr/preconf/__pycache__/tomlkit.cpython-312.pyc,,
|
||||
cattr/preconf/__pycache__/ujson.cpython-312.pyc,,
|
||||
cattr/preconf/bson.py,sha256=Bn4hJxac7OthGg_CR4LCPeBp_fz4kx3QniBVOZhguGs,195
|
||||
cattr/preconf/json.py,sha256=HBxWOTqKI7HOlmt-GnN6_wjQz1VphRi70sAOEbx0A2Y,206
|
||||
cattr/preconf/msgpack.py,sha256=VXqynPel11_lX8uTg84-u27LQhCqL1OoiF-lTqnoAkQ,207
|
||||
cattr/preconf/orjson.py,sha256=fs8qDPDYSBba9D8ib9Df1WVZ8iZaRPQq7kDigAxp14E,203
|
||||
cattr/preconf/pyyaml.py,sha256=lhuKwHrcvr16WOtdW4Q0mgIRzB90v1hwZkFXtPKOvAw,203
|
||||
cattr/preconf/tomlkit.py,sha256=rk393txIBHeWR66LfnATPh9Im1EFAHPJvSEGGSP2c-8,207
|
||||
cattr/preconf/ujson.py,sha256=r6ufraKDqmKdetNZUKxLYVSGmuJ-ckc-UjGYvCamr9k,199
|
||||
cattr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
cattrs-24.1.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
||||
cattrs-24.1.3.dist-info/METADATA,sha256=BeF2f24ebE23Ssz1xE9LN89QPhiPmTrXb2UNk_cOLOI,8420
|
||||
cattrs-24.1.3.dist-info/RECORD,,
|
||||
cattrs-24.1.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
||||
cattrs-24.1.3.dist-info/licenses/LICENSE,sha256=9fudHt43qIykf0IMSZ3KD0oFvJk-Esd9I1IKrSkcAb8,1074
|
||||
cattrs/__init__.py,sha256=peO0_Q9AEguPCMjXlRH-Nj0CahcCw5CJmpnpKxsWKSQ,1835
|
||||
cattrs/__pycache__/__init__.cpython-312.pyc,,
|
||||
cattrs/__pycache__/_compat.cpython-312.pyc,,
|
||||
cattrs/__pycache__/_generics.cpython-312.pyc,,
|
||||
cattrs/__pycache__/cols.cpython-312.pyc,,
|
||||
cattrs/__pycache__/converters.cpython-312.pyc,,
|
||||
cattrs/__pycache__/disambiguators.cpython-312.pyc,,
|
||||
cattrs/__pycache__/dispatch.cpython-312.pyc,,
|
||||
cattrs/__pycache__/errors.cpython-312.pyc,,
|
||||
cattrs/__pycache__/fns.cpython-312.pyc,,
|
||||
cattrs/__pycache__/v.cpython-312.pyc,,
|
||||
cattrs/_compat.py,sha256=NiNN3F9hDI5Cbl14BSdrQcBYld-8YMyizDoubVgNs4U,17677
|
||||
cattrs/_generics.py,sha256=ymyDdLjXoYi_XPBA_f_-xJC7Bc8RGqoUcdlwTbB7xl8,718
|
||||
cattrs/cols.py,sha256=sB9NTOp8pGLMUxVicSHWpcX_4czrD1g5MdCJO0Ko5s0,8433
|
||||
cattrs/converters.py,sha256=nMxuapDj3Q75oW4sVXnYdIeHhodwzLNUcDcaIfKMLQM,53916
|
||||
cattrs/disambiguators.py,sha256=ljl73QtSB3MAGcl7-phAUR66b4yx_1ORYLb5fUgW8bY,6825
|
||||
cattrs/dispatch.py,sha256=fEE100tCqcqC_wl5y2FCdVEocLOuDlys0sduJrTfmB4,6810
|
||||
cattrs/errors.py,sha256=rHps9Qp7SoRafb2VuAkMbhsQf4pq87gX1SzM-jluMsE,4070
|
||||
cattrs/fns.py,sha256=xQceStzW4qLiMTJgGM-pVUudGwHm0Hin8oCYe1feS5c,633
|
||||
cattrs/gen/__init__.py,sha256=yBOs4V1SQ6RAPFSGyIkwi4ZEU7fqA_nQrH6ujgT88eI,38527
|
||||
cattrs/gen/__pycache__/__init__.cpython-312.pyc,,
|
||||
cattrs/gen/__pycache__/_consts.cpython-312.pyc,,
|
||||
cattrs/gen/__pycache__/_generics.cpython-312.pyc,,
|
||||
cattrs/gen/__pycache__/_lc.cpython-312.pyc,,
|
||||
cattrs/gen/__pycache__/_shared.cpython-312.pyc,,
|
||||
cattrs/gen/__pycache__/typeddicts.cpython-312.pyc,,
|
||||
cattrs/gen/_consts.py,sha256=ZwT_m2J3S7p-UjltpbA1WtfQZLNj9KhmFYCAv6Zl-g0,511
|
||||
cattrs/gen/_generics.py,sha256=_DyXCGql2QIxGhAv3_B1hsi80uPK8PhK2hhZa95YOlo,3011
|
||||
cattrs/gen/_lc.py,sha256=ktP5F9oOUo4HpZ4-hlLliLPzr8XjFi31EXMl8YMMs-g,906
|
||||
cattrs/gen/_shared.py,sha256=4yX9-TD5yyVzDWlSjkECrQV5B82xHUeBt9n2N5UgOAE,2064
|
||||
cattrs/gen/typeddicts.py,sha256=C3Bp8tNM-MI7L7KO0X3sfwSkG5d0ua3j7qDtvcCEBQk,22004
|
||||
cattrs/preconf/__init__.py,sha256=dfkUXoU47ZJfmoKX9FsnARKqLlgJeBjMxORMzxrbKbs,604
|
||||
cattrs/preconf/__pycache__/__init__.cpython-312.pyc,,
|
||||
cattrs/preconf/__pycache__/bson.cpython-312.pyc,,
|
||||
cattrs/preconf/__pycache__/cbor2.cpython-312.pyc,,
|
||||
cattrs/preconf/__pycache__/json.cpython-312.pyc,,
|
||||
cattrs/preconf/__pycache__/msgpack.cpython-312.pyc,,
|
||||
cattrs/preconf/__pycache__/msgspec.cpython-312.pyc,,
|
||||
cattrs/preconf/__pycache__/orjson.cpython-312.pyc,,
|
||||
cattrs/preconf/__pycache__/pyyaml.cpython-312.pyc,,
|
||||
cattrs/preconf/__pycache__/tomlkit.cpython-312.pyc,,
|
||||
cattrs/preconf/__pycache__/ujson.cpython-312.pyc,,
|
||||
cattrs/preconf/bson.py,sha256=uBRpTVfwGZ-qfuDYGwsl8eXokVAmcVBedKQPGUmamhc,3656
|
||||
cattrs/preconf/cbor2.py,sha256=ANfQUXgs7pyU5-4_2hYmcqUxzQZhWhFzrk_0y6b1yYw,1635
|
||||
cattrs/preconf/json.py,sha256=CSU5RosdYyg6cIOpaohgZVfdMtOtKjZlSg837fW4fTw,2035
|
||||
cattrs/preconf/msgpack.py,sha256=cgwX_ARi_swQjG6hwa9j-n7FUynLNWIMVLouz_VoTuw,1753
|
||||
cattrs/preconf/msgspec.py,sha256=f8J04RXv8UErKAwwzVs1cMbvoM-9erMmmF49zKBbCDo,6343
|
||||
cattrs/preconf/orjson.py,sha256=RZ8DI-4K7Xi0QdpIihT9I3Cm-O8Aq8_MTt2R3a4fgEk,3241
|
||||
cattrs/preconf/pyyaml.py,sha256=Ga96zLypn2DglTgbrb9h3jcuH-caur_UQI1ADo-ynUA,2298
|
||||
cattrs/preconf/tomlkit.py,sha256=2k-BN0ZW3faWmHcMQ1bCvsKCClhdgSjTe056O1xEc4o,3060
|
||||
cattrs/preconf/ujson.py,sha256=JBh5dWluwMwKhAJPINJhpse_aQ1p9hzrGo8BuvmG6S0,1863
|
||||
cattrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
||||
cattrs/strategies/__init__.py,sha256=nkZWCzSRYcS-75FMfk52mioZSuWykaN8hB39Vig5Xkg,339
|
||||
cattrs/strategies/__pycache__/__init__.cpython-312.pyc,,
|
||||
cattrs/strategies/__pycache__/_class_methods.cpython-312.pyc,,
|
||||
cattrs/strategies/__pycache__/_subclasses.cpython-312.pyc,,
|
||||
cattrs/strategies/__pycache__/_unions.cpython-312.pyc,,
|
||||
cattrs/strategies/_class_methods.py,sha256=vfiE3wKm04oc-3T9hchsIyhVzpMpJRdgTbujKsWyVpQ,2597
|
||||
cattrs/strategies/_subclasses.py,sha256=zzhLl7fSZlmlBuBY-rPX7L1d_C5tiDFDBmUTeRpG2uI,9204
|
||||
cattrs/strategies/_unions.py,sha256=l8CjVVFAwftkBa47g3m2KgtQ_b42Wnv-KwYY_LHReCA,9166
|
||||
cattrs/v.py,sha256=cTYt0EW8yr-gzKynw4_XjFv3RLpAF8IebvOb612l9QE,4399
|
||||
@@ -0,0 +1,4 @@
|
||||
Wheel-Version: 1.0
|
||||
Generator: hatchling 1.27.0
|
||||
Root-Is-Purelib: true
|
||||
Tag: py3-none-any
|
||||
@@ -0,0 +1,11 @@
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2016, Tin Tvrtković
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Reference in New Issue
Block a user