JSON functions WIP, need to add new way to specify strings that are json friendly
This commit is contained in:
parent
1cbc1f4933
commit
94e028536f
4 changed files with 42 additions and 4 deletions
|
|
@ -33,7 +33,10 @@ class Entry(BaseEntry, Scriptable):
|
||||||
def _add_entry_kwargs_to_script(self) -> None:
|
def _add_entry_kwargs_to_script(self) -> None:
|
||||||
# Add entry metadata, but avoid the `.add()` helper since it also adds sanitized
|
# Add entry metadata, but avoid the `.add()` helper since it also adds sanitized
|
||||||
self.unresolvable.remove(VARIABLES.entry_metadata.variable_name)
|
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()
|
self.update_script()
|
||||||
|
|
||||||
def initialize_script(self, other: Optional[Scriptable] = None) -> "Entry":
|
def initialize_script(self, other: Optional[Scriptable] = None) -> "Entry":
|
||||||
|
|
|
||||||
|
|
@ -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.conditional_functions import ConditionalFunctions
|
||||||
from ytdl_sub.script.functions.date_functions import DateFunctions
|
from ytdl_sub.script.functions.date_functions import DateFunctions
|
||||||
from ytdl_sub.script.functions.error_functions import ErrorFunctions
|
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.map_functions import MapFunctions
|
||||||
from ytdl_sub.script.functions.numeric_functions import NumericFunctions
|
from ytdl_sub.script.functions.numeric_functions import NumericFunctions
|
||||||
from ytdl_sub.script.functions.regex_functions import RegexFunctions
|
from ytdl_sub.script.functions.regex_functions import RegexFunctions
|
||||||
|
|
@ -24,6 +25,7 @@ class Functions(
|
||||||
ErrorFunctions,
|
ErrorFunctions,
|
||||||
RegexFunctions,
|
RegexFunctions,
|
||||||
DateFunctions,
|
DateFunctions,
|
||||||
|
JsonFunctions,
|
||||||
):
|
):
|
||||||
_custom_functions: Dict[str, Callable[..., Resolvable]] = {}
|
_custom_functions: Dict[str, Callable[..., Resolvable]] = {}
|
||||||
|
|
||||||
|
|
|
||||||
36
src/ytdl_sub/script/functions/json_functions.py
Normal file
36
src/ytdl_sub/script/functions/json_functions.py
Normal 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))
|
||||||
|
|
@ -1,9 +1,6 @@
|
||||||
import pytest
|
import pytest
|
||||||
from unit.script.conftest import single_variable_output
|
from unit.script.conftest import single_variable_output
|
||||||
|
|
||||||
from ytdl_sub.script.script import Script
|
|
||||||
|
|
||||||
|
|
||||||
class TestNumericFunctions:
|
class TestNumericFunctions:
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"values, expected_output",
|
"values, expected_output",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue