57 lines
1.5 KiB
Python
57 lines
1.5 KiB
Python
|
|
## Wrapper to handle some sort of record baseclass
|
|
class RecordHandler:
|
|
""" handler for a record type
|
|
|
|
defines how a record can be created, and how to retrieve all field names, and the required ones.
|
|
"""
|
|
|
|
@classmethod
|
|
def wrap(cls, klass):
|
|
return cls(klass)
|
|
|
|
def __init__(self, klass):
|
|
self.klass = klass
|
|
|
|
def create(self, **kwargs):
|
|
return self.klass(**kwargs)
|
|
|
|
def get_field_names(self):
|
|
return self.klass.__dict__.keys()
|
|
|
|
@property
|
|
def record(self):
|
|
return self.klass
|
|
|
|
@property
|
|
def required_arguments(self):
|
|
return self.get_field_names()
|
|
|
|
|
|
class RecordDictHandler(RecordHandler):
|
|
""" RecordHandler that outputs a dictionary """
|
|
|
|
def __init__(self, klass=None):
|
|
# it is not required to define dict, but you could do OrderedDict e.g.
|
|
self.klass = klass or dict
|
|
|
|
def get_field_names(self):
|
|
# dictionary has no required fields.
|
|
return []
|
|
|
|
class RecordDataclassHandler(RecordHandler):
|
|
""" handles dataclasses.dataclass derivatives """
|
|
|
|
def create(self, **kwargs):
|
|
# clean field names to be only valid if they are on the dataclass.
|
|
record_fields = self.get_field_names()
|
|
kwargs = {k: v for k, v in kwargs.items() if k in record_fields}
|
|
return self.klass(**kwargs)
|
|
|
|
def get_field_names(self):
|
|
return list(self.klass.__dataclass_fields__.keys())
|
|
|
|
# @TODO: namedtuple - dynamic generation?
|
|
# @TODO: RecordPydanticHAndler
|
|
# @TODO: RecordAttrsHandler
|