pydataui 0.2.1__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.
- pydataui-0.2.1/LICENSE +21 -0
- pydataui-0.2.1/PKG-INFO +390 -0
- pydataui-0.2.1/README.md +345 -0
- pydataui-0.2.1/pydataui/__init__.py +49 -0
- pydataui-0.2.1/pydataui/api.py +247 -0
- pydataui-0.2.1/pydataui/app.py +799 -0
- pydataui-0.2.1/pydataui/auth/__init__.py +21 -0
- pydataui-0.2.1/pydataui/auth/components.py +191 -0
- pydataui-0.2.1/pydataui/auth/decorators.py +61 -0
- pydataui-0.2.1/pydataui/auth/manager.py +369 -0
- pydataui-0.2.1/pydataui/auth/models.py +44 -0
- pydataui-0.2.1/pydataui/auth/state.py +57 -0
- pydataui-0.2.1/pydataui/cli/__init__.py +5 -0
- pydataui-0.2.1/pydataui/cli/main.py +234 -0
- pydataui-0.2.1/pydataui/cli/templates.py +319 -0
- pydataui-0.2.1/pydataui/compiler/__init__.py +4 -0
- pydataui-0.2.1/pydataui/compiler/renderer.py +48 -0
- pydataui-0.2.1/pydataui/compiler/templates.py +459 -0
- pydataui-0.2.1/pydataui/components/__init__.py +41 -0
- pydataui-0.2.1/pydataui/components/base.py +233 -0
- pydataui-0.2.1/pydataui/components/charts.py +141 -0
- pydataui-0.2.1/pydataui/components/data_display.py +275 -0
- pydataui-0.2.1/pydataui/components/data_science.py +609 -0
- pydataui-0.2.1/pydataui/components/feedback.py +172 -0
- pydataui-0.2.1/pydataui/components/forms.py +363 -0
- pydataui-0.2.1/pydataui/components/html.py +232 -0
- pydataui-0.2.1/pydataui/components/layout.py +138 -0
- pydataui-0.2.1/pydataui/components/media.py +92 -0
- pydataui-0.2.1/pydataui/components/navigation.py +212 -0
- pydataui-0.2.1/pydataui/components/overlay.py +205 -0
- pydataui-0.2.1/pydataui/components/shadcn.py +588 -0
- pydataui-0.2.1/pydataui/components/typography.py +127 -0
- pydataui-0.2.1/pydataui/config.py +77 -0
- pydataui-0.2.1/pydataui/event.py +77 -0
- pydataui-0.2.1/pydataui/exceptions.py +40 -0
- pydataui-0.2.1/pydataui/html.py +30 -0
- pydataui-0.2.1/pydataui/middleware/__init__.py +1 -0
- pydataui-0.2.1/pydataui/middleware/logging.py +43 -0
- pydataui-0.2.1/pydataui/middleware/security.py +50 -0
- pydataui-0.2.1/pydataui/middleware/session.py +29 -0
- pydataui-0.2.1/pydataui/page.py +38 -0
- pydataui-0.2.1/pydataui/request.py +12 -0
- pydataui-0.2.1/pydataui/session.py +249 -0
- pydataui-0.2.1/pydataui/state.py +490 -0
- pydataui-0.2.1/pydataui/storage.py +712 -0
- pydataui-0.2.1/pydataui/styling/__init__.py +4 -0
- pydataui-0.2.1/pydataui/styling/css/pydataui.css +409 -0
- pydataui-0.2.1/pydataui/styling/js/htmx.min.js +1 -0
- pydataui-0.2.1/pydataui/styling/style.py +92 -0
- pydataui-0.2.1/pydataui/styling/theme.py +143 -0
- pydataui-0.2.1/pydataui/tunnel.py +168 -0
- pydataui-0.2.1/pydataui/types.py +22 -0
- pydataui-0.2.1/pydataui/utils.py +68 -0
- pydataui-0.2.1/pydataui.egg-info/PKG-INFO +390 -0
- pydataui-0.2.1/pydataui.egg-info/SOURCES.txt +74 -0
- pydataui-0.2.1/pydataui.egg-info/dependency_links.txt +1 -0
- pydataui-0.2.1/pydataui.egg-info/entry_points.txt +2 -0
- pydataui-0.2.1/pydataui.egg-info/requires.txt +26 -0
- pydataui-0.2.1/pydataui.egg-info/top_level.txt +1 -0
- pydataui-0.2.1/pyproject.toml +64 -0
- pydataui-0.2.1/setup.cfg +4 -0
- pydataui-0.2.1/setup.py +2 -0
- pydataui-0.2.1/tests/test_app.py +27 -0
- pydataui-0.2.1/tests/test_auth.py +149 -0
- pydataui-0.2.1/tests/test_bff_and_events.py +119 -0
- pydataui-0.2.1/tests/test_browser_security.py +104 -0
- pydataui-0.2.1/tests/test_cli.py +40 -0
- pydataui-0.2.1/tests/test_components.py +97 -0
- pydataui-0.2.1/tests/test_concurrency_and_cluster.py +236 -0
- pydataui-0.2.1/tests/test_customization.py +132 -0
- pydataui-0.2.1/tests/test_data_science.py +97 -0
- pydataui-0.2.1/tests/test_http_server.py +93 -0
- pydataui-0.2.1/tests/test_security_regressions.py +387 -0
- pydataui-0.2.1/tests/test_shadcn.py +86 -0
- pydataui-0.2.1/tests/test_state.py +34 -0
- pydataui-0.2.1/tests/test_storage.py +173 -0
pydataui-0.2.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Boopathi Raj
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
pydataui-0.2.1/PKG-INFO
ADDED
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pydataui
|
|
3
|
+
Version: 0.2.1
|
|
4
|
+
Summary: A full-stack Python framework for data and AI applications.
|
|
5
|
+
Author-email: Boopathi Raj <rajboopathiking@gmail.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Classifier: Development Status :: 4 - Beta
|
|
8
|
+
Classifier: Intended Audience :: Science/Research
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
11
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
12
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Requires-Python: >=3.9
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: pyrustapi<2,>=1.8.9
|
|
24
|
+
Requires-Dist: PyJWT<3,>=2.8.0
|
|
25
|
+
Requires-Dist: pydantic<3,>=2.0.0
|
|
26
|
+
Provides-Extra: browser
|
|
27
|
+
Requires-Dist: playwright<2,>=1.49; extra == "browser"
|
|
28
|
+
Provides-Extra: data
|
|
29
|
+
Requires-Dist: pandas>=1.5.0; extra == "data"
|
|
30
|
+
Requires-Dist: plotly>=5.0.0; extra == "data"
|
|
31
|
+
Requires-Dist: pyarrow; extra == "data"
|
|
32
|
+
Provides-Extra: tunnel
|
|
33
|
+
Requires-Dist: pyngrok>=7.0.0; extra == "tunnel"
|
|
34
|
+
Provides-Extra: dev
|
|
35
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
36
|
+
Requires-Dist: anyio>=4.0.0; extra == "dev"
|
|
37
|
+
Requires-Dist: pandas>=1.5.0; extra == "dev"
|
|
38
|
+
Requires-Dist: plotly>=5.0.0; extra == "dev"
|
|
39
|
+
Provides-Extra: all
|
|
40
|
+
Requires-Dist: pandas>=1.5.0; extra == "all"
|
|
41
|
+
Requires-Dist: plotly>=5.0.0; extra == "all"
|
|
42
|
+
Requires-Dist: pyarrow; extra == "all"
|
|
43
|
+
Requires-Dist: pyngrok>=7.0.0; extra == "all"
|
|
44
|
+
Dynamic: license-file
|
|
45
|
+
|
|
46
|
+
# ⚡ PyDataUI
|
|
47
|
+
|
|
48
|
+
<div align="center">
|
|
49
|
+
|
|
50
|
+

