[FEATURE] Add scripting print functions

This commit is contained in:
Jesse Bannon 2025-05-31 11:10:46 -07:00
parent 36e23839f3
commit a6aa411733
4 changed files with 106 additions and 0 deletions

View file

@ -523,6 +523,32 @@ sub
----------------------------------------------------------------------------------------------------
Print Functions
---------------
print
~~~~~
:spec: ``print(message: AnyArgument, passthrough: ReturnableArgument) -> ReturnableArgument``
:description:
Print the ``message`` and return ``passthrough``.
print_if_false
~~~~~~~~~~~~~~
:spec: ``print_if_false(message: AnyArgument, passthrough: ReturnableArgument) -> ReturnableArgument``
:description:
Print the ``message`` if ``passthrough`` evaluates to ``false``. Return ``passthrough``.
print_if_true
~~~~~~~~~~~~~
:spec: ``print_if_true(message: AnyArgument, passthrough: ReturnableArgument) -> ReturnableArgument``
:description:
Print the ``message`` if ``passthrough`` evaluates to ``true``. Return ``passthrough``.
----------------------------------------------------------------------------------------------------
Regex Functions
---------------

View file

@ -9,6 +9,7 @@ from ytdl_sub.script.functions.error_functions import ErrorFunctions
from ytdl_sub.script.functions.json_functions import JsonFunctions
from ytdl_sub.script.functions.map_functions import MapFunctions
from ytdl_sub.script.functions.numeric_functions import NumericFunctions
from ytdl_sub.script.functions.print_functions import PrintFunctions
from ytdl_sub.script.functions.regex_functions import RegexFunctions
from ytdl_sub.script.functions.string_functions import StringFunctions
from ytdl_sub.script.types.resolvable import Resolvable
@ -26,6 +27,7 @@ class Functions(
RegexFunctions,
DateFunctions,
JsonFunctions,
PrintFunctions,
):
_custom_functions: Dict[str, Callable[..., Resolvable]] = {}

View file

@ -0,0 +1,42 @@
from ytdl_sub.script.types.resolvable import AnyArgument
from ytdl_sub.script.types.resolvable import ReturnableArgument
from ytdl_sub.utils.logger import Logger
logger = Logger.get(name="preset")
class PrintFunctions:
@staticmethod
def print(
message: AnyArgument, passthrough: ReturnableArgument
) -> ReturnableArgument:
"""
:description:
Print the ``message`` and return ``passthrough``.
"""
logger.info(str(message))
return passthrough
@staticmethod
def print_if_true(
message: AnyArgument, passthrough: ReturnableArgument
) -> ReturnableArgument:
"""
:description:
Print the ``message`` if ``passthrough`` evaluates to ``true``. Return ``passthrough``.
"""
if passthrough.value:
logger.info(str(message))
return passthrough
@staticmethod
def print_if_false(
message: AnyArgument, passthrough: ReturnableArgument
) -> ReturnableArgument:
"""
:description:
Print the ``message`` if ``passthrough`` evaluates to ``false``. Return ``passthrough``.
"""
if not passthrough.value:
logger.info(str(message))
return passthrough

View file

@ -0,0 +1,36 @@
import logging
from typing import Any, Optional
from unittest.mock import patch
import pytest
from unit.script.conftest import single_variable_output
class TestPrintFunctions:
@pytest.mark.parametrize(
"function_str, expected_print, expected_output",
[
# print
("{%print('hi mom', True)}", 'hi mom', True),
("{%print('this is great', [1, 2, 3])}", 'this is great', [1, 2, 3]),
("{%print([1, 2], [3, 4])}", '[1, 2]', [3, 4]),
# print_if_true
("{%print_if_true('hi mom', True)}", 'hi mom', True),
("{%print_if_true('hi mom', False)}", None, False),
# print_if_false
("{%print_if_false('hi mom', True)}", None, True),
("{%print_if_false('hi mom', False)}", 'hi mom', False),
],
)
def test_print_functions(self, function_str: str, expected_print: Optional[str], expected_output: Any):
with patch.object(logging.Logger, "info") as mock_logger:
output = single_variable_output(function_str)
assert output == expected_output
if expected_print is not None:
assert mock_logger.call_count == 1
assert mock_logger.call_args.args[0] == expected_print
else:
assert mock_logger.call_count == 0