variable/function collision detection

This commit is contained in:
Jesse Bannon 2023-12-16 23:42:31 -08:00
parent 336c8607d9
commit d33d633dd7
3 changed files with 33 additions and 11 deletions

View file

@ -76,7 +76,6 @@ class Overrides(DictFormatterValidator, Scriptable):
" built-in ytdl-sub function name." " built-in ytdl-sub function name."
) )
self.unresolvable.add(VARIABLES.entry_metadata.variable_name) self.unresolvable.add(VARIABLES.entry_metadata.variable_name)
def initial_variables( def initial_variables(

View file

@ -88,6 +88,15 @@ class VariableValidation:
resolved_variables=self.resolved_variables, resolved_variables=self.resolved_variables,
) )
for added_variable in added_variables:
if added_variable in overrides.keys:
# pylint: disable=protected-access
raise overrides._validation_exception(
f"Override variable with name {added_variable} cannot be used since it is a"
" built-in ytdl-sub variable added by a plugin."
)
# pylint: enable=protected-access
# Set unresolved as variables that are added but do not exist as entry/override variables # Set unresolved as variables that are added but do not exist as entry/override variables
# Then update resolved variables to reflect that # Then update resolved variables to reflect that
self.unresolved_variables = added_variables | modified_variables self.unresolved_variables = added_variables | modified_variables
@ -113,15 +122,6 @@ class VariableValidation:
).get(plugin_op, set()) ).get(plugin_op, set())
modified_variables = options.modified_variables().get(plugin_op, set()) modified_variables = options.modified_variables().get(plugin_op, set())
if added_variables:
for added_variable in added_variables:
if added_variable in self.resolved_variables:
# pylint: disable=protected-access
raise options._validation_exception(
f"Tried added the variable '{added_variable}', but it already "
f"exists as a defined variable."
)
resolved_variables = added_variables | modified_variables resolved_variables = added_variables | modified_variables
self.script.add(_add_dummy_variables(resolved_variables)) self.script.add(_add_dummy_variables(resolved_variables))

View file

@ -260,13 +260,36 @@ class TestPreset:
}, },
) )
def test_preset_error_override_variable_collides_added_variable(
self, config_file, output_options, youtube_video
):
with pytest.raises(
ValidationException,
match=re.escape(
f"Override variable with name subtitles_ext cannot be used since"
" it is a built-in ytdl-sub variable added by a plugin."
),
):
_ = Preset(
config=config_file,
name="test",
value={
"download": youtube_video,
"output_options": {"output_directory": "dir", "file_name": "ack"},
"subtitles": {
"embed_subtitles": True,
},
"overrides": {"subtitles_ext": "collide"},
},
)
@pytest.mark.parametrize( @pytest.mark.parametrize(
"function_name", "function_name",
[ [
"%extract_field_from_siblings", "%extract_field_from_siblings",
"%extract_field_from_metadata_array", "%extract_field_from_metadata_array",
"%sanitize", "%sanitize",
"%array" "%array",
], ],
) )
def test_preset_error_override_variable_collides_with_custom_function( def test_preset_error_override_variable_collides_with_custom_function(