Ejemplo n.º 1
0
def _build_value(type_: Type, data: Any, config: Config) -> Any:
    if is_union(type_):
        return _build_value_for_union(union=type_, data=data, config=config)
    elif is_generic_collection(type_) and is_instance(data, extract_origin_collection(type_)):
        return _build_value_for_collection(collection=type_, data=data, config=config)
    elif is_dataclass(type_) and is_instance(data, Data):
        return from_dict(data_class=type_, data=data, config=config)
    return data
Ejemplo n.º 2
0
def _build_value_for_collection(collection: Type, data: Any,
                                config: Config) -> Any:
    collection_cls = extract_origin_collection(collection)
    if is_instance(data, Mapping):
        return collection_cls(
            (key,
             _build_value(type_=extract_generic(collection)[1],
                          data=value,
                          config=config)) for key, value in data.items())
    return collection_cls(
        _build_value(
            type_=extract_generic(collection)[0], data=item, config=config)
        for item in data)
Ejemplo n.º 3
0
def _build_value_for_collection(collection: Type, data: Any,
                                config: Config) -> Any:
    generic = extract_generic(collection)

    if is_instance(data, Mapping):
        return data.__class__(
            (key, _build_value(type_=generic[1], data=value, config=config))
            for key, value in data.items())

    collection_type = extract_origin_collection(collection)
    if collection_type == tuple and not (len(generic) == 2
                                         and generic[1] == Ellipsis):
        return data.__class__(
            _build_value(type_=item_type, data=item, config=config)
            for item, item_type in zip(data, generic))

    return data.__class__(
        _build_value(type_=generic[0], data=item, config=config)
        for item in data)
Ejemplo n.º 4
0
def test_extract_generic_collection():
    assert extract_origin_collection(List[int]) == list