[BUGFIX] Have __preset__ override nested preset keys (#784)
With the new preset nesting support, `__preset__` would have lower precedence which isn't ideal since it's meant to serve as a 'apply to all presets in this file'. Now the order of priority is: `inherited presets (top-to-bottom) -> preset itself -> nested subscription presets -> __preset__ -> subscription values`
This commit is contained in:
parent
d810291e7c
commit
852347dc7e
4 changed files with 44 additions and 12 deletions
|
|
@ -147,10 +147,12 @@ class Subscription(SubscriptionDownload):
|
||||||
name="",
|
name="",
|
||||||
value=subscriptions_dict,
|
value=subscriptions_dict,
|
||||||
config=config,
|
config=config,
|
||||||
presets=[FILE_PRESET_APPLY_KEY] if has_file_preset else [],
|
presets=[],
|
||||||
indent_overrides=[],
|
indent_overrides=[],
|
||||||
subscription_value=file_subscription_value,
|
subscription_value=file_subscription_value,
|
||||||
).subscription_dicts()
|
).subscription_dicts(
|
||||||
|
global_presets_to_apply=[FILE_PRESET_APPLY_KEY] if has_file_preset else []
|
||||||
|
)
|
||||||
|
|
||||||
for subscription_key, subscription_object in subscriptions_dicts.items():
|
for subscription_key, subscription_object in subscriptions_dicts.items():
|
||||||
subscriptions.append(
|
subscriptions.append(
|
||||||
|
|
|
||||||
|
|
@ -66,8 +66,10 @@ class SubscriptionOutput(Validator, ABC):
|
||||||
}
|
}
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def subscription_dicts(self) -> Dict[str, Dict]:
|
def subscription_dicts(self, global_presets_to_apply: List[str]) -> Dict[str, Dict]:
|
||||||
"""
|
"""
|
||||||
|
Parameters
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
Subscriptions in the form of ``{ subscription_name: preset_dict }``
|
Subscriptions in the form of ``{ subscription_name: preset_dict }``
|
||||||
|
|
@ -81,7 +83,7 @@ class SubscriptionPresetDictValidator(SubscriptionOutput, DictValidator):
|
||||||
_ = self._validate_key_if_present(key="preset", validator=StringListValidator, default=[])
|
_ = self._validate_key_if_present(key="preset", validator=StringListValidator, default=[])
|
||||||
_ = self._validate_key_if_present(key="overrides", validator=Overrides, default={})
|
_ = self._validate_key_if_present(key="overrides", validator=Overrides, default={})
|
||||||
|
|
||||||
def subscription_dicts(self) -> Dict[str, Dict]:
|
def subscription_dicts(self, global_presets_to_apply: List[str]) -> Dict[str, Dict]:
|
||||||
output_dict = copy.deepcopy(self._dict)
|
output_dict = copy.deepcopy(self._dict)
|
||||||
parent_presets = output_dict.get("preset", [])
|
parent_presets = output_dict.get("preset", [])
|
||||||
|
|
||||||
|
|
@ -89,7 +91,7 @@ class SubscriptionPresetDictValidator(SubscriptionOutput, DictValidator):
|
||||||
if isinstance(parent_presets, str):
|
if isinstance(parent_presets, str):
|
||||||
parent_presets = [parent_presets]
|
parent_presets = [parent_presets]
|
||||||
|
|
||||||
output_dict["preset"] = parent_presets + self._presets
|
output_dict["preset"] = parent_presets + self._presets + global_presets_to_apply
|
||||||
output_dict["overrides"] = dict(
|
output_dict["overrides"] = dict(
|
||||||
output_dict.get("overrides", {}), **self._indent_overrides_dict()
|
output_dict.get("overrides", {}), **self._indent_overrides_dict()
|
||||||
)
|
)
|
||||||
|
|
@ -115,7 +117,7 @@ class SubscriptionValueValidator(SubscriptionOutput, StringValidator):
|
||||||
)
|
)
|
||||||
self._subscription_value: Optional[str] = subscription_value
|
self._subscription_value: Optional[str] = subscription_value
|
||||||
|
|
||||||
def subscription_dicts(self) -> Dict[str, Dict]:
|
def subscription_dicts(self, global_presets_to_apply: List[str]) -> Dict[str, Dict]:
|
||||||
subscription_value_dict: Dict[str, str] = {"subscription_value": self.value}
|
subscription_value_dict: Dict[str, str] = {"subscription_value": self.value}
|
||||||
# TODO: Eventually delete in favor of {subscription_value}
|
# TODO: Eventually delete in favor of {subscription_value}
|
||||||
if self._subscription_value:
|
if self._subscription_value:
|
||||||
|
|
@ -123,7 +125,7 @@ class SubscriptionValueValidator(SubscriptionOutput, StringValidator):
|
||||||
|
|
||||||
return {
|
return {
|
||||||
self._leaf_name: {
|
self._leaf_name: {
|
||||||
"preset": self._presets,
|
"preset": self._presets + global_presets_to_apply,
|
||||||
"overrides": dict(
|
"overrides": dict(
|
||||||
subscription_value_dict,
|
subscription_value_dict,
|
||||||
**self._indent_overrides_dict(),
|
**self._indent_overrides_dict(),
|
||||||
|
|
@ -196,9 +198,12 @@ class SubscriptionValidator(SubscriptionOutput):
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
def subscription_dicts(self) -> Dict[str, Dict]:
|
def subscription_dicts(self, global_presets_to_apply: List[str]) -> Dict[str, Dict]:
|
||||||
subscription_dicts: Dict[str, Dict] = {}
|
subscription_dicts: Dict[str, Dict] = {}
|
||||||
for child in self._children:
|
for child in self._children:
|
||||||
subscription_dicts = dict(subscription_dicts, **child.subscription_dicts())
|
subscription_dicts = dict(
|
||||||
|
subscription_dicts,
|
||||||
|
**child.subscription_dicts(global_presets_to_apply=global_presets_to_apply),
|
||||||
|
)
|
||||||
|
|
||||||
return subscription_dicts
|
return subscription_dicts
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,10 @@ def config_file() -> ConfigFile:
|
||||||
value={
|
value={
|
||||||
"configuration": {"working_directory": "."},
|
"configuration": {"working_directory": "."},
|
||||||
"presets": {
|
"presets": {
|
||||||
"parent_preset_0": {"nfo_tags": {"tags": {"key-1": "preset_0"}}},
|
"parent_preset_0": {
|
||||||
|
"nfo_tags": {"tags": {"key-1": "preset_0"}},
|
||||||
|
"overrides": {"current_override": "parent_preset_0"},
|
||||||
|
},
|
||||||
"parent_preset_1": {
|
"parent_preset_1": {
|
||||||
"preset": "parent_preset_0",
|
"preset": "parent_preset_0",
|
||||||
"nfo_tags": {
|
"nfo_tags": {
|
||||||
|
|
@ -20,15 +23,20 @@ def config_file() -> ConfigFile:
|
||||||
"nfo_root": "root",
|
"nfo_root": "root",
|
||||||
"tags": {"key-2": "preset_1"},
|
"tags": {"key-2": "preset_1"},
|
||||||
},
|
},
|
||||||
|
"overrides": {"current_override": "parent_preset_1"},
|
||||||
},
|
},
|
||||||
"parent_preset_2": {
|
"parent_preset_2": {
|
||||||
"nfo_tags": {
|
"nfo_tags": {
|
||||||
"nfo_name": "{uid}.nfo",
|
"nfo_name": "{uid}.nfo",
|
||||||
"nfo_root": "root",
|
"nfo_root": "root",
|
||||||
"tags": {"key-2": "preset_2", "key-3": "preset_2"},
|
"tags": {"key-2": "preset_2", "key-3": "preset_2"},
|
||||||
}
|
},
|
||||||
|
"overrides": {"current_override": "parent_preset_2"},
|
||||||
|
},
|
||||||
|
"parent_preset_3": {
|
||||||
|
"preset": ["parent_preset_1", "parent_preset_2"],
|
||||||
|
"overrides": {"current_override": "parent_preset_3"},
|
||||||
},
|
},
|
||||||
"parent_preset_3": {"preset": ["parent_preset_1", "parent_preset_2"]},
|
|
||||||
"preset_self_loop": {"preset": "preset_self_loop"},
|
"preset_self_loop": {"preset": "preset_self_loop"},
|
||||||
"preset_loop_0": {"preset": "preset_loop_1"},
|
"preset_loop_0": {"preset": "preset_loop_1"},
|
||||||
"preset_loop_1": {"preset": "preset_loop_0"},
|
"preset_loop_1": {"preset": "preset_loop_0"},
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,7 @@ def preset_with_file_preset(youtube_video: Dict, output_options: Dict):
|
||||||
"test_config_subscription_value": "original",
|
"test_config_subscription_value": "original",
|
||||||
"subscription_indent_1": "original_1",
|
"subscription_indent_1": "original_1",
|
||||||
"subscription_indent_2": "original_2",
|
"subscription_indent_2": "original_2",
|
||||||
|
"current_override": "__preset__",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"test_preset": {
|
"test_preset": {
|
||||||
|
|
@ -54,6 +55,7 @@ def preset_with_file_preset(youtube_video: Dict, output_options: Dict):
|
||||||
"nfo_tags": {
|
"nfo_tags": {
|
||||||
"tags": {"key-4": "test_preset"},
|
"tags": {"key-4": "test_preset"},
|
||||||
},
|
},
|
||||||
|
"overrides": {"current_override": "test_preset"},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -137,6 +139,8 @@ def test_subscription_file_preset_applies(config_file: ConfigFile, preset_with_f
|
||||||
|
|
||||||
# Test __preset__ worked correctly
|
# Test __preset__ worked correctly
|
||||||
preset_sub = subs[0]
|
preset_sub = subs[0]
|
||||||
|
assert preset_sub.name == "test_preset"
|
||||||
|
|
||||||
nfo_options: NfoTagsOptions = preset_sub.plugins.get(NfoTagsOptions)
|
nfo_options: NfoTagsOptions = preset_sub.plugins.get(NfoTagsOptions)
|
||||||
tags_string_dict = {
|
tags_string_dict = {
|
||||||
key: formatter[0].format_string for key, formatter in nfo_options.tags.string_tags.items()
|
key: formatter[0].format_string for key, formatter in nfo_options.tags.string_tags.items()
|
||||||
|
|
@ -149,6 +153,10 @@ def test_subscription_file_preset_applies(config_file: ConfigFile, preset_with_f
|
||||||
"key-4": "test_preset",
|
"key-4": "test_preset",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
overrides = preset_sub.overrides.dict_with_format_strings
|
||||||
|
# preset overrides take precedence over __preset__
|
||||||
|
assert overrides.get("current_override") == "test_preset"
|
||||||
|
|
||||||
|
|
||||||
def test_subscription_file_value_applies(
|
def test_subscription_file_value_applies(
|
||||||
config_file: ConfigFile, preset_with_subscription_file_value: Dict
|
config_file: ConfigFile, preset_with_subscription_file_value: Dict
|
||||||
|
|
@ -165,6 +173,7 @@ def test_subscription_file_value_applies(
|
||||||
assert overrides.get("test_file_subscription_value") == "is_overwritten"
|
assert overrides.get("test_file_subscription_value") == "is_overwritten"
|
||||||
assert overrides.get("test_file_subscription_value")
|
assert overrides.get("test_file_subscription_value")
|
||||||
assert overrides.get("subscription_value") == "is_overwritten"
|
assert overrides.get("subscription_value") == "is_overwritten"
|
||||||
|
assert overrides.get("current_override") == "__preset__" # ensure __preset__ takes precedence
|
||||||
|
|
||||||
|
|
||||||
def test_subscription_file_value_applies_sub_file_takes_precedence(
|
def test_subscription_file_value_applies_sub_file_takes_precedence(
|
||||||
|
|
@ -183,6 +192,7 @@ def test_subscription_file_value_applies_sub_file_takes_precedence(
|
||||||
assert value_sub.get("test_config_subscription_value") == "original"
|
assert value_sub.get("test_config_subscription_value") == "original"
|
||||||
assert value_sub.get("subscription_name") == "test_value"
|
assert value_sub.get("subscription_name") == "test_value"
|
||||||
assert value_sub.get("subscription_value") == "is_overwritten"
|
assert value_sub.get("subscription_value") == "is_overwritten"
|
||||||
|
assert value_sub.get("current_override") == "__preset__" # ensure __preset__ takes precedence
|
||||||
|
|
||||||
|
|
||||||
def test_subscription_file_value_applies_from_config(
|
def test_subscription_file_value_applies_from_config(
|
||||||
|
|
@ -200,6 +210,7 @@ def test_subscription_file_value_applies_from_config(
|
||||||
assert value_sub.get("test_config_subscription_value") == "is_overwritten"
|
assert value_sub.get("test_config_subscription_value") == "is_overwritten"
|
||||||
assert value_sub.get("subscription_name") == "test_value"
|
assert value_sub.get("subscription_name") == "test_value"
|
||||||
assert value_sub.get("subscription_value") == "is_overwritten"
|
assert value_sub.get("subscription_value") == "is_overwritten"
|
||||||
|
assert value_sub.get("current_override") == "__preset__" # ensure __preset__ takes precedence
|
||||||
|
|
||||||
|
|
||||||
def test_subscription_file_value_applies_from_config_and_nested(
|
def test_subscription_file_value_applies_from_config_and_nested(
|
||||||
|
|
@ -219,10 +230,12 @@ def test_subscription_file_value_applies_from_config_and_nested(
|
||||||
assert sub_1.get("test_config_subscription_value") == "is_1_overwritten"
|
assert sub_1.get("test_config_subscription_value") == "is_1_overwritten"
|
||||||
assert sub_1.get("subscription_name") == "test_1"
|
assert sub_1.get("subscription_name") == "test_1"
|
||||||
assert sub_1.get("subscription_value") == "is_1_overwritten"
|
assert sub_1.get("subscription_value") == "is_1_overwritten"
|
||||||
|
assert sub_1.get("current_override") == "__preset__" # ensure __preset__ takes precedence
|
||||||
|
|
||||||
assert sub_2_1.get("test_config_subscription_value") == "is_2_1_overwritten"
|
assert sub_2_1.get("test_config_subscription_value") == "is_2_1_overwritten"
|
||||||
assert sub_2_1.get("subscription_name") == "test_2_1"
|
assert sub_2_1.get("subscription_name") == "test_2_1"
|
||||||
assert sub_2_1.get("subscription_value") == "is_2_1_overwritten"
|
assert sub_2_1.get("subscription_value") == "is_2_1_overwritten"
|
||||||
|
assert sub_2_1.get("current_override") == "__preset__" # ensure __preset__ takes precedence
|
||||||
|
|
||||||
|
|
||||||
def test_subscription_file_value_applies_from_config_and_nested_and_indent_variables(
|
def test_subscription_file_value_applies_from_config_and_nested_and_indent_variables(
|
||||||
|
|
@ -252,12 +265,14 @@ def test_subscription_file_value_applies_from_config_and_nested_and_indent_varia
|
||||||
assert sub_1.get("subscription_value") == "is_1_overwritten"
|
assert sub_1.get("subscription_value") == "is_1_overwritten"
|
||||||
assert sub_1.get("subscription_indent_1") == "INDENT_1"
|
assert sub_1.get("subscription_indent_1") == "INDENT_1"
|
||||||
assert sub_1.get("subscription_indent_2") == "INDENT_2"
|
assert sub_1.get("subscription_indent_2") == "INDENT_2"
|
||||||
|
assert sub_1.get("current_override") == "__preset__" # ensure __preset__ takes precedence
|
||||||
|
|
||||||
assert sub_2_1.get("test_config_subscription_value") == "is_2_1_overwritten"
|
assert sub_2_1.get("test_config_subscription_value") == "is_2_1_overwritten"
|
||||||
assert sub_2_1.get("subscription_name") == "test_2_1"
|
assert sub_2_1.get("subscription_name") == "test_2_1"
|
||||||
assert sub_2_1.get("subscription_value") == "is_2_1_overwritten"
|
assert sub_2_1.get("subscription_value") == "is_2_1_overwritten"
|
||||||
assert sub_2_1.get("subscription_indent_1") == "INDENT_1"
|
assert sub_2_1.get("subscription_indent_1") == "INDENT_1"
|
||||||
assert sub_2_1.get("subscription_indent_2") == "original_2"
|
assert sub_2_1.get("subscription_indent_2") == "original_2"
|
||||||
|
assert sub_2_1.get("current_override") == "__preset__" # ensure __preset__ takes precedence
|
||||||
|
|
||||||
|
|
||||||
def test_subscription_file_value_applies_from_config_and_nested_and_indent_variables_same_line(
|
def test_subscription_file_value_applies_from_config_and_nested_and_indent_variables_same_line(
|
||||||
|
|
@ -288,12 +303,14 @@ def test_subscription_file_value_applies_from_config_and_nested_and_indent_varia
|
||||||
assert sub_1.get("subscription_indent_1") == "INDENT_1"
|
assert sub_1.get("subscription_indent_1") == "INDENT_1"
|
||||||
assert sub_1.get("subscription_indent_2") == "INDENT_2"
|
assert sub_1.get("subscription_indent_2") == "INDENT_2"
|
||||||
assert sub_1.get("subscription_indent_3") == "INDENT_3"
|
assert sub_1.get("subscription_indent_3") == "INDENT_3"
|
||||||
|
assert sub_1.get("current_override") == "__preset__" # ensure __preset__ takes precedence
|
||||||
|
|
||||||
assert sub_2_1.get("test_config_subscription_value") == "is_2_1_overwritten"
|
assert sub_2_1.get("test_config_subscription_value") == "is_2_1_overwritten"
|
||||||
assert sub_2_1.get("subscription_name") == "test_2_1"
|
assert sub_2_1.get("subscription_name") == "test_2_1"
|
||||||
assert sub_2_1.get("subscription_value") == "is_2_1_overwritten"
|
assert sub_2_1.get("subscription_value") == "is_2_1_overwritten"
|
||||||
assert sub_2_1.get("subscription_indent_1") == "INDENT_1"
|
assert sub_2_1.get("subscription_indent_1") == "INDENT_1"
|
||||||
assert sub_2_1.get("subscription_indent_2") == "original_2"
|
assert sub_2_1.get("subscription_indent_2") == "original_2"
|
||||||
|
assert sub_2_1.get("current_override") == "__preset__" # ensure __preset__ takes precedence
|
||||||
assert "subscription_indent_3" not in sub_2_1
|
assert "subscription_indent_3" not in sub_2_1
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue