Initial commit: add config_manager module with ConfigParameter and ConfigManager

This commit is contained in:
2026-04-15 18:44:47 +03:00
commit b8f34faff7
21 changed files with 825 additions and 0 deletions

View File

@@ -0,0 +1,131 @@
import os
import tempfile
from pathlib import Path
from src.utils.config_manager import config
def test_config_manager_register_and_get():
config.reset()
config.register(name="app_name", val="komAI", desc="Application name", cat="app")
assert config.get("app_name", cat="app") == "komAI"
assert config.get_description("app_name", cat="app") == "Application name"
def test_config_manager_register_default_category():
config.reset()
config.register(name="param1", val="value1")
assert config.get("param1") == "value1"
def test_config_manager_singleton():
from src.utils.config_manager import config as config2
assert config is config2
def test_config_manager_load_save():
config.reset()
with tempfile.TemporaryDirectory() as tmpdir:
config_path = Path(tmpdir) / "config.yaml"
config.register(name="app_name", val="TestApp", cat="app")
config.register(name="debug", val="true", cat="app")
config.save(str(config_path))
assert config_path.exists()
config.reset()
config.register(name="app_name", val="Other", cat="app")
config.register(name="debug", val="false", cat="app")
config.load(str(config_path))
assert config.get("app_name", cat="app") == "TestApp"
assert config.get("debug", cat="app") == "true"
def test_config_manager_env_override():
config.reset()
env_var = "TEST_APP_CONFIG"
os.environ[env_var] = "/nonexistent/path.yaml"
from src.utils.config_manager.config_manager import ConfigManager
test_config = ConfigManager(config_env=env_var)
test_config.register(name="param1", val="original")
test_config.load()
assert test_config._config_path == Path("/nonexistent/path.yaml")
del os.environ[env_var]
def test_config_parameter_get_parameter():
config.reset()
config.register(name="param1", val="value1", cat="test")
param = config.get_parameter("param1", cat="test")
assert param is not None
assert param.val == "value1"
assert param.name == "param1"
assert param.default == "value1"
def test_config_set_value():
config.reset()
config.register(name="param1", val="original", cat="test")
assert config.get("param1", cat="test") == "original"
config.set("param1", "modified", cat="test")
assert config.get("param1", cat="test") == "modified"
def test_config_validator():
config.reset()
def validate_level(old_val, new_val):
valid_levels = ["DEBUG", "INFO", "WARNING", "ERROR"]
if new_val not in valid_levels:
raise ValueError(f"Invalid level: {new_val}")
config.register(name="level", val="INFO", cat="test", validator=validate_level)
assert config.get("level", cat="test") == "INFO"
config.set("level", "DEBUG", cat="test")
assert config.get("level", cat="test") == "DEBUG"
try:
config.set("level", "INVALID", cat="test")
assert False, "Should have raised ValueError"
except ValueError:
assert config.get("level", cat="test") == "DEBUG"
def run_tests():
tests = [
test_config_manager_register_and_get,
test_config_manager_register_default_category,
test_config_manager_singleton,
test_config_manager_load_save,
test_config_manager_env_override,
test_config_parameter_get_parameter,
test_config_set_value,
test_config_validator,
]
passed = 0
failed = 0
for test in tests:
try:
test()
print(f"PASS: {test.__name__}")
passed += 1
except Exception as e:
print(f"FAIL: {test.__name__} - {e}")
failed += 1
print(f"\n{passed}/{passed + failed} tests passed")
return failed == 0
if __name__ == "__main__":
success = run_tests()
exit(0 if success else 1)