Skip to main content

Python frontend framework which works on Browser

Project description

WebComPy

What is WebComPy

WebComPy is Python frontend framework for PyScript, which has following features.

  • Component-based declarative rendering
  • Automatic DOM refreshing
  • Built-in router
  • CLI tool (Project template, Build-in HTTP server, Static Site Generator)
  • Type Annotation

Get started

mkdir webcompy-project
cd webcompy-project
pip install webcompy
python -m webcompy init
python -m webcompy start --dev
python -m webcompy generate  # for generating static site

then access http://127.0.0.1:8080/WebComPy/

Documents and Demos

Sample Code

from webcompy.reactive import Reactive, computed_property, computed
from webcompy.elements import html, repeat, switch, DOMEvent
from webcompy.router import RouterContext
from webcompy.components import (
    define_component,
    ComponentContext,
    TypedComponentBase,
    component_class,
    on_before_rendering,
    component_template,
)


@define_component
def FizzbuzzList(context: ComponentContext[Reactive[int]]):
    @computed
    def fizzbuzz():
        li: list[str] = []
        for n in range(1, context.props.value + 1):
            if n % 15 == 0:
                li.append("FizzBuzz")
            elif n % 5 == 0:
                li.append("Fizz")
            elif n % 3 == 0:
                li.append("Buzz")
            else:
                li.append(str(n))
        return li

    return html.DIV(
        {},
        html.UL(
            {},
            repeat(fizzbuzz, lambda s: html.LI({}, s)),
        ),
    )


FizzbuzzList.scoped_style = {
    "ul": {
        "border": "dashed 2px #668ad8",
        "background": "#f1f8ff",
        "padding": "0.5em 0.5em 0.5em 2em",
    },
    "ul > li:nth-child(3n)": {
        "color": "red",
    },
    "ul > li:nth-child(5n)": {
        "color": "blue",
    },
    "ul > li:nth-child(15n)": {
        "color": "purple",
    },
}


@component_class
class Fizzbuzz(TypedComponentBase(props_type=RouterContext)):
    def __init__(self) -> None:
        self.opened = Reactive(True)
        self.count = Reactive(10)

    @computed_property
    def toggle_button_text(self):
        return "Hide" if self.opened.value else "Open"

    @on_before_rendering
    def on_before_rendering(self):
        self.count.value = 10

    def add(self, ev: DOMEvent):
        self.count.value += 1

    def pop(self, ev: DOMEvent):
        if self.count.value > 0:
            self.count.value -= 1

    def toggle(self, ev: DOMEvent):
        self.opened.value = not self.opened.value

    @component_template
    def template(self):
        return html.DIV(
            {},
            html.H3(
                {},
                "FizzBuzz",
            ),
            html.P(
                {},
                html.BUTTON(
                    {"@click": self.toggle},
                    self.toggle_button_text,
                ),
                html.BUTTON(
                    {"@click": self.add},
                    "Add",
                ),
                html.BUTTON(
                    {"@click": self.pop},
                    "Pop",
                ),
            ),
            html.P(
                {},
                "Count: ",
                self.count,
            ),
            switch(
                {
                    "case": self.opened,
                    "generator": lambda: FizzbuzzList(props=self.count),
                },
                default=lambda: html.H5(
                    {},
                    "FizzBuzz Hidden",
                ),
            ),
        )

ToDo

  • Add provide/inject (DI)
  • Add Plugin System

Lisence

This project is licensed under the MIT License, see the LICENSE.txt file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

webcompy-0.0.9.tar.gz (58.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

webcompy-0.0.9-py3-none-any.whl (87.4 kB view details)

Uploaded Python 3

File details

Details for the file webcompy-0.0.9.tar.gz.

File metadata

  • Download URL: webcompy-0.0.9.tar.gz
  • Upload date:
  • Size: 58.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.10.4

File hashes

Hashes for webcompy-0.0.9.tar.gz
Algorithm Hash digest
SHA256 a2d8d848f9faf0b853be59b737b73b359206cb20b5f08eb944aaab6e9d6c2bbf
MD5 d29e6c9115610803b81769905331ae39
BLAKE2b-256 2d230fcd07d87a8482015b044c0cf3ff9cbe569e90341e5c1aa6fc95626eecb3

See more details on using hashes here.

File details

Details for the file webcompy-0.0.9-py3-none-any.whl.

File metadata

  • Download URL: webcompy-0.0.9-py3-none-any.whl
  • Upload date:
  • Size: 87.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.10.4

File hashes

Hashes for webcompy-0.0.9-py3-none-any.whl
Algorithm Hash digest
SHA256 33b78ea02ed334acbddac7cac6abbcdb40501977a6c9bb0c90d96b9665c6faf7
MD5 af4891ffbac2275d80fd794963c7966c
BLAKE2b-256 cea0cf8fac736c3469d135bc2f46fa6d2bee11212020684e810572c22e6d2b0f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page