open source
This commit is contained in:
parent
70b6e17c69
commit
a93bfc1ec9
61 changed files with 4013 additions and 126 deletions
|
|
@ -1,17 +1,17 @@
|
|||
import pydantic
|
||||
|
||||
class BaseModel(pydantic.BaseModel):
|
||||
|
||||
class BaseModel(pydantic.BaseModel):
|
||||
def __init__(self, **data):
|
||||
for key, value in data.items():
|
||||
if isinstance(value, dict):
|
||||
if 'type' in value:
|
||||
if "type" in value:
|
||||
data[key] = TypedModel.parse_obj(value)
|
||||
super().__init__(**data)
|
||||
|
||||
|
||||
# Adapted from https://github.com/pydantic/pydantic/discussions/3091
|
||||
class TypedModel(BaseModel):
|
||||
|
||||
_subtypes_ = []
|
||||
|
||||
def __init_subclass__(cls, type=None):
|
||||
|
|
@ -22,31 +22,30 @@ class TypedModel(BaseModel):
|
|||
for t, cls in _cls._subtypes_:
|
||||
if t == type:
|
||||
return cls
|
||||
raise ValueError(f'Unknown type {type}')
|
||||
|
||||
raise ValueError(f"Unknown type {type}")
|
||||
|
||||
@classmethod
|
||||
def get_type(_cls, cls_name):
|
||||
for t, cls in _cls._subtypes_:
|
||||
if cls.__name__ == cls_name:
|
||||
return t
|
||||
raise ValueError(f'Unknown class {cls_name}')
|
||||
|
||||
raise ValueError(f"Unknown class {cls_name}")
|
||||
|
||||
@classmethod
|
||||
def parse_obj(cls, obj):
|
||||
data_type = obj.get('type')
|
||||
data_type = obj.get("type")
|
||||
if data_type is None:
|
||||
raise ValueError(f'type is required for {cls.__name__}')
|
||||
|
||||
raise ValueError(f"type is required for {cls.__name__}")
|
||||
|
||||
sub = cls.get_cls(data_type)
|
||||
if sub is None:
|
||||
raise ValueError(f'Unknown type {data_type}')
|
||||
raise ValueError(f"Unknown type {data_type}")
|
||||
return sub(**obj)
|
||||
|
||||
def _iter(self, **kwargs):
|
||||
yield 'type', self.get_type(self.__class__.__name__)
|
||||
yield "type", self.get_type(self.__class__.__name__)
|
||||
yield from super()._iter(**kwargs)
|
||||
|
||||
@property
|
||||
def type(self):
|
||||
return self.get_type(self.__class__.__name__)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue