Dict inflator and deflator support

This commit is contained in:
2026-02-19 22:39:56 +03:00
parent 8e38c41aa5
commit 9267f744d8
7 changed files with 198 additions and 17 deletions

View File

@@ -1,6 +1,7 @@
from __future__ import annotations
import json
import uuid
from dataclasses import dataclass
from enum import Enum
from typing import Optional, get_type_hints
@@ -66,6 +67,52 @@ def test_optional():
assert c.a is None
def test_uuid():
@dataclass
class K:
a: uuid.UUID
b: list[uuid.UUID]
c: Optional[uuid.UUID]
d: dict[uuid.UUID, uuid.UUID]
infl = SchemaInflatorGenerator(store_sources=True)
defl = SchemaDeflatorGenerator(store_sources=True)
infl_fn = infl.schema_to_inflator(K)
defl_fn = defl.schema_to_deflator(K)
okd = {
'a': str(uuid.uuid4()),
'b': [str(uuid.uuid4()), str(uuid.uuid4()), str(uuid.uuid4())],
'c': None,
'd': {str(uuid.uuid4()): str(uuid.uuid4()), str(uuid.uuid4()): str(uuid.uuid4())}
}
k = infl_fn(okd)
kd = defl_fn(k)
assert isinstance(kd['a'], str)
assert isinstance(kd['b'], list)
assert len(kd['b']) == 3
assert isinstance(kd['b'][0], str)
assert isinstance(kd['b'][1], str)
assert isinstance(kd['b'][2], str)
assert kd['c'] is None
assert isinstance(kd['d'], dict)
assert len(kd['d']) == 2
assert all(map(lambda x: isinstance(x, str), kd['d'].keys()))
assert all(map(lambda x: isinstance(x, str), kd['d'].values()))
assert isinstance(k.a, uuid.UUID)
assert isinstance(k.b[0], uuid.UUID)
assert isinstance(k.b[1], uuid.UUID)
assert isinstance(k.b[2], uuid.UUID)
assert k.c is None
assert isinstance(k.d, dict)
assert len(k.d) == 2
assert all(map(lambda x: isinstance(x, uuid.UUID), k.d.keys()))
assert all(map(lambda x: isinstance(x, uuid.UUID), k.d.values()))
class AEnum(Enum):
a = 'a'
b = 'b'