mirror of
https://github.com/kevinveenbirkenbach/homepage.veen.world.git
synced 2025-01-15 19:23:58 +01:00
Added conf resv base
This commit is contained in:
parent
4ee5340dd3
commit
61af45e837
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,2 +1,2 @@
|
||||
app/static/cache/*
|
||||
app/__pycache__/
|
||||
*__pycache__*
|
68
app/utils/configuration_resolver.py
Normal file
68
app/utils/configuration_resolver.py
Normal 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
|
Loading…
Reference in New Issue
Block a user