From 6ed45529b43bfca334a505f384e55b4a5743a390 Mon Sep 17 00:00:00 2001 From: Neriya Cohen Date: Sun, 23 Mar 2025 16:55:32 +0200 Subject: [PATCH 1/2] Fix #23 --- src/pydom/context/context.py | 34 ++++------- src/pydom/context/feature.py | 10 ---- .../transformers/class_transformer.py | 2 +- .../standard/transformers/dash_transformer.py | 2 +- .../transformers/falsy_transformer.py | 2 +- .../transformers/html_events_transformer.py | 2 +- .../transformers/inner_html_transformer.py | 2 +- .../transformers/simple_transformer.py | 2 +- .../transformers/style_transformer.py | 2 +- src/pydom/context/transformers.py | 57 ------------------- src/pydom/rendering/__init__.py | 14 +++-- src/pydom/rendering/html.py | 10 +++- src/pydom/rendering/json.py | 10 +++- src/pydom/rendering/props.py | 11 +--- src/pydom/rendering/transformers/__init__.py | 11 +++- .../transformers/post_render_transformer.py | 25 ++++++-- .../transformers/property_transformer.py | 51 +++++++++++++++-- .../rendering/tree/nodes/context_node.py | 16 +++--- src/pydom/rendering/tree/tree.py | 6 +- 19 files changed, 129 insertions(+), 140 deletions(-) delete mode 100644 src/pydom/context/feature.py delete mode 100644 src/pydom/context/transformers.py diff --git a/src/pydom/context/context.py b/src/pydom/context/context.py index b4b6cb8..031ad95 100644 --- a/src/pydom/context/context.py +++ b/src/pydom/context/context.py @@ -1,7 +1,6 @@ from typing import ( Callable, Tuple, - TypeVar, Union, Optional, Type, @@ -9,23 +8,21 @@ overload, ) -from typing_extensions import ParamSpec, Self +from typing_extensions import Self from pydom.errors import Error -from .transformers import ( +from ..rendering.transformers import ( PostRenderTransformer, - PostRenderTransformerFunction, PropertyTransformer, +) +from ..rendering.transformers.post_render_transformer import PostRenderTransformerFunction +from ..rendering.transformers.property_transformer import ( PropertyMatcherFunction, PropertyTransformerFunction, ) - from ..utils.injector import Injector, future_dependency -T = TypeVar("T") -P = ParamSpec("P") - class Context: def __init__(self) -> None: @@ -34,9 +31,7 @@ def __init__(self) -> None: self.injector: Injector = Injector( { Context: self, - RenderState: future_dependency( - "RenderState is only available during rendering" - ), + RenderState: future_dependency("RenderState is only available during rendering"), } ) self._prop_transformers: List[ @@ -83,9 +78,7 @@ def add_prop_transformer( after=after, ) except Error as e: - raise Error( - str(e) + f"\nCould not add transformer {matcher} into prop_transformers" - ) from e + raise Error(str(e) + f"\nCould not add transformer {matcher} into prop_transformers") from e if isinstance(matcher, PropertyTransformer): self._prop_transformers.insert(index, matcher) @@ -108,15 +101,10 @@ def add_post_render_transformer( after=after, ) except Error as e: - raise Error( - str(e) - + f"\nCould not add transformer {transformer} into post_render_transformers" - ) from e + raise Error(str(e) + f"\nCould not add transformer {transformer} into post_render_transformers") from e if isinstance(transformer, PostRenderTransformer): - self._post_render_transformers.insert( - index, self.inject(transformer.transform) - ) + self._post_render_transformers.insert(index, self.inject(transformer.transform)) else: self._post_render_transformers.insert(index, self.inject(transformer)) @@ -158,9 +146,7 @@ def _find_transformer_insertion_index( after_set = set(after) if after is not None else set() if not before_set.isdisjoint(after_set): - raise Error( - "Cannot specify the same transformer in both before and after lists" - ) + raise Error("Cannot specify the same transformer in both before and after lists") before_indexes = {} after_indexes = {} diff --git a/src/pydom/context/feature.py b/src/pydom/context/feature.py deleted file mode 100644 index a44583c..0000000 --- a/src/pydom/context/feature.py +++ /dev/null @@ -1,10 +0,0 @@ -from .context import Context - - -class Feature: - def __init__(self, context: Context) -> None: - self.context = context - - @property - def feature_name(self) -> str: - return type(self).__name__.replace("Feature", "").lower() diff --git a/src/pydom/context/standard/transformers/class_transformer.py b/src/pydom/context/standard/transformers/class_transformer.py index eaa7c12..eec2f53 100644 --- a/src/pydom/context/standard/transformers/class_transformer.py +++ b/src/pydom/context/standard/transformers/class_transformer.py @@ -1,4 +1,4 @@ -from ...transformers import PropertyTransformer +from ....rendering.transformers import PropertyTransformer class ClassTransformer(PropertyTransformer): diff --git a/src/pydom/context/standard/transformers/dash_transformer.py b/src/pydom/context/standard/transformers/dash_transformer.py index 3bb6bd9..870c36e 100644 --- a/src/pydom/context/standard/transformers/dash_transformer.py +++ b/src/pydom/context/standard/transformers/dash_transformer.py @@ -1,4 +1,4 @@ -from ...transformers import PropertyTransformer +from ....rendering.transformers import PropertyTransformer from ....utils.functions import is_primitive diff --git a/src/pydom/context/standard/transformers/falsy_transformer.py b/src/pydom/context/standard/transformers/falsy_transformer.py index f9f274a..bc765b5 100644 --- a/src/pydom/context/standard/transformers/falsy_transformer.py +++ b/src/pydom/context/standard/transformers/falsy_transformer.py @@ -1,4 +1,4 @@ -from ...transformers import PropertyTransformer +from ....rendering.transformers import PropertyTransformer class FalsyTransformer(PropertyTransformer): diff --git a/src/pydom/context/standard/transformers/html_events_transformer.py b/src/pydom/context/standard/transformers/html_events_transformer.py index f850a09..6aaed0a 100644 --- a/src/pydom/context/standard/transformers/html_events_transformer.py +++ b/src/pydom/context/standard/transformers/html_events_transformer.py @@ -1,4 +1,4 @@ -from ...transformers import PropertyTransformer +from ....rendering.transformers import PropertyTransformer class HTMLEventsTransformer(PropertyTransformer): diff --git a/src/pydom/context/standard/transformers/inner_html_transformer.py b/src/pydom/context/standard/transformers/inner_html_transformer.py index 73aa9eb..d073867 100644 --- a/src/pydom/context/standard/transformers/inner_html_transformer.py +++ b/src/pydom/context/standard/transformers/inner_html_transformer.py @@ -1,6 +1,6 @@ from pydom.rendering.tree.nodes import TextNode -from ...transformers import PropertyTransformer +from ....rendering.transformers import PropertyTransformer class InnerHTMLTransformer(PropertyTransformer): diff --git a/src/pydom/context/standard/transformers/simple_transformer.py b/src/pydom/context/standard/transformers/simple_transformer.py index 883e027..433b253 100644 --- a/src/pydom/context/standard/transformers/simple_transformer.py +++ b/src/pydom/context/standard/transformers/simple_transformer.py @@ -1,4 +1,4 @@ -from ...transformers import PropertyTransformer +from ....rendering.transformers import PropertyTransformer _SIMPLE_TRANSFORMERS = { "html_for": "for", diff --git a/src/pydom/context/standard/transformers/style_transformer.py b/src/pydom/context/standard/transformers/style_transformer.py index c39c126..43d75a7 100644 --- a/src/pydom/context/standard/transformers/style_transformer.py +++ b/src/pydom/context/standard/transformers/style_transformer.py @@ -1,5 +1,5 @@ from ....styling import StyleSheet -from ...transformers import PropertyTransformer +from ....rendering.transformers import PropertyTransformer class StyleTransformer(PropertyTransformer): diff --git a/src/pydom/context/transformers.py b/src/pydom/context/transformers.py deleted file mode 100644 index 2ed0d39..0000000 --- a/src/pydom/context/transformers.py +++ /dev/null @@ -1,57 +0,0 @@ -from abc import ABC, abstractmethod -from typing import ( - Callable, - Any, - TYPE_CHECKING, - Tuple, - TypeVar, - Union, -) - -if TYPE_CHECKING: - from pydom.rendering.tree.nodes import ContextNode - - -from typing_extensions import ParamSpec, TypeAlias, Concatenate - -T = TypeVar("T") -P = ParamSpec("P") - -PropertyMatcherFunction: TypeAlias = Union[ - Callable[Concatenate[str, Any, P], bool], str -] -PropertyTransformerFunction: TypeAlias = Callable[ - Concatenate[str, Any, "ContextNode", P], None -] - -PostRenderTransformerFunction: TypeAlias = Callable[Concatenate["ContextNode", P], None] - -if TYPE_CHECKING: - - class PropertyTransformer( - ABC, Tuple[PropertyMatcherFunction, PropertyTransformerFunction] - ): - @abstractmethod - def match(self, prop_name: str, prop_value, /) -> bool: ... - @abstractmethod - def transform(self, prop_name: str, prop_value, element: "ContextNode", /): ... - -else: - - class PropertyTransformer(ABC): - @abstractmethod - def match(self, prop_name: str, prop_value, /) -> bool: - pass - - @abstractmethod - def transform(self, prop_name: str, prop_value, element: "ContextNode", /): - pass - - def __iter__(self): - return iter((self.match, self.transform)) - - -class PostRenderTransformer(ABC): - @abstractmethod - def transform(self, element: "ContextNode"): - pass diff --git a/src/pydom/rendering/__init__.py b/src/pydom/rendering/__init__.py index e560d94..889bc4d 100644 --- a/src/pydom/rendering/__init__.py +++ b/src/pydom/rendering/__init__.py @@ -1,12 +1,14 @@ -from typing import overload, Literal, Union, Optional +from typing import overload, Literal, Union, Optional, TYPE_CHECKING from pydom.types.rendering import RenderResultJSON -from ..context import Context from .html import render_html from .json import render_json from ..types import Renderable, Primitive +if TYPE_CHECKING: + from ..context import Context + @overload def render( @@ -15,7 +17,7 @@ def render( to: Literal["html"], pretty: bool = False, tab_indent: int = 1, - context: Optional[Context] = None, + context: Optional["Context"] = None, **render_state_data, ) -> str: ... @@ -25,7 +27,7 @@ def render( element: Union[Renderable, Primitive], *, to: Literal["json"], - context: Optional[Context] = None, + context: Optional["Context"] = None, **render_state_data, ) -> RenderResultJSON: ... @@ -36,7 +38,7 @@ def render( *, pretty: bool = False, tab_indent: int = 1, - context: Optional[Context] = None, + context: Optional["Context"] = None, **render_state_data, ) -> str: ... @@ -54,4 +56,4 @@ def render( return render_html(element, **kwargs) -__all__ = ["render", "render_html", "render_json"] \ No newline at end of file +__all__ = ["render", "render_html", "render_json"] diff --git a/src/pydom/rendering/html.py b/src/pydom/rendering/html.py index 39aa226..ee33d6d 100644 --- a/src/pydom/rendering/html.py +++ b/src/pydom/rendering/html.py @@ -1,17 +1,19 @@ -from typing import Optional +from typing import Optional, TYPE_CHECKING -from ..context import Context, get_context from ..errors import RenderError from .props import render_props from .render_state import RenderState from .tree import ElementNode, TreeNode, TextNode, build_tree from ..types import RenderResult +if TYPE_CHECKING: + from ..context import Context + def render_html( element: RenderResult, *, - context: Optional[Context] = None, + context: Optional["Context"] = None, pretty=False, tab_indent=1, **render_state_data, @@ -27,6 +29,8 @@ def render_html( Returns: str: The rendered HTML string. """ + from ..context import get_context + context = get_context(context) render_state = RenderState(root=element, render_target="html", **render_state_data) with context.injector.scope({RenderState: lambda: render_state}): diff --git a/src/pydom/rendering/json.py b/src/pydom/rendering/json.py index 9e9daf1..a779b37 100644 --- a/src/pydom/rendering/json.py +++ b/src/pydom/rendering/json.py @@ -1,18 +1,22 @@ -from typing import Optional, cast +from typing import Optional, cast, TYPE_CHECKING -from ..context import Context, get_context from ..errors import RenderError from .render_state import RenderState from .tree import build_tree, TreeNode, TextNode, ElementNode from ..types import RenderResult, RenderResultJSON +if TYPE_CHECKING: + from ..context import Context + def render_json( element: RenderResult, *, - context: Optional[Context] = None, + context: Optional["Context"] = None, **render_state_data, ): + from ..context import get_context + context = get_context(context) render_state = RenderState(root=element, render_target="json", **render_state_data) with context.injector.scope({RenderState: lambda: render_state}): diff --git a/src/pydom/rendering/props.py b/src/pydom/rendering/props.py index 82236ef..27a836a 100644 --- a/src/pydom/rendering/props.py +++ b/src/pydom/rendering/props.py @@ -1,10 +1,10 @@ from html import escape from typing import Any, TYPE_CHECKING, Dict -from ..context import Context from ..errors import RenderError if TYPE_CHECKING: + from ..context import Context from .tree.nodes.context_node import ContextNode @@ -23,15 +23,10 @@ def transform_props(element: "ContextNode", *, context: "Context"): if matcher(key, value): transformer(key, value, element) else: - raise RenderError( - f"Invalid matcher: {matcher} must be a callable or a string." - ) + raise RenderError(f"Invalid matcher: {matcher} must be a callable or a string.") element.props.update(element.props) def render_props(props: Dict[str, Any]) -> str: - return " ".join( - key if value is True else f'{key}="{escape(str(value))}"' - for key, value in props.items() - ) + return " ".join(key if value is True else f'{key}="{escape(str(value))}"' for key, value in props.items()) diff --git a/src/pydom/rendering/transformers/__init__.py b/src/pydom/rendering/transformers/__init__.py index 4005016..37755e1 100644 --- a/src/pydom/rendering/transformers/__init__.py +++ b/src/pydom/rendering/transformers/__init__.py @@ -1,4 +1,9 @@ -from .post_render_transformer import post_render_transformer -from .property_transformer import property_transformer +from .post_render_transformer import post_render_transformer, PostRenderTransformer +from .property_transformer import property_transformer, PropertyTransformer -__all__ = ["post_render_transformer", "property_transformer"] +__all__ = [ + "post_render_transformer", + "PostRenderTransformer", + "property_transformer", + "PropertyTransformer", +] diff --git a/src/pydom/rendering/transformers/post_render_transformer.py b/src/pydom/rendering/transformers/post_render_transformer.py index c3f126b..eec75fb 100644 --- a/src/pydom/rendering/transformers/post_render_transformer.py +++ b/src/pydom/rendering/transformers/post_render_transformer.py @@ -1,12 +1,27 @@ -from typing import List, Optional, Type, Union +from abc import ABC, abstractmethod +from typing import List, Optional, Type, Union, TYPE_CHECKING, Callable -from ...context.context import PostRenderTransformerFunction, get_context, Context -from ...context.transformers import PostRenderTransformer +from typing_extensions import ParamSpec, TypeAlias, Concatenate + + +if TYPE_CHECKING: + from pydom.context import Context + from pydom.rendering.tree.nodes import ContextNode + +P = ParamSpec("P") + +PostRenderTransformerFunction: TypeAlias = Callable[Concatenate["ContextNode", P], None] + + +class PostRenderTransformer(ABC): + @abstractmethod + def transform(self, element: "ContextNode"): + pass def post_render_transformer( *, - context: Union[Context, None] = None, + context: Union["Context", None] = None, before: Optional[List[Type[PostRenderTransformer]]] = None, after: Optional[List[Type[PostRenderTransformer]]] = None, ): @@ -30,6 +45,8 @@ def post_render_transformer( ... ) """ + from ...context import get_context + context = get_context(context) def decorator(func: PostRenderTransformerFunction): diff --git a/src/pydom/rendering/transformers/property_transformer.py b/src/pydom/rendering/transformers/property_transformer.py index 2508418..28ff860 100644 --- a/src/pydom/rendering/transformers/property_transformer.py +++ b/src/pydom/rendering/transformers/property_transformer.py @@ -1,13 +1,54 @@ -from typing import Any, Callable, List, Optional, Type, Union +from abc import ABC, abstractmethod +from typing import ( + Any, + Callable, + List, + Optional, + Type, + Union, + TYPE_CHECKING, + Tuple, +) -from pydom.context.transformers import PropertyTransformer -from ...context.context import PropertyTransformerFunction, Context, get_context +from typing_extensions import ParamSpec, TypeAlias, Concatenate + +if TYPE_CHECKING: + from pydom.context import Context + from pydom.rendering.tree.nodes import ContextNode + + +P = ParamSpec("P") + +PropertyMatcherFunction: TypeAlias = Union[Callable[Concatenate[str, Any, P], bool], str] +PropertyTransformerFunction: TypeAlias = Callable[Concatenate[str, Any, "ContextNode", P], None] + +if TYPE_CHECKING: + + class PropertyTransformer(ABC, Tuple[PropertyMatcherFunction, PropertyTransformerFunction]): + @abstractmethod + def match(self, prop_name: str, prop_value, /) -> bool: ... + @abstractmethod + def transform(self, prop_name: str, prop_value, element: "ContextNode", /): ... + +else: + + class PropertyTransformer(ABC): + @abstractmethod + def match(self, prop_name: str, prop_value, /) -> bool: + pass + + @abstractmethod + def transform(self, prop_name: str, prop_value, element: "ContextNode", /): + pass + + def __iter__(self): + return iter((self.match, self.transform)) def property_transformer( matcher: Union[Callable[[str, Any], bool], str], *, - context: Optional[Context] = None, + context: Optional["Context"] = None, before: Optional[List[Type[PropertyTransformer]]] = None, after: Optional[List[Type[PropertyTransformer]]] = None, ): @@ -32,6 +73,8 @@ def property_transformer( ... element.props["class"] = " ".join(str(class_name).split()) """ + from ...context import get_context + context = get_context(context) def decorator(func: PropertyTransformerFunction): diff --git a/src/pydom/rendering/tree/nodes/context_node.py b/src/pydom/rendering/tree/nodes/context_node.py index ced14f5..d1af1c1 100644 --- a/src/pydom/rendering/tree/nodes/context_node.py +++ b/src/pydom/rendering/tree/nodes/context_node.py @@ -1,14 +1,15 @@ -from typing import List, Optional, Union +from typing import List, Optional, Union, TYPE_CHECKING from ....errors import RenderError from .element_node import ElementNode -from ....context import Context from ....types import Renderable, Primitive +if TYPE_CHECKING: + from ....context import Context class ContextNode: - def __init__(self, node: ElementNode, context: Context): + def __init__(self, node: ElementNode, context: "Context"): self.node = node self.context = context @@ -52,9 +53,7 @@ def insert_after(self, node: Union[Renderable, Primitive]): current_index = self.parent.children.index(self.node) - self.parent.children.insert( - current_index + 1, self._build(node) - ) + self.parent.children.insert(current_index + 1, self._build(node)) def insert_before(self, node: Union[Renderable, Primitive]): if self.parent is None: @@ -63,9 +62,7 @@ def insert_before(self, node: Union[Renderable, Primitive]): assert isinstance(self.parent.children, list) current_index = self.parent.children.index(self.node) - self.parent.children.insert( - current_index, self._build(node) - ) + self.parent.children.insert(current_index, self._build(node)) def insert_child(self, index: int, node: Union[Renderable, Primitive]): if self.children is None: @@ -93,4 +90,5 @@ def props(self): def _build(self, renderable: Union[Renderable, Primitive]): from ..tree import build_raw_tree + return build_raw_tree(renderable, context=self.context) diff --git a/src/pydom/rendering/tree/tree.py b/src/pydom/rendering/tree/tree.py index 04fa72f..f886804 100644 --- a/src/pydom/rendering/tree/tree.py +++ b/src/pydom/rendering/tree/tree.py @@ -1,8 +1,7 @@ from html import escape -from typing import Union +from typing import Union, TYPE_CHECKING from ...component import Component -from ...context import Context from ...element import Element from ...errors import RenderError from .nodes.context_node import ContextNode @@ -11,6 +10,9 @@ from ...types import Primitive, Renderable from ...utils.functions import flatten, is_primitive +if TYPE_CHECKING: + from ...context import Context + def build_raw_tree( renderable: Union[Renderable, Primitive], *, context: "Context", escape_string=True From 3efea510c322728ff0d1e2cdca6c694cf3051bf2 Mon Sep 17 00:00:00 2001 From: Neriya Cohen Date: Sun, 23 Mar 2025 21:12:17 +0200 Subject: [PATCH 2/2] Update docs --- .../pydom/context/context/index.rst | 19 ++------ docs/api-reference/pydom/context/index.rst | 8 ++-- .../transformers/class_transformer/index.rst | 6 +-- .../transformers/dash_transformer/index.rst | 6 +-- .../transformers/falsy_transformer/index.rst | 6 +-- .../html_events_transformer/index.rst | 6 +-- .../context/standard/transformers/index.rst | 42 +++-------------- .../inner_html_transformer/index.rst | 6 +-- .../transformers/simple_transformer/index.rst | 6 +-- .../transformers/style_transformer/index.rst | 6 +-- docs/api-reference/pydom/index.rst | 6 +-- .../pydom/rendering/transformers/index.rst | 46 +++++++++++++++++- .../post_render_transformer/index.rst | 38 ++++++++++++++- .../property_transformer/index.rst | 47 ++++++++++++++++++- .../transformers/property-transformers.rst | 4 +- 15 files changed, 152 insertions(+), 100 deletions(-) diff --git a/docs/api-reference/pydom/context/context/index.rst b/docs/api-reference/pydom/context/context/index.rst index d4fafde..a03ffd4 100644 --- a/docs/api-reference/pydom/context/context/index.rst +++ b/docs/api-reference/pydom/context/context/index.rst @@ -4,15 +4,6 @@ pydom.context.context .. py:module:: pydom.context.context -Attributes ----------- - -.. autoapisummary:: - - pydom.context.context.T - pydom.context.context.P - - Classes ------- @@ -33,21 +24,17 @@ Functions Module Contents --------------- -.. py:data:: T - -.. py:data:: P - .. py:class:: Context .. py:attribute:: injector :type: pydom.utils.injector.Injector - .. py:method:: add_prop_transformer(transformer: pydom.context.transformers.PropertyTransformer, /, *, before: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None, after: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None) -> None - add_prop_transformer(matcher: pydom.context.transformers.PropertyMatcherFunction, transformer: pydom.context.transformers.PropertyTransformerFunction, /, *, before: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None, after: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None) -> None + .. py:method:: add_prop_transformer(transformer: pydom.rendering.transformers.PropertyTransformer, /, *, before: Optional[List[Type[pydom.rendering.transformers.PropertyTransformer]]] = None, after: Optional[List[Type[pydom.rendering.transformers.PropertyTransformer]]] = None) -> None + add_prop_transformer(matcher: pydom.rendering.transformers.property_transformer.PropertyMatcherFunction, transformer: pydom.rendering.transformers.property_transformer.PropertyTransformerFunction, /, *, before: Optional[List[Type[pydom.rendering.transformers.PropertyTransformer]]] = None, after: Optional[List[Type[pydom.rendering.transformers.PropertyTransformer]]] = None) -> None - .. py:method:: add_post_render_transformer(transformer: Union[pydom.context.transformers.PostRenderTransformerFunction, pydom.context.transformers.PostRenderTransformer], /, *, before: Optional[List[Type[pydom.context.transformers.PostRenderTransformer]]] = None, after: Optional[List[Type[pydom.context.transformers.PostRenderTransformer]]] = None) + .. py:method:: add_post_render_transformer(transformer: Union[pydom.rendering.transformers.post_render_transformer.PostRenderTransformerFunction, pydom.rendering.transformers.PostRenderTransformer], /, *, before: Optional[List[Type[pydom.rendering.transformers.PostRenderTransformer]]] = None, after: Optional[List[Type[pydom.rendering.transformers.PostRenderTransformer]]] = None) .. py:property:: prop_transformers diff --git a/docs/api-reference/pydom/context/index.rst b/docs/api-reference/pydom/context/index.rst index ceaf2f1..e0a1d1d 100644 --- a/docs/api-reference/pydom/context/index.rst +++ b/docs/api-reference/pydom/context/index.rst @@ -11,9 +11,7 @@ Submodules :maxdepth: 1 /api-reference/pydom/context/context/index - /api-reference/pydom/context/feature/index /api-reference/pydom/context/standard/index - /api-reference/pydom/context/transformers/index Classes @@ -41,11 +39,11 @@ Package Contents :type: pydom.utils.injector.Injector - .. py:method:: add_prop_transformer(transformer: pydom.context.transformers.PropertyTransformer, /, *, before: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None, after: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None) -> None - add_prop_transformer(matcher: pydom.context.transformers.PropertyMatcherFunction, transformer: pydom.context.transformers.PropertyTransformerFunction, /, *, before: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None, after: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None) -> None + .. py:method:: add_prop_transformer(transformer: pydom.rendering.transformers.PropertyTransformer, /, *, before: Optional[List[Type[pydom.rendering.transformers.PropertyTransformer]]] = None, after: Optional[List[Type[pydom.rendering.transformers.PropertyTransformer]]] = None) -> None + add_prop_transformer(matcher: pydom.rendering.transformers.property_transformer.PropertyMatcherFunction, transformer: pydom.rendering.transformers.property_transformer.PropertyTransformerFunction, /, *, before: Optional[List[Type[pydom.rendering.transformers.PropertyTransformer]]] = None, after: Optional[List[Type[pydom.rendering.transformers.PropertyTransformer]]] = None) -> None - .. py:method:: add_post_render_transformer(transformer: Union[pydom.context.transformers.PostRenderTransformerFunction, pydom.context.transformers.PostRenderTransformer], /, *, before: Optional[List[Type[pydom.context.transformers.PostRenderTransformer]]] = None, after: Optional[List[Type[pydom.context.transformers.PostRenderTransformer]]] = None) + .. py:method:: add_post_render_transformer(transformer: Union[pydom.rendering.transformers.post_render_transformer.PostRenderTransformerFunction, pydom.rendering.transformers.PostRenderTransformer], /, *, before: Optional[List[Type[pydom.rendering.transformers.PostRenderTransformer]]] = None, after: Optional[List[Type[pydom.rendering.transformers.PostRenderTransformer]]] = None) .. py:property:: prop_transformers diff --git a/docs/api-reference/pydom/context/standard/transformers/class_transformer/index.rst b/docs/api-reference/pydom/context/standard/transformers/class_transformer/index.rst index d0edb2a..d76082e 100644 --- a/docs/api-reference/pydom/context/standard/transformers/class_transformer/index.rst +++ b/docs/api-reference/pydom/context/standard/transformers/class_transformer/index.rst @@ -17,11 +17,7 @@ Module Contents .. py:class:: ClassTransformer(prop_name='classes') - Bases: :py:obj:`pydom.context.transformers.PropertyTransformer` - - - Helper class that provides a standard way to create an ABC using - inheritance. + Bases: :py:obj:`pydom.rendering.transformers.PropertyTransformer` .. py:attribute:: prop_name diff --git a/docs/api-reference/pydom/context/standard/transformers/dash_transformer/index.rst b/docs/api-reference/pydom/context/standard/transformers/dash_transformer/index.rst index 57c7f6e..7456cfe 100644 --- a/docs/api-reference/pydom/context/standard/transformers/dash_transformer/index.rst +++ b/docs/api-reference/pydom/context/standard/transformers/dash_transformer/index.rst @@ -17,11 +17,7 @@ Module Contents .. py:class:: DashTransformer - Bases: :py:obj:`pydom.context.transformers.PropertyTransformer` - - - Helper class that provides a standard way to create an ABC using - inheritance. + Bases: :py:obj:`pydom.rendering.transformers.PropertyTransformer` .. py:method:: match(prop_name, _) -> bool diff --git a/docs/api-reference/pydom/context/standard/transformers/falsy_transformer/index.rst b/docs/api-reference/pydom/context/standard/transformers/falsy_transformer/index.rst index 2462f0e..0eede75 100644 --- a/docs/api-reference/pydom/context/standard/transformers/falsy_transformer/index.rst +++ b/docs/api-reference/pydom/context/standard/transformers/falsy_transformer/index.rst @@ -17,11 +17,7 @@ Module Contents .. py:class:: FalsyTransformer - Bases: :py:obj:`pydom.context.transformers.PropertyTransformer` - - - Helper class that provides a standard way to create an ABC using - inheritance. + Bases: :py:obj:`pydom.rendering.transformers.PropertyTransformer` .. py:method:: match(_, prop_value) -> bool diff --git a/docs/api-reference/pydom/context/standard/transformers/html_events_transformer/index.rst b/docs/api-reference/pydom/context/standard/transformers/html_events_transformer/index.rst index 435e497..173d72c 100644 --- a/docs/api-reference/pydom/context/standard/transformers/html_events_transformer/index.rst +++ b/docs/api-reference/pydom/context/standard/transformers/html_events_transformer/index.rst @@ -17,11 +17,7 @@ Module Contents .. py:class:: HTMLEventsTransformer - Bases: :py:obj:`pydom.context.transformers.PropertyTransformer` - - - Helper class that provides a standard way to create an ABC using - inheritance. + Bases: :py:obj:`pydom.rendering.transformers.PropertyTransformer` .. py:method:: match(prop_name, prop_value) -> bool diff --git a/docs/api-reference/pydom/context/standard/transformers/index.rst b/docs/api-reference/pydom/context/standard/transformers/index.rst index 28b1180..ff78a8b 100644 --- a/docs/api-reference/pydom/context/standard/transformers/index.rst +++ b/docs/api-reference/pydom/context/standard/transformers/index.rst @@ -38,11 +38,7 @@ Package Contents .. py:class:: ClassTransformer(prop_name='classes') - Bases: :py:obj:`pydom.context.transformers.PropertyTransformer` - - - Helper class that provides a standard way to create an ABC using - inheritance. + Bases: :py:obj:`pydom.rendering.transformers.PropertyTransformer` .. py:attribute:: prop_name @@ -58,11 +54,7 @@ Package Contents .. py:class:: DashTransformer - Bases: :py:obj:`pydom.context.transformers.PropertyTransformer` - - - Helper class that provides a standard way to create an ABC using - inheritance. + Bases: :py:obj:`pydom.rendering.transformers.PropertyTransformer` .. py:method:: match(prop_name, _) -> bool @@ -73,11 +65,7 @@ Package Contents .. py:class:: FalsyTransformer - Bases: :py:obj:`pydom.context.transformers.PropertyTransformer` - - - Helper class that provides a standard way to create an ABC using - inheritance. + Bases: :py:obj:`pydom.rendering.transformers.PropertyTransformer` .. py:method:: match(_, prop_value) -> bool @@ -88,11 +76,7 @@ Package Contents .. py:class:: HTMLEventsTransformer - Bases: :py:obj:`pydom.context.transformers.PropertyTransformer` - - - Helper class that provides a standard way to create an ABC using - inheritance. + Bases: :py:obj:`pydom.rendering.transformers.PropertyTransformer` .. py:method:: match(prop_name, prop_value) -> bool @@ -103,11 +87,7 @@ Package Contents .. py:class:: InnerHTMLTransformer - Bases: :py:obj:`pydom.context.transformers.PropertyTransformer` - - - Helper class that provides a standard way to create an ABC using - inheritance. + Bases: :py:obj:`pydom.rendering.transformers.PropertyTransformer` .. py:method:: match(prop_name: str, _) -> bool @@ -118,11 +98,7 @@ Package Contents .. py:class:: SimpleTransformer - Bases: :py:obj:`pydom.context.transformers.PropertyTransformer` - - - Helper class that provides a standard way to create an ABC using - inheritance. + Bases: :py:obj:`pydom.rendering.transformers.PropertyTransformer` .. py:method:: match(prop_name, _) -> bool @@ -133,11 +109,7 @@ Package Contents .. py:class:: StyleTransformer - Bases: :py:obj:`pydom.context.transformers.PropertyTransformer` - - - Helper class that provides a standard way to create an ABC using - inheritance. + Bases: :py:obj:`pydom.rendering.transformers.PropertyTransformer` .. py:method:: match(_, value) diff --git a/docs/api-reference/pydom/context/standard/transformers/inner_html_transformer/index.rst b/docs/api-reference/pydom/context/standard/transformers/inner_html_transformer/index.rst index 93087e4..cca0d43 100644 --- a/docs/api-reference/pydom/context/standard/transformers/inner_html_transformer/index.rst +++ b/docs/api-reference/pydom/context/standard/transformers/inner_html_transformer/index.rst @@ -17,11 +17,7 @@ Module Contents .. py:class:: InnerHTMLTransformer - Bases: :py:obj:`pydom.context.transformers.PropertyTransformer` - - - Helper class that provides a standard way to create an ABC using - inheritance. + Bases: :py:obj:`pydom.rendering.transformers.PropertyTransformer` .. py:method:: match(prop_name: str, _) -> bool diff --git a/docs/api-reference/pydom/context/standard/transformers/simple_transformer/index.rst b/docs/api-reference/pydom/context/standard/transformers/simple_transformer/index.rst index da5afad..b3e72c6 100644 --- a/docs/api-reference/pydom/context/standard/transformers/simple_transformer/index.rst +++ b/docs/api-reference/pydom/context/standard/transformers/simple_transformer/index.rst @@ -17,11 +17,7 @@ Module Contents .. py:class:: SimpleTransformer - Bases: :py:obj:`pydom.context.transformers.PropertyTransformer` - - - Helper class that provides a standard way to create an ABC using - inheritance. + Bases: :py:obj:`pydom.rendering.transformers.PropertyTransformer` .. py:method:: match(prop_name, _) -> bool diff --git a/docs/api-reference/pydom/context/standard/transformers/style_transformer/index.rst b/docs/api-reference/pydom/context/standard/transformers/style_transformer/index.rst index 918fd4e..3ae5736 100644 --- a/docs/api-reference/pydom/context/standard/transformers/style_transformer/index.rst +++ b/docs/api-reference/pydom/context/standard/transformers/style_transformer/index.rst @@ -17,11 +17,7 @@ Module Contents .. py:class:: StyleTransformer - Bases: :py:obj:`pydom.context.transformers.PropertyTransformer` - - - Helper class that provides a standard way to create an ABC using - inheritance. + Bases: :py:obj:`pydom.rendering.transformers.PropertyTransformer` .. py:method:: match(_, value) diff --git a/docs/api-reference/pydom/index.rst b/docs/api-reference/pydom/index.rst index 80a7ad9..0fcb92e 100644 --- a/docs/api-reference/pydom/index.rst +++ b/docs/api-reference/pydom/index.rst @@ -215,11 +215,11 @@ Package Contents :type: pydom.utils.injector.Injector - .. py:method:: add_prop_transformer(transformer: pydom.context.transformers.PropertyTransformer, /, *, before: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None, after: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None) -> None - add_prop_transformer(matcher: pydom.context.transformers.PropertyMatcherFunction, transformer: pydom.context.transformers.PropertyTransformerFunction, /, *, before: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None, after: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None) -> None + .. py:method:: add_prop_transformer(transformer: pydom.rendering.transformers.PropertyTransformer, /, *, before: Optional[List[Type[pydom.rendering.transformers.PropertyTransformer]]] = None, after: Optional[List[Type[pydom.rendering.transformers.PropertyTransformer]]] = None) -> None + add_prop_transformer(matcher: pydom.rendering.transformers.property_transformer.PropertyMatcherFunction, transformer: pydom.rendering.transformers.property_transformer.PropertyTransformerFunction, /, *, before: Optional[List[Type[pydom.rendering.transformers.PropertyTransformer]]] = None, after: Optional[List[Type[pydom.rendering.transformers.PropertyTransformer]]] = None) -> None - .. py:method:: add_post_render_transformer(transformer: Union[pydom.context.transformers.PostRenderTransformerFunction, pydom.context.transformers.PostRenderTransformer], /, *, before: Optional[List[Type[pydom.context.transformers.PostRenderTransformer]]] = None, after: Optional[List[Type[pydom.context.transformers.PostRenderTransformer]]] = None) + .. py:method:: add_post_render_transformer(transformer: Union[pydom.rendering.transformers.post_render_transformer.PostRenderTransformerFunction, pydom.rendering.transformers.PostRenderTransformer], /, *, before: Optional[List[Type[pydom.rendering.transformers.PostRenderTransformer]]] = None, after: Optional[List[Type[pydom.rendering.transformers.PostRenderTransformer]]] = None) .. py:property:: prop_transformers diff --git a/docs/api-reference/pydom/rendering/transformers/index.rst b/docs/api-reference/pydom/rendering/transformers/index.rst index 09208f8..2f619d3 100644 --- a/docs/api-reference/pydom/rendering/transformers/index.rst +++ b/docs/api-reference/pydom/rendering/transformers/index.rst @@ -14,6 +14,15 @@ Submodules /api-reference/pydom/rendering/transformers/property_transformer/index +Classes +------- + +.. autoapisummary:: + + pydom.rendering.transformers.PostRenderTransformer + pydom.rendering.transformers.PropertyTransformer + + Functions --------- @@ -26,7 +35,7 @@ Functions Package Contents ---------------- -.. py:function:: post_render_transformer(*, context: Union[pydom.context.context.Context, None] = None, before: Optional[List[Type[pydom.context.transformers.PostRenderTransformer]]] = None, after: Optional[List[Type[pydom.context.transformers.PostRenderTransformer]]] = None) +.. py:function:: post_render_transformer(*, context: Union[pydom.context.Context, None] = None, before: Optional[List[Type[PostRenderTransformer]]] = None, after: Optional[List[Type[PostRenderTransformer]]] = None) A decorator to register a function as a post-render transformer. @@ -48,7 +57,21 @@ Package Contents -.. py:function:: property_transformer(matcher: Union[Callable[[str, Any], bool], str], *, context: Optional[pydom.context.context.Context] = None, before: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None, after: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None) +.. py:class:: PostRenderTransformer + + Bases: :py:obj:`abc.ABC` + + + Helper class that provides a standard way to create an ABC using + inheritance. + + + .. py:method:: transform(element: pydom.rendering.tree.nodes.ContextNode) + :abstractmethod: + + + +.. py:function:: property_transformer(matcher: Union[Callable[[str, Any], bool], str], *, context: Optional[pydom.context.Context] = None, before: Optional[List[Type[PropertyTransformer]]] = None, after: Optional[List[Type[PropertyTransformer]]] = None) A decorator to register a function as a property transformer. @@ -71,3 +94,22 @@ Package Contents +.. py:class:: PropertyTransformer + + Bases: :py:obj:`abc.ABC`, :py:obj:`Tuple`\ [\ :py:obj:`PropertyMatcherFunction`\ , :py:obj:`PropertyTransformerFunction`\ ] + + + Helper class that provides a standard way to create an ABC using + inheritance. + + + .. py:method:: match(prop_name: str, prop_value, /) -> bool + :abstractmethod: + + + + .. py:method:: transform(prop_name: str, prop_value, element: pydom.rendering.tree.nodes.ContextNode, /) + :abstractmethod: + + + diff --git a/docs/api-reference/pydom/rendering/transformers/post_render_transformer/index.rst b/docs/api-reference/pydom/rendering/transformers/post_render_transformer/index.rst index 59921f5..48a825d 100644 --- a/docs/api-reference/pydom/rendering/transformers/post_render_transformer/index.rst +++ b/docs/api-reference/pydom/rendering/transformers/post_render_transformer/index.rst @@ -4,6 +4,23 @@ pydom.rendering.transformers.post_render_transformer .. py:module:: pydom.rendering.transformers.post_render_transformer +Attributes +---------- + +.. autoapisummary:: + + pydom.rendering.transformers.post_render_transformer.P + pydom.rendering.transformers.post_render_transformer.PostRenderTransformerFunction + + +Classes +------- + +.. autoapisummary:: + + pydom.rendering.transformers.post_render_transformer.PostRenderTransformer + + Functions --------- @@ -15,7 +32,26 @@ Functions Module Contents --------------- -.. py:function:: post_render_transformer(*, context: Union[pydom.context.context.Context, None] = None, before: Optional[List[Type[pydom.context.transformers.PostRenderTransformer]]] = None, after: Optional[List[Type[pydom.context.transformers.PostRenderTransformer]]] = None) +.. py:data:: P + +.. py:data:: PostRenderTransformerFunction + :type: typing_extensions.TypeAlias + +.. py:class:: PostRenderTransformer + + Bases: :py:obj:`abc.ABC` + + + Helper class that provides a standard way to create an ABC using + inheritance. + + + .. py:method:: transform(element: pydom.rendering.tree.nodes.ContextNode) + :abstractmethod: + + + +.. py:function:: post_render_transformer(*, context: Union[pydom.context.Context, None] = None, before: Optional[List[Type[PostRenderTransformer]]] = None, after: Optional[List[Type[PostRenderTransformer]]] = None) A decorator to register a function as a post-render transformer. diff --git a/docs/api-reference/pydom/rendering/transformers/property_transformer/index.rst b/docs/api-reference/pydom/rendering/transformers/property_transformer/index.rst index 2bc9665..b639bb9 100644 --- a/docs/api-reference/pydom/rendering/transformers/property_transformer/index.rst +++ b/docs/api-reference/pydom/rendering/transformers/property_transformer/index.rst @@ -4,6 +4,24 @@ pydom.rendering.transformers.property_transformer .. py:module:: pydom.rendering.transformers.property_transformer +Attributes +---------- + +.. autoapisummary:: + + pydom.rendering.transformers.property_transformer.P + pydom.rendering.transformers.property_transformer.PropertyMatcherFunction + pydom.rendering.transformers.property_transformer.PropertyTransformerFunction + + +Classes +------- + +.. autoapisummary:: + + pydom.rendering.transformers.property_transformer.PropertyTransformer + + Functions --------- @@ -15,7 +33,34 @@ Functions Module Contents --------------- -.. py:function:: property_transformer(matcher: Union[Callable[[str, Any], bool], str], *, context: Optional[pydom.context.context.Context] = None, before: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None, after: Optional[List[Type[pydom.context.transformers.PropertyTransformer]]] = None) +.. py:data:: P + +.. py:data:: PropertyMatcherFunction + :type: typing_extensions.TypeAlias + +.. py:data:: PropertyTransformerFunction + :type: typing_extensions.TypeAlias + +.. py:class:: PropertyTransformer + + Bases: :py:obj:`abc.ABC`, :py:obj:`Tuple`\ [\ :py:obj:`PropertyMatcherFunction`\ , :py:obj:`PropertyTransformerFunction`\ ] + + + Helper class that provides a standard way to create an ABC using + inheritance. + + + .. py:method:: match(prop_name: str, prop_value, /) -> bool + :abstractmethod: + + + + .. py:method:: transform(prop_name: str, prop_value, element: pydom.rendering.tree.nodes.ContextNode, /) + :abstractmethod: + + + +.. py:function:: property_transformer(matcher: Union[Callable[[str, Any], bool], str], *, context: Optional[pydom.context.Context] = None, before: Optional[List[Type[PropertyTransformer]]] = None, after: Optional[List[Type[PropertyTransformer]]] = None) A decorator to register a function as a property transformer. diff --git a/docs/user-guide/advanced/transformers/property-transformers.rst b/docs/user-guide/advanced/transformers/property-transformers.rst index 437badd..1214759 100644 --- a/docs/user-guide/advanced/transformers/property-transformers.rst +++ b/docs/user-guide/advanced/transformers/property-transformers.rst @@ -19,7 +19,7 @@ Function Based Property Transformers The function-based transformers are simple functions that take the property name, value, element, and render state as arguments. After the function is defined, you can use the :func:`property_transformer ` decorator to register the transformer. -The decorator takes the property name as an argument or a :type:`matcher function ` that returns ``True`` if the transformer should be applied. +The decorator takes the property name as an argument or a :type:`matcher function ` that returns ``True`` if the transformer should be applied. The following example demonstrates how to use a property transformer to give a class to each element that has inline styles. @@ -45,7 +45,7 @@ The following example demonstrates how to use a property transformer to give a c Class Based Property Transformers ################################# -The class-based transformers are classes that inherit from the :class:`PropertyTransformer ` +The class-based transformers are classes that inherit from the :class:`PropertyTransformer ` class and implement the ``match`` and ``transform`` methods. The ``match`` method should return ``True`` if the transformer should be applied.