From ae5286cbf5d6842dd4369a406e41a57230ac140f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Simon=20K=C3=BCnzel?= <simonk@fsmpi.rwth-aachen.de>
Date: Sat, 12 Oct 2024 18:01:30 +0200
Subject: [PATCH] Move config loading to common

---
 src/videoag_common/__init__.py           | 13 +++++++++++++
 src/videoag_common/miscellaneous/util.py | 13 +++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/src/videoag_common/__init__.py b/src/videoag_common/__init__.py
index e69de29..d75bae0 100644
--- a/src/videoag_common/__init__.py
+++ b/src/videoag_common/__init__.py
@@ -0,0 +1,13 @@
+import os
+from pathlib import Path
+
+from videoag_common.miscellaneous.util import load_config_file, merge_config_with
+
+if "VIDEOAG_CONFIG" not in os.environ:
+    raise Exception("Missing VIDEOAG_CONFIG environment variable")
+config = load_config_file(Path(os.getcwd()).joinpath(os.environ["VIDEOAG_CONFIG"]))
+if "VIDEOAG_TEST_CONFIG_OVERRIDE" in os.environ:
+    merge_config_with(
+        config,
+        load_config_file(Path(os.getcwd()).joinpath(os.environ["VIDEOAG_TEST_CONFIG_OVERRIDE"]))
+    )
diff --git a/src/videoag_common/miscellaneous/util.py b/src/videoag_common/miscellaneous/util.py
index 8d11326..cab39c8 100644
--- a/src/videoag_common/miscellaneous/util.py
+++ b/src/videoag_common/miscellaneous/util.py
@@ -112,3 +112,16 @@ def load_config_file(path: Path):
         if key.isupper():
             config[key] = getattr(config_module, key)
     return config
+
+
+def merge_config_with(config: dict, to_merge: dict, overwrite_non_mergeable: bool = False):
+    for key, item in to_merge:
+        if key not in config:
+            config[key] = item
+        elif isinstance(item, dict) and isinstance(config[key], dict):
+            merge_config_with(config[key], item)
+        elif overwrite_non_mergeable:
+            config[key] = item
+        else:
+            # Don't leak config values, might contain passwords, etc.
+            raise ValueError(f"Can't merge {type(item)} into {type(config[key])} for key {key}")
-- 
GitLab