Source code for appstoreserverlibrary.models.LibraryUtility
# Copyright (c) 2023 Apple Inc. Licensed under MIT License.
from enum import EnumMeta
from functools import lru_cache
from typing import Any, List, Type, TypeVar
from attr import Attribute, has, ib, fields
from cattr import override
from cattrs.gen import make_dict_structure_fn, make_dict_unstructure_fn, override
import cattrs
T = TypeVar('T')
metadata_key = 'correspondingFieldName'
metadata_type_key = 'typeOfField'
[docs]
class AttrsRawValueAware:
def __attrs_post_init__(self):
attr_fields: List[Attribute] = fields(type(self))
for attribute in attr_fields:
if metadata_type_key not in attribute.metadata or attribute.metadata[metadata_type_key] != 'raw':
continue
field: str = attribute.metadata.get(metadata_key)
rawField = 'raw' + field[0].upper() + field[1:]
rawValue = getattr(self, rawField)
value = getattr(self, field)
if rawValue is not None:
setattr(self, rawField, rawValue)
elif value is not None:
setattr(self, field, value)
@lru_cache(maxsize=None)
def _get_cattrs_converter(destination_class: Type[T]) -> cattrs.Converter:
c = cattrs.Converter()
attributes: List[Attribute] = fields(destination_class)
cattrs_overrides = {}
for attribute in attributes:
if metadata_type_key in attribute.metadata:
matching_name: str = attribute.metadata[metadata_key]
if attribute.metadata[metadata_type_key] == 'raw':
cattrs_overrides[matching_name] = override(omit=True)
raw_field = 'raw' + matching_name[0].upper() + matching_name[1:]
cattrs_overrides[raw_field] = override(rename=matching_name)
c.register_structure_hook_factory(has, lambda cl: make_dict_structure_fn(cl, c, **cattrs_overrides))
c.register_unstructure_hook_factory(has, lambda cl: make_dict_unstructure_fn(cl, c, **cattrs_overrides))
return c