python-dataclasses-serialization icon indicating copy to clipboard operation
python-dataclasses-serialization copied to clipboard

Cannot deserialize type typing.Dict

Open dotlambda opened this issue 3 years ago • 0 comments

____________________ TestJSON.test_json_serialization_types ____________________

self = Serializer(serialization_functions=RefinementDict(lookup={<class 'dict'>: <function <lambda> at 0x7ffff67221f0>, <clas...7ffff680eca0>), is_subset=<function issubclass at 0x7ffff680eca0>, is_element=<function issubclass at 0x7ffff680eca0>))
cls = typing.Dict, serialized_obj = {'name': 'Fred'}

    @curry
    def deserialize(self, cls, serialized_obj):
        """
        Attempt to deserialize serialized object as given type
        """

        try:
>           deserialization_func = self.deserialization_functions[cls]

dataclasses_serialization/serializer_base/serializer.py:62:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = RefinementDict(lookup={<class 'dict'>: <function <lambda> at 0x7ffff6722310>, <class 'list'>: <function <lambda> at 0x...x7ffff680eca0>), is_subset=<function issubclass at 0x7ffff680eca0>, is_element=<function issubclass at 0x7ffff680eca0>)
key = typing.Dict

    def __getitem__(self, key):
        for order in self.dependency_orders:
            ancestors = {st for st in order if self.is_element(key, st)}

            if len(ancestors) > 1:
                raise AmbiguousKeyError(f"{key!r} in all of {ancestors!r}")

            if ancestors:
                return self.lookup[ancestors.pop()]

        if self.fallback is not None:
>           return self.fallback[key]

dataclasses_serialization/serializer_base/refinement_dict.py:63:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = RefinementDict(lookup={<function dataclass at 0x7ffff697cca0>: <function dict_to_dataclass at 0x7ffff68d9670>, typing...., fallback=None, is_subset=<function issubclass at 0x7ffff680eca0>, is_element=<function issubclass at 0x7ffff680eca0>)
key = typing.Dict

    def __getitem__(self, key):
        for order in self.dependency_orders:
            ancestors = {st for st in order if self.is_element(key, st)}

            if len(ancestors) > 1:
                raise AmbiguousKeyError(f"{key!r} in all of {ancestors!r}")

            if ancestors:
                return self.lookup[ancestors.pop()]

        if self.fallback is not None:
            return self.fallback[key]

>       raise KeyError(f"{key!r}")
E       KeyError: 'typing.Dict'

dataclasses_serialization/serializer_base/refinement_dict.py:65: KeyError

During handling of the above exception, another exception occurred:

self = <tests.test_json.TestJSON testMethod=test_json_serialization_types>

    def test_json_serialization_types(self):
        test_cases = [
            (int, 1, 1),
            (float, 1.0, 1.0),
            (str, "Fred", "Fred"),
            (bool, True, True),
            (dict, {'name': "Fred"}, {'name': "Fred"}),
            (Dict, {'name': "Fred"}, {'name': "Fred"}),
            (Dict[str, Person], {'abc123': Person("Fred")}, {'abc123': {'name': "Fred"}}),
            (list, [{'name': "Fred"}], [{'name': "Fred"}]),
            (List, [{'name': "Fred"}], [{'name': "Fred"}]),
            (List[Person], [Person("Fred")], [{'name': "Fred"}]),
            (Union[int, Person], 1, 1),
            (Union[int, Person], Person("Fred"), {'name': "Fred"}),
            (Union[Song, Person], Person("Fred"), {'name': "Fred"}),
            (type(None), None, None)
        ]

        for type_, obj, serialized_obj in test_cases:
            with self.subTest("Serialize object", obj=obj):
                self.assertEqual(serialized_obj, JSONSerializer.serialize(obj))

            with self.subTest("Deserialize object", obj=obj):
>               self.assertEqual(obj, JSONSerializer.deserialize(type_, serialized_obj))

tests/test_json.py:52:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/nix/store/kpf97qpxp10675aw0kydwf5k7ksindqy-python3.9-toolz-0.11.2/lib/python3.9/site-packages/toolz/functoolz.py:306: in __call__
    return self._partial(*args, **kwargs)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = Serializer(serialization_functions=RefinementDict(lookup={<class 'dict'>: <function <lambda> at 0x7ffff67221f0>, <clas...7ffff680eca0>), is_subset=<function issubclass at 0x7ffff680eca0>, is_element=<function issubclass at 0x7ffff680eca0>))
cls = typing.Dict, serialized_obj = {'name': 'Fred'}

    @curry
    def deserialize(self, cls, serialized_obj):
        """
        Attempt to deserialize serialized object as given type
        """

        try:
            deserialization_func = self.deserialization_functions[cls]
        except KeyError:
>           raise DeserializationError("Cannot deserialize type {}".format(cls))
E           dataclasses_serialization.serializer_base.errors.DeserializationError: Cannot deserialize type typing.Dict

dataclasses_serialization/serializer_base/serializer.py:64: DeserializationError

dotlambda avatar May 26 '22 17:05 dotlambda