From 213580ee8441a24a4f9cbf4e1ff6683a710c9819 Mon Sep 17 00:00:00 2001 From: Jesse Bannon Date: Thu, 18 Jan 2024 23:24:10 -0800 Subject: [PATCH] [DEV] Add type-check functions (#905) --- .../scripting/scripting_functions.rst | 49 +++++++++++++++ .../script/functions/boolean_functions.py | 60 +++++++++++++++++++ .../functions/test_boolean_functions.py | 31 +++++++++- 3 files changed, 138 insertions(+), 2 deletions(-) diff --git a/docs/source/config_reference/scripting/scripting_functions.rst b/docs/source/config_reference/scripting/scripting_functions.rst index 1e62d137..9302e10b 100644 --- a/docs/source/config_reference/scripting/scripting_functions.rst +++ b/docs/source/config_reference/scripting/scripting_functions.rst @@ -172,6 +172,41 @@ gte :description: ``>=`` operator. Returns True if left >= right. False otherwise. +is_array +~~~~~~~~ +:spec: ``is_array(value: AnyArgument) -> Boolean`` + +:description: + Returns True if a value is a Map. False otherwise. + +is_bool +~~~~~~~ +:spec: ``is_bool(value: AnyArgument) -> Boolean`` + +:description: + Returns True if a value is a Float. False otherwise. + +is_float +~~~~~~~~ +:spec: ``is_float(value: AnyArgument) -> Boolean`` + +:description: + Returns True if a value is a Float. False otherwise. + +is_int +~~~~~~ +:spec: ``is_int(value: AnyArgument) -> Boolean`` + +:description: + Returns True if a value is an Integer. False otherwise. + +is_map +~~~~~~ +:spec: ``is_map(value: AnyArgument) -> Boolean`` + +:description: + Returns True if a value is a Map. False otherwise. + is_null ~~~~~~~ :spec: ``is_null(value: AnyArgument) -> Boolean`` @@ -179,6 +214,20 @@ is_null :description: Returns True if a value is null (i.e. an empty string). False otherwise. +is_numeric +~~~~~~~~~~ +:spec: ``is_numeric(value: AnyArgument) -> Boolean`` + +:description: + Returns True if a value is either an Integer or Float. False otherwise. + +is_string +~~~~~~~~~ +:spec: ``is_string(value: AnyArgument) -> Boolean`` + +:description: + Returns True if a value is a String. False otherwise. + lt ~~ :spec: ``lt(left: AnyArgument, right: AnyArgument) -> Boolean`` diff --git a/src/ytdl_sub/script/functions/boolean_functions.py b/src/ytdl_sub/script/functions/boolean_functions.py index bfb7416f..f2c89e28 100644 --- a/src/ytdl_sub/script/functions/boolean_functions.py +++ b/src/ytdl_sub/script/functions/boolean_functions.py @@ -1,5 +1,9 @@ +from ytdl_sub.script.types.array import Array +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 Float +from ytdl_sub.script.types.resolvable import Integer from ytdl_sub.script.types.resolvable import String # pylint: disable=invalid-name @@ -107,3 +111,59 @@ class BooleanFunctions: Returns True if a value is null (i.e. an empty string). False otherwise. """ return Boolean(isinstance(value, String) and value.value == "") + + @staticmethod + def is_map(value: AnyArgument) -> Boolean: + """ + :description: + Returns True if a value is a Map. False otherwise. + """ + return Boolean(isinstance(value, Map)) + + @staticmethod + def is_array(value: AnyArgument) -> Boolean: + """ + :description: + Returns True if a value is a Map. False otherwise. + """ + return Boolean(isinstance(value, Array)) + + @staticmethod + def is_string(value: AnyArgument) -> Boolean: + """ + :description: + Returns True if a value is a String. False otherwise. + """ + return Boolean(isinstance(value, String)) + + @staticmethod + def is_numeric(value: AnyArgument) -> Boolean: + """ + :description: + Returns True if a value is either an Integer or Float. False otherwise. + """ + return Boolean(isinstance(value, (Integer, Float))) + + @staticmethod + def is_int(value: AnyArgument) -> Boolean: + """ + :description: + Returns True if a value is an Integer. False otherwise. + """ + return Boolean(isinstance(value, Integer)) + + @staticmethod + def is_float(value: AnyArgument) -> Boolean: + """ + :description: + Returns True if a value is a Float. False otherwise. + """ + return Boolean(isinstance(value, Float)) + + @staticmethod + def is_bool(value: AnyArgument) -> Boolean: + """ + :description: + Returns True if a value is a Float. False otherwise. + """ + return Boolean(isinstance(value, Boolean)) diff --git a/tests/unit/script/functions/test_boolean_functions.py b/tests/unit/script/functions/test_boolean_functions.py index dfdd79c6..a141a258 100644 --- a/tests/unit/script/functions/test_boolean_functions.py +++ b/tests/unit/script/functions/test_boolean_functions.py @@ -1,8 +1,6 @@ import pytest from unit.script.conftest import single_variable_output -from ytdl_sub.script.script import Script - class TestBooleanFunctions: @pytest.mark.parametrize( @@ -140,3 +138,32 @@ class TestBooleanFunctions: def test_is_null(self, value: str, expected_output: bool): output = single_variable_output(f"{{%is_null({value})}}") assert output == expected_output + + def test_is_array(self): + assert single_variable_output("{ %is_array( [] ) }") is True + assert single_variable_output("{ %is_array( {} ) }") is False + + def test_is_map(self): + assert single_variable_output("{ %is_map( {} ) }") is True + assert single_variable_output("{ %is_map( [] ) }") is False + + def test_is_string(self): + assert single_variable_output("{ %is_string( 'hi' ) }") is True + assert single_variable_output("{ %is_string( False ) }") is False + + def test_is_bool(self): + assert single_variable_output("{ %is_bool( True ) }") is True + assert single_variable_output("{ %is_bool( 0 ) }") is False + + def test_is_int(self): + assert single_variable_output("{ %is_int( 2 ) }") is True + assert single_variable_output("{ %is_int( 2.3 ) }") is False + + def test_is_float(self): + assert single_variable_output("{ %is_float( 3.14 ) }") is True + assert single_variable_output("{ %is_float( 4 ) }") is False + + def test_is_numeric(self): + assert single_variable_output("{ %is_numeric( 4 ) }") is True + assert single_variable_output("{ %is_numeric( 2.34 ) }") is True + assert single_variable_output("{ %is_numeric( '3.12' ) }") is False