def filter(cls, **query_args): """Finds data entries from storage as list of Model instances :param: query_args - a dict holding query conditions like {'id': 123} :returns: list with Model instances or empty list if no match """ retval = [] storage = StorageForge() model_name = cls.get_model_name() values_list = storage.filter(model_name, **query_args) for values in values_list: retval.append(cls(**values)) return retval
def __init__(self, **values): """During initialization it is possible to set all Fields To set Field values during Model initialization time a dict of field names and values is required in such form: {<field-name>: <value>} """ if values: for name, value in values.items(): field = getattr(self, name) # FIXME field value gets overwritten when creating multiple # instances field.put_value(value) self.storage = StorageForge()
class Model(object): """Provides Model for storing and managing data to initiate model one needs to subclass from Model class and use Field class data-type-methods to define Model. This alows data validation and control when assigning values to Model instance. Also this class implements ``sync`` method which synchronises data schema with actual data storage. """ def __new__(cls, **kwargs): user_model_inst = super(Model, cls).__new__(cls, **kwargs) return user_model_inst def __setattr__(self, name, value): """Here we define how user values should be assigned When Field does not exists by name it will be added :param: name - string name of an Field :param: value - data value which gets passed to Field """ field = self._introspect(name=name) if field: field = field[name].put_value(value) else: super(Model, self).__setattr__(name, value) def __init__(self, **values): """During initialization it is possible to set all Fields To set Field values during Model initialization time a dict of field names and values is required in such form: {<field-name>: <value>} """ if values: for name, value in values.items(): field = getattr(self, name) # FIXME field value gets overwritten when creating multiple # instances field.put_value(value) self.storage = StorageForge() def save(self): """Here is where value of Field gets stored in actual storage All Field values are collected here and passed to storage back-end where these get saved according to earlier Model definition which was synced with storage. """ values = [] fields = self._introspect() for name, field in fields.items(): attr = getattr(self, name) values.append(attr) model_name = self.get_model_name() self.storage.save(model_name, values) @classmethod def filter(cls, **query_args): """Finds data entries from storage as list of Model instances :param: query_args - a dict holding query conditions like {'id': 123} :returns: list with Model instances or empty list if no match """ retval = [] storage = StorageForge() model_name = cls.get_model_name() values_list = storage.filter(model_name, **query_args) for values in values_list: retval.append(cls(**values)) return retval @classmethod def sync(cls): """Synchronizes Model with Storage""" fields = cls._introspect() storage = StorageForge() model_name = cls.get_model_name() storage.sync(model_name, fields) @classmethod def flush(cls): """Deletes all Model entries in storage""" fields = cls._introspect() storage = StorageForge() model_name = cls.get_model_name() storage.flush(model_name) @classmethod def _introspect(cls, name=None): """Looks for defined Field in the Model definition :param: name - string name of specific Field (optional) :returns: dict of {'name': Field,} or first matched Field if ``name`` given """ fields = {} for attr_name in dir(cls): attr = getattr(cls, attr_name) if isinstance(attr, Field): if name is not None: if attr_name == name: return {attr_name: attr} else: fields[attr_name] = attr return fields @classmethod def get_model_name(cls): """Gets name of model in lower case :returns: name - string name of the model """ return cls.__name__.lower()
def flush(cls): """Deletes all Model entries in storage""" fields = cls._introspect() storage = StorageForge() model_name = cls.get_model_name() storage.flush(model_name)
def sync(cls): """Synchronizes Model with Storage""" fields = cls._introspect() storage = StorageForge() model_name = cls.get_model_name() storage.sync(model_name, fields)