From bb097ac3ba964482d9936a94bd5caaddf05b1e65 Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Wed, 23 Mar 2022 13:53:46 +0100 Subject: [PATCH] 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 Reviewed-by: Enrico Faulhaber Reviewed-by: Markus Zolliker --- secop/datatypes.py | 2 ++ secop/io.py | 1 + secop/lib/__init__.py | 28 ++++++++++++++++++++++++++++ secop/modules.py | 1 + secop/params.py | 2 ++ test/conftest.py | 6 ------ 6 files changed, 34 insertions(+), 6 deletions(-) diff --git a/secop/datatypes.py b/secop/datatypes.py index 269590b..3f5f3df 100644 --- a/secop/datatypes.py +++ b/secop/datatypes.py @@ -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 diff --git a/secop/io.py b/secop/io.py index 0dde066..695643f 100644 --- a/secop/io.py +++ b/secop/io.py @@ -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]$') diff --git a/secop/lib/__init__.py b/secop/lib/__init__.py index 0c2c59d..d6cd24e 100644 --- a/secop/lib/__init__.py +++ b/secop/lib/__init__.py @@ -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. raises an error, when generalConfig.init is + not yet called, except when a default for 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 diff --git a/secop/modules.py b/secop/modules.py index a56940e..f7b4436 100644 --- a/secop/modules.py +++ b/secop/modules.py @@ -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 diff --git a/secop/params.py b/secop/params.py index c592153..2328197 100644 --- a/secop/params.py +++ b/secop/params.py @@ -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 diff --git a/test/conftest.py b/test/conftest.py index 6e1d2b8..6289b9b 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -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")