diff --git a/indico/types/base.py b/indico/types/base.py index 4412f0de..39ac588c 100644 --- a/indico/types/base.py +++ b/indico/types/base.py @@ -1,7 +1,7 @@ import inspect import json from datetime import datetime -from typing import TYPE_CHECKING, Any, List, cast +from typing import TYPE_CHECKING, Any, List, cast, get_origin from indico.types.utils import cc_to_snake @@ -38,6 +38,7 @@ def valid_type(v: "Any") -> bool: return ( (inspect.isclass(v) and issubclass(v, BaseType)) or v in [str, int, float, bool, JSONType, datetime] + or get_origin(v) is dict or valid_type(list_subtype(v)) ) diff --git a/tests/unit/types/test_base_type.py b/tests/unit/types/test_base_type.py index 13c4b40b..3d7bd06b 100644 --- a/tests/unit/types/test_base_type.py +++ b/tests/unit/types/test_base_type.py @@ -1,5 +1,5 @@ from datetime import datetime -from typing import List +from typing import Dict, List from indico.types.base import BaseType, JSONType @@ -97,3 +97,12 @@ class A(BaseType): x = A(**{"createdAt": "1590169591.582852"}) assert x.created_at == datetime.fromtimestamp(1590169591.582852) + + +def test_generic_dict_field(): + class A(BaseType): + meta: Dict[str, str] + + x = A(meta={"foo": "bar"}) + + assert x.meta == {"foo": "bar"}