variable nonsense fixed for now

This commit is contained in:
Jesse Bannon 2023-12-13 00:56:31 -08:00
parent 5ea1c83ef7
commit b645c82e5a
3 changed files with 40 additions and 20 deletions

View file

@ -2,6 +2,7 @@ import copy
from typing import List from typing import List
from typing import Optional from typing import Optional
from typing import Set from typing import Set
from typing import Tuple
from ytdl_sub.config.overrides import Overrides from ytdl_sub.config.overrides import Overrides
from ytdl_sub.config.plugin.plugin_mapping import PluginMapping from ytdl_sub.config.plugin.plugin_mapping import PluginMapping
@ -12,15 +13,16 @@ from ytdl_sub.config.validators.options import OptionsValidator
from ytdl_sub.downloaders.url.validators import MultiUrlValidator from ytdl_sub.downloaders.url.validators import MultiUrlValidator
from ytdl_sub.entries.script.variable_scripts import VARIABLE_SCRIPTS from ytdl_sub.entries.script.variable_scripts import VARIABLE_SCRIPTS
from ytdl_sub.script.script import Script from ytdl_sub.script.script import Script
from ytdl_sub.utils.exceptions import ValidationException
from ytdl_sub.utils.script import ScriptUtils from ytdl_sub.utils.script import ScriptUtils
from ytdl_sub.validators.string_formatter_validators import validate_formatters from ytdl_sub.validators.string_formatter_validators import validate_formatters
def _get_added_variables( def _get_added_and_modified_variables(
plugins: PresetPlugins, downloader_options: MultiUrlValidator, resolved_variables: Set[str] plugins: PresetPlugins, downloader_options: MultiUrlValidator, resolved_variables: Set[str]
) -> Set[str]: ) -> Tuple[Set[str], Set[str]]:
added_variables: Set[str] = set() added_variables: Set[str] = set()
modified_variables: Set[str] = set()
options: List[OptionsValidator] = plugins.plugin_options options: List[OptionsValidator] = plugins.plugin_options
options.append(downloader_options) options.append(downloader_options)
@ -31,7 +33,10 @@ def _get_added_variables(
).values(): ).values():
added_variables |= set(plugin_added_variables) added_variables |= set(plugin_added_variables)
return added_variables for plugin_modified_variables in plugin_options.modified_variables().values():
modified_variables |= plugin_modified_variables
return added_variables, modified_variables
def _override_variables(overrides: Overrides) -> Set[str]: def _override_variables(overrides: Overrides) -> Set[str]:
@ -59,19 +64,25 @@ class VariableValidation:
def initialize_overrides(self, overrides: Overrides) -> "VariableValidation": def initialize_overrides(self, overrides: Overrides) -> "VariableValidation":
entry_variables = _entry_variables() entry_variables = _entry_variables()
self.resolved_variables = entry_variables.union(_override_variables(overrides)) override_variables = _override_variables(overrides)
# Set unresolved as variables that are added but do not exist as entry/override variables # Set resolved variables as all entry + override variables
self.unresolved_variables = ( # at this point to generate every possible added/modified variable
_get_added_variables( self.resolved_variables = entry_variables | override_variables
plugins=self.plugins, added_variables, modified_variables = _get_added_and_modified_variables(
downloader_options=self.downloader_options, plugins=self.plugins,
resolved_variables=self.resolved_variables, downloader_options=self.downloader_options,
) resolved_variables=self.resolved_variables,
- self.resolved_variables
) )
# Initialize overrides with unresolved variables to throw an error # Set unresolved as variables that are added but do not exist as entry/override variables
# Then update resolved variables to reflect that
self.unresolved_variables = added_variables | modified_variables
self.resolved_variables -= self.unresolved_variables
# Initialize overrides with unresolved variables + modified variables to throw an error.
# For modified variables, this is to prevent a resolve(update=True) to setting any
# dependencies until it has been explicitly added
overrides = overrides.initialize_script( overrides = overrides.initialize_script(
unresolved_variables={ unresolved_variables={
var_name: f"{{%throw('Plugin variable {var_name} has not been created yet')}}" var_name: f"{{%throw('Plugin variable {var_name} has not been created yet')}}"
@ -94,17 +105,20 @@ class VariableValidation:
resolved_variables=self.resolved_variables, resolved_variables=self.resolved_variables,
unresolved_variables=self.unresolved_variables, unresolved_variables=self.unresolved_variables,
).get(plugin_op, set()) ).get(plugin_op, set())
modified_variables = options.modified_variables().get(plugin_op, set())
if added_variables: if added_variables:
for added_variable in added_variables: for added_variable in added_variables:
if added_variable in self.resolved_variables: if added_variable in self.resolved_variables:
raise ValidationException( raise options._validation_exception(
f"Tried added the variable '{added_variable}', but it already " f"Tried added the variable '{added_variable}', but it already "
f"exists as a defined variable." f"exists as a defined variable."
) )
self.script.add(ScriptUtils.add_dummy_variables(added_variables)) resolved_variables = added_variables | modified_variables
self.unresolved_variables -= added_variables
self.script.add(ScriptUtils.add_dummy_variables(resolved_variables))
self.unresolved_variables -= resolved_variables
return added_variables return added_variables

View file

@ -260,6 +260,12 @@ class RegexOptions(OptionsDictValidator):
): ):
key = PluginOperation.MODIFY_ENTRY_METADATA key = PluginOperation.MODIFY_ENTRY_METADATA
for capture_group_name in regex_options.capture_group_names:
if capture_group_name in resolved_variables:
raise self._validation_exception(
f"cannot use '{capture_group_name}' as a capture group name because it is "
f"a defined variable"
)
added_source_vars[key] |= set(regex_options.capture_group_names) added_source_vars[key] |= set(regex_options.capture_group_names)
return added_source_vars return added_source_vars

View file

@ -313,7 +313,7 @@ class TestRegex:
with pytest.raises( with pytest.raises(
ValidationException, ValidationException,
match=re.escape( match=re.escape(
"Tried added the variable 'uid', but it already exists as a defined variable" "cannot use 'uid' as a capture group name because it is a defined variable"
), ),
): ):
_ = Subscription.from_dict( _ = Subscription.from_dict(
@ -333,8 +333,8 @@ class TestRegex:
with pytest.raises( with pytest.raises(
ValidationException, ValidationException,
match=re.escape( match=re.escape(
"Tried added the variable 'contains_regex_default', but it already exists " "cannot use 'contains_regex_default' as a capture group name because it is a "
"as a defined variable" "defined variable"
), ),
): ):
_ = Subscription.from_dict( _ = Subscription.from_dict(