From d8fa46f34dc94572d21534c69fcfa79d15fe9786 Mon Sep 17 00:00:00 2001 From: Seth Trowbridge Date: Sun, 17 Aug 2025 13:58:14 -0400 Subject: [PATCH] tweak typings --- pyx.py | 27 ++++++++++++++++----------- template.py | 2 +- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/pyx.py b/pyx.py index 00d4642..a93ab8d 100644 --- a/pyx.py +++ b/pyx.py @@ -1,6 +1,10 @@ -from typing import List, Tuple, Union +from typing import List, Tuple, Union, Optional -def MakeAttrs(css:str|Tuple[str, ...]|None, id:str|None, attributes: dict[str, str | None]|None) -> str: +Attributes = dict[str, Union[str, bool, None]] +Stringy = Union[str, Tuple[str, ...]] +Renderable = Union[str, 'Branch', 'Leaf'] + +def MakeAttrs(css:Optional[Stringy], id:Optional[str], attributes: Attributes) -> str: if not attributes: attributes = {} if css: @@ -15,17 +19,17 @@ def MakeAttrs(css:str|Tuple[str, ...]|None, id:str|None, attributes: dict[str, s class Leaf(): name:str = "" - def __init__(self, name:str|None = None): + def __init__(self, name:Optional[str] = None): if name: self.name = name self.attrs = None - def props(self, css:str|Tuple[str, ...]|None, id:str|None, attributes: dict[str, str | None]|None): + def props(self, css:Optional[Stringy], id:Optional[str], attributes: Attributes): clone = self.__class__(self.name) clone.attrs = MakeAttrs(css, id, attributes) return clone - def __call__(self, css:str|None = None, id:str|None = None): + def __call__(self, css:Optional[str] = None, id:Optional[str] = None): return self.props(css, id, {}) def __repr__(self) -> str: @@ -33,29 +37,30 @@ class Leaf(): class Branch(Leaf): name:str = "" - def __init__(self, name:str|None = None): + + def __init__(self, name:Optional[str] = None): if name: self.name = name self.attrs = None + def __repr__(self) -> str: return f'<{self.name}{self.attrs or ""}>' - def __getitem__(self, key:Union[str, 'Branch', Leaf, Tuple[Union[str, 'Branch', Leaf], ...]]) -> str: - + + def __getitem__(self, key:Union[Renderable, Tuple[Renderable, ...]]) -> str: if isinstance(key, tuple): children = f'\n'.join(str(k) for k in key) else: children = str(key) - return f'<{self.name}{self.attrs or ""}>\n{children}\n' class IMGTag(Leaf): name = "img" - def __call__(self, css:str|None = None, id:str|None = None, src:str|None = None): + def __call__(self, css:Optional[Stringy] = None, id:Optional[str] = None, src:Optional[str] = None): return self.props(css, id, {"src":src}) class ATag(Branch): name = "a" - def __call__(self, css:str|None = None, id:str|None = None, href:str|None = None, target:str|None = None): + def __call__(self, css:Optional[Stringy] = None, id:Optional[str] = None, href:Optional[str] = None, target:Optional[str] = None): return self.props(css, id, {"href":href, "target":target}) IMG = IMGTag() diff --git a/template.py b/template.py index 32e1c39..3c07eb7 100644 --- a/template.py +++ b/template.py @@ -1,4 +1,4 @@ -from PYX import DIV, H1, H2, P, SPAN, BR, IMG, A +from pyx import DIV, H1, H2, P, SPAN, BR, IMG, A print( DIV