Backend-first SPA framework in Python.
Project description
LUA-SPA
Backend-first SPA framework in Python.
This project includes:
- Template file served by the backend
.lspacomponents (HTML + Python) with component import support- Client hydration at component level
- DOM diff renderer inspired by React's virtual DOM flow
useStatehook-style state management- Setup-only component contract via
Component.setup(self, props) - Server-call bridge for callable actions and lifecycle hooks
- Base app definitions isolated in
src/moon_template/spa.config.json
Requirements
- Python 3.10+
- Poetry installed
How to use
Install locally (development)
poetry install
Create a new project
moon-spa create my_project
moon-spa create my_project ./apps
Create a component from template
moon-spa new component UserCard
moon-spa new component UserCard ./apps/my_project
The CLI copies ComponentTemplate, renames files/content, and prints the exact created paths.
Run the application
poetry run moon-spa serve
Enable hot reload:
poetry run moon-spa serve --reload
When reload is enabled, watcher logs use relative paths:
Live reload activated. Watching src for file changes...
Open in browser:
http://127.0.0.1:8000
Documentation
Docs are available in the docs/ directory:
Run locally:
cd docs
npx docusaurus start
Project Structure
moon-spa/
pyproject.toml
src/
moon_spa/
app.py
codegen.py
framework.py
loader.py
main.py
renderer.py
router.py
scope.py
server.py
runtime_assets.py
moon_template/
index.lspa
spa.config.json
components/
tests/
Tests
poetry run pytest
With coverage:
poetry run pytest --cov=src/moon_spa --cov-report=term
Component Format
Components are .lspa files composed of:
- optional imports
<python>block with aComponentsubclass implementingsetup(self, props)<template>block (HTML)
setup(self, props) can return a mapping with props, state, data, actions, and lifecycle,
or omit return and let the server infer these sections from local variables/functions.
Callable actions and lifecycle entries are executed through the POST /__moon_spa_action bridge.
When actions/lifecycle mutate data, those keys are patched back to client props automatically.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file moon_spa-2.0.2.tar.gz.
File metadata
- Download URL: moon_spa-2.0.2.tar.gz
- Upload date:
- Size: 2.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18b26f8677e3dcd7e5c21b87628852f45256750cbb51e9de64d9efdbc31365d9
|
|
| MD5 |
f45c81658397f7a8f9216f6e1ddaf8c4
|
|
| BLAKE2b-256 |
9bbabee9094af3a9cd0ea6a010076e1015f0090cc653fc6298b50f02826a8d9c
|
Provenance
The following attestation bundles were made for moon_spa-2.0.2.tar.gz:
Publisher:
release-and-deploy.yaml on roderiano/moon-spa
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
moon_spa-2.0.2.tar.gz -
Subject digest:
18b26f8677e3dcd7e5c21b87628852f45256750cbb51e9de64d9efdbc31365d9 - Sigstore transparency entry: 1525250105
- Sigstore integration time:
-
Permalink:
roderiano/moon-spa@9fb89f8e20eba54dbd6b4dedf19c2c16b2569d37 -
Branch / Tag:
refs/heads/release - Owner: https://github.com/roderiano
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-and-deploy.yaml@9fb89f8e20eba54dbd6b4dedf19c2c16b2569d37 -
Trigger Event:
push
-
Statement type:
File details
Details for the file moon_spa-2.0.2-py3-none-any.whl.
File metadata
- Download URL: moon_spa-2.0.2-py3-none-any.whl
- Upload date:
- Size: 2.3 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b4b1e741027073df25f6933199bbee02279da38493ab26bc7e2766eee97f8ba1
|
|
| MD5 |
371536a59c4b60aace504ad2c460cc1c
|
|
| BLAKE2b-256 |
266aa97d53183029783f4034c833e8ac3731597bbbbd1bb0290d0f60c54741d9
|
Provenance
The following attestation bundles were made for moon_spa-2.0.2-py3-none-any.whl:
Publisher:
release-and-deploy.yaml on roderiano/moon-spa
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
moon_spa-2.0.2-py3-none-any.whl -
Subject digest:
b4b1e741027073df25f6933199bbee02279da38493ab26bc7e2766eee97f8ba1 - Sigstore transparency entry: 1525250114
- Sigstore integration time:
-
Permalink:
roderiano/moon-spa@9fb89f8e20eba54dbd6b4dedf19c2c16b2569d37 -
Branch / Tag:
refs/heads/release - Owner: https://github.com/roderiano
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-and-deploy.yaml@9fb89f8e20eba54dbd6b4dedf19c2c16b2569d37 -
Trigger Event:
push
-
Statement type: