simplify types
This commit is contained in:
parent
b16f6262ec
commit
fe095b151c
4 changed files with 15 additions and 18 deletions
|
|
@ -4,6 +4,7 @@ from typing import Generic
|
||||||
from typing import TypeVar
|
from typing import TypeVar
|
||||||
|
|
||||||
T = TypeVar("T")
|
T = TypeVar("T")
|
||||||
|
NumericT = TypeVar("NumericT", bound=int | float)
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
|
|
@ -14,6 +15,11 @@ class Resolvable(ABC, Generic[T]):
|
||||||
return str(self.value)
|
return str(self.value)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class Numeric(Resolvable[NumericT], ABC, Generic[NumericT]):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class Integer(Resolvable[int]):
|
class Integer(Resolvable[int]):
|
||||||
pass
|
pass
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,6 @@ from ytdl_sub.script.functions import Integer
|
||||||
from ytdl_sub.script.functions import String
|
from ytdl_sub.script.functions import String
|
||||||
from ytdl_sub.script.types import ArgumentType
|
from ytdl_sub.script.types import ArgumentType
|
||||||
from ytdl_sub.script.types import Function
|
from ytdl_sub.script.types import Function
|
||||||
from ytdl_sub.script.types import LiteralString
|
|
||||||
from ytdl_sub.script.types import NumericType
|
|
||||||
from ytdl_sub.script.types import SyntaxTree
|
from ytdl_sub.script.types import SyntaxTree
|
||||||
from ytdl_sub.script.types import Variable
|
from ytdl_sub.script.types import Variable
|
||||||
from ytdl_sub.utils.exceptions import StringFormattingException
|
from ytdl_sub.utils.exceptions import StringFormattingException
|
||||||
|
|
@ -21,7 +19,7 @@ class _Parser:
|
||||||
def __init__(self, text: str):
|
def __init__(self, text: str):
|
||||||
self._text = text
|
self._text = text
|
||||||
self._pos = 0
|
self._pos = 0
|
||||||
self._ast: List[LiteralString | Variable | Function] = []
|
self._ast: List[String | Variable | Function] = []
|
||||||
|
|
||||||
self._syntax_tree = self._parse()
|
self._syntax_tree = self._parse()
|
||||||
|
|
||||||
|
|
@ -69,7 +67,7 @@ class _Parser:
|
||||||
assert is_valid_source_variable_name(var_name, raise_exception=False)
|
assert is_valid_source_variable_name(var_name, raise_exception=False)
|
||||||
return Variable(var_name)
|
return Variable(var_name)
|
||||||
|
|
||||||
def _parse_numeric(self) -> NumericType:
|
def _parse_numeric(self) -> Integer | Float:
|
||||||
numeric_string = ""
|
numeric_string = ""
|
||||||
while ch := self._read(increment_pos=False):
|
while ch := self._read(increment_pos=False):
|
||||||
if not (ch.isnumeric() or ch == "."):
|
if not (ch.isnumeric() or ch == "."):
|
||||||
|
|
@ -178,7 +176,7 @@ class _Parser:
|
||||||
if ch == "{":
|
if ch == "{":
|
||||||
bracket_counter += 1
|
bracket_counter += 1
|
||||||
if literal_str:
|
if literal_str:
|
||||||
self._ast.append(LiteralString(literal_str))
|
self._ast.append(String(value=literal_str))
|
||||||
literal_str = ""
|
literal_str = ""
|
||||||
|
|
||||||
# Allow whitespace after bracket opening
|
# Allow whitespace after bracket opening
|
||||||
|
|
@ -204,7 +202,7 @@ class _Parser:
|
||||||
raise StringFormattingException("Bracket count mismatch")
|
raise StringFormattingException("Bracket count mismatch")
|
||||||
|
|
||||||
if literal_str:
|
if literal_str:
|
||||||
self._ast.append(LiteralString(literal_str))
|
self._ast.append(String(value=literal_str))
|
||||||
|
|
||||||
return SyntaxTree(ast=self._ast)
|
return SyntaxTree(ast=self._ast)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,6 @@ class Variable:
|
||||||
name: str
|
name: str
|
||||||
|
|
||||||
|
|
||||||
NumericType = Union[Integer, Float]
|
|
||||||
ArgumentType = Union[Integer, Float, String, Boolean, Variable, "Function"]
|
ArgumentType = Union[Integer, Float, String, Boolean, Variable, "Function"]
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -50,14 +49,9 @@ class Function:
|
||||||
return variables
|
return variables
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
|
||||||
class LiteralString:
|
|
||||||
value: str
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class SyntaxTree:
|
class SyntaxTree:
|
||||||
ast: List[LiteralString | Variable | Function]
|
ast: List[String | Variable | Function]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def variables(self) -> Set[Variable]:
|
def variables(self) -> Set[Variable]:
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,6 @@ from ytdl_sub.script.functions import Integer
|
||||||
from ytdl_sub.script.functions import String
|
from ytdl_sub.script.functions import String
|
||||||
from ytdl_sub.script.parser import parse
|
from ytdl_sub.script.parser import parse
|
||||||
from ytdl_sub.script.types import Function
|
from ytdl_sub.script.types import Function
|
||||||
from ytdl_sub.script.types import LiteralString
|
|
||||||
from ytdl_sub.script.types import SyntaxTree
|
from ytdl_sub.script.types import SyntaxTree
|
||||||
from ytdl_sub.script.types import Variable
|
from ytdl_sub.script.types import Variable
|
||||||
from ytdl_sub.utils.exceptions import StringFormattingException
|
from ytdl_sub.utils.exceptions import StringFormattingException
|
||||||
|
|
@ -15,14 +14,14 @@ from ytdl_sub.utils.exceptions import StringFormattingException
|
||||||
class TestParser:
|
class TestParser:
|
||||||
def test_simple(self):
|
def test_simple(self):
|
||||||
parsed = parse("hello world")
|
parsed = parse("hello world")
|
||||||
assert parsed == SyntaxTree([LiteralString(value="hello world")])
|
assert parsed == SyntaxTree([String(value="hello world")])
|
||||||
assert parsed.variables == set()
|
assert parsed.variables == set()
|
||||||
|
|
||||||
def test_single_function_one_arg(self):
|
def test_single_function_one_arg(self):
|
||||||
parsed = parse("hello {%capitalize('hi mom')}")
|
parsed = parse("hello {%capitalize('hi mom')}")
|
||||||
assert parsed == SyntaxTree(
|
assert parsed == SyntaxTree(
|
||||||
[
|
[
|
||||||
LiteralString("hello "),
|
String("hello "),
|
||||||
Function(name="capitalize", args=[String(value="hi mom")]),
|
Function(name="capitalize", args=[String(value="hi mom")]),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
@ -36,7 +35,7 @@ class TestParser:
|
||||||
)
|
)
|
||||||
assert parsed == SyntaxTree(
|
assert parsed == SyntaxTree(
|
||||||
[
|
[
|
||||||
LiteralString(value=f"hello{s}"),
|
String(value=f"hello{s}"),
|
||||||
Function(
|
Function(
|
||||||
name="concat",
|
name="concat",
|
||||||
args=[
|
args=[
|
||||||
|
|
@ -49,7 +48,7 @@ class TestParser:
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
+ ([LiteralString(value=s)] if s else [])
|
+ ([String(value=s)] if s else [])
|
||||||
)
|
)
|
||||||
assert parsed.variables == {Variable(name="variable_name")}
|
assert parsed.variables == {Variable(name="variable_name")}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue