Burathar
4 years ago
3 changed files with 104 additions and 0 deletions
@ -0,0 +1,17 @@
@@ -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 @@
@@ -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