preset test
This commit is contained in:
parent
52a9a8db86
commit
a16f4c9c4b
3 changed files with 59 additions and 7 deletions
|
|
@ -22,6 +22,9 @@ from ytdl_sub.downloaders.downloader import DownloaderValidator
|
||||||
from ytdl_sub.entries.entry import Entry
|
from ytdl_sub.entries.entry import Entry
|
||||||
from ytdl_sub.plugins.plugin import Plugin
|
from ytdl_sub.plugins.plugin import Plugin
|
||||||
from ytdl_sub.plugins.plugin import PluginOptions
|
from ytdl_sub.plugins.plugin import PluginOptions
|
||||||
|
from ytdl_sub.prebuilt_presets import PREBUILT_PRESET_NAMES
|
||||||
|
from ytdl_sub.prebuilt_presets import PUBLISHED_PRESET_NAMES
|
||||||
|
from ytdl_sub.utils.exceptions import ValidationException
|
||||||
from ytdl_sub.utils.yaml import dump_yaml
|
from ytdl_sub.utils.yaml import dump_yaml
|
||||||
from ytdl_sub.validators.strict_dict_validator import StrictDictValidator
|
from ytdl_sub.validators.strict_dict_validator import StrictDictValidator
|
||||||
from ytdl_sub.validators.string_formatter_validators import DictFormatterValidator
|
from ytdl_sub.validators.string_formatter_validators import DictFormatterValidator
|
||||||
|
|
@ -45,6 +48,19 @@ PRESET_KEYS = {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def _parent_preset_error_message(
|
||||||
|
current_preset_name: str, parent_preset_name: str, presets: List[str]
|
||||||
|
) -> ValidationException:
|
||||||
|
user_defined_presets = set(presets) - PREBUILT_PRESET_NAMES - {current_preset_name}
|
||||||
|
|
||||||
|
return validation_exception(
|
||||||
|
name=current_preset_name,
|
||||||
|
error_message=f"preset '{parent_preset_name}' does not exist in the provided config.\n"
|
||||||
|
f"Available prebuilt presets: {', '.join(sorted(PUBLISHED_PRESET_NAMES))}\n"
|
||||||
|
f"Your presets: {', '.join(sorted(user_defined_presets))}",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class PresetPlugins:
|
class PresetPlugins:
|
||||||
_TPluginOptions = TypeVar("_TPluginOptions", bound=PluginOptions)
|
_TPluginOptions = TypeVar("_TPluginOptions", bound=PluginOptions)
|
||||||
|
|
||||||
|
|
@ -180,6 +196,11 @@ class Preset(_PresetShell):
|
||||||
Preset name
|
Preset name
|
||||||
value
|
value
|
||||||
Preset value
|
Preset value
|
||||||
|
|
||||||
|
Raises
|
||||||
|
------
|
||||||
|
ValidationException
|
||||||
|
If validation fails
|
||||||
"""
|
"""
|
||||||
# Ensure value is a dict
|
# Ensure value is a dict
|
||||||
_ = _PresetShell(name=name, value=value)
|
_ = _PresetShell(name=name, value=value)
|
||||||
|
|
@ -201,10 +222,10 @@ class Preset(_PresetShell):
|
||||||
parent_presets = StringListValidator(name=f"{name}.preset", value=value.get("preset", []))
|
parent_presets = StringListValidator(name=f"{name}.preset", value=value.get("preset", []))
|
||||||
for parent_preset_name in parent_presets.list:
|
for parent_preset_name in parent_presets.list:
|
||||||
if parent_preset_name.value not in config.presets.keys:
|
if parent_preset_name.value not in config.presets.keys:
|
||||||
raise validation_exception(
|
raise _parent_preset_error_message(
|
||||||
name=f"{name}.preset",
|
current_preset_name=name,
|
||||||
error_message=f"preset '{parent_preset_name.value}' does not exist in the "
|
parent_preset_name=parent_preset_name.value,
|
||||||
f"provided config. Available presets: {', '.join(config.presets.keys)}",
|
presets=config.presets.keys,
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
@ -373,9 +394,10 @@ class Preset(_PresetShell):
|
||||||
|
|
||||||
# Make sure the parent preset actually exists
|
# Make sure the parent preset actually exists
|
||||||
if parent_preset not in config.presets.keys:
|
if parent_preset not in config.presets.keys:
|
||||||
raise self._validation_exception(
|
raise _parent_preset_error_message(
|
||||||
f"preset '{parent_preset}' does not exist in the provided config. "
|
current_preset_name=self._name,
|
||||||
f"Available presets: {', '.join(config.presets.keys)}"
|
parent_preset_name=parent_preset,
|
||||||
|
presets=config.presets.keys,
|
||||||
)
|
)
|
||||||
|
|
||||||
parent_preset_dict = copy.deepcopy(config.presets.dict[parent_preset])
|
parent_preset_dict = copy.deepcopy(config.presets.dict[parent_preset])
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import pathlib
|
import pathlib
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
from typing import Set
|
||||||
|
|
||||||
import mergedeep
|
import mergedeep
|
||||||
|
|
||||||
|
|
@ -21,3 +22,8 @@ def _merge_presets() -> Dict[str, Any]:
|
||||||
|
|
||||||
|
|
||||||
PREBUILT_PRESETS: Dict[str, Any] = _merge_presets()
|
PREBUILT_PRESETS: Dict[str, Any] = _merge_presets()
|
||||||
|
|
||||||
|
PREBUILT_PRESET_NAMES: Set[str] = set(PREBUILT_PRESETS.keys())
|
||||||
|
PUBLISHED_PRESET_NAMES: Set[str] = {
|
||||||
|
name for name in PREBUILT_PRESET_NAMES if not name.startswith("_")
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import pytest
|
||||||
|
|
||||||
from ytdl_sub.config.config_file import ConfigFile
|
from ytdl_sub.config.config_file import ConfigFile
|
||||||
from ytdl_sub.config.preset import PRESET_KEYS
|
from ytdl_sub.config.preset import PRESET_KEYS
|
||||||
|
from ytdl_sub.config.preset_class_mappings import DownloadStrategyMapping
|
||||||
from ytdl_sub.config.preset_class_mappings import PluginMapping
|
from ytdl_sub.config.preset_class_mappings import PluginMapping
|
||||||
from ytdl_sub.utils.exceptions import ValidationException
|
from ytdl_sub.utils.exceptions import ValidationException
|
||||||
|
|
||||||
|
|
@ -44,10 +45,19 @@ class TestConfigFilePartiallyValidatesPresets:
|
||||||
def test_success(self, preset_dict: Dict):
|
def test_success(self, preset_dict: Dict):
|
||||||
self._partial_validate(preset_dict)
|
self._partial_validate(preset_dict)
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("key", ["output_options", "overrides", "ytdl_options"])
|
||||||
|
def test_success__empty_preset_keys(self, key):
|
||||||
|
self._partial_validate({key: {}})
|
||||||
|
|
||||||
@pytest.mark.parametrize("plugin", PluginMapping.plugins())
|
@pytest.mark.parametrize("plugin", PluginMapping.plugins())
|
||||||
def test_success__empty_plugins(self, plugin: str):
|
def test_success__empty_plugins(self, plugin: str):
|
||||||
self._partial_validate({plugin: {}})
|
self._partial_validate({plugin: {}})
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("source", DownloadStrategyMapping.sources())
|
||||||
|
def test_success__empty_sources(self, source: str):
|
||||||
|
for download_strategy in DownloadStrategyMapping.source_download_strategies(source):
|
||||||
|
self._partial_validate({source: {"download_strategy": download_strategy}})
|
||||||
|
|
||||||
def test_error__bad_preset_section(self):
|
def test_error__bad_preset_section(self):
|
||||||
self._partial_validate(
|
self._partial_validate(
|
||||||
preset_dict={"does_not_exist": "lol"},
|
preset_dict={"does_not_exist": "lol"},
|
||||||
|
|
@ -129,3 +139,17 @@ class TestConfigFilePartiallyValidatesPresets:
|
||||||
preset_dict=preset_dict,
|
preset_dict=preset_dict,
|
||||||
expected_error_message="Validation error in partial_preset.ytdl_options",
|
expected_error_message="Validation error in partial_preset.ytdl_options",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"preset_dict",
|
||||||
|
[
|
||||||
|
{"preset": "DNE"},
|
||||||
|
{"preset": ["DNE"]},
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_error__non_existent_preset(self, preset_dict):
|
||||||
|
self._partial_validate(
|
||||||
|
preset_dict=preset_dict,
|
||||||
|
expected_error_message="Validation error in partial_preset: "
|
||||||
|
"preset 'DNE' does not exist in the provided config.",
|
||||||
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue