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.13.tar.gz (56.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.13-py3-none-any.whl (86.5 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for webcompy-0.0.13.tar.gz
Algorithm Hash digest
SHA256 ad03cdc99170bfe27641da0d3e6ff41bbb5f2ae769ae31e09c984f49e9f7ecca
MD5 5dd05228021c5ffdd1a06c7e842f1743
BLAKE2b-256 dd51c475759988d55f29aa1b42c1d887a7da46ad881b9a3c50055ef26d0eeebb

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for webcompy-0.0.13-py3-none-any.whl
Algorithm Hash digest
SHA256 e448150c430c8ffd2025386025514827d3c4a9ad6e5ff1301c5d2d7efa2d7e3f
MD5 c67a4c79ef3d2d6456d82f53554f7592
BLAKE2b-256 182738e88867658431640073fe263f939dd3f54faeb8622e2f225d7d84469e75

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