misc/blackmesa/records/handlers.py
2021-06-02 10:24:33 +02:00

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