Added conf resv base

This commit is contained in:
Kevin Veen-Birkenbach 2025-01-09 13:53:56 +01:00
parent 4ee5340dd3
commit 61af45e837
2 changed files with 69 additions and 1 deletions

2
.gitignore vendored
View File

@ -1,2 +1,2 @@
app/static/cache/*
app/__pycache__/
*__pycache__*

View File

@ -0,0 +1,68 @@
class ConfigurationResolver:
"""
A class to resolve `link` entries in a nested configuration structure.
Supports navigation through dictionaries, lists, and `subitems`.
"""
def __init__(self, config):
self.config = config
def resolve_links(self):
"""
Resolves all `link` entries in the configuration.
"""
self._recursive_resolve(self.config, self.config)
def _recursive_resolve(self, current_config, root_config):
"""
Recursively resolves `link` entries in the configuration.
"""
if isinstance(current_config, dict):
for key, value in list(current_config.items()):
if key == "link":
target = self._find_entry(root_config, value.lower())
current_config.clear()
current_config.update(target)
else:
self._recursive_resolve(value, root_config)
elif isinstance(current_config, list):
for item in current_config:
self._recursive_resolve(item, root_config)
def _find_entry(self, config, path):
"""
Finds an entry in the configuration by a dot-separated path.
Supports both dictionaries and lists with `subitems` navigation.
"""
parts = path.split('.')
current = config
for part in parts:
if isinstance(current, list):
# Look for a matching name in the list
found = next(
(item for item in current if isinstance(item, dict) and item.get("name", "").lower() == part),
None
)
if found is None:
raise ValueError(f"No matching entry for '{part}' in list.")
current = found
elif isinstance(current, dict):
# Case-insensitive dictionary lookup
key = next((k for k in current if k.lower() == part), None)
if key is None:
raise KeyError(f"Key '{part}' not found.")
current = current[key]
else:
raise ValueError(f"Invalid path segment '{part}'. Current type is {type(current)}.")
# Navigate into `subitems` if present
if isinstance(current, dict) and "subitems" in current:
current = current["subitems"]
return current
def get_config(self):
"""
Returns the resolved configuration.
"""
return self.config