Burathar
4 years ago
3 changed files with 104 additions and 0 deletions
@ -0,0 +1,17 @@ |
|||||||
|
from pathlib import Path |
||||||
|
from biscd import config |
||||||
|
from biscd.models import YamlSerializable |
||||||
|
|
||||||
|
class Project(YamlSerializable): |
||||||
|
@property |
||||||
|
def _storage_file(self): |
||||||
|
return Path(config.config_dir()) / 'users.yaml' |
||||||
|
|
||||||
|
@property |
||||||
|
def _yaml_object_name(self): |
||||||
|
return 'users' |
||||||
|
|
||||||
|
def __init__(self, name=None, password=None, email=None): |
||||||
|
self.name = name |
||||||
|
self.password = password |
||||||
|
self.email = email |
@ -0,0 +1,82 @@ |
|||||||
|
from abc import ABCMeta, abstractmethod |
||||||
|
import yaml |
||||||
|
|
||||||
|
class MyMeta(metaclass=ABCMeta): |
||||||
|
required_attributes = [] |
||||||
|
|
||||||
|
def __call__(self, *args, **kwargs): |
||||||
|
obj = super(MyMeta, self).__call__(*args, **kwargs) |
||||||
|
for attr_name in obj.required_attributes: |
||||||
|
if not getattr(obj, attr_name): |
||||||
|
raise ValueError('required attribute (%s) not set' % attr_name) |
||||||
|
return obj |
||||||
|
|
||||||
|
class YamlSerializable(object, metaclass=MyMeta): |
||||||
|
required_attributes = ['name'] |
||||||
|
|
||||||
|
@abstractmethod |
||||||
|
def __init__(self): |
||||||
|
pass |
||||||
|
|
||||||
|
@property |
||||||
|
@abstractmethod |
||||||
|
def _storage_file(self): |
||||||
|
pass |
||||||
|
|
||||||
|
@property |
||||||
|
@abstractmethod |
||||||
|
def _yaml_object_name(self): |
||||||
|
pass |
||||||
|
|
||||||
|
@property |
||||||
|
def config_dict(self): |
||||||
|
ymlserializable_dict = self.__dict__.copy() |
||||||
|
ymlserializable_dict.pop('name') |
||||||
|
return {self.name: ymlserializable_dict} |
||||||
|
|
||||||
|
def save(self): |
||||||
|
if self.name is None: |
||||||
|
raise TypeError("Name cannot be None") |
||||||
|
ymlserializables = self._get_all_from_file() |
||||||
|
if self.name in ([*ymlserializable][0] for ymlserializable in ymlserializables): |
||||||
|
ymlserializables[self.name] = self.config_dict |
||||||
|
else: |
||||||
|
ymlserializables.append(self.config_dict) |
||||||
|
print(ymlserializables) |
||||||
|
self._save_all_to_file(ymlserializables) |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def get(cls, name): |
||||||
|
ymlserializable_dict = next(ymlserializable for ymlserializable in cls._get_all_from_file() if [*ymlserializable][0] == name) |
||||||
|
if ymlserializable_dict is None: |
||||||
|
return None |
||||||
|
ymlserializable_name = [*ymlserializable_dict][0] |
||||||
|
ymlserializable_dict = ymlserializable_dict.get(ymlserializable_name) |
||||||
|
|
||||||
|
ymlserializable_dict['name'] = ymlserializable_name |
||||||
|
|
||||||
|
ymlserializable = cls() |
||||||
|
ymlserializable.__dict__ = ymlserializable_dict |
||||||
|
return ymlserializable |
||||||
|
|
||||||
|
|
||||||
|
@classmethod |
||||||
|
def list(cls): |
||||||
|
ymlserializables = cls._get_all_from_file() |
||||||
|
ymlserializables_list = [] |
||||||
|
for ymlserializable in ymlserializables: |
||||||
|
name = [*ymlserializable][0] |
||||||
|
ymlserializables_list.append(name) |
||||||
|
return ymlserializables_list |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def _get_all_from_file(cls): |
||||||
|
with open(cls._storage_file) as file: |
||||||
|
ymlserializables = yaml.load(file, yaml.FullLoader).get(_yaml_object_name) |
||||||
|
return ymlserializables |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def _save_all_to_file(cls, ymlserializables): |
||||||
|
ymlserializables_object = {_yaml_object_name : ymlserializables} |
||||||
|
with open(cls._storage_file, 'w') as file: |
||||||
|
yaml.dump(ymlserializables_object, file) |
Loading…
Reference in new issue