giant rename

This commit is contained in:
Jesse Bannon 2023-11-22 12:21:25 -08:00
parent 8dc695bdd1
commit ef58092ff3
16 changed files with 95 additions and 87 deletions

View file

@ -1,4 +1,4 @@
from ytdl_sub.script.types.resolvable import AnyType
from ytdl_sub.script.types.resolvable import AnyArgument
from ytdl_sub.script.types.resolvable import Boolean
# pylint: disable=invalid-name
@ -10,49 +10,49 @@ class BooleanFunctions:
"""
@staticmethod
def bool(value: AnyType) -> Boolean:
def bool(value: AnyArgument) -> Boolean:
"""
Cast any type to a Boolean.
"""
return Boolean(bool(value.value))
@staticmethod
def eq(left: AnyType, right: AnyType) -> Boolean:
def eq(left: AnyArgument, right: AnyArgument) -> Boolean:
"""
``==`` operator. Returns True if left == right. False otherwise.
"""
return Boolean(left.value == right.value)
@staticmethod
def ne(left: AnyType, right: AnyType) -> Boolean:
def ne(left: AnyArgument, right: AnyArgument) -> Boolean:
"""
``!=`` operator. Returns True if left != right. False otherwise.
"""
return Boolean(left.value != right.value)
@staticmethod
def lt(left: AnyType, right: AnyType) -> Boolean:
def lt(left: AnyArgument, right: AnyArgument) -> Boolean:
"""
``<`` operator. Returns True if left < right. False otherwise.
"""
return Boolean(left.value < right.value)
@staticmethod
def lte(left: AnyType, right: AnyType) -> Boolean:
def lte(left: AnyArgument, right: AnyArgument) -> Boolean:
"""
``<=`` operator. Returns True if left <= right. False otherwise.
"""
return Boolean(left.value <= right.value)
@staticmethod
def gt(left: AnyType, right: AnyType) -> Boolean:
def gt(left: AnyArgument, right: AnyArgument) -> Boolean:
"""
``>`` operator. Returns True if left > right. False otherwise.
"""
return Boolean(left.value > right.value)
@staticmethod
def gte(left: AnyType, right: AnyType) -> Boolean:
def gte(left: AnyArgument, right: AnyArgument) -> Boolean:
"""
``>=`` operator. Returns True if left >= right. False otherwise.
"""

View file

@ -1,15 +1,15 @@
from typing import Union
from ytdl_sub.script.types.resolvable import AnyTypeReturnableA
from ytdl_sub.script.types.resolvable import AnyTypeReturnableB
from ytdl_sub.script.types.resolvable import Boolean
from ytdl_sub.script.types.resolvable import ReturnableArgumentA
from ytdl_sub.script.types.resolvable import ReturnableArgumentB
class ConditionalFunctions:
@staticmethod
def if_(
condition: Boolean, true: AnyTypeReturnableA, false: AnyTypeReturnableB
) -> Union[AnyTypeReturnableA, AnyTypeReturnableB]:
condition: Boolean, true: ReturnableArgumentA, false: ReturnableArgumentB
) -> Union[ReturnableArgumentA, ReturnableArgumentB]:
"""
Conditional ``if`` statement that returns the ``true`` or ``false`` parameter
depending on the ``condition`` value.

View file

@ -1,4 +1,4 @@
from ytdl_sub.script.types.resolvable import AnyType
from ytdl_sub.script.types.resolvable import AnyArgument
from ytdl_sub.script.types.resolvable import Boolean
from ytdl_sub.script.types.resolvable import String
from ytdl_sub.script.utils.exceptions import UserThrownRuntimeError
@ -6,7 +6,7 @@ from ytdl_sub.script.utils.exceptions import UserThrownRuntimeError
class ErrorFunctions:
@staticmethod
def throw(error_message: String) -> AnyType:
def throw(error_message: String) -> AnyArgument:
"""
Explicitly throw an error with the provided error message.
"""

View file

