fastapp-cli 0.1.0__py3-none-any.whl
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.
- fastapp_cli/__init__.py +3 -0
- fastapp_cli/create.py +157 -0
- fastapp_cli/main.py +33 -0
- fastapp_cli/naming.py +39 -0
- fastapp_cli/prompts.py +35 -0
- fastapp_cli/render.py +130 -0
- fastapp_cli/templates/__init__.py +1 -0
- fastapp_cli/templates/project/.env.development.example.j2 +21 -0
- fastapp_cli/templates/project/.env.example.j2 +29 -0
- fastapp_cli/templates/project/.env.j2 +27 -0
- fastapp_cli/templates/project/.gitignore +178 -0
- fastapp_cli/templates/project/.pre-commit-config.yaml.j2 +80 -0
- fastapp_cli/templates/project/.python-version.j2 +1 -0
- fastapp_cli/templates/project/Dockerfile.j2 +17 -0
- fastapp_cli/templates/project/Makefile.j2 +31 -0
- fastapp_cli/templates/project/README.md.j2 +68 -0
- fastapp_cli/templates/project/alembic/env.py.j2 +84 -0
- fastapp_cli/templates/project/alembic/script.py.mako +28 -0
- fastapp_cli/templates/project/alembic/versions/.gitkeep +0 -0
- fastapp_cli/templates/project/alembic.ini.j2 +50 -0
- fastapp_cli/templates/project/app/__init__.py.j2 +1 -0
- fastapp_cli/templates/project/app/api/__init__.py.j2 +1 -0
- fastapp_cli/templates/project/app/api/deps.py.j2 +33 -0
- fastapp_cli/templates/project/app/api/v1/__init__.py.j2 +1 -0
- fastapp_cli/templates/project/app/api/v1/endpoints/__init__.py.j2 +1 -0
- fastapp_cli/templates/project/app/api/v1/endpoints/health.py.j2 +33 -0
- fastapp_cli/templates/project/app/api/v1/endpoints/items.py.j2 +90 -0
- fastapp_cli/templates/project/app/api/v1/router.py.j2 +9 -0
- fastapp_cli/templates/project/app/core/__init__.py.j2 +1 -0
- fastapp_cli/templates/project/app/core/celery_app.py.j2 +62 -0
- fastapp_cli/templates/project/app/core/config.py.j2 +105 -0
- fastapp_cli/templates/project/app/core/context_var.py.j2 +13 -0
- fastapp_cli/templates/project/app/core/database.py.j2 +50 -0
- fastapp_cli/templates/project/app/core/exceptions.py.j2 +175 -0
- fastapp_cli/templates/project/app/core/logging.py.j2 +125 -0
- fastapp_cli/templates/project/app/core/middleware.py.j2 +39 -0
- fastapp_cli/templates/project/app/crud/__init__.py.j2 +1 -0
- fastapp_cli/templates/project/app/crud/base.py.j2 +229 -0
- fastapp_cli/templates/project/app/crud/item.py.j2 +10 -0
- fastapp_cli/templates/project/app/main.py.j2 +118 -0
- fastapp_cli/templates/project/app/models/__init__.py.j2 +10 -0
- fastapp_cli/templates/project/app/models/base.py.j2 +59 -0
- fastapp_cli/templates/project/app/models/item.py.j2 +22 -0
- fastapp_cli/templates/project/app/schemas/__init__.py.j2 +1 -0
- fastapp_cli/templates/project/app/schemas/common.py.j2 +81 -0
- fastapp_cli/templates/project/app/schemas/item.py.j2 +35 -0
- fastapp_cli/templates/project/app/services/__init__.py.j2 +1 -0
- fastapp_cli/templates/project/app/services/base.py.j2 +79 -0
- fastapp_cli/templates/project/app/services/item_service.py.j2 +10 -0
- fastapp_cli/templates/project/app/tasks/__init__.py.j2 +1 -0
- fastapp_cli/templates/project/app/tasks/sample_tasks.py.j2 +28 -0
- fastapp_cli/templates/project/app/utils/__init__.py.j2 +1 -0
- fastapp_cli/templates/project/docs/SQLModel/345/256/232/344/271/211/347/244/272/344/276/213.md +400 -0
- fastapp_cli/templates/project/pm2.config.json.j2 +47 -0
- fastapp_cli/templates/project/pyproject.toml.j2 +195 -0
- fastapp_cli/templates/project/scripts/celery_beat.sh.j2 +9 -0
- fastapp_cli/templates/project/scripts/celery_flower.sh.j2 +22 -0
- fastapp_cli/templates/project/scripts/celery_worker.sh.j2 +15 -0
- fastapp_cli/templates/project/scripts/start.sh.j2 +17 -0
- fastapp_cli/templates/project/tests/api/test_health.py.j2 +15 -0
- fastapp_cli/templates/project/tests/api/test_items.py.j2 +61 -0
- fastapp_cli/templates/project/tests/conftest.py.j2 +61 -0
- fastapp_cli/templates/project/tests/services/test_item_service.py.j2 +44 -0
- fastapp_cli-0.1.0.dist-info/METADATA +102 -0
- fastapp_cli-0.1.0.dist-info/RECORD +67 -0
- fastapp_cli-0.1.0.dist-info/WHEEL +4 -0
- fastapp_cli-0.1.0.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# 启动 Celery Worker
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
cd "$(dirname "$0")/.."
|
|
6
|
+
|
|
7
|
+
CONCURRENCY="${CONCURRENCY:-4}"
|
|
8
|
+
QUEUE="${QUEUE:-default}"
|
|
9
|
+
LOG_LEVEL="${LOG_LEVEL:-INFO}"
|
|
10
|
+
|
|
11
|
+
exec uv run celery -A app.core.celery_app.celery_app worker \
|
|
12
|
+
-Q "${QUEUE}" \
|
|
13
|
+
-c "${CONCURRENCY}" \
|
|
14
|
+
-l "${LOG_LEVEL}" \
|
|
15
|
+
-n "worker@%h"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# 启动 FastAPI 服务
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
cd "$(dirname "$0")/.."
|
|
6
|
+
|
|
7
|
+
HOST="${HOST:-0.0.0.0}"
|
|
8
|
+
PORT="${PORT:-8000}"
|
|
9
|
+
WORKERS="${WORKERS:-1}"
|
|
10
|
+
|
|
11
|
+
if [ "${APP_ENV:-development}" = "production" ]; then
|
|
12
|
+
echo "[prod] launching uvicorn with ${WORKERS} workers"
|
|
13
|
+
exec uv run uvicorn app.main:app --host "${HOST}" --port "${PORT}" --workers "${WORKERS}"
|
|
14
|
+
else
|
|
15
|
+
echo "[dev] launching uvicorn with reload"
|
|
16
|
+
exec uv run uvicorn app.main:app --host "${HOST}" --port "${PORT}" --reload
|
|
17
|
+
fi
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Health 接口测试."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from fastapi.testclient import TestClient
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_health(client: TestClient) -> None:
|
|
9
|
+
"""健康检查返回应用状态与数据库状态."""
|
|
10
|
+
resp = client.get("/api/v1/health")
|
|
11
|
+
assert resp.status_code == 200
|
|
12
|
+
body = resp.json()
|
|
13
|
+
assert body["status"] == "ok"
|
|
14
|
+
assert body["database"] in ("up", "down")
|
|
15
|
+
assert "trace_id" not in body or body.get("trace_id") is None
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""Items 接口集成测试(分页 CRUD + 过滤)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from fastapi.testclient import TestClient
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_item_crud_roundtrip(client: TestClient) -> None:
|
|
9
|
+
"""创建 -> 查询 -> 更新 -> 删除 -> 404 全链路."""
|
|
10
|
+
# 创建(非生产环境认证占位自动通过)
|
|
11
|
+
resp = client.post(
|
|
12
|
+
"/api/v1/items",
|
|
13
|
+
json={"title": "hello", "description": "world", "price": 9.9},
|
|
14
|
+
)
|
|
15
|
+
assert resp.status_code == 200, resp.text
|
|
16
|
+
body = resp.json()
|
|
17
|
+
assert body["code"] == 0
|
|
18
|
+
assert body["data"]["title"] == "hello"
|
|
19
|
+
assert body["trace_id"]
|
|
20
|
+
item_id = body["data"]["id"]
|
|
21
|
+
|
|
22
|
+
# 列表(分页)
|
|
23
|
+
resp = client.get("/api/v1/items")
|
|
24
|
+
assert resp.status_code == 200
|
|
25
|
+
data = resp.json()["data"]
|
|
26
|
+
assert data["total"] >= 1
|
|
27
|
+
assert any(it["id"] == item_id for it in data["content"])
|
|
28
|
+
|
|
29
|
+
# 过滤
|
|
30
|
+
resp = client.get("/api/v1/items", params={"title": "hel"})
|
|
31
|
+
assert resp.status_code == 200
|
|
32
|
+
assert all("hel" in it["title"] for it in resp.json()["data"]["content"])
|
|
33
|
+
|
|
34
|
+
# 详情
|
|
35
|
+
resp = client.get(f"/api/v1/items/{item_id}")
|
|
36
|
+
assert resp.status_code == 200
|
|
37
|
+
assert resp.json()["data"]["id"] == item_id
|
|
38
|
+
|
|
39
|
+
# 更新
|
|
40
|
+
resp = client.patch(f"/api/v1/items/{item_id}", json={"title": "updated"})
|
|
41
|
+
assert resp.status_code == 200
|
|
42
|
+
assert resp.json()["data"]["title"] == "updated"
|
|
43
|
+
assert resp.json()["data"]["description"] == "world" # 未传字段不受影响
|
|
44
|
+
|
|
45
|
+
# 删除
|
|
46
|
+
resp = client.delete(f"/api/v1/items/{item_id}")
|
|
47
|
+
assert resp.status_code == 200
|
|
48
|
+
|
|
49
|
+
# 再次查询 404
|
|
50
|
+
resp = client.get(f"/api/v1/items/{item_id}")
|
|
51
|
+
assert resp.status_code == 404
|
|
52
|
+
assert resp.json()["code"] == 40400
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def test_get_missing_item_returns_404(client: TestClient) -> None:
|
|
56
|
+
"""查询不存在的 Item 返回统一 404 结构."""
|
|
57
|
+
resp = client.get("/api/v1/items/999999")
|
|
58
|
+
assert resp.status_code == 404
|
|
59
|
+
body = resp.json()
|
|
60
|
+
assert body["code"] == 40400
|
|
61
|
+
assert body["message"] == "资源不存在"
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""Pytest fixtures & 测试配置."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
|
|
7
|
+
# 强制切换到测试环境,需要在 app 模块导入前设置
|
|
8
|
+
os.environ.setdefault("APP_ENV", "test")
|
|
9
|
+
os.environ.setdefault("DATABASE_URI", "sqlite:///:memory:")
|
|
10
|
+
os.environ.setdefault("CELERY_BROKER_URL", "memory://")
|
|
11
|
+
os.environ.setdefault("CELERY_RESULT_BACKEND", "cache+memory://")
|
|
12
|
+
|
|
13
|
+
from collections.abc import Generator
|
|
14
|
+
|
|
15
|
+
import pytest
|
|
16
|
+
from fastapi.testclient import TestClient
|
|
17
|
+
from sqlalchemy.pool import StaticPool
|
|
18
|
+
from sqlmodel import Session, SQLModel, create_engine
|
|
19
|
+
|
|
20
|
+
from app.core.database import get_session
|
|
21
|
+
from app.main import app
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@pytest.fixture(scope="session")
|
|
25
|
+
def engine():
|
|
26
|
+
"""每个测试 session 共享一个内存 SQLite 引擎."""
|
|
27
|
+
test_engine = create_engine(
|
|
28
|
+
"sqlite://",
|
|
29
|
+
connect_args={"check_same_thread": False},
|
|
30
|
+
poolclass=StaticPool,
|
|
31
|
+
)
|
|
32
|
+
SQLModel.metadata.create_all(test_engine)
|
|
33
|
+
yield test_engine
|
|
34
|
+
SQLModel.metadata.drop_all(test_engine)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@pytest.fixture
|
|
38
|
+
def db_session(engine) -> Generator[Session, None, None]:
|
|
39
|
+
"""每个测试提供独立的 Session,结束后回滚保证数据隔离."""
|
|
40
|
+
connection = engine.connect()
|
|
41
|
+
transaction = connection.begin()
|
|
42
|
+
session = Session(bind=connection)
|
|
43
|
+
|
|
44
|
+
yield session
|
|
45
|
+
|
|
46
|
+
session.close()
|
|
47
|
+
transaction.rollback()
|
|
48
|
+
connection.close()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@pytest.fixture
|
|
52
|
+
def client(db_session: Session) -> Generator[TestClient, None, None]:
|
|
53
|
+
"""FastAPI 测试客户端,注入测试会话."""
|
|
54
|
+
|
|
55
|
+
def _override_get_session() -> Generator[Session, None, None]:
|
|
56
|
+
yield db_session
|
|
57
|
+
|
|
58
|
+
app.dependency_overrides[get_session] = _override_get_session
|
|
59
|
+
with TestClient(app) as test_client:
|
|
60
|
+
yield test_client
|
|
61
|
+
app.dependency_overrides.clear()
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""ItemService 单元测试(sqlite 内存库)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from sqlmodel import Session
|
|
6
|
+
|
|
7
|
+
from app.crud.item import CRUDItem
|
|
8
|
+
from app.models.item import Item
|
|
9
|
+
from app.schemas.item import ItemCreate, ItemUpdate
|
|
10
|
+
from app.services.item_service import ItemService
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def test_service_create_get_update_delete(db_session: Session) -> None:
|
|
14
|
+
"""Service 层增删改查全链路."""
|
|
15
|
+
service = ItemService(db_session, CRUDItem(Item))
|
|
16
|
+
|
|
17
|
+
# 创建
|
|
18
|
+
created = service.create(ItemCreate(title="t1", description="d1", price=1.5))
|
|
19
|
+
assert created.id is not None
|
|
20
|
+
assert created.title == "t1"
|
|
21
|
+
|
|
22
|
+
# 获取
|
|
23
|
+
fetched = service.get(created.id)
|
|
24
|
+
assert fetched.id == created.id
|
|
25
|
+
|
|
26
|
+
# 更新(exclude_unset 语义)
|
|
27
|
+
updated = service.update(created.id, ItemUpdate(title="t2"))
|
|
28
|
+
assert updated.title == "t2"
|
|
29
|
+
assert updated.description == "d1"
|
|
30
|
+
|
|
31
|
+
# 删除
|
|
32
|
+
deleted = service.delete(created.id)
|
|
33
|
+
assert deleted.id == created.id
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_service_get_missing_raises(db_session: Session) -> None:
|
|
37
|
+
"""获取不存在的记录抛出 NotFoundError(404 语义)."""
|
|
38
|
+
import pytest
|
|
39
|
+
|
|
40
|
+
from app.core.exceptions import NotFoundError
|
|
41
|
+
|
|
42
|
+
service = ItemService(db_session, CRUDItem(Item))
|
|
43
|
+
with pytest.raises(NotFoundError):
|
|
44
|
+
service.get(999999)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: fastapp-cli
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: FastAPI 项目脚手架:一条命令生成完整可运行的 FastAPI 工程
|
|
5
|
+
Author: aidenmo
|
|
6
|
+
License: MIT
|
|
7
|
+
Keywords: cli,fastapi,scaffold,sqlmodel,template
|
|
8
|
+
Classifier: Development Status :: 4 - Beta
|
|
9
|
+
Classifier: Environment :: Console
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Classifier: Topic :: Software Development :: Code Generators
|
|
16
|
+
Requires-Python: >=3.10
|
|
17
|
+
Requires-Dist: jinja2>=3.1.0
|
|
18
|
+
Requires-Dist: typer>=0.12.0
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
|
|
21
|
+
# fastapp-cli
|
|
22
|
+
|
|
23
|
+
FastAPI 项目脚手架:一条命令生成**完整、可直接运行**的 FastAPI 工程。
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
fastapp create my-server
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 特性
|
|
30
|
+
|
|
31
|
+
- **分层架构**:`api / schemas / crud / services / models` 分层,内置泛型 CRUD / Service 基类
|
|
32
|
+
- **开箱即用的工程能力**:统一响应 / 异常体系、TraceID 中间件、loguru 日志、pydantic-settings 多环境配置
|
|
33
|
+
- **分页 CRUD + 过滤**:基于 fastapi-pagination 与 fastapi-filter 的完整示例(`/api/v1/items`)
|
|
34
|
+
- **Celery 骨架**:默认 redis broker,本地无 redis 时启动自动降级 `memory://` 并告警
|
|
35
|
+
- **Alembic 迁移**:接入 SQLModel.metadata,含 autogenerate 过滤钩子
|
|
36
|
+
- **优雅降级**:MySQL 缺席不阻塞启动,`/api/v1/health` 返回 `database: up/down`
|
|
37
|
+
- **工程化配套**:Makefile、scripts/、pre-commit、ruff + mypy + pytest 配置全套
|
|
38
|
+
- **可选部署文件**:`--pm2` / `--docker` 按需生成
|
|
39
|
+
|
|
40
|
+
## 安装
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# uv tool(推荐)
|
|
44
|
+
uv tool install fastapp-cli
|
|
45
|
+
|
|
46
|
+
# 或 pipx
|
|
47
|
+
pipx install fastapp-cli
|
|
48
|
+
|
|
49
|
+
# 或一次性使用
|
|
50
|
+
uvx fastapp create demo
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 使用
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
fastapp create <project_name> [options]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
| 参数 | 默认 | 说明 |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| `project_name` | 必填 | 项目名;小写字母/数字/连字符,如 `my-server` |
|
|
62
|
+
| `--description` | 交互提问 | 项目描述 |
|
|
63
|
+
| `--pm2 / --no-pm2` | 交互提问 | 是否生成 `pm2.config.json` |
|
|
64
|
+
| `--docker / --no-docker` | 交互提问 | 是否生成 `Dockerfile` |
|
|
65
|
+
| `--python` | `3.12` | 目标 Python 版本(写入 `.python-version`) |
|
|
66
|
+
| `--author` | `git config user.name` | 作者署名 |
|
|
67
|
+
| `--force` | 关 | 目标目录已存在时覆盖重建 |
|
|
68
|
+
| `--no-git` | 关 | 跳过 `git init` |
|
|
69
|
+
|
|
70
|
+
全部关键项通过 flag 提供时零交互:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
fastapp create my-server --description "demo" --no-pm2 --no-docker
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
生成完成后:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
cd my-server && uv sync
|
|
80
|
+
make dev # 访问 /api/v1/docs
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 生成项目依赖
|
|
84
|
+
|
|
85
|
+
fastapi、sqlmodel、alembic、celery[redis]、fastapi-pagination、fastapi-filter、loguru、pydantic-settings 等,dev 组含 pytest / ruff / mypy / pre-commit。
|
|
86
|
+
|
|
87
|
+
## 开发 fastapp-cli 自身
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
uv sync --group dev
|
|
91
|
+
uv run pytest # 单元 + 冒烟测试
|
|
92
|
+
uv run ruff check .
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## 发布
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
uv build # 构建 sdist + wheel(模板随包发布)
|
|
99
|
+
uv publish # 发布到 PyPI
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
版本策略:v0.1.0 起,语义化版本。
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
fastapp_cli/__init__.py,sha256=qFCT_E_SW3FQo1M8JsfHpFZ8N9uzPBZvAwKEwxfLmOs,67
|
|
2
|
+
fastapp_cli/create.py,sha256=73uzI0rzE-aOtEqU-cOyqnTNqdNtDMyn4pzAbMEeQrU,4780
|
|
3
|
+
fastapp_cli/main.py,sha256=esejW58f6yQWRB-Guo4tA_-DMy2hheeaUobKay_Z8ps,572
|
|
4
|
+
fastapp_cli/naming.py,sha256=hqf5Zp7UPbLfTshkBzqmdfs4l3BK13OWPLAM6PRizgI,1256
|
|
5
|
+
fastapp_cli/prompts.py,sha256=Q_NPpJpNWeY7yt7iR4vp6fN2FxsKiiI_i9DpLVZyYRQ,1021
|
|
6
|
+
fastapp_cli/render.py,sha256=nGINL23Cj01wXZHLSX_jX6Psn8ifnHIpZtGHobL3Weg,4552
|
|
7
|
+
fastapp_cli/templates/__init__.py,sha256=zhjzr92oq_fzKzAIz3pvBBBdlosqDTIZSKv3aoSmAk4,35
|
|
8
|
+
fastapp_cli/templates/project/.env.development.example.j2,sha256=NInJETzOsXXU2eGVKc0i6lhNu9mXBrzJ4JUKlk7P5AY,493
|
|
9
|
+
fastapp_cli/templates/project/.env.example.j2,sha256=j6mzuST_BkRBZndroXu23QGa0IoeWH9qe0Ru_erQywc,763
|
|
10
|
+
fastapp_cli/templates/project/.env.j2,sha256=7ugrW889G-wjYrR5As45FktyhDwLykgiR3qfLuEBxOM,773
|
|
11
|
+
fastapp_cli/templates/project/.gitignore,sha256=V1ZXTBYK__a3sPmb4OkVpEGI9xRc6_hi2nXBoUgRcq0,3364
|
|
12
|
+
fastapp_cli/templates/project/.pre-commit-config.yaml.j2,sha256=CN152QtO6CXHPHNQdkPUuDOb9Epn2ASHoks1fofOAj4,2676
|
|
13
|
+
fastapp_cli/templates/project/.python-version.j2,sha256=qmjmizmsXLw7uI3xvWI-IYz8E_WZeAlZPJZ6gzaNtjs,21
|
|
14
|
+
fastapp_cli/templates/project/Dockerfile.j2,sha256=k8pc57spoMaOqYUiBMD6Q_JX2-Lz3I2HgqW9Ni-kEQE,424
|
|
15
|
+
fastapp_cli/templates/project/Makefile.j2,sha256=XfEwUoWMU2eRBGKn4D0t9AFYbB9YLwt6kk2gwVldjfY,595
|
|
16
|
+
fastapp_cli/templates/project/README.md.j2,sha256=bOp7vFJ8o3I87fhn7Ra6aanP4qeMR6uDdr9UPDS1hn4,2689
|
|
17
|
+
fastapp_cli/templates/project/alembic.ini.j2,sha256=AlnCAgT-Km5EDrBkWKF5QXjwWjZ2PPy2KN1B3O3Rpyg,948
|
|
18
|
+
fastapp_cli/templates/project/pm2.config.json.j2,sha256=YUXTHi2hI3lE2c66XBuNeOVBbuT83qtUqRZGVZC39ts,1101
|
|
19
|
+
fastapp_cli/templates/project/pyproject.toml.j2,sha256=U2XiDOq-bnkuS27KxOiDpCYtAoq1cOE2cZh-YopLR24,6391
|
|
20
|
+
fastapp_cli/templates/project/alembic/env.py.j2,sha256=FD6sYlQSRCur7pMPUN_zmgHlS8qbGityKMVE80dHSlU,2641
|
|
21
|
+
fastapp_cli/templates/project/alembic/script.py.mako,sha256=Z9nr1bIwmfCe6qX_XQSJJUB1RNSxcGOX-7qi3B83IMY,687
|
|
22
|
+
fastapp_cli/templates/project/alembic/versions/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
|
+
fastapp_cli/templates/project/app/__init__.py.j2,sha256=HOYtpxjqEGAS2_c_rmbopvOS5qy6FRI_J4pAiSYOuDU,10
|
|
24
|
+
fastapp_cli/templates/project/app/main.py.j2,sha256=miI0v6SHhhnL0olyae2bdkT5_rZN1ZYBM_YZN_ie1nc,3736
|
|
25
|
+
fastapp_cli/templates/project/app/api/__init__.py.j2,sha256=VHtktKr-UQmKf8Yx1LA64J08b_Ga4P40vL_k0540wro,17
|
|
26
|
+
fastapp_cli/templates/project/app/api/deps.py.j2,sha256=JOeAQM4DQMmLKtPON5av_TL2hXBIASQfvuSUo5JrGzM,1102
|
|
27
|
+
fastapp_cli/templates/project/app/api/v1/__init__.py.j2,sha256=x24359gFTf_2ne3iDo2viPo5mCdopg2PrQBYpkYsiX0,23
|
|
28
|
+
fastapp_cli/templates/project/app/api/v1/router.py.j2,sha256=BPjdyDjpQDVHBfW0mUDvA83bxV7qSbphwvr9-Nlexcs,274
|
|
29
|
+
fastapp_cli/templates/project/app/api/v1/endpoints/__init__.py.j2,sha256=jGNKbV7f_FZxMqVOXtFyEcOMGdaySGFNHg6FO414dVM,36
|
|
30
|
+
fastapp_cli/templates/project/app/api/v1/endpoints/health.py.j2,sha256=VQRKrGsbPqu6oI5PbGWIbjGFfD8tGr7fBSOlnR-YI64,804
|
|
31
|
+
fastapp_cli/templates/project/app/api/v1/endpoints/items.py.j2,sha256=0CY0DPY0ngQ-ZzK5qfgjDqBqQMxtIK4HLOjST4NaqlM,2125
|
|
32
|
+
fastapp_cli/templates/project/app/core/__init__.py.j2,sha256=e81XIYVsR5JFoTjAYaHSgwMbrvZFslkg5NHYduhoebw,18
|
|
33
|
+
fastapp_cli/templates/project/app/core/celery_app.py.j2,sha256=wRKn8f8R0sa_gLdQIDZW-XtSg4_DAt8XFrWNWWgV8Zs,1990
|
|
34
|
+
fastapp_cli/templates/project/app/core/config.py.j2,sha256=78U5T4TwNPL1YfFarRt_QEiCDDGZfDrEXy8QRnISPfA,3418
|
|
35
|
+
fastapp_cli/templates/project/app/core/context_var.py.j2,sha256=9kJTc62lrwQ-gR90hU4onmYS07EedvlHdrsiRuIdBeE,393
|
|
36
|
+
fastapp_cli/templates/project/app/core/database.py.j2,sha256=cU9qRBKv5v4JqXvYGnsFYK7lwRl61aG1tTEt-vCh6ss,1632
|
|
37
|
+
fastapp_cli/templates/project/app/core/exceptions.py.j2,sha256=QB9hDnM-vkAGyKxpkRWZP6nnYaS03CzfUlRARYvfESg,4679
|
|
38
|
+
fastapp_cli/templates/project/app/core/logging.py.j2,sha256=srcg78850B9IZEC7cNh8T4rZHUH-nHTY0XYLSYgyHTs,4633
|
|
39
|
+
fastapp_cli/templates/project/app/core/middleware.py.j2,sha256=n4WDvcs4ESDUv9c2u2uYwH9gcckz9zIfHfCH19DurrU,1370
|
|
40
|
+
fastapp_cli/templates/project/app/crud/__init__.py.j2,sha256=bXK8xQojkL-Dzunseo2kG6xifn9UUYENbuuA9prLCH8,18
|
|
41
|
+
fastapp_cli/templates/project/app/crud/base.py.j2,sha256=xAuaNnKhjmJLAvNfAjBtl9rWs6ozl0c9SBRTMTtS7yA,8317
|
|
42
|
+
fastapp_cli/templates/project/app/crud/item.py.j2,sha256=HCDcISBdL0G5OFlHN6R5wCMhSX5cp4c6zXyxBDb4K7Q,165
|
|
43
|
+
fastapp_cli/templates/project/app/models/__init__.py.j2,sha256=MQuQgQKK1GWUJelOhwaVQtTMhiNwj2kkX-PCmhhzevU,165
|
|
44
|
+
fastapp_cli/templates/project/app/models/base.py.j2,sha256=d0iqUD-lCinCLZPhQRFioBupyrMIKMgFY9JI3y560e0,1665
|
|
45
|
+
fastapp_cli/templates/project/app/models/item.py.j2,sha256=-jfZ9tuh_-JeewyM8nj2m_m3ovMSRhvPaVGecG2VE0w,628
|
|
46
|
+
fastapp_cli/templates/project/app/schemas/__init__.py.j2,sha256=EgTl4CaiQrmz5EpHs3xy3EGImsZHjlaT3VUMj1MdGC8,21
|
|
47
|
+
fastapp_cli/templates/project/app/schemas/common.py.j2,sha256=ctHQ6WR_-XI7KhGOGoUo4-mX-xhuXZGPoVLY3bOvRdE,2279
|
|
48
|
+
fastapp_cli/templates/project/app/schemas/item.py.j2,sha256=XMEuPKYWLJrCczeIGFdpPoKXD1l3jR6EvlWEyH-dSyg,1037
|
|
49
|
+
fastapp_cli/templates/project/app/services/__init__.py.j2,sha256=Ctx-aTWgPrEsjpJGKxLxCoGxZuVsepJ67X6XLx-Ske8,22
|
|
50
|
+
fastapp_cli/templates/project/app/services/base.py.j2,sha256=2c5sxkXq2pSszfdfdJvug0niZykKGu3QdurYPu10xcI,2742
|
|
51
|
+
fastapp_cli/templates/project/app/services/item_service.py.j2,sha256=At3RNulYyfIBI2oQoDtT4vihRwVprt6Dt91flBcHMzI,192
|
|
52
|
+
fastapp_cli/templates/project/app/tasks/__init__.py.j2,sha256=L302vJrLaiy-tlW_Cgka2E9baYtga9hv-p9-nLq7mx0,19
|
|
53
|
+
fastapp_cli/templates/project/app/tasks/sample_tasks.py.j2,sha256=a5uGmymimeoShSN3A5ieitknJPQLe6HZrpHRMm_9i_U,802
|
|
54
|
+
fastapp_cli/templates/project/app/utils/__init__.py.j2,sha256=nD_PAGL8PLUIq9hfUfaXXPvjV-E4Pw2_ItR76wuGMoE,19
|
|
55
|
+
fastapp_cli/templates/project/docs/SQLModel定义示例.md,sha256=SwGKOKxMAzNgQ0cuO2LpeaFFV48HssBkvrkzeNYheF4,10064
|
|
56
|
+
fastapp_cli/templates/project/scripts/celery_beat.sh.j2,sha256=7_S6MblPhGFw67IXYJsuej9-_AV2pLBpl45ZeVRGqWc,217
|
|
57
|
+
fastapp_cli/templates/project/scripts/celery_flower.sh.j2,sha256=S-kTYD7xA8c7ZAEYyNIuiKNZ12sLb3mjxvBixaCefKA,603
|
|
58
|
+
fastapp_cli/templates/project/scripts/celery_worker.sh.j2,sha256=4k3hKNP3J0RRS7TnObcn6Eza9iDRcSGQgUF4WpTcssM,328
|
|
59
|
+
fastapp_cli/templates/project/scripts/start.sh.j2,sha256=hKY2bQv7-CwZsr4hUhO1Er-OYTCp4n5jLMUPrAnemlc,501
|
|
60
|
+
fastapp_cli/templates/project/tests/conftest.py.j2,sha256=1fVdvNF7io7UMX31b-Sh_6RDpTMvtu_fTjFJQfSWYpM,1768
|
|
61
|
+
fastapp_cli/templates/project/tests/api/test_health.py.j2,sha256=-sRDDETLcdrKfuoV-5IXgbnCERqPJQ2OmC4s5jwPe-s,457
|
|
62
|
+
fastapp_cli/templates/project/tests/api/test_items.py.j2,sha256=qholB9OhVhbGc_oLZwISzkeoKc6bKYGjW8VPgUYEEDM,2040
|
|
63
|
+
fastapp_cli/templates/project/tests/services/test_item_service.py.j2,sha256=pKHc64MJsv5b2NuX7hFpqzj2MbBZu5Kexe4VeTqpnYE,1313
|
|
64
|
+
fastapp_cli-0.1.0.dist-info/METADATA,sha256=RhvhOPqzJ0kcNxedZ9DjlRt1dqux0Ma-718Dg25DP5k,3161
|
|
65
|
+
fastapp_cli-0.1.0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
|
|
66
|
+
fastapp_cli-0.1.0.dist-info/entry_points.txt,sha256=NONIEhUlTtuFCmV7CEykJzPhpjsplc7XLuWbjhFzFuc,49
|
|
67
|
+
fastapp_cli-0.1.0.dist-info/RECORD,,
|