From a05fce9bc03531f5d015511d1ab0128e08756700 Mon Sep 17 00:00:00 2001 From: MaXFeeD Date: Fri, 20 Jun 2025 00:30:44 +0300 Subject: [PATCH] MakeDataConfig implements RuleSetHolder, complete configuration support --- src/icmtoolchain/__main__.py | 1 + src/icmtoolchain/language.py | 9 ++++++--- src/icmtoolchain/make_config.py | 18 +++++++++++++++++- src/icmtoolchain/rule_set.py | 5 +++++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/icmtoolchain/__main__.py b/src/icmtoolchain/__main__.py index dcd1af8..27cfa48 100644 --- a/src/icmtoolchain/__main__.py +++ b/src/icmtoolchain/__main__.py @@ -1,2 +1,3 @@ from .cli import run + run() diff --git a/src/icmtoolchain/language.py b/src/icmtoolchain/language.py index 3c3f7f9..444aa0f 100644 --- a/src/icmtoolchain/language.py +++ b/src/icmtoolchain/language.py @@ -7,6 +7,7 @@ from typing import (TYPE_CHECKING, Any, Callable, Dict, Final, Iterable, from .config import Config, FileConfig from .output_directory import expand_paths +from .rule_set import RuleSet, RuleSetConfig, RuleSetHolder from .shell import abort, warn from .utils import RuntimeCodeError, ensure_not_whitespace @@ -142,16 +143,18 @@ class MakeAssetData: AVAILABLE_DATA_CONFIGS: Dict[Union[str, Callable[[str], str]], type['MakeDataConfig']] = {} -class MakeDataConfig(FileConfig, metaclass=ABCMeta): +class MakeDataConfig(RuleSetConfig, FileConfig, RuleSetHolder, metaclass=ABCMeta): defaults: FileConfig current_project: Final[str] project_unique_name: Final[str] - def __init__(self, path: str, defaults: FileConfig) -> None: + def __init__(self, path: str, defaults: FileConfig, rule_set: Optional[RuleSet] = None) -> None: if not isfile(path): abort(f"Not found {basename(path)!r}, are you sure that selected project exists?") + RuleSetConfig.__init__(self) self.current_project = dirname(abspath(path)) - super().__init__(path, defaults, raise_non_existing=True) + FileConfig.__init__(self, path, defaults, raise_non_existing=True) + RuleSetHolder.__init__(self, rule_set=rule_set) from .output_directory import unique_folder_name self.project_unique_name = unique_folder_name(self.directory) diff --git a/src/icmtoolchain/make_config.py b/src/icmtoolchain/make_config.py index 54fffc2..bc94c13 100644 --- a/src/icmtoolchain/make_config.py +++ b/src/icmtoolchain/make_config.py @@ -1,6 +1,7 @@ from functools import cmp_to_key from os.path import basename, isfile, join, splitext -from typing import Any, Iterable, MutableSequence, Optional, Union, override +from typing import (Any, Iterable, MutableMapping, MutableSequence, Optional, + Union, override) from .config import Config, FileConfig from .language import (MakeAssetData, MakeDataConfig, MakeJavaData, @@ -47,6 +48,21 @@ class MakeConfig(MakeDataConfig): config.save_as_file() return changes + @override + def update_properties(self) -> None: + configurations = self.get_value("configurations") + if not isinstance(configurations, MutableMapping): + self.overrides = None + return + overrides = None + for value_set, configuration in configurations.items(): + if not self.is_relevant_configuration(value_set) or not isinstance(configuration, MutableMapping): + continue + if overrides is None: + overrides = Config() + overrides.merge_config(configuration) + self.overrides = overrides + @property @override def is_pack(self) -> bool: diff --git a/src/icmtoolchain/rule_set.py b/src/icmtoolchain/rule_set.py index 1188982..65f99d2 100644 --- a/src/icmtoolchain/rule_set.py +++ b/src/icmtoolchain/rule_set.py @@ -90,11 +90,16 @@ class RuleSetHolder(metaclass=ABCMeta): def is_relevant_configuration(self, value_set: str, allow_unresolved_properties: bool = True) -> bool: return self.rule_set.is_relevant(self.properties, value_set, allow_unresolved_properties=allow_unresolved_properties) + def update_properties(self) -> None: + pass + def bisect_properties(self, *properties: str) -> None: self.rule_set.bisect_values(self.properties, *properties) + self.update_properties() def remove_rules(self, *rules: str) -> None: self.rule_set.remove_rules(self.properties, *rules) + self.update_properties() class RuleSetConfig(Config): def __init__(self, map: Optional[ConfigSupportsKeysAndGetItem] = None, defaults: Optional[Config] = None, overrides: Optional[Config] = None):