simplify types

This commit is contained in:
Jesse Bannon 2023-07-17 23:22:45 -07:00
parent b16f6262ec
commit fe095b151c
4 changed files with 15 additions and 18 deletions

View file

@ -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

View file

@ -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)

View file

@ -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]:

View file

@ -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")}