@ -1,13 +1,13 @@
from typing import Optional
from ytdl_sub.script.types.map import Map
from ytdl_sub.script.types.resolvable import AnyType
from ytdl_sub.script.types.resolvable import AnyArgument
from ytdl_sub.script.types.resolvable import Hashable
class MapFunctions:
@staticmethod
def map_get(mapping: Map, key: Hashable, default: Optional[AnyType] = None) -> AnyType:
def map_get(mapping: Map, key: Hashable, default: Optional[AnyArgument] = None) -> AnyArgument:
"""
Return ``key``'s value within the Map. If ``key`` does not exist, and ``default`` is
provided, it will return ``default``. Otherwise, will error.

View file

@ -1,13 +1,13 @@
from typing import Optional
from ytdl_sub.script.types.resolvable import AnyType
from ytdl_sub.script.types.resolvable import AnyArgument
from ytdl_sub.script.types.resolvable import Integer
from ytdl_sub.script.types.resolvable import String
class StringFunctions:
@staticmethod
def string(value: AnyType) -> String:
def string(value: AnyArgument) -> String:
"""
Cast to String.
"""

View file

@ -4,7 +4,7 @@ from typing import List
from typing import Optional
from ytdl_sub.script.types.array import UnresolvedArray
from ytdl_sub.script.types.function import ArgumentType
from ytdl_sub.script.types.function import Argument
from ytdl_sub.script.types.function import Function
from ytdl_sub.script.types.map import UnresolvedMap
from ytdl_sub.script.types.resolvable import Boolean
@ -114,7 +114,7 @@ class _Parser:
self._custom_function_name = custom_function_name
self._pos = 0
self._error_highlight_pos = 0
self._ast: List[ArgumentType] = []
self._ast: List[Argument] = []
try:
self._syntax_tree = self._parse()
@ -267,7 +267,7 @@ class _Parser:
raise STRINGS_NOT_CLOSED
def _parse_function_arg(self, argument_parser: ParsedArgType) -> ArgumentType:
def _parse_function_arg(self, argument_parser: ParsedArgType) -> Argument:
if self._read(increment_pos=False) == "%":
self._pos += 1
return self._parse_function()
@ -298,12 +298,12 @@ class _Parser:
def _parse_args(
self, argument_parser: ParsedArgType, breaking_chars: str = ")"
) -> List[ArgumentType]:
) -> List[Argument]:
"""
Begin parsing function args after the first ``(``, i.e. ``function_name(``
"""
comma_count = 0
arguments: List[ArgumentType] = []
arguments: List[Argument] = []
while ch := self._read(increment_pos=False):
if ch in breaking_chars:
# i.e. ["arg", ] which is invalid
@ -330,7 +330,7 @@ class _Parser:
Begin parsing a function after reading the first ``%``
"""
function_name: str = ""
function_args: Optional[List[ArgumentType]] = None
function_args: Optional[List[Argument]] = None
function_start_pos = self._pos
while ch := self._read():
@ -351,7 +351,7 @@ class _Parser:
# Go back one so the parent function can close using the ')'
self._pos -= 1
return Lambda(function_name=function_name)
return Lambda(value=function_name)
if _is_function_name_char(ch):
function_name += ch
@ -359,7 +359,7 @@ class _Parser:
function_args = self._parse_args(argument_parser=ParsedArgType.FUNCTION)
elif ch.isspace() or ch == ",":
# function with no args, it's a lambda
return Lambda(function_name=function_name)
return Lambda(value=function_name)
else:
break
@ -370,7 +370,7 @@ class _Parser:
"""
Begin parsing an array after reading the first ``[``
"""
function_args: List[ArgumentType] = []
function_args: List[Argument] = []
while ch := self._read(increment_pos=False):
if ch == "]":
@ -387,8 +387,8 @@ class _Parser:
"""
Begin parsing a map after reading the first ``{``
"""
output: Dict[ArgumentType, ArgumentType] = {}
key: Optional[ArgumentType] = None
output: Dict[Argument, Argument] = {}
key: Optional[Argument] = None
in_comma = False
self._set_highlight_position()

View file

@ -1,14 +1,12 @@
from dataclasses import dataclass
from typing import Dict
from typing import List
from typing import Set
from ytdl_sub.script.types.resolvable import ArgumentType
from ytdl_sub.script.types.resolvable import FutureResolvable
from ytdl_sub.script.types.resolvable import AnyArgument
from ytdl_sub.script.types.resolvable import Argument
from ytdl_sub.script.types.resolvable import NonHashable
from ytdl_sub.script.types.resolvable import Resolvable
from ytdl_sub.script.types.resolvable import ResolvableToJson
from ytdl_sub.script.types.variable import FunctionArgument
from ytdl_sub.script.types.variable import Variable
from ytdl_sub.script.types.variable_dependency import VariableDependency
@ -23,11 +21,11 @@ class Array(NonHashable):
@dataclass(frozen=True)
class UnresolvedArray(Array, VariableDependency, FutureResolvable):
value: List[ArgumentType]
class UnresolvedArray(Array, VariableDependency, AnyArgument):
value: List[Argument]
@property
def _iterable_arguments(self) -> List[ArgumentType]:
def _iterable_arguments(self) -> List[Argument]:
return self.value
def resolve(

View file

@ -16,14 +16,14 @@ from ytdl_sub.script.functions import Functions
from ytdl_sub.script.types.array import Array
from ytdl_sub.script.types.array import ResolvedArray
from ytdl_sub.script.types.array import UnresolvedArray
from ytdl_sub.script.types.resolvable import AnyTypeReturnable
from ytdl_sub.script.types.resolvable import AnyTypeReturnableA
from ytdl_sub.script.types.resolvable import AnyTypeReturnableB
from ytdl_sub.script.types.resolvable import ArgumentType
from ytdl_sub.script.types.resolvable import Argument
from ytdl_sub.script.types.resolvable import FunctionType
from ytdl_sub.script.types.resolvable import Lambda
from ytdl_sub.script.types.resolvable import NamedCustomFunction
from ytdl_sub.script.types.resolvable import Resolvable
from ytdl_sub.script.types.resolvable import ReturnableArgument
from ytdl_sub.script.types.resolvable import ReturnableArgumentA
from ytdl_sub.script.types.resolvable import ReturnableArgumentB
from ytdl_sub.script.types.resolvable import TypeHintedFunctionType
from ytdl_sub.script.types.variable import FunctionArgument
from ytdl_sub.script.types.variable import Variable
@ -42,11 +42,11 @@ from ytdl_sub.utils.exceptions import StringFormattingException
@dataclass(frozen=True)
class Function(FunctionType, VariableDependency, ABC):
@property
def _iterable_arguments(self) -> List[ArgumentType]:
def _iterable_arguments(self) -> List[Argument]:
return self.args
@classmethod
def from_name_and_args(cls, name: str, args: List[ArgumentType]) -> "Function":
def from_name_and_args(cls, name: str, args: List[Argument]) -> "Function":
if Functions.is_built_in(name):
return BuiltInFunction(name=name, args=args).validate_args()
return CustomFunction(name=name, args=args)
@ -128,7 +128,7 @@ class BuiltInFunction(Function, TypeHintedFunctionType):
return Lambda in (self.input_spec.args or [])
@classmethod
def _arg_output_type(cls, arg: ArgumentType) -> Type[ArgumentType]:
def _arg_output_type(cls, arg: Argument) -> Type[Argument]:
if isinstance(arg, BuiltInFunction):
return arg.output_type()
return type(arg)
@ -138,7 +138,7 @@ class BuiltInFunction(Function, TypeHintedFunctionType):
if is_union(output_type):
union_types_list = []
for union_type in output_type.__args__:
if union_type in (AnyTypeReturnable, AnyTypeReturnableA, AnyTypeReturnableB):
if union_type in (ReturnableArgument, ReturnableArgumentA, ReturnableArgumentB):
generic_arg_index = self.input_spec.args.index(union_type)
union_types_list.append(self._arg_output_type(self.args[generic_arg_index]))
else:
@ -166,7 +166,7 @@ class BuiltInFunction(Function, TypeHintedFunctionType):
if not self.is_lambda_function or len(function_input_lambda_args) != 1:
raise UNREACHABLE
lambda_function_name = function_input_lambda_args[0].function_name
lambda_function_name = function_input_lambda_args[0].value
try:
lambda_args = self.callable(*resolved_arguments)

View file

@ -4,13 +4,12 @@ from typing import Dict
from typing import List
from typing import Set
from ytdl_sub.script.types.resolvable import ArgumentType
from ytdl_sub.script.types.resolvable import FutureResolvable
from ytdl_sub.script.types.resolvable import AnyArgument
from ytdl_sub.script.types.resolvable import Argument
from ytdl_sub.script.types.resolvable import Hashable
from ytdl_sub.script.types.resolvable import NonHashable
from ytdl_sub.script.types.resolvable import Resolvable
from ytdl_sub.script.types.resolvable import ResolvableToJson
from ytdl_sub.script.types.variable import FunctionArgument
from ytdl_sub.script.types.variable import Variable
from ytdl_sub.script.types.variable_dependency import VariableDependency
from ytdl_sub.utils.exceptions import StringFormattingException
@ -26,11 +25,11 @@ class Map(NonHashable):
@dataclass(frozen=True)
class UnresolvedMap(Map, VariableDependency, FutureResolvable):
value: Dict[ArgumentType, ArgumentType]
class UnresolvedMap(Map, VariableDependency, AnyArgument):
value: Dict[Argument, Argument]
@property
def _iterable_arguments(self) -> List[ArgumentType]:
def _iterable_arguments(self) -> List[Argument]:
return list(itertools.chain(*self.value.items()))
def resolve(

View file

@ -12,6 +12,7 @@ T = TypeVar("T")
NumericT = TypeVar("NumericT", bound=int | float)
@dataclass(frozen=True)
class NamedType(ABC):
@classmethod
def type_name(cls) -> str:
@ -23,31 +24,45 @@ class NamedType(ABC):
return cls.__name__
class ArgumentType(NamedType, ABC):
@dataclass(frozen=True)
class Argument(NamedType, ABC):
"""
Any possible argument type that has not been resolved yet
"""
class AnyTypeReturnable(NamedType, ABC):
@dataclass(frozen=True)
class NamedArgument(Argument, ABC):
"""
Argument that has an explicit name (i.e. custom function or variable)
"""
name: str
@dataclass(frozen=True)
class ReturnableArgument(NamedType, ABC):
"""
AnyType to express generics in functions that are part of the return type
"""
class AnyTypeReturnableA(NamedType, ABC):
@dataclass(frozen=True)
class ReturnableArgumentA(NamedType, ABC):
"""
AnyType to express generics in functions when more than one are present (i.e. `if`)
"""
class AnyTypeReturnableB(NamedType, ABC):
@dataclass(frozen=True)
class ReturnableArgumentB(NamedType, ABC):
"""
AnyType to express generics in functions when more than one are present (i.e. `if`)
"""
class AnyType(ArgumentType, AnyTypeReturnable, AnyTypeReturnableA, AnyTypeReturnableB, ABC):
@dataclass(frozen=True)
class AnyArgument(Argument, ReturnableArgument, ReturnableArgumentA, ReturnableArgumentB, ABC):
"""
Human-readable name for FutureResolvable
"""
@ -55,26 +70,23 @@ class AnyType(ArgumentType, AnyTypeReturnable, AnyTypeReturnableA, AnyTypeReturn
value: Any
class FutureResolvable(AnyType, ABC):
"""
Type that will be resolved in the future (Map, Array)
"""
@dataclass(frozen=True)
class Resolvable(AnyType, ABC):
class Resolvable(AnyArgument, ABC):
def __str__(self) -> str:
return str(self.value)
@dataclass(frozen=True)
class Hashable(Resolvable, ABC):
pass
@dataclass(frozen=True)
class NonHashable(ABC):
pass
@dataclass(frozen=True)
class ResolvableToJson(Resolvable, ABC):
@classmethod
def _to_native(cls, to_convert: Resolvable) -> Any:
@ -102,34 +114,33 @@ class Numeric(ResolvableT[NumericT], Hashable, ABC, Generic[NumericT]):
@dataclass(frozen=True)
class Integer(Numeric[int], ArgumentType):
class Integer(Numeric[int], Argument):
pass
@dataclass(frozen=True)
class Float(Numeric[float], ArgumentType):
class Float(Numeric[float], Argument):
pass
@dataclass(frozen=True)
class Boolean(ResolvableT[bool], Hashable, ArgumentType):
class Boolean(ResolvableT[bool], Hashable, Argument):
pass
@dataclass(frozen=True)
class String(ResolvableT[str], Hashable, ArgumentType):
class String(ResolvableT[str], Hashable, Argument):
pass
@dataclass(frozen=True)
class NamedCustomFunction(ArgumentType, ABC):
class NamedCustomFunction(Argument, ABC):
name: str
@dataclass(frozen=True)
class FunctionType(ArgumentType, ABC):
name: str
args: List[ArgumentType]
class FunctionType(NamedArgument, ABC):
args: List[Argument]
@dataclass(frozen=True)
@ -141,4 +152,4 @@ class TypeHintedFunctionType(FunctionType, ABC):
@dataclass(frozen=True)
class Lambda(Resolvable):
function_name: str
value: str

View file

@ -2,7 +2,7 @@ from dataclasses import dataclass
from typing import Dict
from typing import List
from ytdl_sub.script.types.resolvable import ArgumentType
from ytdl_sub.script.types.resolvable import Argument
from ytdl_sub.script.types.resolvable import Resolvable
from ytdl_sub.script.types.resolvable import String
from ytdl_sub.script.types.variable import Variable
@ -11,10 +11,10 @@ from ytdl_sub.script.types.variable_dependency import VariableDependency
@dataclass(frozen=True)
class SyntaxTree(VariableDependency):
ast: List[ArgumentType]
ast: List[Argument]
@property
def _iterable_arguments(self) -> List[ArgumentType]:
def _iterable_arguments(self) -> List[Argument]:
return self.ast
def resolve(

View file

@ -1,12 +1,12 @@
from dataclasses import dataclass
from typing import Optional
from ytdl_sub.script.types.resolvable import ArgumentType
from ytdl_sub.script.types.resolvable import NamedArgument
@dataclass(frozen=True)
class Variable(ArgumentType):
name: str
class Variable(NamedArgument):
pass
@dataclass(frozen=True)

View file

@ -6,7 +6,7 @@ from typing import List
from typing import Set
from typing import final
from ytdl_sub.script.types.resolvable import ArgumentType
from ytdl_sub.script.types.resolvable import Argument
from ytdl_sub.script.types.resolvable import NamedCustomFunction
from ytdl_sub.script.types.resolvable import Resolvable
from ytdl_sub.script.types.variable import FunctionArgument
@ -19,7 +19,7 @@ from ytdl_sub.utils.exceptions import StringFormattingException
class VariableDependency(ABC):
@property
@abstractmethod
def _iterable_arguments(self) -> List[ArgumentType]:
def _iterable_arguments(self) -> List[Argument]:
pass
@final
@ -70,7 +70,7 @@ class VariableDependency(ABC):
@classmethod
def _resolve_argument_type(
cls,
arg: ArgumentType,
arg: Argument,
resolved_variables: Dict[Variable, Resolvable],
custom_functions: Dict[str, "VariableDependency"],
) -> Resolvable:

View file

@ -5,7 +5,7 @@ from typing import Type
from typing import Union
from typing import get_origin
from ytdl_sub.script.types.resolvable import ArgumentType
from ytdl_sub.script.types.resolvable import Argument
from ytdl_sub.script.types.resolvable import FunctionType
from ytdl_sub.script.types.resolvable import NamedType
from ytdl_sub.script.types.resolvable import Resolvable
@ -97,7 +97,7 @@ class FunctionInputSpec:
def __post_init__(self):
assert (self.args is None) ^ (self.varargs is None)
def _is_args_compatible(self, input_args: List[ArgumentType]) -> bool:
def _is_args_compatible(self, input_args: List[Argument]) -> bool:
assert self.args is not None
if len(input_args) > len(self.args):
@ -110,7 +110,7 @@ class FunctionInputSpec:
return True
def _is_varargs_compatible(self, input_args: List[ArgumentType]) -> bool:
def _is_varargs_compatible(self, input_args: List[Argument]) -> bool:
assert self.varargs is not None
for input_arg in input_args:
@ -119,7 +119,7 @@ class FunctionInputSpec:
return True
def is_compatible(self, input_args: List[ArgumentType]) -> bool:
def is_compatible(self, input_args: List[Argument]) -> bool:
"""
Returns
-------

View file

@ -165,7 +165,7 @@ class TestParser:
name="array_apply",
args=[
UnresolvedArray(value=[Integer(1)]),
Lambda(function_name="times_two"),
Lambda(value="times_two"),
],
)
]

View file

@ -68,7 +68,7 @@ class TestFunction:
with pytest.raises(
IncompatibleFunctionArguments,
match=_incompatible_arguments_match(
expected="Map, Hashable, Optional[AnyType]",
expected="Map, Hashable, Optional[AnyArgument]",
recieved="%if(...)->Union[Map, Array], String",
),
):