|
|
51
|
+

|
|
52
|
+
-orange.svg)
|
|
53
|
+

|
|
54
|
+

|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
**A Full-Stack Python Framework for Data and AI Applications.**
|
|
58
|
+
*Data Engineers • Data Analysts • AI/ML Engineers • Python Developers*
|
|
59
|
+
|
|
60
|
+
Write pure Python → get reactive web applications, automatic REST APIs, and a Rust HTTP backend.
|
|
61
|
+
**Zero JavaScript required.**
|
|
62
|
+
|
|
63
|
+
[Quick Start](#-quick-start) • [Why PyDataUI?](#-why-pydataui) • [Components](#-components) • [Authentication](#-authentication--api-keys) • [Port Forwarding](#-port-forwarding-sharetrue) • [Benchmarks](#-performance-benchmarks) • [Documentation](docs/README.md)
|
|
64
|
+
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 🎯 Built Specifically for Data Roles
|
|
70
|
+
|
|
71
|
+
Build dashboards, dataset explorers, model evaluation interfaces, and data
|
|
72
|
+
workflows using Python UI components and server-side logic.
|
|
73
|
+
|
|
74
|
+
**0.2.1 security source update:** see [the migration guide](docs/MIGRATION_0_2_1.md)
|
|
75
|
+
for protected routes, API permissions, CSRF, and session behavior. This checkout
|
|
76
|
+
has not been published to PyPI by this change.
|
|
77
|
+
|
|
78
|
+
**PyDataUI solves this:**
|
|
79
|
+
- 🐍 **100% Python Code**: Build UI, reactive state, and server logic in clean, typed Python.
|
|
80
|
+
- 🦀 **Rust-Powered HTTP Core (`pyrustapi`)**: Tokio/Hyper HTTP backend; application performance needs workload-specific measurement.
|
|
81
|
+
- 🎨 **Tailwind CSS + shadcn/ui**: Modern, accessible UI design system with built-in dark mode and CSS variables.
|
|
82
|
+
- ⚡ **Reactive SSR via HTMX**: Server re-renders the current page fragment on state mutation — seamless browser updates with no user-authored JavaScript for common interactions.
|
|
83
|
+
- 🔌 **Automatic REST API**: Eligible `State` classes expose OpenAPI documentation and CRUD endpoints at `/api/{State}`.
|
|
84
|
+
- 🔒 **Auth & API Keys**: JWT authentication, role-based access control (RBAC), and `pdu_live_...` API keys for ETL automation.
|
|
85
|
+
- 🌐 **One-Click Sharing (`share=True`)**: Create public internet tunnels for demos and stakeholders instantly, like Gradio.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## ⚡ Quick Start
|
|
90
|
+
|
|
91
|
+
### Installation
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
pip install pydataui
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Optional dependencies for data science and port forwarding:
|
|
98
|
+
```bash
|
|
99
|
+
pip install "pydataui[all]" # includes pandas, plotly, pyngrok, pyarrow
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 1. Minimal Reactive Counter (30 seconds)
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
from pydataui import App, State
|
|
106
|
+
from pydataui.components import Container, Card, Flex, Button, Heading, Divider
|
|
107
|
+
|
|
108
|
+
class CounterState(State):
|
|
109
|
+
count: int = 0
|
|
110
|
+
def increment(self): self.count += 1
|
|
111
|
+
def decrement(self): self.count -= 1
|
|
112
|
+
def reset(self): self.count = 0
|
|
113
|
+
|
|
114
|
+
app = App(title="PyDataUI Counter")
|
|
115
|
+
|
|
116
|
+
@app.page("/")
|
|
117
|
+
def home():
|
|
118
|
+
return Container(
|
|
119
|
+
Card(
|
|
120
|
+
title="Reactive Counter",
|
|
121
|
+
children=[
|
|
122
|
+
Flex(
|
|
123
|
+
Button("-", on_click=CounterState.decrement, variant="danger"),
|
|
124
|
+
Heading(CounterState.count, level=2),
|
|
125
|
+
Button("+", on_click=CounterState.increment, variant="success"),
|
|
126
|
+
align="center", justify="center", gap="lg",
|
|
127
|
+
),
|
|
128
|
+
Divider(),
|
|
129
|
+
Button("Reset", on_click=CounterState.reset, variant="outline", full_width=True),
|
|
130
|
+
]
|
|
131
|
+
),
|
|
132
|
+
max_width="md",
|
|
133
|
+
padding="lg",
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
if __name__ == "__main__":
|
|
137
|
+
app.run()
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Run it:
|
|
141
|
+
```bash
|
|
142
|
+
python app.py
|
|
143
|
+
```
|
|
144
|
+
- 🌐 **Web UI:** `http://127.0.0.1:8000`
|
|
145
|
+
- 📖 **Swagger UI:** `http://127.0.0.1:8000/docs`
|
|
146
|
+
- 📡 **REST API Catalog:** `http://127.0.0.1:8000/api`
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 🤖 Machine Learning Dashboard Example
|
|
151
|
+
|
|
152
|
+
PyDataUI includes native components for model evaluation:
|
|
153
|
+
|
|
154
|
+
```python
|
|
155
|
+
from pydataui import App
|
|
156
|
+
from pydataui.components import Container, Heading, Grid
|
|
157
|
+
from pydataui.components.data_science import ModelMetrics, ConfusionMatrix, FeatureImportance
|
|
158
|
+
|
|
159
|
+
app = App(title="Fraud Detection Model v3")
|
|
160
|
+
|
|
161
|
+
@app.page("/")
|
|
162
|
+
def dashboard():
|
|
163
|
+
return Container(
|
|
164
|
+
Heading("Production XGBoost Model Evaluation", level=1, margin_bottom="lg"),
|
|
165
|
+
ModelMetrics(
|
|
166
|
+
metrics={
|
|
167
|
+
"Accuracy": 0.9642,
|
|
168
|
+
"Precision": 0.9410,
|
|
169
|
+
"Recall": 0.9780,
|
|
170
|
+
"ROC-AUC": 0.9891
|
|
171
|
+
}
|
|
172
|
+
),
|
|
173
|
+
Grid(
|
|
174
|
+
ConfusionMatrix(
|
|
175
|
+
matrix=[[1450, 42], [28, 1380]],
|
|
176
|
+
labels=["Legitimate", "Fraud"]
|
|
177
|
+
),
|
|
178
|
+
FeatureImportance(
|
|
179
|
+
features={
|
|
180
|
+
"velocity_1h": 0.34,
|
|
181
|
+
"avg_amount_ratio": 0.28,
|
|
182
|
+
"device_fingerprint_entropy": 0.18,
|
|
183
|
+
"geo_distance_anomaly": 0.12,
|
|
184
|
+
"is_international": 0.08
|
|
185
|
+
},
|
|
186
|
+
title="Top Predictive Features"
|
|
187
|
+
),
|
|
188
|
+
columns=2, gap="lg", margin_top="lg"
|
|
189
|
+
),
|
|
190
|
+
padding="lg"
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
if __name__ == "__main__":
|
|
194
|
+
app.run()
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## 🔒 Authentication, Roles & API Keys
|
|
200
|
+
|
|
201
|
+
Secure your application for enterprise data workflows:
|
|
202
|
+
|
|
203
|
+
```python
|
|
204
|
+
from pydataui import App
|
|
205
|
+
from pydataui.components import Container, Heading, Flex
|
|
206
|
+
from pydataui.auth import (
|
|
207
|
+
AuthManager, LoginPage, UserMenu, APIKeyManager,
|
|
208
|
+
require_auth, require_role, Role, current_user
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
app = App(title="Secure Analytics Portal")
|
|
212
|
+
auth = AuthManager() # Configure PYDATAUI_AUTH_SECRET for deployment
|
|
213
|
+
|
|
214
|
+
# Register users with roles
|
|
215
|
+
admin = auth.add_user("lead_eng", "password123", roles=[Role.ADMIN, Role.DATA_ENGINEER])
|
|
216
|
+
analyst = auth.add_user("analyst_jane", "password456", roles=[Role.DATA_ANALYST])
|
|
217
|
+
|
|
218
|
+
# Wire up auth routes (/api/auth/login, /api/auth/me, /api/auth/keys)
|
|
219
|
+
app.setup_auth(auth)
|
|
220
|
+
|
|
221
|
+
@app.page("/login")
|
|
222
|
+
def login_route():
|
|
223
|
+
return LoginPage(title="Analytics Portal", subtitle="Sign in with your corporate credentials")
|
|
224
|
+
|
|
225
|
+
@app.page("/")
|
|
226
|
+
def dashboard():
|
|
227
|
+
user = current_user.get()
|
|
228
|
+
return Container(
|
|
229
|
+
Flex(
|
|
230
|
+
Heading("Data Warehouse Control Center", level=1),
|
|
231
|
+
UserMenu(user),
|
|
232
|
+
justify="space-between", align="center"
|
|
233
|
+
),
|
|
234
|
+
APIKeyManager(keys=auth.list_api_keys(user.id) if user else []),
|
|
235
|
+
padding="lg"
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
# Protected API endpoint with API key requirement
|
|
239
|
+
@app.api("/data/export", method="GET")
|
|
240
|
+
def export_data(request):
|
|
241
|
+
user = auth.require_auth_middleware(request)
|
|
242
|
+
if not user:
|
|
243
|
+
return {"error": "Unauthorized"}
|
|
244
|
+
return {"status": "ok", "records": 100000}
|
|
245
|
+
|
|
246
|
+
if __name__ == "__main__":
|
|
247
|
+
app.run()
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Automated API Key Authentication (ETL & Airflow)
|
|
251
|
+
Automate ingestion pipelines by passing the generated key:
|
|
252
|
+
```bash
|
|
253
|
+
curl -H "Authorization: Bearer pdu_live_819dd41a93870327fdc57311d0080755" \
|
|
254
|
+
http://localhost:8000/data/export
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## 🌐 Port Forwarding (`share=True`)
|
|
260
|
+
|
|
261
|
+
Share your application with remote stakeholders, clients, or team members with a single flag:
|
|
262
|
+
|
|
263
|
+
```python
|
|
264
|
+
# In your Python code:
|
|
265
|
+
app.run(share=True)
|
|
266
|
+
```
|
|
267
|
+
Or via CLI:
|
|
268
|
+
```bash
|
|
269
|
+
pydataui run app.py --share
|
|
270
|
+
```
|
|
271
|
+
Output:
|
|
272
|
+
```
|
|
273
|
+
PyDataUI v0.2.0
|
|
274
|
+
Running on http://127.0.0.1:8000
|
|
275
|
+
Public URL: https://abc123.ngrok.app
|
|
276
|
+
API docs at http://127.0.0.1:8000/docs
|
|
277
|
+
REST API root at http://127.0.0.1:8000/api
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## 📊 Performance
|
|
283
|
+
|
|
284
|
+
The backend uses pyrustapi. This repository does not yet contain a reproducible
|
|
285
|
+
benchmark suite establishing throughput, P99 latency, or memory superiority over
|
|
286
|
+
other frameworks. Evaluate equivalent real applications on the same hardware;
|
|
287
|
+
HTTP hello-world throughput does not establish data-application performance.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## 🧩 Comprehensive Component Library (80+ Components)
|
|
292
|
+
|
|
293
|
+
PyDataUI includes modern Tailwind and shadcn/ui components:
|
|
294
|
+
|
|
295
|
+
### 🔬 Data & Machine Learning
|
|
296
|
+
- `DataFrameTable`: Interactive table with automatic pandas integration
|
|
297
|
+
- `PlotlyChart`: Native Plotly figure embedding
|
|
298
|
+
- `MetricCard`: KPI card with delta percentage and trend indicators
|
|
299
|
+
- `ModelMetrics`: Evaluation grid (Accuracy, Precision, Recall, AUC, F1)
|
|
300
|
+
- `ConfusionMatrix`: Heat-mapped confusion matrix
|
|
301
|
+
- `FeatureImportance`: Horizontal bar chart for predictive features
|
|
302
|
+
- `PipelineStatus`: Step-by-step DAG execution tracker
|
|
303
|
+
- `DataTimeline`: Run history and audit event timeline
|
|
304
|
+
- `SchemaViewer`: Inspect table schemas, dtypes, nulls, and uniques
|
|
305
|
+
- `SQLEditor`: SQL query editor with inline Run button
|
|
306
|
+
- `JSONViewer`: Pretty-printed, collapsible JSON display
|
|
307
|
+
- `FileDownload`: In-browser data export to CSV/JSON
|
|
308
|
+
|
|
309
|
+
### 🎨 shadcn/ui Styled Components
|
|
310
|
+
- `ShadButton`, `ShadCard`, `ShadBadge`, `ShadAlert`, `ShadSeparator`
|
|
311
|
+
- `ShadProgress`, `ShadSkeleton`, `ShadSwitch`, `ShadTable`, `ShadSelect`
|
|
312
|
+
- `ShadTextarea`, `ShadLabel`, `ShadDialog` (Modal), `ShadScrollArea`
|
|
313
|
+
- `ShadTabs`, `ShadToast`, `ShadAvatar`, `ShadHoverCard`, `ShadAccordion`, `ShadSheet` (Drawer)
|
|
314
|
+
|
|
315
|
+
### 📐 Classic Layout & Forms
|
|
316
|
+
- `Container`, `Flex`, `Grid`, `Stack`, `HStack`, `VStack`, `Box`, `Center`, `Divider`
|
|
317
|
+
- `Heading`, `Text`, `Paragraph`, `Link`, `Code`, `Blockquote`
|
|
318
|
+
- `Button`, `Input`, `TextArea`, `Select`, `Checkbox`, `Radio`, `Switch`, `Slider`, `FileUpload`
|
|
319
|
+
- `Table`, `DataTable`, `Badge`, `Stat`, `Progress`, `Spinner`, `Modal`, `Drawer`
|
|
320
|
+
- `BarChart`, `LineChart`, `PieChart`, `DoughnutChart`, `Sparkline`
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
### 💼 Commercial SaaS Application Example
|
|
325
|
+
|
|
326
|
+
Experience an enterprise-grade AI gateway and subscription billing platform built entirely with PyDataUI:
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
python examples/commercial_saas_app.py
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
* **Executive Observability**: Live KPI cards (MRR, Token Volume, P99 Latency), time-window filters (`24h`, `7d`, `30d`), and pipeline step tracking.
|
|
333
|
+
* **Model Observatory**: Multi-model routing matrix (Claude 3.5 Sonnet, GPT-4o, Gemini 1.5 Pro, Llama 3 70B) with pricing and quality benchmarks.
|
|
334
|
+
* **Tiered Subscription Billing**: Interactive plan cards (Starter, Growth, Enterprise Scale) with usage quota progress and automated invoice history.
|
|
335
|
+
* **API Key Gateway**: Provision scoped production tokens (`pdu_live_...`) for automated pipelines.
|
|
336
|
+
* **Production Persistence**: Backed by SQLite WAL cross-process storage supporting multi-worker execution out of the box.
|
|
337
|
+
|
|
338
|
+
## 🛠️ Powerful CLI
|
|
339
|
+
|
|
340
|
+
Create, run, and containerize PyDataUI projects with zero boilerplate:
|
|
341
|
+
|
|
342
|
+
```bash
|
|
343
|
+
# 1. Create a project from starter templates
|
|
344
|
+
pydataui new analytics_hub --template dashboard
|
|
345
|
+
# Available templates: basic, dashboard, crud, ml-dashboard, data-pipeline, auth
|
|
346
|
+
|
|
347
|
+
# 2. Run local development with hot reload
|
|
348
|
+
pydataui dev app.py --port 8000 --reload
|
|
349
|
+
|
|
350
|
+
# 3. Run production server with public tunnel
|
|
351
|
+
pydataui run app.py --workers 1 --share
|
|
352
|
+
|
|
353
|
+
# 4. Check syntax and route definitions
|
|
354
|
+
pydataui check app.py
|
|
355
|
+
|
|
356
|
+
# 5. Generate secure API key for scripts
|
|
357
|
+
pydataui generate key --name "AirflowSync"
|
|
358
|
+
|
|
359
|
+
# 6. One-command containerization build
|
|
360
|
+
pydataui build app.py --output dist/
|
|
361
|
+
# Generates Dockerfile, docker-compose.yml, bundled static assets, and app.py
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
## 📚 In-Depth Guides
|
|
367
|
+
|
|
368
|
+
- 📘 [Full Documentation](docs/README.md)
|
|
369
|
+
- 🎨 [UI Customization Guide (Tailwind, shadcn & HTML)](docs/CUSTOMIZATION.md)
|
|
370
|
+
- 🛠️ [Troubleshooting & Architecture Guide](docs/TROUBLESHOOTING.md)
|
|
371
|
+
- 🔒 [Authentication & Security Guide](docs/AUTHENTICATION.md)
|
|
372
|
+
- 📊 [Data Science & Engineering Components](docs/DATA_COMPONENTS.md)
|
|
373
|
+
- 📖 [Complete API Reference](docs/API_REFERENCE.md)
|
|
374
|
+
- 🚀 [Production & Cloud Deployment](docs/DEPLOYMENT.md)
|
|
375
|
+
- 🛡️ [Production Readiness Assessment](docs/PRODUCTION_READINESS.md)
|
|
376
|
+
- ⚡ [Quick Reference Card](docs/QUICKREF.md)
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## 🤝 Contributing
|
|
381
|
+
|
|
382
|
+
We welcome contributions from the data science, AI/ML, and Python web development communities!
|
|
383
|
+
Please see our [CONTRIBUTING.md](CONTRIBUTING.md) for local environment setup, testing, and pull request guidelines.
|
|
384
|
+
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
## 📄 License
|
|
388
|
+
|
|
389
|
+
PyDataUI is licensed under the [MIT License](LICENSE).
|
|
390
|
+
Copyright (c) 2024 Boopathi Raj.
|