AIDockerCompose/Python/Utils/Utils.py
2026-05-06 18:58:50 +02:00

121 lines
3.2 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from typing import Self, Any, Sequence, Optional
from Utils.Check import Check
from Utils.Patterns import RE
class Utils:
@classmethod
def get_keys(cls:type[Self], *items:list[Any|None]) -> list[str]:
keys:list[str] = []
item:Any|None
for item in items:
if Check.is_key(item):
if item not in keys:
keys.append(item)
elif Check.is_array(item):
key:str
for key in cls.get_keys(*item):
if key not in keys:
keys.append(key)
return keys
@classmethod
def get_dictionaries(cls:type[Self], *items:list[Any|None]) -> list[dict[str, Any|None]]:
dictionaries:list[dict[str, Any|None]] = []
item:Any|None
for item in items:
if Check.is_dictionary:
dictionaries.append(item)
elif Check.is_array(item):
dictionary:dict[str, Any|None]
for dictionary in cls.get_dictionaries(*item):
dictionaries.append(dictionary)
return dictionaries
@classmethod
def get_dictionary(cls:type[Self], inputs:Any|None, overwrite:bool = False) -> dict[str, Any|None]:
dictionary:dict[str, Any|None] = {}
if Check.is_dictionary(inputs):
dictionary = inputs
elif Check.is_array(inputs):
key:str
value:Any|None
for key, value in cls.get_dictionary(inputs, overwrite).items():
if overwrite or key not in dictionary:
dictionary[key] = value
return dictionary
@classmethod
def get_values(cls:type[Self],
keys:str|Sequence[str],
inputs:dict[str, Any|None]|Sequence[Any|None],
default:Optional[Any] = None
) -> Any|None:
if len(keys := cls.get_keys(keys)):
dictionary:dict[str, Any|None]
for dictionary in cls.get_dictionaries(inputs):
key:str
for key in keys:
if key in dictionary:
return dictionary[key]
return default
@classmethod
def get_texts(cls:type[Self], *items:list[Any|None]) -> list[str]:
texts:list[str] = []
item:Any|None
for item in items:
if Check.is_string(item):
texts.append(item)
elif Check.is_array(item):
text:str
for text in cls.get_texts(*item):
texts.append(text)
return texts
@classmethod
def string_variables(cls:type[Self],
string:str,
inputs:dict[str, Any|None]|Sequence[Any|None],
default:Optional[str|None] = None
) -> str:
variables:dict[str, Any|None] = Utils.get_dictionary(inputs)
def replace(match:Any) -> str:
key:str = match.group(1)
return str(
variables[key] if key in variables and variables[key] is not None else
default if default is not None else
match.group(0))
return RE.STRING_VARIABLES.sub(replace, string)