diff --git a/.gitignore b/.gitignore index 65c4686..8964cf1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ __pycache__/ -.venv +.vscode/ +.venv/ puppygirl.egg-info *.html diff --git a/puppygirl/__init__.py b/puppygirl/__init__.py index 44e7ad9..ca6e7dc 100644 --- a/puppygirl/__init__.py +++ b/puppygirl/__init__.py @@ -1,3 +1,3 @@ -from puppygirl.clonable import * -from puppygirl.pg import * -from puppygirl.elements import * +from .clonable import * +from .pg import * +from .elements import * diff --git a/puppygirl/__main__.py b/puppygirl/__main__.py index 98d5b59..fdbf37e 100644 --- a/puppygirl/__main__.py +++ b/puppygirl/__main__.py @@ -2,7 +2,7 @@ from argparse import ArgumentParser from puppygirl import Puppygirl -from elements.domme import PuppygirlDomme +from puppygirl.elements.domme import PuppygirlDomme from puppygirl.renderer import ClientSideRenderer, ServerSideRenderer parser = ArgumentParser("puppygirl", add_help=True) diff --git a/puppygirl/clonable.py b/puppygirl/clonable.py index 8dc372d..869f5ba 100644 --- a/puppygirl/clonable.py +++ b/puppygirl/clonable.py @@ -1,5 +1,5 @@ from copy import copy -from typing import TYPE_CHECKING, Protocol, Self +from typing import Protocol, Self class Clonable[T = Self](Protocol): def clone(self) -> T: diff --git a/puppygirl/elements/__init__.py b/puppygirl/elements/__init__.py index 0f48b73..632e28c 100644 --- a/puppygirl/elements/__init__.py +++ b/puppygirl/elements/__init__.py @@ -1,3 +1,3 @@ -from puppygirl.elements.constants import * -from puppygirl.elements.domme import * -from puppygirl.elements.shadow_root import * +from .constants import * +from .domme import * +from .shadow_root import * diff --git a/puppygirl/elements/domme.py b/puppygirl/elements/domme.py index c532246..3f4bf32 100644 --- a/puppygirl/elements/domme.py +++ b/puppygirl/elements/domme.py @@ -1,14 +1,14 @@ from dataclasses import dataclass from typing import TYPE_CHECKING -from puppygirl.elements import TemplateAttr -from puppygirl.elements.shadow_root import ShadowRootMode -from puppygirl.renderer import Renderable +from .constants import TemplateAttr +from .shadow_root import ShadowRootMode +from ..renderer import Renderable if TYPE_CHECKING: - from puppygirl import Puppygirl - from puppygirl.elements import Node - from puppygirl.puppytype import RenderableElement, Templates + from .. import Puppygirl + from .shadow_root import Node + from ..puppytype import RenderableElement, Templates @dataclass class PuppygirlDomme(Renderable): diff --git a/puppygirl/elements/shadow_root.py b/puppygirl/elements/shadow_root.py index a516f48..850f7dd 100644 --- a/puppygirl/elements/shadow_root.py +++ b/puppygirl/elements/shadow_root.py @@ -1,10 +1,13 @@ from copy import copy from dataclasses import dataclass from enum import StrEnum -from typing import Optional, Self +from typing import TYPE_CHECKING, Optional, Self from bs4 import Tag -from puppygirl.clonable import Clonable +from ..clonable import Clonable + +if TYPE_CHECKING: + from ..puppytype import ElementLike TemplateName = "template" @@ -29,6 +32,11 @@ class Node(Clonable): serializable=serializable ) + def from_element(element: "ElementLike") -> Self: + if isinstance(element, Node): + return element + return Node(element) + def clone(self) -> "Self": return Node(copy(self.value)) @@ -80,6 +88,11 @@ class Template(Clonable): def serializable(self, value: bool): self._value["serializable"] = value + def from_element(element: "ElementLike") -> Self: + if isinstance(element, Template): + return element + return Template(element) + def clone(self) -> Self: return Template(copy(self._value)) diff --git a/puppygirl/pg.py b/puppygirl/pg.py index c55b0e3..3f61a61 100644 --- a/puppygirl/pg.py +++ b/puppygirl/pg.py @@ -1,9 +1,9 @@ from typing import Callable, Iterable, Self from bs4 import BeautifulSoup, Tag -from elements import IdAttr, Template -from puppygirl.renderer import Renderable, Renderer -from puppygirl.puppytype import ElementLike, ElementLikeList, Parsable, Templates +from .elements import IdAttr, Template +from .renderer import Renderable, Renderer +from .puppytype import ElementLike, ElementLikeList, Parsable, Templates class Puppygirl[R: Renderer]: renderer: R @@ -21,11 +21,11 @@ class Puppygirl[R: Renderer]: return value def _create_template_dict(templates: Iterable[ElementLike]) -> Templates: - templates = [Template(t) for t in templates] + templates = [Template.from_element(t) for t in templates] return {t[IdAttr]: t for t in templates} def add_template(self, template: ElementLike): - template = Template(template) + template = Template.from_element(template) self._templates[template[IdAttr]] = template def fetch(self, path: str) -> BeautifulSoup: diff --git a/puppygirl/puppytype.py b/puppygirl/puppytype.py index 38a05d3..4c4c30c 100644 --- a/puppygirl/puppytype.py +++ b/puppygirl/puppytype.py @@ -3,10 +3,10 @@ from typing import BinaryIO, Iterable, TextIO, TypeAlias, TYPE_CHECKING if TYPE_CHECKING: from string import Template from bs4 import BeautifulSoup, Tag - from puppygirl.elements import Node + from .elements import Node Parsable: TypeAlias = "BeautifulSoup | Tag | str | bytes | TextIO | BinaryIO" -ElementLike: TypeAlias = "BeautifulSoup | Tag | str | Node" +ElementLike: TypeAlias = "BeautifulSoup | Tag | str | Node | Template" ElementLikeList: TypeAlias = "Iterable[ElementLike]" RenderableElement: TypeAlias = "Node | Iterable[Node]" Templates: TypeAlias = "dict[str, Template]"