# SPDX-License-Identifier: GPLv3-or-later
# Copyright © 2025 pygaindalf Rui Pinheiro
import argparse
from typing import Any
from functools import cached_property
from ..helpers import script_info
from .loader import ConfigFileLoader
from .models import ConfigBase, ConfigFilePath
from .args import ArgParserBase
[docs]
class ConfigWrapper[C: ConfigBase, A: ArgParserBase]:
[docs]
def __init__(self, config_class : type[C], argparser_class : type[A]):
self.config_class = config_class
self.argparser_class = argparser_class
self.config = None
[docs]
def initialize(self) -> C:
return self.open(getattr(self.args, 'app.paths.config'))
[docs]
@cached_property
def args(self) -> argparse.Namespace:
parser = self.argparser_class()
return parser.parse_args()
[docs]
def open(self, path : ConfigFilePath | str) -> C:
loader = ConfigFileLoader(self.config_class, self.args)
self.config = loader.open(path)
return self.config
[docs]
def load(self, config : str | dict[str, Any] | C) -> C:
if isinstance(config, self.config_class):
self.config = config
elif isinstance(config, (str,dict)):
loader = ConfigFileLoader(self.config_class, self.args)
self.config = loader.load(config)
else:
raise TypeError(f"Expected Config or dict, got {type(config).__name__}")
return self.config
[docs]
def reset(self) -> None:
if not script_info.is_unit_test():
raise RuntimeError("Cannot reset configuration outside of unit tests")
self.config = None
def __getattr__(self, name) -> Any:
try:
return super().__getattr__(name)
except AttributeError:
if script_info.is_documentation_build():
raise AttributeError(f"Configuration not initialized. Cannot access '{name}'")
if self.config is None:
raise RuntimeError("Configuration not initialized. Call 'initialize()' first.")
return getattr(self.config, name)