spaday-regular-table 0.0.0__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. spaday_regular_table-0.2.0/.gitignore +157 -0
  2. {spaday_regular_table-0.0.0 → spaday_regular_table-0.2.0}/LICENSE +1 -1
  3. spaday_regular_table-0.2.0/PKG-INFO +111 -0
  4. spaday_regular_table-0.2.0/README.md +67 -0
  5. spaday_regular_table-0.2.0/js/.oxfmtrc.json +5 -0
  6. spaday_regular_table-0.2.0/js/.oxlintrc.json +11 -0
  7. spaday_regular_table-0.2.0/js/build.mjs +48 -0
  8. spaday_regular_table-0.2.0/js/package.json +56 -0
  9. spaday_regular_table-0.2.0/js/playwright.config.js +38 -0
  10. spaday_regular_table-0.2.0/js/pnpm-lock.yaml +2863 -0
  11. spaday_regular_table-0.2.0/js/pnpm-workspace.yaml +2 -0
  12. spaday_regular_table-0.2.0/js/src/css/index.css +0 -0
  13. spaday_regular_table-0.2.0/js/src/html/index.html +13 -0
  14. spaday_regular_table-0.2.0/js/src/ts/css.d.ts +4 -0
  15. spaday_regular_table-0.2.0/js/src/ts/index.ts +449 -0
  16. spaday_regular_table-0.2.0/js/tests/index.spec.js +171 -0
  17. spaday_regular_table-0.2.0/js/tools/bundle.mjs +59 -0
  18. spaday_regular_table-0.2.0/js/tools/css.mjs +55 -0
  19. spaday_regular_table-0.2.0/js/tools/externals.mjs +18 -0
  20. spaday_regular_table-0.2.0/js/tools/getarg.mjs +23 -0
  21. spaday_regular_table-0.2.0/js/tools/html.mjs +0 -0
  22. spaday_regular_table-0.2.0/js/tsconfig.json +24 -0
  23. spaday_regular_table-0.2.0/pyproject.toml +190 -0
  24. spaday_regular_table-0.2.0/spaday_regular_table/__init__.py +50 -0
  25. spaday_regular_table-0.2.0/spaday_regular_table/components.cem.json +39 -0
  26. spaday_regular_table-0.2.0/spaday_regular_table/components.py +67 -0
  27. spaday_regular_table-0.2.0/spaday_regular_table/example.py +267 -0
  28. spaday_regular_table-0.2.0/spaday_regular_table/extension/cdn/index.js +1202 -0
  29. spaday_regular_table-0.2.0/spaday_regular_table/extension/cdn/index.js.map +7 -0
  30. spaday_regular_table-0.2.0/spaday_regular_table/extension/css/material.css +1 -0
  31. spaday_regular_table-0.2.0/spaday_regular_table/extension/index.html +13 -0
  32. spaday_regular_table-0.2.0/spaday_regular_table/tests/test_all.py +67 -0
  33. spaday_regular_table-0.2.0/spaday_regular_table/tests/test_example.py +34 -0
  34. spaday_regular_table-0.0.0/PKG-INFO +0 -225
  35. spaday_regular_table-0.0.0/README.md +0 -1
  36. spaday_regular_table-0.0.0/pyproject.toml +0 -29
  37. spaday_regular_table-0.0.0/setup.cfg +0 -4
  38. spaday_regular_table-0.0.0/setup.py +0 -1
  39. spaday_regular_table-0.0.0/spaday_regular_table.egg-info/PKG-INFO +0 -225
  40. spaday_regular_table-0.0.0/spaday_regular_table.egg-info/SOURCES.txt +0 -8
  41. spaday_regular_table-0.0.0/spaday_regular_table.egg-info/dependency_links.txt +0 -1
  42. spaday_regular_table-0.0.0/spaday_regular_table.egg-info/top_level.txt +0 -1
