aboutsummaryrefslogtreecommitdiffstats
path: root/src/onapsdk/configuration/loader.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/onapsdk/configuration/loader.py')
-rw-r--r--src/onapsdk/configuration/loader.py115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/onapsdk/configuration/loader.py b/src/onapsdk/configuration/loader.py
new file mode 100644
index 0000000..a9aae6f
--- /dev/null
+++ b/src/onapsdk/configuration/loader.py
@@ -0,0 +1,115 @@
+"""Settings loader module."""
+# Copyright 2022 Orange, Deutsche Telekom AG
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+import importlib
+import os
+from typing import Any
+
+from onapsdk.exceptions import ModuleError, SettingsError
+
+from . import global_settings
+
+
+SETTINGS_ENV = "ONAP_PYTHON_SDK_SETTINGS"
+
+
+class SettingsLoader:
+ """Settings loader class.
+
+ Load global settings and optionally load
+ custom settings by importing the module
+ stored in ONAP_PYTHON_SDK_SETTINGS environment
+ variable.
+ The module has to be uder PYTHONPATH.
+ """
+
+ def __init__(self) -> None:
+ """Load settings.
+
+ Load global settings and optionally load custom one.
+
+ Raises:
+ ModuleError: If ONAP_PYTHON_SDK_SETTINGS environment variable
+ is set and module can't be imported.
+
+ """
+ self._settings = {}
+
+ # Load values from global_settings (only uppercase)
+ self.filter_and_set(global_settings)
+
+ settings_env_value: str = os.environ.get(SETTINGS_ENV)
+ if settings_env_value:
+ # Load values from custom settings
+ try:
+ module = importlib.import_module(settings_env_value)
+ except ModuleNotFoundError:
+ msg = "Can't import custom settings. Is it under PYTHONPATH?"
+ raise ModuleError(msg)
+ self.filter_and_set(module)
+
+ def __getattribute__(self, name: str) -> Any:
+ """Return stored attributes.
+
+ If attribute name is uppercase return it from
+ _settings dictionary.
+ Look for attribute in __dict__ otherwise.
+
+ Args:
+ name (str): Attribute's name
+
+ Raises:
+ SettingsError: a setting is not found by the key.
+
+ Returns:
+ Any: Attribute's value
+
+ """
+ if name.isupper():
+ try:
+ return self._settings[name]
+ except KeyError as exc:
+ msg = f"Requested setting {exc.args[0]} does not exist."
+ raise SettingsError(msg) from exc
+ return super().__getattribute__(name)
+
+ def __setattr__(self, name: str, value: Any) -> None:
+ """Save attribute.
+
+ If attribute name is uppercase save the value
+ in _settings dictionary.
+ Use Object class __setattr__ implementation
+ otherwise.
+
+ Args:
+ name (str): Attribute's name
+ value (Any): Attribute's value
+
+ """
+ if name.isupper():
+ self._settings[name] = value
+ super().__setattr__(name, value)
+
+ def filter_and_set(self, module: "module") -> None:
+ """Filter module attributes and save the uppercased.
+
+ Iterate through module's attribures and save the value
+ of them which name is uppercase.
+
+ Args:
+ module (module): Module to get attributes from
+
+ """
+ for key in filter(lambda x: x.isupper(), dir(module)):
+ self._settings[key] = getattr(module, key)