Source code for warg.bases.property_settings
__author__ = "Christian Heider Lindbjerg"
__doc__ = r"""
Created on 17/03/2020
"""
__all__ = ["PropertySettings"]
import logging
from collections.abc import Mapping
from typing import Any, Dict, MutableMapping
from warg import NOD
_logger = logging.getLogger(__name__)
[docs]
class PropertySettings(
# Mapping
):
"""description"""
# def __getitem__(self, k):
# return self.__getattribute__(k)
# def __len__(self) -> int:
# return len(self.__crystallise__())
# raise_exception_on_none = False
raise_exception_non_exist_property = True
[docs]
def __init__(self, **kwargs: MutableMapping):
for k, v in kwargs.items():
self.__setattr__(k, v)
for setting in dir(self):
if not setting.startswith("_"):
try:
self.__getattr__(setting)
except KeyError:
self.__setattr__(setting, None)
def __clear__(self):
for setting in dir(self):
if not setting.startswith("_"):
self.__setattr__(setting, None)
def __setattr__(self, key: str, value: Any):
assert not key.startswith("_"), f"{key} is not allowed"
if PropertySettings.raise_exception_non_exist_property and not hasattr(self, key):
raise ValueError(f"Property setting {key} does not exist , available settings {self}")
# self.__getattr__(key)
super().__setattr__(key, value)
def __getattr__(self, item):
assert not item.startswith("_"), f"{item} is not allowed"
try:
val = super().__getattribute__(item)
# if PropertySettings.raise_exception_on_none and not val:
# raise ValueError(f'Property {item} is {val}')
return val
except AttributeError as a:
a = type(a)(str(a) + f", available settings {self}")
raise a
def __iter_keys__(self):
for setting in dir(self):
if not setting.startswith("_"):
yield setting
def __str__(self) -> str:
return self.__repr__()
def __contains__(self, item: Any):
return hasattr(self, item)
# def __dir__(self) -> Iterable[str]:
# return self.__crystallise__().keys()
def __repr__(self) -> str:
settings_dict = {}
for setting in dir(self):
if not setting.startswith("_"):
try:
settings_dict[setting] = self.__getattr__(setting)
except KeyError:
settings_dict[setting] = None
return str(settings_dict)
def __iter__(self):
available_settings = []
for setting in dir(self):
if not setting.startswith("_"):
available_settings.append(setting)
return iter(available_settings)
def __getitem__(self, item: Any):
return self.__getattr__(item)
def __to_dict__(self) -> Dict:
return self.__crystallise__().as_dict()
def __crystallise__(self) -> NOD:
return NOD({k: getattr(self, k) for k in self})
def __from_mapping__(self, mapping: Mapping) -> None:
for k, v in mapping.items():
setattr(self, k, v)
def __from_dict__(self, d: Dict) -> None:
self.__from_mapping__(d)
if __name__ == "__main__":
a = PropertySettings()
_logger.info({**a.__crystallise__()})
assert not "h" in a