Source code for pyzeal.settings.json_core_settings
"""
Class JSONCoreSettingsService from the module `pyzeal.settings`.
This module provides a straight-forward implementation of the
`CoreSettingsSerivce` based on a `json` serialization backend.
Authors:\n
- Philipp Schuette\n
"""
from os.path import dirname, join
from typing import Dict, Final
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.core_settings_service import CoreSettingsService
from pyzeal.settings.invalid_setting_exception import InvalidSettingException
from pyzeal.settings.json_helper import JSONHelper
# 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 JSONCoreSettingsService(CoreSettingsService):
"""
This class provides a layer of abstraction for storage and retrieval of
PyZEAL core settings using JSON for persistence. Any read and/or write
access to (core) settings must happen through a service like this one.
"""
__slots__ = ("_container", "_algorithm", "_estimator")
[docs]
def __init__(self) -> None:
"""
Create an instance of a new `CoreSettingsService`. The basis for its
properties are the currently persisted (user or default) settings.
"""
currentSettings: Dict[str, str] = {}
# first load default settings (must always exist)...
JSONHelper.loadCoreSettingsFromFile(DEFAULT_SETTINGS, currentSettings)
# ...then try to load custom settings (might not exist)
JSONHelper.loadCoreSettingsFromFile(CUSTOM_SETTINGS, currentSettings)
# set default container
for container in ContainerTypes:
if container.value == currentSettings["defaultContainer"]:
self._container = container
break
# set default algorithm
for algorithm in AlgorithmTypes:
if algorithm.value == currentSettings["defaultAlgorithm"]:
self._algorithm = algorithm
break
# set default estimator
for estimator in EstimatorTypes:
if estimator.value == currentSettings["defaultEstimator"]:
self._estimator = estimator
break
# check if required defaults 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 core settings
configuration.
:return: string representation of current core setting
"""
return (
f"-> default container: {self.defaultContainer.value}\n"
f"-> default algorithm: {self.defaultAlgorithm.value}\n"
f"-> default estimator: {self.defaultEstimator.value}\n"
)
# docstr-coverage:inherited
@property
def defaultContainer(self) -> ContainerTypes:
return self._container
# docstr-coverage:inherited
@defaultContainer.setter
def defaultContainer(self, value: ContainerTypes) -> None:
self._container = value
JSONHelper.createOrUpdateCoreSetting(
CUSTOM_SETTINGS, "defaultContainer", value
)
# docstr-coverage:inherited
@property
def defaultAlgorithm(self) -> AlgorithmTypes:
return self._algorithm
# docstr-coverage:inherited
@defaultAlgorithm.setter
def defaultAlgorithm(self, value: AlgorithmTypes) -> None:
self._algorithm = value
JSONHelper.createOrUpdateCoreSetting(
CUSTOM_SETTINGS, "defaultAlgorithm", value
)
# docstr-coverage:inherited
@property
def defaultEstimator(self) -> EstimatorTypes:
return self._estimator
# docstr-coverage:inherited
@defaultEstimator.setter
def defaultEstimator(self, value: EstimatorTypes) -> None:
self._estimator = value
JSONHelper.createOrUpdateCoreSetting(
CUSTOM_SETTINGS, "defaultEstimator", value
)