vibetuner 2.8.0__tar.gz → 2.17.8__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.
Potentially problematic release.
This version of vibetuner might be problematic. Click here for more details.
- vibetuner-2.17.8/PKG-INFO +240 -0
- vibetuner-2.17.8/README.md +172 -0
- vibetuner-2.17.8/pyproject.toml +85 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/cli/__init__.py +13 -2
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/cli/run.py +0 -1
- vibetuner-2.17.8/src/vibetuner/cli/scaffold.py +187 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/config.py +20 -9
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/__init__.py +5 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/routes/auth.py +19 -13
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/mongo.py +3 -3
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/tasks/AGENTS.md +1 -1
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/tasks/CLAUDE.md +1 -1
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/tasks/worker.py +1 -1
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/debug/users.html.jinja +2 -2
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/login.html.jinja +11 -13
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/versioning.py +1 -1
- vibetuner-2.8.0/PKG-INFO +0 -48
- vibetuner-2.8.0/pyproject.toml +0 -59
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/__init__.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/__main__.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/context.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/AGENTS.md +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/CLAUDE.md +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/context.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/deps.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/email.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/hotreload.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/lifespan.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/middleware.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/oauth.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/routes/__init__.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/routes/debug.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/routes/health.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/routes/language.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/routes/meta.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/routes/user.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/frontend/templates.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/logging.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/models/AGENTS.md +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/models/CLAUDE.md +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/models/__init__.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/models/blob.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/models/email_verification.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/models/mixins.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/models/oauth.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/models/registry.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/models/types.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/models/user.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/paths.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/services/AGENTS.md +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/services/CLAUDE.md +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/services/__init__.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/services/blob.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/services/email.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/tasks/__init__.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/tasks/context.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/email/AGENTS.md +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/email/CLAUDE.md +0 -0
- {vibetuner-2.8.0/src/vibetuner/templates/email/default → vibetuner-2.17.8/src/vibetuner/templates/email}/magic_link.html.jinja +0 -0
- {vibetuner-2.8.0/src/vibetuner/templates/email/default → vibetuner-2.17.8/src/vibetuner/templates/email}/magic_link.txt.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/AGENTS.md +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/CLAUDE.md +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/base/favicons.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/base/footer.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/base/header.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/base/opengraph.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/base/skeleton.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/debug/collections.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/debug/components/debug_nav.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/debug/index.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/debug/info.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/debug/version.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/email/magic_link.txt.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/email_sent.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/index.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/lang/select.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/meta/browserconfig.xml.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/meta/robots.txt.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/meta/site.webmanifest.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/meta/sitemap.xml.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/user/edit.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/frontend/user/profile.html.jinja +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/markdown/.placeholder +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/markdown/AGENTS.md +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates/markdown/CLAUDE.md +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/templates.py +0 -0
- {vibetuner-2.8.0 → vibetuner-2.17.8}/src/vibetuner/time.py +0 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
|
+
Name: vibetuner
|
|
3
|
+
Version: 2.17.8
|
|
4
|
+
Summary: Core Python framework and blessed dependencies for production-ready FastAPI + MongoDB + HTMX projects
|
|
5
|
+
Keywords: fastapi,mongodb,htmx,web-framework,scaffolding,oauth,background-jobs
|
|
6
|
+
Author: All Tuner Labs, S.L.
|
|
7
|
+
License: MIT
|
|
8
|
+
Classifier: Development Status :: 4 - Beta
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
+
Classifier: Framework :: FastAPI
|
|
17
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
|
|
18
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
19
|
+
Requires-Dist: aioboto3>=15.5.0
|
|
20
|
+
Requires-Dist: arel>=0.4.0
|
|
21
|
+
Requires-Dist: asyncer>=0.0.10
|
|
22
|
+
Requires-Dist: authlib>=1.6.5
|
|
23
|
+
Requires-Dist: beanie[zstd]>=2.0.0
|
|
24
|
+
Requires-Dist: click>=8.3.0
|
|
25
|
+
Requires-Dist: copier>=9.10.3,<9.10.4
|
|
26
|
+
Requires-Dist: email-validator>=2.3.0
|
|
27
|
+
Requires-Dist: fastapi[standard-no-fastapi-cloud-cli]>=0.121.1
|
|
28
|
+
Requires-Dist: granian[pname]>=2.5.7
|
|
29
|
+
Requires-Dist: httpx[http2]>=0.28.1
|
|
30
|
+
Requires-Dist: itsdangerous>=2.2.0
|
|
31
|
+
Requires-Dist: loguru>=0.7.3
|
|
32
|
+
Requires-Dist: pydantic[email]>=2.12.4
|
|
33
|
+
Requires-Dist: pydantic-extra-types[pycountry]>=2.10.6
|
|
34
|
+
Requires-Dist: pydantic-settings>=2.12.0
|
|
35
|
+
Requires-Dist: pyyaml>=6.0.3
|
|
36
|
+
Requires-Dist: redis[hiredis]>=7.0.1
|
|
37
|
+
Requires-Dist: rich>=14.2.0
|
|
38
|
+
Requires-Dist: sse-starlette>=3.0.3
|
|
39
|
+
Requires-Dist: starlette-babel>=1.0.3
|
|
40
|
+
Requires-Dist: starlette-htmx>=0.1.1
|
|
41
|
+
Requires-Dist: streaq[web]<6.0.0
|
|
42
|
+
Requires-Dist: typer-slim[standard]>=0.20.0
|
|
43
|
+
Requires-Dist: babel>=2.17.0 ; extra == 'dev'
|
|
44
|
+
Requires-Dist: cloudflare>=4.3.1 ; extra == 'dev'
|
|
45
|
+
Requires-Dist: dunamai>=1.25.0 ; extra == 'dev'
|
|
46
|
+
Requires-Dist: gh-bin>=2.83.0 ; extra == 'dev'
|
|
47
|
+
Requires-Dist: granian[pname,reload]>=2.5.7 ; extra == 'dev'
|
|
48
|
+
Requires-Dist: just-bin>=1.43.0 ; extra == 'dev'
|
|
49
|
+
Requires-Dist: pre-commit>=4.4.0 ; extra == 'dev'
|
|
50
|
+
Requires-Dist: pysemver>=0.5.0 ; extra == 'dev'
|
|
51
|
+
Requires-Dist: ruff>=0.14.4 ; extra == 'dev'
|
|
52
|
+
Requires-Dist: rumdl>=0.0.174 ; extra == 'dev'
|
|
53
|
+
Requires-Dist: semver>=3.0.4 ; extra == 'dev'
|
|
54
|
+
Requires-Dist: taplo>=0.9.3 ; extra == 'dev'
|
|
55
|
+
Requires-Dist: ty>=0.0.1a26 ; extra == 'dev'
|
|
56
|
+
Requires-Dist: types-aioboto3[s3,ses]>=15.5.0 ; extra == 'dev'
|
|
57
|
+
Requires-Dist: types-authlib>=1.6.5.20251005 ; extra == 'dev'
|
|
58
|
+
Requires-Dist: types-pyyaml>=6.0.12.20250915 ; extra == 'dev'
|
|
59
|
+
Requires-Dist: uv-bump>=0.3.1 ; extra == 'dev'
|
|
60
|
+
Requires-Python: >=3.11
|
|
61
|
+
Project-URL: Changelog, https://github.com/alltuner/vibetuner/blob/main/CHANGELOG.md
|
|
62
|
+
Project-URL: Documentation, https://vibetuner.alltuner.com/
|
|
63
|
+
Project-URL: Homepage, https://vibetuner.alltuner.com/
|
|
64
|
+
Project-URL: Issues, https://github.com/alltuner/vibetuner/issues
|
|
65
|
+
Project-URL: Repository, https://github.com/alltuner/vibetuner
|
|
66
|
+
Provides-Extra: dev
|
|
67
|
+
Description-Content-Type: text/markdown
|
|
68
|
+
|
|
69
|
+
# vibetuner
|
|
70
|
+
|
|
71
|
+
Core Python framework and blessed dependencies for Vibetuner projects
|
|
72
|
+
|
|
73
|
+
This package provides the complete Python framework and curated dependency set for building modern
|
|
74
|
+
web applications with Vibetuner. It includes everything from FastAPI and MongoDB integration to
|
|
75
|
+
authentication, background jobs, and CLI tools.
|
|
76
|
+
|
|
77
|
+
## What is Vibetuner?
|
|
78
|
+
|
|
79
|
+
Vibetuner is a production-ready scaffolding tool for FastAPI + MongoDB + HTMX web applications.
|
|
80
|
+
This package (`vibetuner`) is the Python component that provides:
|
|
81
|
+
|
|
82
|
+
- Complete web application framework built on FastAPI
|
|
83
|
+
- MongoDB integration with Beanie ODM
|
|
84
|
+
- OAuth and magic link authentication out of the box
|
|
85
|
+
- Background job processing with Redis + Streaq
|
|
86
|
+
- CLI framework with Typer
|
|
87
|
+
- Email services, blob storage, and more
|
|
88
|
+
|
|
89
|
+
**This package is designed to be used within projects generated by the Vibetuner scaffolding
|
|
90
|
+
tool.** For standalone use, you'll need to set up the project structure manually.
|
|
91
|
+
|
|
92
|
+
## Installation
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# In a Vibetuner-generated project (automatic)
|
|
96
|
+
uv sync
|
|
97
|
+
|
|
98
|
+
# Add to an existing project
|
|
99
|
+
uv add vibetuner
|
|
100
|
+
|
|
101
|
+
# With development dependencies
|
|
102
|
+
uv add vibetuner[dev]
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Quick Start
|
|
106
|
+
|
|
107
|
+
The recommended way to use Vibetuner is via the scaffolding tool:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Create a new project with all the framework code
|
|
111
|
+
uvx vibetuner scaffold new my-project
|
|
112
|
+
cd my-project
|
|
113
|
+
just dev
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
This will generate a complete project with:
|
|
117
|
+
|
|
118
|
+
- Pre-configured FastAPI application
|
|
119
|
+
- Authentication system (OAuth + magic links)
|
|
120
|
+
- MongoDB models and configuration
|
|
121
|
+
- Frontend templates and asset pipeline
|
|
122
|
+
- Docker setup for development and production
|
|
123
|
+
- CLI commands and background job infrastructure
|
|
124
|
+
|
|
125
|
+
## What's Included
|
|
126
|
+
|
|
127
|
+
### Core Framework (`src/vibetuner/`)
|
|
128
|
+
|
|
129
|
+
- **`frontend/`**: FastAPI app, routes, middleware, auth
|
|
130
|
+
- **`models/`**: User, OAuth, email verification, blob storage models
|
|
131
|
+
- **`services/`**: Email (SES), blob storage (S3)
|
|
132
|
+
- **`tasks/`**: Background job infrastructure
|
|
133
|
+
- **`cli/`**: CLI framework with scaffold, run commands
|
|
134
|
+
- **`config.py`**: Pydantic settings management
|
|
135
|
+
- **`mongo.py`**: MongoDB/Beanie setup
|
|
136
|
+
- **`logging.py`**: Structured logging configuration
|
|
137
|
+
|
|
138
|
+
### Blessed Dependencies
|
|
139
|
+
|
|
140
|
+
- **FastAPI** (0.121+): Modern, fast web framework
|
|
141
|
+
- **Beanie**: Async MongoDB ODM with Pydantic
|
|
142
|
+
- **Authlib**: OAuth 1.0/2.0 client
|
|
143
|
+
- **Granian**: High-performance ASGI server
|
|
144
|
+
- **Redis** + **Streaq**: Background task processing
|
|
145
|
+
- **Typer**: CLI framework
|
|
146
|
+
- **Rich**: Beautiful terminal output
|
|
147
|
+
- **Loguru**: Structured logging
|
|
148
|
+
- **Pydantic**: Data validation and settings
|
|
149
|
+
|
|
150
|
+
See [pyproject.toml](./pyproject.toml) for the complete dependency list.
|
|
151
|
+
|
|
152
|
+
## CLI Tools
|
|
153
|
+
|
|
154
|
+
When installed, provides the `vibetuner` command:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# Create new project from template
|
|
158
|
+
vibetuner scaffold new my-project
|
|
159
|
+
vibetuner scaffold new my-project --defaults
|
|
160
|
+
|
|
161
|
+
# Update existing project
|
|
162
|
+
vibetuner scaffold update
|
|
163
|
+
|
|
164
|
+
# Run development server (in generated projects)
|
|
165
|
+
vibetuner run dev frontend
|
|
166
|
+
vibetuner run dev worker
|
|
167
|
+
|
|
168
|
+
# Run production server (in generated projects)
|
|
169
|
+
vibetuner run prod frontend
|
|
170
|
+
vibetuner run prod worker
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Development Dependencies
|
|
174
|
+
|
|
175
|
+
The `[dev]` extra includes all tools needed for development:
|
|
176
|
+
|
|
177
|
+
- **Ruff**: Fast linting and formatting
|
|
178
|
+
- **Babel**: i18n message extraction
|
|
179
|
+
- **pre-commit**: Git hooks
|
|
180
|
+
- **Type stubs**: For aioboto3, authlib, PyYAML
|
|
181
|
+
- And more...
|
|
182
|
+
|
|
183
|
+
## Usage in Generated Projects
|
|
184
|
+
|
|
185
|
+
In a Vibetuner-generated project, import from `vibetuner`:
|
|
186
|
+
|
|
187
|
+
```python
|
|
188
|
+
# Use core models
|
|
189
|
+
from vibetuner.models import UserModel, OAuthAccountModel
|
|
190
|
+
|
|
191
|
+
# Use services
|
|
192
|
+
from vibetuner.services.email import send_email
|
|
193
|
+
|
|
194
|
+
# Use configuration
|
|
195
|
+
from vibetuner.config import settings
|
|
196
|
+
|
|
197
|
+
# Extend core routes
|
|
198
|
+
from vibetuner.frontend import app
|
|
199
|
+
|
|
200
|
+
# Add your routes
|
|
201
|
+
@app.get("/api/hello")
|
|
202
|
+
async def hello():
|
|
203
|
+
return {"message": "Hello World"}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Documentation
|
|
207
|
+
|
|
208
|
+
For complete documentation, guides, and examples, see the main Vibetuner repository:
|
|
209
|
+
|
|
210
|
+
**📖 [Vibetuner Documentation](https://vibetuner.alltuner.com/)**
|
|
211
|
+
|
|
212
|
+
## Package Ecosystem
|
|
213
|
+
|
|
214
|
+
Vibetuner consists of three packages that work together:
|
|
215
|
+
|
|
216
|
+
1. **vibetuner** (this package): Python framework and dependencies
|
|
217
|
+
2. **[@alltuner/vibetuner](https://www.npmjs.com/package/@alltuner/vibetuner)**: JavaScript/CSS build dependencies
|
|
218
|
+
3. **Scaffolding template**: Copier template for project generation
|
|
219
|
+
|
|
220
|
+
All three are version-locked and tested together to ensure compatibility.
|
|
221
|
+
|
|
222
|
+
## Contributing
|
|
223
|
+
|
|
224
|
+
Contributions welcome! See the main repository for contribution guidelines:
|
|
225
|
+
|
|
226
|
+
**🤝 [Contributing to Vibetuner](https://github.com/alltuner/vibetuner/blob/main/CONTRIBUTING.md)**
|
|
227
|
+
|
|
228
|
+
## License
|
|
229
|
+
|
|
230
|
+
MIT License - Copyright (c) 2025 All Tuner Labs, S.L.
|
|
231
|
+
|
|
232
|
+
See [LICENSE](https://github.com/alltuner/vibetuner/blob/main/LICENSE) for details.
|
|
233
|
+
|
|
234
|
+
## Links
|
|
235
|
+
|
|
236
|
+
- **Main Repository**: <https://github.com/alltuner/vibetuner>
|
|
237
|
+
- **Documentation**: <https://vibetuner.alltuner.com/>
|
|
238
|
+
- **Issues**: <https://github.com/alltuner/vibetuner/issues>
|
|
239
|
+
- **PyPI**: <https://pypi.org/project/vibetuner/>
|
|
240
|
+
- **npm Package**: <https://www.npmjs.com/package/@alltuner/vibetuner>
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# vibetuner
|
|
2
|
+
|
|
3
|
+
Core Python framework and blessed dependencies for Vibetuner projects
|
|
4
|
+
|
|
5
|
+
This package provides the complete Python framework and curated dependency set for building modern
|
|
6
|
+
web applications with Vibetuner. It includes everything from FastAPI and MongoDB integration to
|
|
7
|
+
authentication, background jobs, and CLI tools.
|
|
8
|
+
|
|
9
|
+
## What is Vibetuner?
|
|
10
|
+
|
|
11
|
+
Vibetuner is a production-ready scaffolding tool for FastAPI + MongoDB + HTMX web applications.
|
|
12
|
+
This package (`vibetuner`) is the Python component that provides:
|
|
13
|
+
|
|
14
|
+
- Complete web application framework built on FastAPI
|
|
15
|
+
- MongoDB integration with Beanie ODM
|
|
16
|
+
- OAuth and magic link authentication out of the box
|
|
17
|
+
- Background job processing with Redis + Streaq
|
|
18
|
+
- CLI framework with Typer
|
|
19
|
+
- Email services, blob storage, and more
|
|
20
|
+
|
|
21
|
+
**This package is designed to be used within projects generated by the Vibetuner scaffolding
|
|
22
|
+
tool.** For standalone use, you'll need to set up the project structure manually.
|
|
23
|
+
|
|
24
|
+
## Installation
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# In a Vibetuner-generated project (automatic)
|
|
28
|
+
uv sync
|
|
29
|
+
|
|
30
|
+
# Add to an existing project
|
|
31
|
+
uv add vibetuner
|
|
32
|
+
|
|
33
|
+
# With development dependencies
|
|
34
|
+
uv add vibetuner[dev]
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Quick Start
|
|
38
|
+
|
|
39
|
+
The recommended way to use Vibetuner is via the scaffolding tool:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Create a new project with all the framework code
|
|
43
|
+
uvx vibetuner scaffold new my-project
|
|
44
|
+
cd my-project
|
|
45
|
+
just dev
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
This will generate a complete project with:
|
|
49
|
+
|
|
50
|
+
- Pre-configured FastAPI application
|
|
51
|
+
- Authentication system (OAuth + magic links)
|
|
52
|
+
- MongoDB models and configuration
|
|
53
|
+
- Frontend templates and asset pipeline
|
|
54
|
+
- Docker setup for development and production
|
|
55
|
+
- CLI commands and background job infrastructure
|
|
56
|
+
|
|
57
|
+
## What's Included
|
|
58
|
+
|
|
59
|
+
### Core Framework (`src/vibetuner/`)
|
|
60
|
+
|
|
61
|
+
- **`frontend/`**: FastAPI app, routes, middleware, auth
|
|
62
|
+
- **`models/`**: User, OAuth, email verification, blob storage models
|
|
63
|
+
- **`services/`**: Email (SES), blob storage (S3)
|
|
64
|
+
- **`tasks/`**: Background job infrastructure
|
|
65
|
+
- **`cli/`**: CLI framework with scaffold, run commands
|
|
66
|
+
- **`config.py`**: Pydantic settings management
|
|
67
|
+
- **`mongo.py`**: MongoDB/Beanie setup
|
|
68
|
+
- **`logging.py`**: Structured logging configuration
|
|
69
|
+
|
|
70
|
+
### Blessed Dependencies
|
|
71
|
+
|
|
72
|
+
- **FastAPI** (0.121+): Modern, fast web framework
|
|
73
|
+
- **Beanie**: Async MongoDB ODM with Pydantic
|
|
74
|
+
- **Authlib**: OAuth 1.0/2.0 client
|
|
75
|
+
- **Granian**: High-performance ASGI server
|
|
76
|
+
- **Redis** + **Streaq**: Background task processing
|
|
77
|
+
- **Typer**: CLI framework
|
|
78
|
+
- **Rich**: Beautiful terminal output
|
|
79
|
+
- **Loguru**: Structured logging
|
|
80
|
+
- **Pydantic**: Data validation and settings
|
|
81
|
+
|
|
82
|
+
See [pyproject.toml](./pyproject.toml) for the complete dependency list.
|
|
83
|
+
|
|
84
|
+
## CLI Tools
|
|
85
|
+
|
|
86
|
+
When installed, provides the `vibetuner` command:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# Create new project from template
|
|
90
|
+
vibetuner scaffold new my-project
|
|
91
|
+
vibetuner scaffold new my-project --defaults
|
|
92
|
+
|
|
93
|
+
# Update existing project
|
|
94
|
+
vibetuner scaffold update
|
|
95
|
+
|
|
96
|
+
# Run development server (in generated projects)
|
|
97
|
+
vibetuner run dev frontend
|
|
98
|
+
vibetuner run dev worker
|
|
99
|
+
|
|
100
|
+
# Run production server (in generated projects)
|
|
101
|
+
vibetuner run prod frontend
|
|
102
|
+
vibetuner run prod worker
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Development Dependencies
|
|
106
|
+
|
|
107
|
+
The `[dev]` extra includes all tools needed for development:
|
|
108
|
+
|
|
109
|
+
- **Ruff**: Fast linting and formatting
|
|
110
|
+
- **Babel**: i18n message extraction
|
|
111
|
+
- **pre-commit**: Git hooks
|
|
112
|
+
- **Type stubs**: For aioboto3, authlib, PyYAML
|
|
113
|
+
- And more...
|
|
114
|
+
|
|
115
|
+
## Usage in Generated Projects
|
|
116
|
+
|
|
117
|
+
In a Vibetuner-generated project, import from `vibetuner`:
|
|
118
|
+
|
|
119
|
+
```python
|
|
120
|
+
# Use core models
|
|
121
|
+
from vibetuner.models import UserModel, OAuthAccountModel
|
|
122
|
+
|
|
123
|
+
# Use services
|
|
124
|
+
from vibetuner.services.email import send_email
|
|
125
|
+
|
|
126
|
+
# Use configuration
|
|
127
|
+
from vibetuner.config import settings
|
|
128
|
+
|
|
129
|
+
# Extend core routes
|
|
130
|
+
from vibetuner.frontend import app
|
|
131
|
+
|
|
132
|
+
# Add your routes
|
|
133
|
+
@app.get("/api/hello")
|
|
134
|
+
async def hello():
|
|
135
|
+
return {"message": "Hello World"}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Documentation
|
|
139
|
+
|
|
140
|
+
For complete documentation, guides, and examples, see the main Vibetuner repository:
|
|
141
|
+
|
|
142
|
+
**📖 [Vibetuner Documentation](https://vibetuner.alltuner.com/)**
|
|
143
|
+
|
|
144
|
+
## Package Ecosystem
|
|
145
|
+
|
|
146
|
+
Vibetuner consists of three packages that work together:
|
|
147
|
+
|
|
148
|
+
1. **vibetuner** (this package): Python framework and dependencies
|
|
149
|
+
2. **[@alltuner/vibetuner](https://www.npmjs.com/package/@alltuner/vibetuner)**: JavaScript/CSS build dependencies
|
|
150
|
+
3. **Scaffolding template**: Copier template for project generation
|
|
151
|
+
|
|
152
|
+
All three are version-locked and tested together to ensure compatibility.
|
|
153
|
+
|
|
154
|
+
## Contributing
|
|
155
|
+
|
|
156
|
+
Contributions welcome! See the main repository for contribution guidelines:
|
|
157
|
+
|
|
158
|
+
**🤝 [Contributing to Vibetuner](https://github.com/alltuner/vibetuner/blob/main/CONTRIBUTING.md)**
|
|
159
|
+
|
|
160
|
+
## License
|
|
161
|
+
|
|
162
|
+
MIT License - Copyright (c) 2025 All Tuner Labs, S.L.
|
|
163
|
+
|
|
164
|
+
See [LICENSE](https://github.com/alltuner/vibetuner/blob/main/LICENSE) for details.
|
|
165
|
+
|
|
166
|
+
## Links
|
|
167
|
+
|
|
168
|
+
- **Main Repository**: <https://github.com/alltuner/vibetuner>
|
|
169
|
+
- **Documentation**: <https://vibetuner.alltuner.com/>
|
|
170
|
+
- **Issues**: <https://github.com/alltuner/vibetuner/issues>
|
|
171
|
+
- **PyPI**: <https://pypi.org/project/vibetuner/>
|
|
172
|
+
- **npm Package**: <https://www.npmjs.com/package/@alltuner/vibetuner>
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "vibetuner"
|
|
3
|
+
description = "Core Python framework and blessed dependencies for production-ready FastAPI + MongoDB + HTMX projects"
|
|
4
|
+
version = "2.17.8"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.11"
|
|
7
|
+
license = { text = "MIT" }
|
|
8
|
+
authors = [{ name = "All Tuner Labs, S.L." }]
|
|
9
|
+
keywords = ["fastapi", "mongodb", "htmx", "web-framework", "scaffolding", "oauth", "background-jobs"]
|
|
10
|
+
classifiers = [
|
|
11
|
+
"Development Status :: 4 - Beta",
|
|
12
|
+
"Intended Audience :: Developers",
|
|
13
|
+
"License :: OSI Approved :: MIT License",
|
|
14
|
+
"Programming Language :: Python :: 3",
|
|
15
|
+
"Programming Language :: Python :: 3.11",
|
|
16
|
+
"Programming Language :: Python :: 3.12",
|
|
17
|
+
"Programming Language :: Python :: 3.13",
|
|
18
|
+
"Programming Language :: Python :: 3.14",
|
|
19
|
+
"Framework :: FastAPI",
|
|
20
|
+
"Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
|
|
21
|
+
"Topic :: Software Development :: Libraries :: Application Frameworks",
|
|
22
|
+
]
|
|
23
|
+
dependencies = [
|
|
24
|
+
# These are the base dependencies of AllTuner's blessed stack
|
|
25
|
+
"aioboto3>=15.5.0",
|
|
26
|
+
"arel>=0.4.0",
|
|
27
|
+
"asyncer>=0.0.10",
|
|
28
|
+
"authlib>=1.6.5",
|
|
29
|
+
"beanie[zstd]>=2.0.0",
|
|
30
|
+
"click>=8.3.0",
|
|
31
|
+
"copier>=9.10.3,<9.10.4",
|
|
32
|
+
"email-validator>=2.3.0",
|
|
33
|
+
"fastapi[standard-no-fastapi-cloud-cli]>=0.121.1",
|
|
34
|
+
"granian[pname]>=2.5.7",
|
|
35
|
+
"httpx[http2]>=0.28.1",
|
|
36
|
+
"itsdangerous>=2.2.0",
|
|
37
|
+
"loguru>=0.7.3",
|
|
38
|
+
"pydantic[email]>=2.12.4",
|
|
39
|
+
"pydantic-extra-types[pycountry]>=2.10.6",
|
|
40
|
+
"pydantic-settings>=2.12.0",
|
|
41
|
+
"pyyaml>=6.0.3",
|
|
42
|
+
"redis[hiredis]>=7.0.1",
|
|
43
|
+
"rich>=14.2.0",
|
|
44
|
+
"sse-starlette>=3.0.3",
|
|
45
|
+
"starlette-babel>=1.0.3",
|
|
46
|
+
"starlette-htmx>=0.1.1",
|
|
47
|
+
"streaq[web]<6.0.0",
|
|
48
|
+
"typer-slim[standard]>=0.20.0",
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
[project.scripts]
|
|
52
|
+
vibetuner = "vibetuner.cli:app"
|
|
53
|
+
|
|
54
|
+
[project.urls]
|
|
55
|
+
Homepage = "https://vibetuner.alltuner.com/"
|
|
56
|
+
Documentation = "https://vibetuner.alltuner.com/"
|
|
57
|
+
Repository = "https://github.com/alltuner/vibetuner"
|
|
58
|
+
Issues = "https://github.com/alltuner/vibetuner/issues"
|
|
59
|
+
Changelog = "https://github.com/alltuner/vibetuner/blob/main/CHANGELOG.md"
|
|
60
|
+
|
|
61
|
+
[project.optional-dependencies]
|
|
62
|
+
dev = [
|
|
63
|
+
# These are the development dependencies of AllTuner's blessed stack
|
|
64
|
+
"babel>=2.17.0",
|
|
65
|
+
"cloudflare>=4.3.1",
|
|
66
|
+
"dunamai>=1.25.0",
|
|
67
|
+
"gh-bin>=2.83.0",
|
|
68
|
+
"granian[pname,reload]>=2.5.7",
|
|
69
|
+
"just-bin>=1.43.0",
|
|
70
|
+
"pre-commit>=4.4.0",
|
|
71
|
+
"pysemver>=0.5.0",
|
|
72
|
+
"ruff>=0.14.4",
|
|
73
|
+
"rumdl>=0.0.174",
|
|
74
|
+
"semver>=3.0.4",
|
|
75
|
+
"taplo>=0.9.3",
|
|
76
|
+
"ty>=0.0.1a26",
|
|
77
|
+
"types-aioboto3[s3,ses]>=15.5.0",
|
|
78
|
+
"types-authlib>=1.6.5.20251005",
|
|
79
|
+
"types-pyyaml>=6.0.12.20250915",
|
|
80
|
+
"uv-bump>=0.3.1",
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
[build-system]
|
|
84
|
+
requires = ["uv_build>=0.9,<0.10"]
|
|
85
|
+
build-backend = "uv_build"
|
|
@@ -9,7 +9,7 @@ import typer
|
|
|
9
9
|
from rich.console import Console
|
|
10
10
|
|
|
11
11
|
from vibetuner.cli.run import run_app
|
|
12
|
-
from vibetuner.
|
|
12
|
+
from vibetuner.cli.scaffold import scaffold_app
|
|
13
13
|
from vibetuner.logging import LogLevel, setup_logging
|
|
14
14
|
|
|
15
15
|
|
|
@@ -43,7 +43,16 @@ class AsyncTyper(typer.Typer):
|
|
|
43
43
|
return partial(self.maybe_run_async, decorator)
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
def _get_app_help():
|
|
47
|
+
try:
|
|
48
|
+
from vibetuner.config import settings
|
|
49
|
+
|
|
50
|
+
return f"{settings.project.project_name.title()} CLI"
|
|
51
|
+
except (RuntimeError, ImportError):
|
|
52
|
+
return "Vibetuner CLI"
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
app = AsyncTyper(help=_get_app_help())
|
|
47
56
|
|
|
48
57
|
LOG_LEVEL_OPTION = typer.Option(
|
|
49
58
|
LogLevel.INFO,
|
|
@@ -61,8 +70,10 @@ def callback(log_level: LogLevel | None = LOG_LEVEL_OPTION) -> None:
|
|
|
61
70
|
|
|
62
71
|
|
|
63
72
|
app.add_typer(run_app, name="run")
|
|
73
|
+
app.add_typer(scaffold_app, name="scaffold")
|
|
64
74
|
|
|
65
75
|
try:
|
|
66
76
|
import_module("app.cli")
|
|
67
77
|
except (ImportError, ModuleNotFoundError):
|
|
68
78
|
pass
|
|
79
|
+
# Cache buster
|