From f9545a7e03dafe8a2368397c466e35f706a2cc8c Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Thu, 30 Nov 2023 08:41:45 -0800 Subject: [PATCH] map_contains --- .../script/functions/map_functions.py | 8 +++++++ .../script/functions/test_map_functions.py | 22 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/ytdl_sub/script/functions/map_functions.py b/src/ytdl_sub/script/functions/map_functions.py index bd85a55d..6603e923 100644 --- a/src/ytdl_sub/script/functions/map_functions.py +++ b/src/ytdl_sub/script/functions/map_functions.py @@ -2,6 +2,7 @@ from typing import Optional from ytdl_sub.script.types.map import Map from ytdl_sub.script.types.resolvable import AnyArgument +from ytdl_sub.script.types.resolvable import Boolean from ytdl_sub.script.types.resolvable import Hashable from ytdl_sub.script.utils.exceptions import KeyDoesNotExistRuntimeException @@ -21,3 +22,10 @@ class MapFunctions: f"Tried to call %map_get with key {key.value}, but it does not exist" ) return mapping.value[key] + + @staticmethod + def map_contains(mapping: Map, key: Hashable) -> Boolean: + """ + Returns True if the key is in the Map. False otherwise. + """ + return Boolean(key in mapping.value) diff --git a/tests/unit/script/functions/test_map_functions.py b/tests/unit/script/functions/test_map_functions.py index a908e776..162d4b77 100644 --- a/tests/unit/script/functions/test_map_functions.py +++ b/tests/unit/script/functions/test_map_functions.py @@ -46,3 +46,25 @@ class TestMapFunctions: "output": "{%map_get(input_map, 'dne')}", } ).resolve() + + @pytest.mark.parametrize( + "contains_value, expected_value", + [ + ("'key'", True), + ("'dne'", False), + ("%string(%array_at(['dne', 'key'], 1))", True), + ], + ) + def test_map_contains(self, contains_value: str, expected_value: bool): + output = ( + Script( + { + "input_map": "{{'key': 'value'}}", + "output": f"{{%map_contains(input_map, {contains_value})}}", + } + ) + .resolve(update=True) + .get("output") + .native + ) + assert output == expected_value