still need to validate plugin added vars

This commit is contained in:
Jesse Bannon 2023-12-16 23:29:36 -08:00
parent f31388eb04
commit 336c8607d9
5 changed files with 194 additions and 0 deletions

View file

@ -8,6 +8,8 @@ import mergedeep
from ytdl_sub.entries.entry import Entry from ytdl_sub.entries.entry import Entry
from ytdl_sub.entries.script.variable_definitions import VARIABLES from ytdl_sub.entries.script.variable_definitions import VARIABLES
from ytdl_sub.entries.variables.override_variables import SUBSCRIPTION_NAME from ytdl_sub.entries.variables.override_variables import SUBSCRIPTION_NAME
from ytdl_sub.entries.variables.override_variables import OverrideVariables
from ytdl_sub.script.functions import Functions
from ytdl_sub.script.parser import parse from ytdl_sub.script.parser import parse
from ytdl_sub.script.script import Script from ytdl_sub.script.script import Script
from ytdl_sub.utils.script import ScriptUtils from ytdl_sub.utils.script import ScriptUtils
@ -53,6 +55,28 @@ class Overrides(DictFormatterValidator, Scriptable):
DictFormatterValidator.__init__(self, name, value) DictFormatterValidator.__init__(self, name, value)
Scriptable.__init__(self) Scriptable.__init__(self)
for key in self._keys:
if OverrideVariables.is_override_variable_name(key):
raise self._validation_exception(
f"Override variable with name {key} cannot be used since it is a"
" built-in ytdl-sub override variable name."
)
if key in self.script.variable_names:
raise self._validation_exception(
f"Override variable with name {key} cannot be used since it is a"
" built-in ytdl-sub entry variable name."
)
if key in self.script.function_names or (
key.startswith("%") and Functions.is_built_in(key[1:])
):
raise self._validation_exception(
f"Override function definition with name {key} cannot be used since it is a"
" 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

@ -1,5 +1,9 @@
import re
SUBSCRIPTION_NAME = "subscription_name" SUBSCRIPTION_NAME = "subscription_name"
SUBSCRIPTION_VALUE = "subscription_value" SUBSCRIPTION_VALUE = "subscription_value"
SUBSCRIPTION_MAP = "subscription_map"
SUBSCRIPTION_ARRAY = "subscription_array"
class OverrideVariables: class OverrideVariables:
@ -55,3 +59,26 @@ class OverrideVariables:
``subscription_value``. ``subscription_value``.
""" """
return f"subscription_value_{index + 1}" return f"subscription_value_{index + 1}"
@classmethod
def is_override_variable_name(cls, variable_name: str):
"""
Returns
-------
True of a variable name collides with an override variable name. False otherwise.
"""
if variable_name in (
SUBSCRIPTION_NAME,
SUBSCRIPTION_VALUE,
SUBSCRIPTION_MAP,
SUBSCRIPTION_ARRAY,
):
return True
if re.fullmatch(r"^subscription_value_(\d+)$", variable_name):
return True
if re.fullmatch(r"^subscription_indent_(\d+)$", variable_name):
return True
return False

View file

@ -31,6 +31,13 @@ def _function_name(function_key: str) -> str:
return function_key[1:] return function_key[1:]
def _to_function_definition_name(function_key: str) -> str:
"""
Add % in %custom_function
"""
return f"%{function_key}"
class Script: class Script:
""" """
Takes a dictionary of both Takes a dictionary of both
@ -455,3 +462,23 @@ class Script:
return resolvable return resolvable
raise RuntimeException(f"Tried to get unresolved variable {variable_name}") raise RuntimeException(f"Tried to get unresolved variable {variable_name}")
@property
def variable_names(self) -> Set[str]:
"""
Returns
-------
Set[str]
Names of all the variables within the Script.
"""
return set(list(self._variables.keys()))
@property
def function_names(self) -> Set[str]:
"""
Returns
-------
Set[str]
Names of all functions within the Script.
"""
return set(_to_function_definition_name(name) for name in self._functions.keys())

View file

@ -207,3 +207,84 @@ class TestPreset:
"output_options": output_options, "output_options": output_options,
}, },
) )
@pytest.mark.parametrize(
"override_variable_name", ["subscription_name", "subscription_value_3", "subscription_map"]
)
def test_preset_error_override_variable_collides_with_override(
self, config_file, output_options, youtube_video, override_variable_name: str
):
with pytest.raises(
ValidationException,
match=re.escape(
f"Override variable with name {override_variable_name} cannot be used since"
" it is a built-in ytdl-sub override variable name."
),
):
_ = Preset(
config=config_file,
name="test",
value={
"download": youtube_video,
"output_options": {"output_directory": "dir", "file_name": "{dne_var}"},
"overrides": {override_variable_name: "fail"},
},
)
@pytest.mark.parametrize(
"entry_variable_name",
[
"title",
"playlist_uid",
"source_title",
"playlist_max_upload_year",
],
)
def test_preset_error_override_variable_collides_with_entry_variable(
self, config_file, output_options, youtube_video, entry_variable_name: str
):
with pytest.raises(
ValidationException,
match=re.escape(
f"Override variable with name {entry_variable_name} cannot be used since"
" it is a built-in ytdl-sub entry variable name."
),
):
_ = Preset(
config=config_file,
name="test",
value={
"download": youtube_video,
"output_options": {"output_directory": "dir", "file_name": "{dne_var}"},
"overrides": {entry_variable_name: "fail"},
},
)
@pytest.mark.parametrize(
"function_name",
[
"%extract_field_from_siblings",
"%extract_field_from_metadata_array",
"%sanitize",
"%array"
],
)
def test_preset_error_override_variable_collides_with_custom_function(
self, config_file, output_options, youtube_video, function_name: str
):
with pytest.raises(
ValidationException,
match=re.escape(
f"Override function definition with name {function_name} cannot be used since"
" it is a built-in ytdl-sub function name."
),
):
_ = Preset(
config=config_file,
name="test",
value={
"download": youtube_video,
"output_options": {"output_directory": "dir", "file_name": "{dne_var}"},
"overrides": {function_name: "fail"},
},
)

View file

@ -0,0 +1,35 @@
import pytest
from ytdl_sub.entries.variables.override_variables import OverrideVariables
class TestOverrideVariables:
@pytest.mark.parametrize(
"override_variable_name",
[
"subscription_value",
"subscription_name",
"subscription_map",
"subscription_array",
"subscription_value_532",
"subscription_indent_0",
"subscription_indent_1",
],
)
def test_override_variables_contains(self, override_variable_name: str):
assert OverrideVariables.is_override_variable_name(override_variable_name)
@pytest.mark.parametrize(
"override_variable_name",
[
"subscription_value_var",
"subscription_name_var",
"subscription_map_var",
"subscription_array_var",
"subscription_value_532_var",
"subscription_indent_0_var",
"subscription_indent_1_var",
],
)
def test_override_variables_does_not_contains(self, override_variable_name: str):
assert not OverrideVariables.is_override_variable_name(override_variable_name)