From 9f0d5c473bd1ba066fdea04d4e39727090249d11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tin=20Tvrtkovi=C4=87?= Date: Wed, 24 Jul 2024 23:24:34 +0200 Subject: [PATCH] Fix collections.abc.Mapping handling on 3.8 --- src/cattrs/_compat.py | 4 ++-- src/cattrs/converters.py | 45 ++++++++++++++++++---------------------- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/src/cattrs/_compat.py b/src/cattrs/_compat.py index 7b26dfd5..027ef477 100644 --- a/src/cattrs/_compat.py +++ b/src/cattrs/_compat.py @@ -1,5 +1,7 @@ import sys from collections import deque +from collections.abc import Mapping as AbcMapping +from collections.abc import MutableMapping as AbcMutableMapping from collections.abc import MutableSet as AbcMutableSet from collections.abc import Set as AbcSet from dataclasses import MISSING, Field, is_dataclass @@ -219,8 +221,6 @@ def get_final_base(type) -> Optional[type]: if sys.version_info >= (3, 9): from collections import Counter - from collections.abc import Mapping as AbcMapping - from collections.abc import MutableMapping as AbcMutableMapping from collections.abc import MutableSequence as AbcMutableSequence from collections.abc import MutableSet as AbcMutableSet from collections.abc import Sequence as AbcSequence diff --git a/src/cattrs/converters.py b/src/cattrs/converters.py index 65bac0d8..e4653fb3 100644 --- a/src/cattrs/converters.py +++ b/src/cattrs/converters.py @@ -1,6 +1,8 @@ from __future__ import annotations from collections import Counter, deque +from collections.abc import Mapping as AbcMapping +from collections.abc import MutableMapping as AbcMutableMapping from collections.abc import MutableSet as AbcMutableSet from dataclasses import Field from enum import Enum @@ -288,12 +290,10 @@ def unstruct_strat(self) -> UnstructureStrategy: ) @overload - def register_unstructure_hook(self) -> Callable[[UnstructureHook], None]: - ... + def register_unstructure_hook(self) -> Callable[[UnstructureHook], None]: ... @overload - def register_unstructure_hook(self, cls: Any, func: UnstructureHook) -> None: - ... + def register_unstructure_hook(self, cls: Any, func: UnstructureHook) -> None: ... def register_unstructure_hook( self, cls: Any = None, func: UnstructureHook | None = None @@ -341,26 +341,22 @@ def register_unstructure_hook_func( @overload def register_unstructure_hook_factory( self, predicate: Predicate - ) -> Callable[[UnstructureHookFactory], UnstructureHookFactory]: - ... + ) -> Callable[[UnstructureHookFactory], UnstructureHookFactory]: ... @overload def register_unstructure_hook_factory( self, predicate: Predicate - ) -> Callable[[ExtendedUnstructureHookFactory], ExtendedUnstructureHookFactory]: - ... + ) -> Callable[[ExtendedUnstructureHookFactory], ExtendedUnstructureHookFactory]: ... @overload def register_unstructure_hook_factory( self, predicate: Predicate, factory: UnstructureHookFactory - ) -> UnstructureHookFactory: - ... + ) -> UnstructureHookFactory: ... @overload def register_unstructure_hook_factory( self, predicate: Predicate, factory: ExtendedUnstructureHookFactory - ) -> ExtendedUnstructureHookFactory: - ... + ) -> ExtendedUnstructureHookFactory: ... def register_unstructure_hook_factory(self, predicate, factory=None): """ @@ -429,12 +425,10 @@ def get_unstructure_hook( ) @overload - def register_structure_hook(self) -> Callable[[StructureHook], None]: - ... + def register_structure_hook(self) -> Callable[[StructureHook], None]: ... @overload - def register_structure_hook(self, cl: Any, func: StructuredValue) -> None: - ... + def register_structure_hook(self, cl: Any, func: StructuredValue) -> None: ... def register_structure_hook( self, cl: Any, func: StructureHook | None = None @@ -484,26 +478,22 @@ def register_structure_hook_func( @overload def register_structure_hook_factory( self, predicate: Predicate - ) -> Callable[[StructureHookFactory, StructureHookFactory]]: - ... + ) -> Callable[[StructureHookFactory, StructureHookFactory]]: ... @overload def register_structure_hook_factory( self, predicate: Predicate - ) -> Callable[[ExtendedStructureHookFactory, ExtendedStructureHookFactory]]: - ... + ) -> Callable[[ExtendedStructureHookFactory, ExtendedStructureHookFactory]]: ... @overload def register_structure_hook_factory( self, predicate: Predicate, factory: StructureHookFactory - ) -> StructureHookFactory: - ... + ) -> StructureHookFactory: ... @overload def register_structure_hook_factory( self, predicate: Predicate, factory: ExtendedStructureHookFactory - ) -> ExtendedStructureHookFactory: - ... + ) -> ExtendedStructureHookFactory: ... def register_structure_hook_factory(self, predicate, factory=None): """ @@ -1302,7 +1292,12 @@ def gen_structure_counter(self, cl: Any) -> MappingStructureFn[T]: def gen_structure_mapping(self, cl: Any) -> MappingStructureFn[T]: structure_to = get_origin(cl) or cl - if structure_to in (MutableMapping, Mapping): # These default to dicts + if structure_to in ( + MutableMapping, + AbcMutableMapping, + Mapping, + AbcMapping, + ): # These default to dicts structure_to = dict h = make_mapping_structure_fn( cl, self, structure_to, detailed_validation=self.detailed_validation