From c122e535c1229179d4f810c5a0ebc075a57d9829 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Mon, 3 Jun 2024 00:33:05 -0700 Subject: [PATCH] fix custom func dep bug --- src/ytdl_sub/script/script.py | 11 +++++---- .../script/types/variable_dependency.py | 23 +++++++++++++++++-- src/ytdl_sub/utils/script.py | 3 ++- .../prebuilt_presets/test_prebuilt_presets.py | 13 ++++------- 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/ytdl_sub/script/script.py b/src/ytdl_sub/script/script.py index e54cc6ba..6f095df9 100644 --- a/src/ytdl_sub/script/script.py +++ b/src/ytdl_sub/script/script.py @@ -151,8 +151,9 @@ class Script: return lambda_function_names = set( - lamb.value for lamb in SyntaxTree(function.args).lambdas if isinstance(lamb, Lambda) - and lamb in function.args + lamb.value + for lamb in SyntaxTree(function.args).lambdas + if isinstance(lamb, Lambda) and lamb in function.args ) # Only case len(lambda_function_names) > 1 is when used in if-statements @@ -367,13 +368,15 @@ class Script: # If the variable's variable dependencies contain an unresolvable variable, # declare it as unresolvable and continue - elif definition.contains(unresolvable): + elif definition.contains(unresolvable, custom_function_definitions=self._functions): unresolvable.add(variable) del unresolved[variable] # Otherwise, if it has dependencies that are all resolved, then # resolve the definition - elif not definition.is_subset_of(variables=resolved.keys()): + elif not definition.is_subset_of( + variables=resolved.keys(), custom_function_definitions=self._functions + ): resolved[variable] = unresolved[variable].resolve( resolved_variables=resolved, custom_functions=self._functions, diff --git a/src/ytdl_sub/script/types/variable_dependency.py b/src/ytdl_sub/script/types/variable_dependency.py index 8cd86134..f7ab83cd 100644 --- a/src/ytdl_sub/script/types/variable_dependency.py +++ b/src/ytdl_sub/script/types/variable_dependency.py @@ -156,19 +156,38 @@ class VariableDependency(ABC): raise UNREACHABLE @final - def is_subset_of(self, variables: Iterable[Variable]) -> bool: + def is_subset_of( + self, + variables: Iterable[Variable], + custom_function_definitions: Dict[str, "VariableDependency"], + ) -> bool: """ Returns ------- True if it contains all input variables as a dependency. False otherwise. """ + for custom_function in self.custom_functions: + if custom_function_definitions[custom_function.name].is_subset_of( + variables=variables, custom_function_definitions=custom_function_definitions + ): + return True + return not self.variables.issubset(variables) @final - def contains(self, variables: Iterable[Variable]) -> bool: + def contains( + self, + variables: Iterable[Variable], + custom_function_definitions: Dict[str, "VariableDependency"], + ) -> bool: """ Returns ------- True if it contains any of the input variables. False otherwise. """ + for custom_function in self.custom_functions: + if custom_function_definitions[custom_function.name].contains( + variables=variables, custom_function_definitions=custom_function_definitions + ): + return True return len(self.variables.intersection(variables)) > 0 diff --git a/src/ytdl_sub/utils/script.py b/src/ytdl_sub/utils/script.py index 8f2c9b2a..fba88a35 100644 --- a/src/ytdl_sub/utils/script.py +++ b/src/ytdl_sub/utils/script.py @@ -9,10 +9,11 @@ from ytdl_sub.script.types.array import UnresolvedArray from ytdl_sub.script.types.function import BuiltInFunction from ytdl_sub.script.types.function import Function from ytdl_sub.script.types.map import UnresolvedMap -from ytdl_sub.script.types.resolvable import Argument, Lambda +from ytdl_sub.script.types.resolvable import Argument from ytdl_sub.script.types.resolvable import Boolean from ytdl_sub.script.types.resolvable import Float from ytdl_sub.script.types.resolvable import Integer +from ytdl_sub.script.types.resolvable import Lambda from ytdl_sub.script.types.resolvable import String from ytdl_sub.script.types.variable import Variable from ytdl_sub.script.utils.exceptions import UNREACHABLE diff --git a/tests/unit/prebuilt_presets/test_prebuilt_presets.py b/tests/unit/prebuilt_presets/test_prebuilt_presets.py index ec010cea..cd686278 100644 --- a/tests/unit/prebuilt_presets/test_prebuilt_presets.py +++ b/tests/unit/prebuilt_presets/test_prebuilt_presets.py @@ -550,17 +550,12 @@ class TestPrebuiltMusicVideoPresets: album_metadata: str, multi_url: bool, ) -> Dict: - subscription_dict = { - album_metadata: [ - "https://your.name.here" - ] - } + subscription_dict = {album_metadata: ["https://your.name.here"]} if multi_url: - subscription_dict[album_metadata].append({ - "url": "https://your.name.here2", - "title": "Custom Title" - }) + subscription_dict[album_metadata].append( + {"url": "https://your.name.here2", "title": "Custom Title"} + ) preset_dict = { "preset": [