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__/
.venv
.vscode/
.venv/
puppygirl.egg-info
*.html

View file

@ -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 *

View file

@ -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)

View file

@ -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:

View file

@ -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 *

View file

@ -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):

View file

@ -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))

View file

@ -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:

View file

@ -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]"