@@ -0,0 +1,157 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.a
8
+ *.o
9
+ *.dSYM
10
+ *.so
11
+ *.obj
12
+ *.dll
13
+ *.exp
14
+ *.lib
15
+
16
+ # Rust
17
+ target
18
+ target-capi
19
+
20
+ # Distribution / packaging
21
+ .Python
22
+ build/
23
+ develop-eggs/
24
+ dist/
25
+ downloads/
26
+ eggs/
27
+ .eggs/
28
+ lib/
29
+ lib64/
30
+ parts/
31
+ sdist/
32
+ var/
33
+ wheels/
34
+ pip-wheel-metadata/
35
+ share/python-wheels/
36
+ *.egg-info/
37
+ .installed.cfg
38
+ *.egg
39
+ MANIFEST
40
+
41
+ # PyInstaller
42
+ *.manifest
43
+ *.spec
44
+
45
+ # Installer logs
46
+ pip-log.txt
47
+ pip-delete-this-directory.txt
48
+
49
+ # Unit test / coverage reports
50
+ htmlcov/
51
+ .tox/
52
+ .nox/
53
+ .coverage
54
+ .coverage.*
55
+ .cache
56
+ nosetests.xml
57
+ coverage.xml
58
+ junit.xml
59
+ *.cover
60
+ *.py,cover
61
+ .hypothesis/
62
+ .pytest_cache/
63
+
64
+ # Django
65
+ *.log
66
+ local_settings.py
67
+ db.sqlite3
68
+ db.sqlite3-journal
69
+
70
+ # IPython
71
+ profile_default/
72
+ ipython_config.py
73
+
74
+ # pyenv
75
+ .python-version
76
+
77
+ # pipenv
78
+ Pipfile.lock
79
+
80
+ # Celery
81
+ celerybeat-schedule
82
+ celerybeat.pid
83
+
84
+ # Airspeed Velocity
85
+ .asv
86
+
87
+ # Environments
88
+ .env
89
+ .venv
90
+ env/
91
+ venv/
92
+ ENV/
93
+ env.bak/
94
+ venv.bak/
95
+
96
+ # Spyder project settings
97
+ .spyderproject
98
+ .spyproject
99
+
100
+ # Rope project settings
101
+ .ropeproject
102
+
103
+ # mkdocs documentation
104
+ /site
105
+
106
+ # mypy
107
+ .mypy_cache/
108
+ .dmypy.json
109
+ dmypy.json
110
+
111
+ # Pyre type checker
112
+ .pyre/
113
+
114
+ # Documentation
115
+ /site
116
+ index.md
117
+ docs/_build/
118
+ docs/api
119
+ docs/html
120
+ docs/index.md
121
+ docs/jupyter_execute
122
+ docs/src/_build/
123
+ docs/superpowers
124
+ index.md
125
+
126
+ # JS
127
+ js/coverage
128
+ js/dist
129
+ js/lib
130
+ js/node_modules
131
+ js/test-results
132
+ js/playwright-report
133
+ js/*.tgz
134
+
135
+ # Jupyter
136
+ .ipynb_checkpoints
137
+ .autoversion
138
+ Untitled*.ipynb
139
+ spaday_regular_table/extension
140
+ spaday_regular_table/nbextension
141
+ spaday_regular_table/labextension
142
+
143
+ # Emscripten SDK (locally installed)
144
+ emsdk
145
+
146
+ # Mac
147
+ .DS_Store
148
+
149
+ # Hydra
150
+ /outputs/
151
+ /multirun/
152
+
153
+ # AI
154
+ ROADMAP.md
155
+ AGENTS.md
156
+ .github/hooks/sdlc.json
157
+ .superpowers
@@ -186,7 +186,7 @@
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright 2025, the spaday-regular-table authors
189
+ Copyright 2025 1kbgz
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.
@@ -0,0 +1,111 @@
1
+ Metadata-Version: 2.5
2
+ Name: spaday-regular-table
3
+ Version: 0.2.0
4
+ Summary: regular-table for spaday
5
+ Project-URL: Repository, https://github.com/1kbgz/spaday-regular-table
6
+ Project-URL: Homepage, https://github.com/1kbgz/spaday-regular-table
7
+ Author-email: 1kbgz <dev@1kbgz.com>
8
+ License: Apache-2.0
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Programming Language :: Python
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Programming Language :: Python :: 3.14
17
+ Classifier: Programming Language :: Python :: Implementation :: CPython
18
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
19
+ Requires-Python: >=3.11
20
+ Requires-Dist: spaday>=0.6.0
21
+ Provides-Extra: develop
22
+ Requires-Dist: build; extra == 'develop'
23
+ Requires-Dist: bump-my-version; extra == 'develop'
24
+ Requires-Dist: check-dist; extra == 'develop'
25
+ Requires-Dist: codespell; extra == 'develop'
26
+ Requires-Dist: hatch-js; extra == 'develop'
27
+ Requires-Dist: hatchling; extra == 'develop'
28
+ Requires-Dist: httpx; extra == 'develop'
29
+ Requires-Dist: mdformat; extra == 'develop'
30
+ Requires-Dist: mdformat-tables>=1; extra == 'develop'
31
+ Requires-Dist: pytest; extra == 'develop'
32
+ Requires-Dist: pytest-cov; extra == 'develop'
33
+ Requires-Dist: ruff; extra == 'develop'
34
+ Requires-Dist: starlette; extra == 'develop'
35
+ Requires-Dist: twine; extra == 'develop'
36
+ Requires-Dist: ty; extra == 'develop'
37
+ Requires-Dist: uv; extra == 'develop'
38
+ Requires-Dist: uvicorn; extra == 'develop'
39
+ Requires-Dist: wheel; extra == 'develop'
40
+ Provides-Extra: examples
41
+ Requires-Dist: starlette; extra == 'examples'
42
+ Requires-Dist: uvicorn; extra == 'examples'
43
+ Description-Content-Type: text/markdown
44
+
45
+ # spaday-regular-table
46
+
47
+ Viewport-virtualized data tables for spaday, powered by `regular-table`.
48
+
49
+ [![Build Status](https://github.com/1kbgz/spaday-regular-table/actions/workflows/build.yaml/badge.svg?branch=main&event=push)](https://github.com/1kbgz/spaday-regular-table/actions/workflows/build.yaml)
50
+ [![codecov](https://codecov.io/gh/1kbgz/spaday-regular-table/branch/main/graph/badge.svg)](https://codecov.io/gh/1kbgz/spaday-regular-table)
51
+ [![License](https://img.shields.io/github/license/1kbgz/spaday-regular-table)](https://github.com/1kbgz/spaday-regular-table)
52
+ [![PyPI](https://img.shields.io/pypi/v/spaday-regular-table.svg)](https://pypi.python.org/pypi/spaday-regular-table)
53
+
54
+ ## Documentation
55
+
56
+ - [Build a 100,000-row table](docs/src/tutorial.md) — guided virtual-table example.
57
+ - [Add rich action cells and hot row updates](docs/src/how-to.md) — task-focused Python configuration.
58
+ - [API reference](docs/src/reference.md) — props, events, methods, and metadata.
59
+ - [Why viewport virtualization matters](docs/src/explanation.md) — performance model and tradeoffs.
60
+
61
+ ## Quick example
62
+
63
+ ```python
64
+ from spaday import CallEndpoint, event_value, serve
65
+ from spaday_regular_table import RegularTable
66
+
67
+ rows = [{"id": i, "symbol": f"SYM{i}", "price": i / 10} for i in range(100_000)]
68
+
69
+ table = RegularTable(
70
+ columns=[
71
+ "id",
72
+ {
73
+ "key": "symbol",
74
+ "label": "Symbol",
75
+ "cell": {"tag": "button", "class": "symbol-button", "event": "symbol-click"},
76
+ },
77
+ {"key": "price", "label": "Last price", "cell": {"format": "number", "digits": 2}},
78
+ ],
79
+ rows=rows,
80
+ row_header="id",
81
+ style="height: 32rem",
82
+ ).on("symbol-click", CallEndpoint("POST", "/api/click", event_value()))
83
+
84
+ serve(table, packages=["regular-table"])
85
+ ```
86
+
87
+ Only cells requested for the current viewport are copied into `regular-table` and rendered. `rows`
88
+ remains a browser-side record array. `columns` accepts keys or `{key, label, cell}` objects and is
89
+ inferred from the first row when omitted. A `cell` descriptor can wrap the displayed value in an HTML
90
+ or custom-element tag, apply classes and attributes, or format numeric values. The wrapper performs
91
+ that work only for visible cells.
92
+
93
+ For hot server pushes, set `stream_url` to an SSE endpoint whose messages are row patches. You can also
94
+ bind `rowPatch` to `CallEndpoint(result=...)` state for request/response updates. Each patch contains
95
+ revisioned `update`, `insert`, and `remove` operations, so a 100,000-row list is not recopied. The
96
+ browser methods remain available to integration authors, but applications need no JavaScript callback.
97
+
98
+ `cell-click` exposes `event.detail` with `type`, virtual `x`/`y`, `column`, `value`, and the source `row`, so normal spaday actions can handle interactions. `virtual_mode` supports upstream `both`, `horizontal`, `vertical`, and `none`; keep `both` for large datasets.
99
+
100
+ ## Run the local example
101
+
102
+ ```bash
103
+ python -m pip install -e ".[examples]"
104
+ python -m spaday_regular_table.example
105
+ ```
106
+
107
+ Open `http://127.0.0.1:8014` to inspect the [complete market-blotter example](spaday_regular_table/example.py): 100,000
108
+ virtualized rows, a server row stream, full-width sizing, rich cells, and server-authoritative update,
109
+ insert, remove, and click operations. All interaction is authored in Python; there is no companion
110
+ `example.js`. It passes the local package descriptor directly, so it does not install or resolve the
111
+ integration from GitHub.
@@ -0,0 +1,67 @@
1
+ # spaday-regular-table
2
+
3
+ Viewport-virtualized data tables for spaday, powered by `regular-table`.
4
+
5
+ [![Build Status](https://github.com/1kbgz/spaday-regular-table/actions/workflows/build.yaml/badge.svg?branch=main&event=push)](https://github.com/1kbgz/spaday-regular-table/actions/workflows/build.yaml)
6
+ [![codecov](https://codecov.io/gh/1kbgz/spaday-regular-table/branch/main/graph/badge.svg)](https://codecov.io/gh/1kbgz/spaday-regular-table)
7
+ [![License](https://img.shields.io/github/license/1kbgz/spaday-regular-table)](https://github.com/1kbgz/spaday-regular-table)
8
+ [![PyPI](https://img.shields.io/pypi/v/spaday-regular-table.svg)](https://pypi.python.org/pypi/spaday-regular-table)
9
+
10
+ ## Documentation
11
+
12
+ - [Build a 100,000-row table](docs/src/tutorial.md) — guided virtual-table example.
13
+ - [Add rich action cells and hot row updates](docs/src/how-to.md) — task-focused Python configuration.
14
+ - [API reference](docs/src/reference.md) — props, events, methods, and metadata.
15
+ - [Why viewport virtualization matters](docs/src/explanation.md) — performance model and tradeoffs.
16
+
17
+ ## Quick example
18
+
19
+ ```python
20
+ from spaday import CallEndpoint, event_value, serve
21
+ from spaday_regular_table import RegularTable
22
+
23
+ rows = [{"id": i, "symbol": f"SYM{i}", "price": i / 10} for i in range(100_000)]
24
+
25
+ table = RegularTable(
26
+ columns=[
27
+ "id",
28
+ {
29
+ "key": "symbol",
30
+ "label": "Symbol",
31
+ "cell": {"tag": "button", "class": "symbol-button", "event": "symbol-click"},
32
+ },
33
+ {"key": "price", "label": "Last price", "cell": {"format": "number", "digits": 2}},
34
+ ],
35
+ rows=rows,
36
+ row_header="id",
37
+ style="height: 32rem",
38
+ ).on("symbol-click", CallEndpoint("POST", "/api/click", event_value()))
39
+
40
+ serve(table, packages=["regular-table"])
41
+ ```
42
+
43
+ Only cells requested for the current viewport are copied into `regular-table` and rendered. `rows`
44
+ remains a browser-side record array. `columns` accepts keys or `{key, label, cell}` objects and is
45
+ inferred from the first row when omitted. A `cell` descriptor can wrap the displayed value in an HTML
46
+ or custom-element tag, apply classes and attributes, or format numeric values. The wrapper performs
47
+ that work only for visible cells.
48
+
49
+ For hot server pushes, set `stream_url` to an SSE endpoint whose messages are row patches. You can also
50
+ bind `rowPatch` to `CallEndpoint(result=...)` state for request/response updates. Each patch contains
51
+ revisioned `update`, `insert`, and `remove` operations, so a 100,000-row list is not recopied. The
52
+ browser methods remain available to integration authors, but applications need no JavaScript callback.
53
+
54
+ `cell-click` exposes `event.detail` with `type`, virtual `x`/`y`, `column`, `value`, and the source `row`, so normal spaday actions can handle interactions. `virtual_mode` supports upstream `both`, `horizontal`, `vertical`, and `none`; keep `both` for large datasets.
55
+
56
+ ## Run the local example
57
+
58
+ ```bash
59
+ python -m pip install -e ".[examples]"
60
+ python -m spaday_regular_table.example
61
+ ```
62
+
63
+ Open `http://127.0.0.1:8014` to inspect the [complete market-blotter example](spaday_regular_table/example.py): 100,000
64
+ virtualized rows, a server row stream, full-width sizing, rich cells, and server-authoritative update,
65
+ insert, remove, and click operations. All interaction is authored in Python; there is no companion
66
+ `example.js`. It passes the local package descriptor directly, so it does not install or resolve the
67
+ integration from GitHub.
@@ -0,0 +1,5 @@
1
+ {
2
+ "$schema": "./node_modules/oxfmt/configuration_schema.json",
3
+ "printWidth": 80,
4
+ "sortPackageJson": false
5
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
3
+ "env": {
4
+ "browser": true,
5
+ "es6": true,
6
+ "node": true
7
+ },
8
+ "rules": {
9
+ "unicorn/no-empty-file": "off"
10
+ }
11
+ }
@@ -0,0 +1,48 @@
1
+ import { bundle } from "./tools/bundle.mjs";
2
+ import { node_modules_external } from "./tools/externals.mjs";
3
+
4
+ import fs from "fs";
5
+ import cpy from "cpy";
6
+
7
+ const BUNDLES = [
8
+ {
9
+ entryPoints: ["src/ts/index.ts"],
10
+ plugins: [node_modules_external()],
11
+ outfile: "dist/esm/index.js",
12
+ },
13
+ {
14
+ entryPoints: ["src/ts/index.ts"],
15
+ outfile: "dist/cdn/index.js",
16
+ },
17
+ ];
18
+
19
+ async function build() {
20
+ fs.rmSync("dist", { recursive: true, force: true });
21
+ fs.rmSync("../spaday_regular_table/extension", {
22
+ recursive: true,
23
+ force: true,
24
+ });
25
+
26
+ // Copy HTML
27
+ await cpy("src/html/*", "dist/");
28
+
29
+ // Copy images
30
+ fs.mkdirSync("dist/img", { recursive: true });
31
+ await cpy("src/img/*", "dist/img");
32
+
33
+ await cpy("node_modules/regular-table/dist/css/material.css", "dist/css", {
34
+ flat: true,
35
+ });
36
+
37
+ await Promise.all(BUNDLES.map(bundle)).catch(() => process.exit(1));
38
+
39
+ // Copy servable assets to python extension (exclude esm/)
40
+ fs.mkdirSync("../spaday_regular_table/extension", { recursive: true });
41
+ await cpy("dist/**/*", "../spaday_regular_table/extension", {
42
+ filter: (file) =>
43
+ !file.relativePath.startsWith("esm/") &&
44
+ !file.relativePath.startsWith("dist/esm/"),
45
+ });
46
+ }
47
+
48
+ build();
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "spaday-regular-table",
3
+ "version": "0.2.0",
4
+ "description": "regular-table for spaday",
5
+ "repository": "git@github.com:1kbgz/spaday-regular-table.git",
6
+ "author": "1kbgz <dev@1kbgz.com>",
7
+ "license": "Apache-2.0",
8
+ "private": true,
9
+ "type": "module",
10
+ "unpkg": "dist/cdn/index.js",
11
+ "jsdelivr": "dist/cdn/index.js",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/esm/index.d.ts",
15
+ "default": "./dist/esm/index.js"
16
+ },
17
+ "./dist/*": "./dist/*",
18
+ "./package.json": "./package.json"
19
+ },
20
+ "files": [
21
+ "dist/**/*",
22
+ "index.d.ts"
23
+ ],
24
+ "types": "./dist/esm/index.d.ts",
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "scripts": {
29
+ "build:debug": "node build.mjs --debug",
30
+ "build": "node build.mjs",
31
+ "clean": "rm -rf dist playwright-report ../spaday_regular_table/extension",
32
+ "dev": "npm-run-all -p start watch",
33
+ "lint": "oxlint . && oxfmt --check \"src/**/*.{js,ts,jsx,tsx,css}\" \"tests/**/*.{js,ts,jsx,tsx}\" \"*.mjs\" \"*.json\"",
34
+ "fix": "oxlint --fix . && oxfmt --write \"src/**/*.{js,ts,jsx,tsx,css}\" \"tests/**/*.{js,ts,jsx,tsx}\" \"*.mjs\" \"*.json\"",
35
+ "preinstall": "npx only-allow pnpm",
36
+ "prepack": "npm run build",
37
+ "start": "http-server -p 3000 -o examples/",
38
+ "start:tests": "http-server -p 3000 ",
39
+ "test": "TZ=UTC playwright test",
40
+ "watch": "nodemon --watch src -e ts,css,html --exec \"pnpm build:debug\""
41
+ },
42
+ "dependencies": {
43
+ "regular-table": "^0.9.0"
44
+ },
45
+ "devDependencies": {
46
+ "@playwright/test": "^1.62.0",
47
+ "cpy": "^13.2.2",
48
+ "esbuild": "^0.28.1",
49
+ "http-server": "^14.1.1",
50
+ "nodemon": "^3.1.10",
51
+ "npm-run-all": "^4.1.5",
52
+ "oxfmt": "^0.63.0",
53
+ "oxlint": "^1.78.0",
54
+ "typescript": "^7.0.2"
55
+ }
56
+ }
@@ -0,0 +1,38 @@
1
+ import { defineConfig, devices } from "@playwright/test";
2
+
3
+ export default defineConfig({
4
+ testDir: "tests",
5
+ fullyParallel: true,
6
+ forbidOnly: !!process.env.CI,
7
+ retries: process.env.CI ? 2 : 0,
8
+ workers: process.env.CI ? 1 : undefined,
9
+ reporter: [
10
+ ["line"],
11
+ ["html", { outputFile: "playwright-report/index.html", open: "never" }],
12
+ ["junit", { outputFile: "junit.xml" }],
13
+ ],
14
+ use: {
15
+ baseURL: "http://127.0.0.1:3000",
16
+ trace: "on-first-retry",
17
+ },
18
+ projects: [
19
+ {
20
+ name: "chromium",
21
+ use: { ...devices["Desktop Chrome"] },
22
+ },
23
+ ],
24
+ webServer: [
25
+ {
26
+ command: "pnpm run start:tests",
27
+ url: "http://127.0.0.1:3000",
28
+ reuseExistingServer: !process.env.CI,
29
+ timeout: 120 * 1000,
30
+ },
31
+ {
32
+ command: "python -m spaday_regular_table.example",
33
+ url: "http://127.0.0.1:8014",
34
+ reuseExistingServer: !process.env.CI,
35
+ timeout: 120 * 1000,
36
+ },
37
+ ],
38
+ });