improved added source var validation

This commit is contained in:
Jesse Bannon 2022-09-13 21:46:20 -07:00
parent d9bca00bc4
commit adc61f6ed1
4 changed files with 24 additions and 11 deletions

View file

@ -203,16 +203,18 @@ class Preset(StrictDictValidator):
# Validate added download option variables here since plugins could subsequently use them # Validate added download option variables here since plugins could subsequently use them
self.downloader_options.validate_with_variables( self.downloader_options.validate_with_variables(
source_variables=source_variables, override_variables=self.overrides.keys source_variables=source_variables,
override_variables=self.overrides.dict_with_format_strings,
) )
source_variables.extend(self.downloader_options.added_source_variables()) source_variables.extend(self.downloader_options.added_source_variables())
for plugin_options in sorted( for _, plugin_options in sorted(
self.plugins.plugin_options, key=lambda pl_options: pl_options.priority.modify_entry self.plugins.zipped(), key=lambda pl: pl[0].priority.modify_entry
): ):
# Validate current plugin using source + added plugin variables # Validate current plugin using source + added plugin variables
plugin_options.validate_with_variables( plugin_options.validate_with_variables(
source_variables=source_variables, override_variables=self.overrides.keys source_variables=source_variables,
override_variables=self.overrides.dict_with_format_strings,
) )
# Extend existing source variables with ones created from this plugin # Extend existing source variables with ones created from this plugin

View file

@ -33,7 +33,7 @@ class AddsVariablesMixin(ABC):
return [] return []
def validate_with_variables( def validate_with_variables(
self, source_variables: List[str], override_variables: List[str] self, source_variables: List[str], override_variables: Dict[str, str]
) -> None: ) -> None:
""" """
Optional validation after init with the session's source and override variables. Optional validation after init with the session's source and override variables.

View file

@ -13,6 +13,7 @@ from ytdl_sub.entries.entry_parent import EntryParent
from ytdl_sub.utils.file_handler import FileHandler from ytdl_sub.utils.file_handler import FileHandler
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
from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator
from ytdl_sub.validators.validators import ListValidator from ytdl_sub.validators.validators import ListValidator
from ytdl_sub.validators.validators import StringValidator from ytdl_sub.validators.validators import StringValidator
@ -124,19 +125,29 @@ class CollectionDownloadOptions(DownloaderValidator):
return list(self._urls.list[0].variables.keys()) return list(self._urls.list[0].variables.keys())
def validate_with_variables( def validate_with_variables(
self, source_variables: List[str], override_variables: List[str] self, source_variables: List[str], override_variables: Dict[str, str]
) -> None: ) -> None:
""" """
Ensures new variables added are not existing variables Ensures new variables added are not existing variables
""" """
# TODO: Make sure they resolve for source_var_name in self.added_source_variables():
for added_source_var in self.added_source_variables(): if source_var_name in source_variables:
if added_source_var in source_variables:
raise self._validation_exception( raise self._validation_exception(
f"'{added_source_var}' cannot be used as a variable name because it " f"'{source_var_name}' cannot be used as a variable name because it "
f"is an existing source variable" f"is an existing source variable"
) )
base_variables = dict(
override_variables, **{source_var: "dummy_string" for source_var in source_variables}
)
# Apply formatting to each new source variable, ensure it resolves
for collection_url in self.collection_urls.list:
for source_var_name, source_var_formatter_str in collection_url.variables.items():
_ = StringFormatterValidator(
name=f"{self._name}.{source_var_name}", value=source_var_formatter_str
).apply_formatter(base_variables)
class CollectionDownloader(Downloader[CollectionDownloadOptions, Entry]): class CollectionDownloader(Downloader[CollectionDownloadOptions, Entry]):
downloader_options_type = CollectionDownloadOptions downloader_options_type = CollectionDownloadOptions

View file

@ -165,7 +165,7 @@ class RegexOptions(PluginOptions):
return self._skip_if_match_fails return self._skip_if_match_fails
def validate_with_variables( def validate_with_variables(
self, source_variables: List[str], override_variables: List[str] self, source_variables: List[str], override_variables: Dict[str, str]
) -> None: ) -> None:
""" """
Ensures each source variable capture group is valid Ensures each source variable capture group is valid