Source code for pyzeal.settings.json_settings_service
"""
This module provides a straight-forward implementation of the `SettingsSerivce`
based on a `json` serialization backend.
Authors:\n
- Philipp Schuette\n
"""
from os.path import dirname, join
from typing import Dict, Final, Tuple, Union
from pyzeal.pyzeal_logging.log_levels import LogLevel
from pyzeal.pyzeal_types.algorithm_types import AlgorithmTypes
from pyzeal.pyzeal_types.container_types import ContainerTypes
from pyzeal.pyzeal_types.estimator_types import EstimatorTypes
from pyzeal.settings.invalid_setting_exception import InvalidSettingException
from pyzeal.settings.json_core_settings import JSONCoreSettingsService
from pyzeal.settings.json_helper import JSONHelper
from pyzeal.settings.settings_service import SettingsService
# location where the default settings should be
DEFAULT_SETTINGS: Final[str] = join(dirname(__file__), "default_settings.json")
# default location where custom settings are saved
CUSTOM_SETTINGS: Final[str] = join(dirname(__file__), "custom_settings.json")
[docs]
class JSONSettingsService(SettingsService):
"""
This class provides a layer of abstraction for storage and retrieval of
PyZEAL related settings using JSON for persistence. Any read and/or write
access to settings must happen through a service like this one.
"""
__slots__ = ("_coreSettings", "_level", "_verbose", "_precision")
[docs]
def __init__(self) -> None:
"""
Create an instance of a new `SettingsService`. The basis for its
properties are the currently persisted (user or default) settings.
"""
self._coreSettings = JSONCoreSettingsService()
currentSettings: Dict[str, Union[str, bool, Tuple[int, int]]] = {}
# first load default settings (must always exist)...
JSONHelper.loadSettingsFromFile(DEFAULT_SETTINGS, currentSettings)
# ...then try to load custom settings (might not exist)
JSONHelper.loadSettingsFromFile(CUSTOM_SETTINGS, currentSettings)
# set default logging level
for level in LogLevel:
if level.name == currentSettings["logLevel"]:
self._level = level
# set default verbosity
verbosity = currentSettings.get("verbose", None)
if verbosity is not None:
self._verbose = bool(verbosity)
# set default precision
precision = currentSettings.get("precision", None)
if precision is not None:
try:
if isinstance(precision, tuple):
self._precision = (
precision[0],
precision[1],
)
except ValueError:
pass
# check if required settings were loaded successfully
for attr in self.__slots__:
if not hasattr(self, attr):
raise InvalidSettingException(attr[1:])
def __str__(self) -> str:
"""
A printable string representation of the currently active settings
configuration.
:return: string representation of current setting
"""
return (
f"Currently active settings configuration:\n{self._coreSettings}"
f"-> default log level: {self.logLevel.name}\n"
f"-> default verbosity: {self.verbose}\n"
f"-> default precision: {self.precision}"
)
# docstr-coverage:inherited
@property
def defaultContainer(self) -> ContainerTypes:
return self._coreSettings.defaultContainer
# docstr-coverage:inherited
@defaultContainer.setter
def defaultContainer(self, value: ContainerTypes) -> None:
self._coreSettings.defaultContainer = value
# docstr-coverage:inherited
@property
def defaultAlgorithm(self) -> AlgorithmTypes:
return self._coreSettings.defaultAlgorithm
# docstr-coverage:inherited
@defaultAlgorithm.setter
def defaultAlgorithm(self, value: AlgorithmTypes) -> None:
self._coreSettings.defaultAlgorithm = value
# docstr-coverage:inherited
@property
def defaultEstimator(self) -> EstimatorTypes:
return self._coreSettings.defaultEstimator
# docstr-coverage:inherited
@defaultEstimator.setter
def defaultEstimator(self, value: EstimatorTypes) -> None:
self._coreSettings.defaultEstimator = value
# docstr-coverage:inherited
@property
def logLevel(self) -> LogLevel:
return self._level
# docstr-coverage:inherited
@logLevel.setter
def logLevel(self, value: LogLevel) -> None:
self._level = value
JSONHelper.createOrUpdateSetting(CUSTOM_SETTINGS, "logLevel", value)
# docstr-coverage:inherited
@property
def verbose(self) -> bool:
return self._verbose
# docstr-coverage:inherited
@verbose.setter
def verbose(self, value: bool) -> None:
self._verbose = value
JSONHelper.createOrUpdateSetting(CUSTOM_SETTINGS, "verbose", value)
# docstr-coverage:inherited
@property
def precision(self) -> Tuple[int, int]:
return self._precision
# docstr-coverage:inherited
@precision.setter
def precision(self, value: Tuple[int, int]) -> None:
self._precision = value
JSONHelper.createOrUpdateSetting(CUSTOM_SETTINGS, "precision", value)