reintroduced individual init of generalConfig.defaults

revert basically the former change
"init generalConfig.defaults only in secop-server"

The problem of import order when setting generalConfig.defaults
has to be solved by not overriding already existing keys when
setting the default.

Change-Id: I82121e346607dd74146279c4241e13ab63c14096
Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/28011
Tested-by: Jenkins Automated Tests <pedersen+jenkins@frm2.tum.de>
Reviewed-by: Enrico Faulhaber <enrico.faulhaber@frm2.tum.de>
Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
This commit is contained in:
zolliker 2022-03-23 13:53:46 +01:00
parent 16a9550080
commit bb097ac3ba
6 changed files with 34 additions and 6 deletions

View File

@ -35,6 +35,8 @@ from secop.lib.enum import Enum
from secop.parse import Parser
from secop.properties import HasProperties, Property
generalConfig.set_default('lazy_number_validation', False)
# *DEFAULT* limits for IntRange/ScaledIntegers transport serialisation
DEFAULT_MIN_INT = -16777216
DEFAULT_MAX_INT = 16777216

View File

@ -37,6 +37,7 @@ from secop.modules import Attached, Command, \
Communicator, Done, Module, Parameter, Property
from secop.lib import generalConfig
generalConfig.set_default('legacy_hasiodev', False)
HEX_CODE = re.compile(r'[0-9a-fA-F][0-9a-fA-F]$')

View File

@ -32,12 +32,28 @@ from os import environ, path
class GeneralConfig:
"""generalConfig holds server configuration items
generalConfig.init is to be called before starting the server.
Accessing generalConfig.<key> raises an error, when generalConfig.init is
not yet called, except when a default for <key> is set.
For tests and for imports from client code, a module may access generalConfig
without calling generalConfig.init before. For this, it should call
generalConfig.set_default on import to define defaults for the needed keys.
"""
def __init__(self):
self._config = None
self.defaults = {} #: default values. may be set before or after :meth:`init`
def init(self, configfile=None):
"""init default server configuration
:param configfile: if present, keys and values from the [FRAPPY] section are read
if configfile is not given, it tries to guess the location of the configfile
or determine 'piddir', 'logdir', 'confdir' and 'basedir' from the environment.
"""
cfg = {}
mandatory = 'piddir', 'logdir', 'confdir'
repodir = path.abspath(path.join(path.dirname(__file__), '..', '..'))
@ -82,6 +98,11 @@ class GeneralConfig:
self._config = cfg
def __getitem__(self, key):
"""access for keys known to exist
:param key: the key (raises an error when key is not available)
:return: the value
"""
try:
return self._config[key]
except KeyError:
@ -94,12 +115,14 @@ class GeneralConfig:
raise TypeError('generalConfig.init() has to be called first') from None
def get(self, key, default=None):
"""access for keys not known to exist"""
try:
return self.__getitem__(key)
except KeyError:
return default
def getint(self, key, default=None):
"""access and convert to int"""
try:
return int(self.__getitem__(key))
except KeyError:
@ -113,6 +136,11 @@ class GeneralConfig:
def initialized(self):
return bool(self._config)
def set_default(self, key, value):
"""set a default value, in case not set already"""
if key not in self.defaults:
self.defaults[key] = value
def testinit(self, **kwds):
"""for test purposes"""
self._config = kwds

View File

@ -39,6 +39,7 @@ from secop.params import Accessible, Command, Parameter
from secop.properties import HasProperties, Property
from secop.logging import RemoteLogHandler, HasComlog
generalConfig.set_default('disable_value_range_check', False) # check for problematic value range by default
Done = UniqueObject('Done')
"""a special return value for a read/write function

View File

@ -32,6 +32,8 @@ from secop.errors import BadValueError, ProgrammingError
from secop.properties import HasProperties, Property
from secop.lib import generalConfig
generalConfig.set_default('tolerate_poll_property', False)
class Accessible(HasProperties):
"""base class for Parameter and Command

View File

@ -1,12 +1,6 @@
# content of conftest.py
import pytest
from secop.lib import generalConfig
@pytest.fixture(scope="session", autouse=True)
def general_config():
generalConfig.testinit()
@pytest.fixture(scope="module")