RuleSetConfig separated from RuleSetHolder

This commit is contained in:
MaXFeeD
2025-06-17 20:31:23 +03:00
parent 3107cc83bb
commit 4a8610207c
2 changed files with 32 additions and 13 deletions
+2 -2
View File
@@ -153,7 +153,7 @@ class Config(dict[str, Any]):
def __setitem__(self, key: str, value: Any, /) -> None: def __setitem__(self, key: str, value: Any, /) -> None:
self.set_value_unsafe(key, value, replace_mismatched_types=True) self.set_value_unsafe(key, value, replace_mismatched_types=True)
def merge_config(self, config: Union[dict, 'Config'], *, replace_configs: bool = False, exclusive_lists: bool = False, extend_lists: bool = False, strip_none_from_lists: bool = False) -> None: def merge_config(self, config: Union[MutableMapping, 'Config'], *, replace_configs: bool = False, exclusive_lists: bool = False, extend_lists: bool = False, strip_none_from_lists: bool = False) -> None:
if exclusive_lists: if exclusive_lists:
extend_lists = True extend_lists = True
@@ -208,7 +208,7 @@ class Config(dict[str, Any]):
def __delitem__(self, key: str, /) -> None: def __delitem__(self, key: str, /) -> None:
self.delete_value_unsafe(key, remove_mismatched_types=True) self.delete_value_unsafe(key, remove_mismatched_types=True)
def as_json(self, *, strip_none: bool = True) -> dict: def as_json(self, *, strip_none: bool = True) -> MutableMapping:
json = {} json = {}
for key, value in self.items(): for key, value in self.items():
if not isinstance(value, Config): if not isinstance(value, Config):
+30 -11
View File
@@ -1,8 +1,9 @@
from abc import ABCMeta, abstractmethod from abc import ABCMeta
from functools import lru_cache from itertools import chain
from typing import Dict, MutableSequence, MutableSet, Optional from typing import (Any, Dict, MutableMapping, MutableSequence, MutableSet,
Optional)
from .config import Config from .config import Config, ConfigSupportsKeysAndGetItem
from .utils import ensure_not_whitespace from .utils import ensure_not_whitespace
@@ -95,10 +96,28 @@ class RuleSetHolder(metaclass=ABCMeta):
def remove_rules(self, *rules: str) -> None: def remove_rules(self, *rules: str) -> None:
self.rule_set.remove_rules(self.properties, *rules) self.rule_set.remove_rules(self.properties, *rules)
@lru_cache(maxsize=4096) class RuleSetConfig(Config):
def get_rule_set_config(type: Optional[type['Config']]): def __init__(self, map: Optional[ConfigSupportsKeysAndGetItem] = None, defaults: Optional[Config] = None, overrides: Optional[Config] = None):
if not type: super().__init__(map=map, defaults=defaults)
type = Config self.overrides = overrides
class RuleSetConfig(type, RuleSetHolder):
pass def get_dict_value(self, key: str) -> Any:
return RuleSetConfig value = super().get_dict_value(key)
if not self.overrides or not key in self.overrides:
return value
overriden_value = self.overrides.get_dict_value(key)
if isinstance(overriden_value, MutableMapping):
if not isinstance(value, MutableMapping):
return overriden_value
if isinstance(value, RuleSetConfig):
return value
if not isinstance(overriden_value, Config):
overriden_value = Config(overriden_value)
config = RuleSetConfig(map=value, overrides=overriden_value)
self.set_value_unsafe(key, config)
return config
if isinstance(overriden_value, MutableSequence):
if not isinstance(value, MutableSequence):
return overriden_value
return list(chain(overriden_value, value))
return overriden_value