Module pyboiler.settings
pyboiler.settings file
Expand source code
"""pyboiler.settings file"""
from typing import TYPE_CHECKING
from .config import config
if config().SERIAL == "json":
from .hson import dumps, loads
else:
from .hml import dumps, loads
from .generic import hierarchy
class Settings(hierarchy):
"""Global settings, intended to be edited by users"""
__instance = None
def __new__(cls):
if cls.__instance is None:
cls.__instance = object.__new__(cls)
cls._str_name = "Settings"
cls._defaults = {}
cls._settings = {}
return cls.__instance
def __init__(self):
pass
def Child(self, name: str):
sets_inst = getattr(self, name, config().SENTINEL)
if sets_inst is config().SENTINEL:
sets_inst = _Settings(name, self)
self._settings[name] = sets_inst
self._defaults[name] = sets_inst
setattr(self, name, sets_inst)
elif not isinstance(sets_inst, _Settings):
raise Exception(f"Child '{name}' is not _Settings instance")
return sets_inst
def get(self, key, default=config().SENTINEL):
if default is config().SENTINEL:
_get = self._settings.get(key, config().SENTINEL)
if _get is config().SENTINEL:
_get = self._defaults.get(key)
return _get
return self._settings.get(key, default)
def set(self, key, val):
self._defaults[key] = val
setattr(self, key, lambda s=self, k=key: s.get(k))
def softSet(self, key, val):
self._settings[key] = val
def init(self, name: str, default):
self.set(name, default)
def serialize(self) -> None:
s_data = None
config().FILEPATH_SETTINGS.write_text(dumps(self._json()))
def deserialize(self) -> None:
if not config().FILEPATH_SETTINGS.exists():
return
self.from_dict(loads(config().FILEPATH_SETTINGS.read_text()))
def from_dict(self, d: dict):
for k, v in d.items():
if isinstance(v, dict):
_child = self.Child(k)
_child.from_dict(v)
else:
if v is None:
v = config().SENTINEL
self.softSet(k, v)
def json(self) -> dict:
"""Return attributes as dictionary for json serialization"""
fmt = {}
for k, v in self._defaults.items():
if isinstance(v, _Settings):
fmt[k] = v.json()
else:
fmt[k] = v
return fmt
def _json(self) -> dict:
"""Internal serialization method for writing to settings.json"""
fmt = {}
for k, v in self._defaults.items():
if isinstance(v, _Settings):
fmt[k] = v._json()
else:
fmt[k] = self.get(k, None)
return fmt
def u_fmt_k(self, *args, **kwargs):
raise NotImplementedError()
def u_fmt_v(self, *args, **kwargs):
raise NotImplementedError()
def _i_init(self, *args, **kwargs):
raise NotImplementedError()
if TYPE_CHECKING:
def __getattr__(self, key):
return lambda msg: print(msg)
class _Settings(Settings):
def __new__(cls, *args, **kwargs):
obj = object.__new__(cls)
obj.__init__(*args, **kwargs)
return obj
def __init__(self, name: str, parent):
self._parent = parent
self._str_name = name
self._defaults = {}
self._settings = {}
Classes
class Settings
-
Global settings, intended to be edited by users
Expand source code
class Settings(hierarchy): """Global settings, intended to be edited by users""" __instance = None def __new__(cls): if cls.__instance is None: cls.__instance = object.__new__(cls) cls._str_name = "Settings" cls._defaults = {} cls._settings = {} return cls.__instance def __init__(self): pass def Child(self, name: str): sets_inst = getattr(self, name, config().SENTINEL) if sets_inst is config().SENTINEL: sets_inst = _Settings(name, self) self._settings[name] = sets_inst self._defaults[name] = sets_inst setattr(self, name, sets_inst) elif not isinstance(sets_inst, _Settings): raise Exception(f"Child '{name}' is not _Settings instance") return sets_inst def get(self, key, default=config().SENTINEL): if default is config().SENTINEL: _get = self._settings.get(key, config().SENTINEL) if _get is config().SENTINEL: _get = self._defaults.get(key) return _get return self._settings.get(key, default) def set(self, key, val): self._defaults[key] = val setattr(self, key, lambda s=self, k=key: s.get(k)) def softSet(self, key, val): self._settings[key] = val def init(self, name: str, default): self.set(name, default) def serialize(self) -> None: s_data = None config().FILEPATH_SETTINGS.write_text(dumps(self._json())) def deserialize(self) -> None: if not config().FILEPATH_SETTINGS.exists(): return self.from_dict(loads(config().FILEPATH_SETTINGS.read_text())) def from_dict(self, d: dict): for k, v in d.items(): if isinstance(v, dict): _child = self.Child(k) _child.from_dict(v) else: if v is None: v = config().SENTINEL self.softSet(k, v) def json(self) -> dict: """Return attributes as dictionary for json serialization""" fmt = {} for k, v in self._defaults.items(): if isinstance(v, _Settings): fmt[k] = v.json() else: fmt[k] = v return fmt def _json(self) -> dict: """Internal serialization method for writing to settings.json""" fmt = {} for k, v in self._defaults.items(): if isinstance(v, _Settings): fmt[k] = v._json() else: fmt[k] = self.get(k, None) return fmt def u_fmt_k(self, *args, **kwargs): raise NotImplementedError() def u_fmt_v(self, *args, **kwargs): raise NotImplementedError() def _i_init(self, *args, **kwargs): raise NotImplementedError() if TYPE_CHECKING: def __getattr__(self, key): return lambda msg: print(msg)
Ancestors
Subclasses
- pyboiler.settings._Settings
Methods
def Child(self, name: str)
-
Expand source code
def Child(self, name: str): sets_inst = getattr(self, name, config().SENTINEL) if sets_inst is config().SENTINEL: sets_inst = _Settings(name, self) self._settings[name] = sets_inst self._defaults[name] = sets_inst setattr(self, name, sets_inst) elif not isinstance(sets_inst, _Settings): raise Exception(f"Child '{name}' is not _Settings instance") return sets_inst
def deserialize(self) ‑> None
-
Expand source code
def deserialize(self) -> None: if not config().FILEPATH_SETTINGS.exists(): return self.from_dict(loads(config().FILEPATH_SETTINGS.read_text()))
def from_dict(self, d: dict)
-
Expand source code
def from_dict(self, d: dict): for k, v in d.items(): if isinstance(v, dict): _child = self.Child(k) _child.from_dict(v) else: if v is None: v = config().SENTINEL self.softSet(k, v)
def get(self, key, default=<object object>)
-
Expand source code
def get(self, key, default=config().SENTINEL): if default is config().SENTINEL: _get = self._settings.get(key, config().SENTINEL) if _get is config().SENTINEL: _get = self._defaults.get(key) return _get return self._settings.get(key, default)
def init(self, name: str, default)
-
Expand source code
def init(self, name: str, default): self.set(name, default)
def json(self) ‑> dict
-
Return attributes as dictionary for json serialization
Expand source code
def json(self) -> dict: """Return attributes as dictionary for json serialization""" fmt = {} for k, v in self._defaults.items(): if isinstance(v, _Settings): fmt[k] = v.json() else: fmt[k] = v return fmt
def serialize(self) ‑> None
-
Expand source code
def serialize(self) -> None: s_data = None config().FILEPATH_SETTINGS.write_text(dumps(self._json()))
def set(self, key, val)
-
Expand source code
def set(self, key, val): self._defaults[key] = val setattr(self, key, lambda s=self, k=key: s.get(k))
def softSet(self, key, val)
-
Expand source code
def softSet(self, key, val): self._settings[key] = val
Inherited members