Skip to content

Commit

Permalink
Allow all types to be used in field mapping
Browse files Browse the repository at this point in the history
  • Loading branch information
oxan committed Sep 26, 2022
1 parent 08eb78b commit be6359b
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 0 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.rst
@@ -1,5 +1,13 @@
1.2.0, TBD
----------
Features & fixes:

* Allow all types, including special forms, to be used in ``serializer_field_mapping``.

1.1.1, 25 January 2021
----------------------
Features & fixes:

* Fix usage of PEP 585 generics with forward references (e.g. ``list["str"]``).
* Fix usage of ``allow_empty`` with ``many=True``.

Expand Down
4 changes: 4 additions & 0 deletions rest_framework_dataclasses/field_utils.py
Expand Up @@ -89,6 +89,10 @@ def get_relation_info(type_info: TypeInfo) -> RelationInfo:


def lookup_type_in_mapping(mapping: typing.Dict[type, T], key: type) -> T:
# Allow all types, including special forms, to be used when they're present in the mapping
if key in mapping:
return mapping[key]

try:
# _SpecialForm types like Literal, NoReturn don't have an __mro__ attribute
bases = inspect.getmro(key)
Expand Down
25 changes: 25 additions & 0 deletions tests/test_field_utils.py
@@ -0,0 +1,25 @@
import unittest
import typing

from rest_framework_dataclasses import field_utils
from rest_framework_dataclasses.types import Literal


class FieldUtilsTest(unittest.TestCase):
def test_lookup_type(self):
mapping = {
str: 1,
int: 2,
typing.Union[int, str]: 3
}

self.assertEqual(field_utils.lookup_type_in_mapping(mapping, str), 1)
self.assertEqual(field_utils.lookup_type_in_mapping(mapping, int), 2)
self.assertEqual(field_utils.lookup_type_in_mapping(mapping, typing.Union[int, str]), 3)

self.assertEqual(field_utils.lookup_type_in_mapping(mapping, type('email', (str, ), {})), 1)

with self.assertRaises(KeyError):
field_utils.lookup_type_in_mapping(mapping, float)
with self.assertRaises(KeyError):
field_utils.lookup_type_in_mapping(mapping, Literal['a', 'b'])

0 comments on commit be6359b

Please sign in to comment.