- Potentially breaking: skip attrs fields marked as
init=False
by default. This change is potentially breaking for unstructuring. See here for instructions on how to restore the old behavior. (#40 #395) - Potentially breaking: {py:func}
cattrs.gen.make_dict_structure_fn
and {py:func}cattrs.gen.typeddicts.make_dict_structure_fn
will use the values for thedetailed_validation
andforbid_extra_keys
parameters from the given converter by default now. If you're using these functions directly, the old behavior can be restored by passing in the desired values directly. (#410 #411) - Potentially breaking: The default union structuring strategy will also use fields annotated as
typing.Literal
to help guide structuring. See here for instructions on how to restore the old behavior. (#391) - Python 3.12 is now supported. Python 3.7 is no longer supported; use older releases there. (#424)
- Implement the
union passthrough
strategy, enabling much richer union handling for preconfigured converters. Learn more here. - Introduce the
use_class_methods
strategy. Learn more here. (#405) - The
omit
parameter of {py:func}cattrs.override
is now of typebool | None
(frombool
).None
is the new default and means to apply default cattrs handling to the attribute, which is to omit the attribute if it's marked asinit=False
, and keep it otherwise. - Converters can now be initialized with custom fallback hook factories for un/structuring. (#331 #441)
- Add support for
date
to preconfigured converters. (#420) - Add support for
datetime.date
s to the PyYAML preconfigured converter. (#393) - Fix {py:func}
format_exception() <cattrs.v.format_exception>
parameter working for recursive calls to {py:func}transform_error <cattrs.transform_error>
. (#389) - attrs aliases are now supported, although aliased fields still map to their attribute name instead of their alias by default when un/structuring. (#322 #391)
- Fix TypedDicts with periods in their field names. (#376 #377)
- Optimize and improve unstructuring of
Optional
(unions of one type andNone
). (#380 #381) - Fix {py:func}
format_exception <cattrs.v.format_exception>
and {py:func}transform_error <cattrs.transform_error>
type annotations. - Improve the implementation of
cattrs._compat.is_typeddict
. The implementation is now simpler, and relies on fewer private implementation details fromtyping
and typing_extensions. (#384) - Improve handling of TypedDicts with forward references.
- Speed up generated attrs and TypedDict structuring functions by changing their signature slightly. (#388)
- Fix copying of converters with function hooks. (#398 #399)
- Broaden {py:func}
loads' <cattrs.preconf.orjson.OrjsonConverter.loads>
type definition for the preconf orjson converter. (#400) - {py:class}
AttributeValidationNote <cattrs.AttributeValidationNote>
and {py:class}IterableValidationNote <cattrs.IterableValidationNote>
are now picklable. (#408) - Fix structuring
Final
lists. (#412) - Fix certain cases of structuring
Annotated
types. (#418) - Fix the tagged union strategy to work with
forbid_extra_keys
. (#402 #443) - Use PDM instead of Poetry.
- cattrs is now linted with Ruff.
- Remove some unused lines in the unstructuring code. (#416)
- Fix handling classes inheriting from non-generic protocols. (#374 #436)
- The documentation Makefile now supports the
htmlview
andhtmllive
targets. (#442) - cattrs is now published using PyPI Trusted Publishers, and
main
branch commits are automatically deployed to Test PyPI.
- Improve
typing_extensions
version bound. (#372)
- Introduce the
tagged_union
strategy. (#318 #317) - Introduce the
cattrs.transform_error
helper function for formatting validation exceptions. (258 342) - Add support for
typing.TypedDict
andtyping_extensions.TypedDict
. (#296 #364) - Add support for
typing.Final
. (#340 #349) - Introduce
override.struct_hook
andoverride.unstruct_hook
. Learn more here. (#326) - Fix generating structuring functions for types with angle brackets (
<>
) and pipe symbols (|
) in the name. (#319 #327) pathlib.Path
is now supported by default. (#81)- Add
cbor2
serialization library to thecattrs.preconf
package. - Add optional dependencies for
cattrs.preconf
third-party libraries. (#337) - All preconf converters now allow overriding the default
unstruct_collection_overrides
inmake_converter
. (#350 #353) - Subclasses structuring and unstructuring is now supported via a custom
include_subclasses
strategy. (#312) - Add support for
typing_extensions.Annotated
when the python version is less than3.9
. (#366) - Add unstructuring and structuring support for the standard library
deque
. (#355)
- Potentially breaking:
cattrs.Converter
has been renamed tocattrs.BaseConverter
, andcattrs.GenConverter
tocattrs.Converter
. TheGenConverter
name is still available for backwards compatibility, but is deprecated. If you were depending on functionality specific to the oldConverter
, change your import tofrom cattrs import BaseConverter
. - NewTypes are now supported by the
cattrs.Converter
. (#255 #94 #297) cattrs.Converter
andcattrs.BaseConverter
can now copy themselves using thecopy
method. (#284)- Python 3.11 support.
- cattrs now supports un/structuring
kw_only
fields on attrs classes into/from dictionaries. (#247) - PyPy support (and tests, using a minimal Hypothesis profile) restored. (#253)
- Fix propagating the
detailed_validation
flag to mapping and counter structuring generators. - Fix
typing.Set
applying too broadly when used with theGenConverter.unstruct_collection_overrides
parameter on Python versions below 3.9. Switch totyping.AbstractSet
on those versions to restore the old behavior. (#264) - Uncap the required Python version, to avoid problems detailed here (#275)
- Fix
Converter.register_structure_hook_factory
andcattrs.gen.make_dict_unstructure_fn
type annotations. (#281) - Expose all error classes in the
cattr.errors
namespace. Note that it is deprecated, just usecattrs.errors
. (#252) - Fix generating structuring functions for types with quotes in the name. (#291 #277)
- Fix usage of notes for the final version of PEP 678, supported since
exceptiongroup>=1.0.0rc4
. (#303)
- cattrs now uses the CalVer versioning convention.
- cattrs now has a detailed validation mode, which is enabled by default. Learn more here.
The old behavior can be restored by creating the converter with
detailed_validation=False
. - attrs and dataclass structuring is now ~25% faster.
- Fix an issue structuring bare
typing.List
s on Pythons lower than 3.9. (#209) - Fix structuring of non-parametrized containers like
list/dict/...
on Pythons lower than 3.9. (#218) - Fix structuring bare
typing.Tuple
on Pythons lower than 3.9. (#218) - Fix a wrong
AttributeError
of an missing__parameters__
attribute. This could happen when inheriting certain generic classes – for exampletyping.*
classes are affected. (#217) - Fix structuring of
enum.Enum
instances intyping.Literal
types. (#231) - Fix unstructuring all tuples - unannotated, variable-length, homogenous and heterogenous - to
list
. (#226) - For
forbid_extra_keys
raise customForbiddenExtraKeyError
instead of genericException
. (#225) - All preconf converters now support
loads
anddumps
directly. See an example here. - Fix mappings with byte keys for the orjson, bson and tomlkit converters. (#241)
- Add PEP 563 (string annotations) support for dataclasses. (#195)
- Fix handling of dictionaries with string Enum keys for bson, orjson, and tomlkit.
- Rename the
cattr.gen.make_dict_unstructure_fn.omit_if_default
parameter to_cattrs_omit_if_default
, for consistency. Theomit_if_default
parameters toGenConverter
andoverride
are unchanged. - Following the changes in attrs 21.3.0, add a
cattrs
package mirroring the existingcattr
package. Both package names may be used as desired, and thecattr
package isn't going away.
- Python 3.10 support, including support for the new union syntax (
A | B
vsUnion[A, B]
). - The
GenConverter
can now properly structure generic classes with generic collection fields. (#149) omit=True
now also affects generated structuring functions. (#166)cattr.gen.{make_dict_structure_fn, make_dict_unstructure_fn}
now resolve type annotations automatically when PEP 563 is used. (#169)- Protocols are now unstructured as their runtime types. (#177)
- Fix an issue generating structuring functions with renaming and
_cattrs_forbid_extra_keys=True
. (#190)
- Fix
GenConverter
mapping structuring for unannotated dicts on Python 3.8. (#151) - The source code for generated un/structuring functions is stored in the
linecache
cache, which enables more informative stack traces when un/structuring errors happen using theGenConverter
. This behavior can optionally be disabled to save memory. - Support using the attr converter callback during structure.
By default, this is a method of last resort, but it can be elevated to the default by setting
prefer_attrib_converters=True
onConverter
orGenConverter
. (#138) - Fix structuring recursive classes. (#159)
- Converters now support un/structuring hook factories. This is the most powerful and complex venue for customizing un/structuring. This had previously been an internal feature.
- The Common Usage Examples documentation page now has a section on advanced hook factory usage.
cattr.override
now supports theomit
parameter, which makes cattrs skip the atribute entirely when unstructuring.- The
cattr.preconf.bson
module is now tested against thebson
module bundled with thepymongo
package, because that package is much more popular than the standalone PyPIbson
package.
Literal
s are not supported on Python 3.9.0 (supported on 3.9.1 and later), so we skip importing them there. (#150)
cattr.global_converter
(which providescattr.unstructure
,cattr.structure
etc.) is now an instance ofcattr.GenConverter
.Literal
s are now supported and validated when structuring.- Fix dependency metadata information for attrs. (#147)
- Fix
GenConverter
mapping structuring for unannotated dicts. (#148)
- cattrs now uses Poetry.
GenConverter
mapping structuring is now ~25% faster, and unstructuring heterogenous tuples is significantly faster.- Add
cattr.preconf
. This package contains modules for making converters for particular serialization libraries. We currently support the standard libraryjson
, and third-partyujson
,orjson
,msgpack
,bson
,pyyaml
andtomlkit
libraries.
- Fix an issue with
GenConverter
unstructuring attrs classes and dataclasses with generic fields. (#65) GenConverter
has support for easy overriding of collection unstructuring types (for example, unstructure all sets to lists) through itsunstruct_collection_overrides
argument. (#137)- Unstructuring mappings with
GenConverter
is significantly faster. GenConverter
supports strict handling of unexpected dictionary keys through itsforbid_extra_keys
argument. (#142)
- Fix an issue with
GenConverter
un/structuring hooks when a function hook is registered after the converter has already been used. - Add support for
collections.abc.{Sequence, MutableSequence, Set, MutableSet}
. These should be used on 3.9+ instead of theirtyping
alternatives, which are deprecated. (#128) - The
GenConverter
will unstructure iterables (list[T]
,tuple[T, ...]
,set[T]
) using their type argument instead of the runtime class if its elements, if possible. These unstructuring operations are up to 40% faster. (#129) - Flesh out
Converter
andGenConverter
initializer type annotations. (#131) - Add support for
typing.Annotated
on Python 3.9+. cattrs will use the first annotation present. cattrs specific annotations may be added in the future. (#127) - Add support for dataclasses. (#43)
- cattrs now has a benchmark suite to help make and keep cattrs the fastest it can be. The instructions on using it can be found under the Benchmarking section in the docs. (#123)
- Fix an issue unstructuring tuples of non-primitives. (#125)
- cattrs now calls
attr.resolve_types
on attrs classes when registering un/structuring hooks. GenConverter
structuring and unstructuring of attrs classes is significantly faster.
converter.unstructure
now supports an optional parameter,unstructure_as
, which can be used to unstructure something as a different type. Useful for unions.- Improve support for union un/structuring hooks. Flesh out docs for advanced union handling. (#115)
- Fix
GenConverter
behavior with inheritance hierarchies of attrs classes. ([#117](python-attrs#117 #116) - Refactor
GenConverter.un/structure_attrs_fromdict
intoGenConverter.gen_un/structure_attrs_fromdict
to allow calling back toConverter.un/structure_attrs_fromdict
without sideeffects. (#118)
- The default disambiguator will not consider non-required fields any more. (#108)
- Fix a couple type annotations. (#107 #105)
- Fix a
GenConverter
unstructuring issue and tests.
- Add metadata for supported Python versions. (#103)
- Python 2, 3.5 and 3.6 support removal. If you need it, use a version below 1.1.0.
- Python 3.9 support, including support for built-in generic types (
list[int]
vstyping.List[int]
). - cattrs now includes functions to generate specialized structuring and unstructuring hooks. Specialized hooks are faster and support overrides (
omit_if_default
andrename
). See thecattr.gen
module. - cattrs now includes a converter variant,
cattr.GenConverter
, that automatically generates specialized hooks for attrs classes. This converter will become the default in the future. - Generating specialized structuring hooks now invokes attr.resolve_types on a class if the class makes use of the new PEP 563 annotations.
- cattrs now depends on attrs >= 20.1.0, because of
attr.resolve_types
. - Specialized hooks now support generic classes. The default converter will generate and use a specialized hook upon encountering a generic class.
- attrs classes with private attributes can now be structured by default.
- Structuring from dictionaries is now more lenient: extra keys are ignored.
- cattrs has improved type annotations for use with Mypy.
- Unstructuring sets and frozensets now works properly.
- Python 3.8 support.
- Python 3.7 support.
- The disambiguation function generator now supports unions of attrs classes and NoneType.
- Distribution fix.
- Removed the undocumented
Converter.unstruct_strat
property setter. - Removed the ability to set the
Converter.structure_attrs
instance field. - Some micro-optimizations were applied; a
structure(unstructure(obj))
roundtrip is now up to 2 times faster.
- Packaging fixes. (#17)
- structure/unstructure now supports using functions as well as classes for deciding the appropriate function.
- added
Converter.register_structure_hook_func
, to register a function instead of a class for determining handler func. - added
Converter.register_unstructure_hook_func
, to register a function instead of a class for determining handler func. - vendored typing is no longer needed, nor provided.
- Attributes with default values can now be structured if they are missing in the input. (#15)
Optional
attributes can no longer be structured if they are missing in the input.cattr.typed
removed since the functionality is now present in attrs itself. Replace instances ofcattr.typed(type)
withattr.ib(type=type)
.
Converter.loads
is nowConverter.structure
, andConverter.dumps
is nowConverter.unstructure
.- Python 2.7 is supported.
- Moved
cattr.typing
tocattr.vendor.typing
to support different vendored versions of typing.py for Python 2 and Python 3. - Type metadata can be added to attrs classes using
cattr.typed
.
- Python 3.4 is no longer supported.
- Introduced
cattr.typing
for use with Python versions 3.5.2 and 3.6.0. - Minor changes to work with newer versions of
typing
. - Bare Optionals are not supported any more (use
Optional[Any]
). - Attempting to load unrecognized classes will result in a ValueError, and a helpful message to register a loads hook.
- Loading attrs classes is now documented.
- The global converter is now documented.
cattr.loads_attrs_fromtuple
andcattr.loads_attrs_fromdict
are now exposed.
- Tests and documentation.
- First release on PyPI.