JSON functions WIP, need to add new way to specify strings that are json friendly

This commit is contained in:
Jesse Bannon 2023-12-10 19:43:07 -08:00
parent 1cbc1f4933
commit 94e028536f
4 changed files with 42 additions and 4 deletions

View file

@ -33,7 +33,10 @@ class Entry(BaseEntry, Scriptable):
def _add_entry_kwargs_to_script(self) -> None:
# Add entry metadata, but avoid the `.add()` helper since it also adds sanitized
self.unresolvable.remove(VARIABLES.entry_metadata.variable_name)
self.script.add({VARIABLES.entry_metadata.variable_name: f"{{{json.dumps(self._kwargs)}}}"})
single_quote = "'"
replace_single_quote = "\\'"
entry_metadata_variable = f"{{%from_json('{json.dumps(self._kwargs, ensure_ascii=False).replace(single_quote, replace_single_quote)}')}}"
self.script.add({VARIABLES.entry_metadata.variable_name: entry_metadata_variable})
self.update_script()
def initialize_script(self, other: Optional[Scriptable] = None) -> "Entry":

View file

@ -6,6 +6,7 @@ from ytdl_sub.script.functions.boolean_functions import BooleanFunctions
from ytdl_sub.script.functions.conditional_functions import ConditionalFunctions
from ytdl_sub.script.functions.date_functions import DateFunctions
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.regex_functions import RegexFunctions
@ -24,6 +25,7 @@ class Functions(
ErrorFunctions,
RegexFunctions,
DateFunctions,
JsonFunctions,
):
_custom_functions: Dict[str, Callable[..., Resolvable]] = {}

View file

@ -0,0 +1,36 @@
import json
from typing import Any
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 Resolvable
from ytdl_sub.script.types.resolvable import String
from ytdl_sub.script.utils.exceptions import UNREACHABLE
def _from_json(out: Any) -> Resolvable:
if out is None:
return String("")
if isinstance(out, int):
return Integer(out)
if isinstance(out, float):
return Float(out)
if isinstance(out, str):
return String(out)
if isinstance(out, bool):
return Boolean(out)
if isinstance(out, list):
return Array(value=[_from_json(arg) for arg in out])
if isinstance(out, dict):
return Map(value={_from_json(key): _from_json(value) for key, value in out.items()})
raise UNREACHABLE
class JsonFunctions:
@staticmethod
def from_json(argument: AnyArgument) -> AnyArgument:
return _from_json(json.loads(argument.value))

View file

@ -1,9 +1,6 @@
import pytest
from unit.script.conftest import single_variable_output
from ytdl_sub.script.script import Script
class TestNumericFunctions:
@pytest.mark.parametrize(
"values, expected_output",