From 9004fba5cbab94a84323e8df27d946f55283c780 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Wed, 6 Dec 2023 23:15:44 -0800 Subject: [PATCH] Map future resolvable --- src/ytdl_sub/script/types/array.py | 3 ++- src/ytdl_sub/script/types/map.py | 14 ++++++++++---- tests/unit/script/test_script.py | 4 ++-- tests/unit/script/types/test_map.py | 16 ++++++++-------- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/ytdl_sub/script/types/array.py b/src/ytdl_sub/script/types/array.py index a0790d3f..1b2aa5d8 100644 --- a/src/ytdl_sub/script/types/array.py +++ b/src/ytdl_sub/script/types/array.py @@ -1,3 +1,4 @@ +from abc import ABC from dataclasses import dataclass from typing import Any from typing import Dict @@ -15,7 +16,7 @@ from ytdl_sub.script.types.variable_dependency import VariableDependency @dataclass(frozen=True) -class _Array(NonHashable): +class _Array(NonHashable, ABC): value: List[Resolvable] @classmethod diff --git a/src/ytdl_sub/script/types/map.py b/src/ytdl_sub/script/types/map.py index 9024306b..9beb05ad 100644 --- a/src/ytdl_sub/script/types/map.py +++ b/src/ytdl_sub/script/types/map.py @@ -1,11 +1,14 @@ import itertools +from abc import ABC from dataclasses import dataclass from typing import Any from typing import Dict from typing import List +from typing import Type from ytdl_sub.script.types.resolvable import AnyArgument from ytdl_sub.script.types.resolvable import Argument +from ytdl_sub.script.types.resolvable import FutureResolvable from ytdl_sub.script.types.resolvable import Hashable from ytdl_sub.script.types.resolvable import NonHashable from ytdl_sub.script.types.resolvable import Resolvable @@ -16,7 +19,7 @@ from ytdl_sub.script.utils.exceptions import KeyNotHashableRuntimeException @dataclass(frozen=True) -class Map(NonHashable): +class _Map(NonHashable, ABC): value: Dict[Hashable, Resolvable] @classmethod @@ -25,7 +28,7 @@ class Map(NonHashable): @dataclass(frozen=True) -class UnresolvedMap(Map, VariableDependency, AnyArgument): +class UnresolvedMap(_Map, VariableDependency, FutureResolvable): value: Dict[Argument, Argument] @property @@ -51,11 +54,14 @@ class UnresolvedMap(Map, VariableDependency, AnyArgument): arg=value, resolved_variables=resolved_variables, custom_functions=custom_functions ) - return ResolvedMap(output) + return Map(output) + + def future_resolvable_type(self) -> Type[Resolvable]: + return Map @dataclass(frozen=True) -class ResolvedMap(Map, ResolvableToJson): +class Map(_Map, ResolvableToJson): @property def native(self) -> Any: return {key.native: value.native for key, value in self.value.items()} diff --git a/tests/unit/script/test_script.py b/tests/unit/script/test_script.py index 0c668fb8..36a335a7 100644 --- a/tests/unit/script/test_script.py +++ b/tests/unit/script/test_script.py @@ -1,5 +1,5 @@ from ytdl_sub.script.script import Script -from ytdl_sub.script.types.map import ResolvedMap +from ytdl_sub.script.types.map import Map from ytdl_sub.script.types.resolvable import String @@ -30,7 +30,7 @@ class TestScript: def test_partial_update_script(self): # to be resolved later - entry_map = ResolvedMap({String("title"): String("the title")}) + entry_map = Map({String("title"): String("the title")}) script = Script( { diff --git a/tests/unit/script/types/test_map.py b/tests/unit/script/types/test_map.py index 9dfd39af..607cf335 100644 --- a/tests/unit/script/types/test_map.py +++ b/tests/unit/script/types/test_map.py @@ -10,7 +10,7 @@ from ytdl_sub.script.parser import MAP_KEY_WITH_NO_VALUE from ytdl_sub.script.parser import MAP_MISSING_KEY from ytdl_sub.script.parser import ParsedArgType from ytdl_sub.script.script import Script -from ytdl_sub.script.types.map import ResolvedMap +from ytdl_sub.script.types.map import Map from ytdl_sub.script.types.resolvable import Float from ytdl_sub.script.types.resolvable import String from ytdl_sub.script.utils.exceptions import InvalidSyntaxException @@ -20,7 +20,7 @@ from ytdl_sub.script.utils.exceptions import KeyNotHashableRuntimeException class TestMap: def test_return(self): assert Script({"map": "{{'a': 3.14}}"}).resolve() == { - "map": ResolvedMap({String("a"): Float(3.14)}) + "map": Map({String("a"): Float(3.14)}) } def test_return_as_str(self): @@ -45,13 +45,13 @@ class TestMap: }""" assert Script({"map": map_str}).resolve() == { - "map": ResolvedMap( + "map": Map( { - String("level1"): ResolvedMap( + String("level1"): Map( { - String("level2"): ResolvedMap( + String("level2"): Map( { - String("level3"): ResolvedMap( + String("level3"): Map( {String("level4_key"): String("level4_value")} ), String("level3_key"): String("level3_value"), @@ -75,7 +75,7 @@ class TestMap: ], ) def test_empty_map(self, empty_map: str): - assert Script({"map": empty_map}).resolve() == {"map": ResolvedMap({})} + assert Script({"map": empty_map}).resolve() == {"map": Map({})} @pytest.mark.parametrize( "map", @@ -168,7 +168,7 @@ class TestMap: } ).resolve() == { "key_variable": String("hashable"), - "map": ResolvedMap({String("hashable"): String("value")}), + "map": Map({String("hashable"): String("value")}), } def test_map_key_is_non_hashable_variable(self):