maid time

This commit is contained in:
Rowan 2025-10-06 18:03:06 -04:00
parent 13f546fcf5
commit b60b16b2f9
9 changed files with 38 additions and 24 deletions

3
.gitignore vendored
View file

@ -1,4 +1,5 @@
__pycache__/ __pycache__/
.venv .vscode/
.venv/
puppygirl.egg-info puppygirl.egg-info
*.html *.html

View file

@ -1,3 +1,3 @@
from puppygirl.clonable import * from .clonable import *
from puppygirl.pg import * from .pg import *
from puppygirl.elements import * from .elements import *

View file

@ -2,7 +2,7 @@
from argparse import ArgumentParser from argparse import ArgumentParser
from puppygirl import Puppygirl from puppygirl import Puppygirl
from elements.domme import PuppygirlDomme from puppygirl.elements.domme import PuppygirlDomme
from puppygirl.renderer import ClientSideRenderer, ServerSideRenderer from puppygirl.renderer import ClientSideRenderer, ServerSideRenderer
parser = ArgumentParser("puppygirl", add_help=True) parser = ArgumentParser("puppygirl", add_help=True)

View file

@ -1,5 +1,5 @@
from copy import copy from copy import copy
from typing import TYPE_CHECKING, Protocol, Self from typing import Protocol, Self
class Clonable[T = Self](Protocol): class Clonable[T = Self](Protocol):
def clone(self) -> T: def clone(self) -> T:

View file

@ -1,3 +1,3 @@
from puppygirl.elements.constants import * from .constants import *
from puppygirl.elements.domme import * from .domme import *
from puppygirl.elements.shadow_root import * from .shadow_root import *

View file

@ -1,14 +1,14 @@
from dataclasses import dataclass from dataclasses import dataclass
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from puppygirl.elements import TemplateAttr from .constants import TemplateAttr
from puppygirl.elements.shadow_root import ShadowRootMode from .shadow_root import ShadowRootMode
from puppygirl.renderer import Renderable from ..renderer import Renderable
if TYPE_CHECKING: if TYPE_CHECKING:
from puppygirl import Puppygirl from .. import Puppygirl
from puppygirl.elements import Node from .shadow_root import Node
from puppygirl.puppytype import RenderableElement, Templates from ..puppytype import RenderableElement, Templates
@dataclass @dataclass
class PuppygirlDomme(Renderable): class PuppygirlDomme(Renderable):

View file

@ -1,10 +1,13 @@
from copy import copy from copy import copy
from dataclasses import dataclass from dataclasses import dataclass
from enum import StrEnum from enum import StrEnum
from typing import Optional, Self from typing import TYPE_CHECKING, Optional, Self
from bs4 import Tag from bs4 import Tag
from puppygirl.clonable import Clonable from ..clonable import Clonable
if TYPE_CHECKING:
from ..puppytype import ElementLike
TemplateName = "template" TemplateName = "template"
@ -29,6 +32,11 @@ class Node(Clonable):
serializable=serializable serializable=serializable
) )
def from_element(element: "ElementLike") -> Self:
if isinstance(element, Node):
return element
return Node(element)
def clone(self) -> "Self": def clone(self) -> "Self":
return Node(copy(self.value)) return Node(copy(self.value))
@ -80,6 +88,11 @@ class Template(Clonable):
def serializable(self, value: bool): def serializable(self, value: bool):
self._value["serializable"] = value self._value["serializable"] = value
def from_element(element: "ElementLike") -> Self:
if isinstance(element, Template):
return element
return Template(element)
def clone(self) -> Self: def clone(self) -> Self:
return Template(copy(self._value)) return Template(copy(self._value))

View file

@ -1,9 +1,9 @@
from typing import Callable, Iterable, Self from typing import Callable, Iterable, Self
from bs4 import BeautifulSoup, Tag from bs4 import BeautifulSoup, Tag
from elements import IdAttr, Template from .elements import IdAttr, Template
from puppygirl.renderer import Renderable, Renderer from .renderer import Renderable, Renderer
from puppygirl.puppytype import ElementLike, ElementLikeList, Parsable, Templates from .puppytype import ElementLike, ElementLikeList, Parsable, Templates
class Puppygirl[R: Renderer]: class Puppygirl[R: Renderer]:
renderer: R renderer: R
@ -21,11 +21,11 @@ class Puppygirl[R: Renderer]:
return value return value
def _create_template_dict(templates: Iterable[ElementLike]) -> Templates: 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} return {t[IdAttr]: t for t in templates}
def add_template(self, template: ElementLike): def add_template(self, template: ElementLike):
template = Template(template) template = Template.from_element(template)
self._templates[template[IdAttr]] = template self._templates[template[IdAttr]] = template
def fetch(self, path: str) -> BeautifulSoup: def fetch(self, path: str) -> BeautifulSoup:

View file

@ -3,10 +3,10 @@ from typing import BinaryIO, Iterable, TextIO, TypeAlias, TYPE_CHECKING
if TYPE_CHECKING: if TYPE_CHECKING:
from string import Template from string import Template
from bs4 import BeautifulSoup, Tag from bs4 import BeautifulSoup, Tag
from puppygirl.elements import Node from .elements import Node
Parsable: TypeAlias = "BeautifulSoup | Tag | str | bytes | TextIO | BinaryIO" 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]" ElementLikeList: TypeAlias = "Iterable[ElementLike]"
RenderableElement: TypeAlias = "Node | Iterable[Node]" RenderableElement: TypeAlias = "Node | Iterable[Node]"
Templates: TypeAlias = "dict[str, Template]" Templates: TypeAlias = "dict[str, Template]"