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.
Files changed (67) hide show
  1. fastapp_cli/__init__.py +3 -0
  2. fastapp_cli/create.py +157 -0
  3. fastapp_cli/main.py +33 -0
  4. fastapp_cli/naming.py +39 -0
  5. fastapp_cli/prompts.py +35 -0
  6. fastapp_cli/render.py +130 -0
  7. fastapp_cli/templates/__init__.py +1 -0
  8. fastapp_cli/templates/project/.env.development.example.j2 +21 -0
  9. fastapp_cli/templates/project/.env.example.j2 +29 -0
  10. fastapp_cli/templates/project/.env.j2 +27 -0
  11. fastapp_cli/templates/project/.gitignore +178 -0
  12. fastapp_cli/templates/project/.pre-commit-config.yaml.j2 +80 -0
  13. fastapp_cli/templates/project/.python-version.j2 +1 -0
  14. fastapp_cli/templates/project/Dockerfile.j2 +17 -0
  15. fastapp_cli/templates/project/Makefile.j2 +31 -0
  16. fastapp_cli/templates/project/README.md.j2 +68 -0
  17. fastapp_cli/templates/project/alembic/env.py.j2 +84 -0
  18. fastapp_cli/templates/project/alembic/script.py.mako +28 -0
  19. fastapp_cli/templates/project/alembic/versions/.gitkeep +0 -0
  20. fastapp_cli/templates/project/alembic.ini.j2 +50 -0
  21. fastapp_cli/templates/project/app/__init__.py.j2 +1 -0
  22. fastapp_cli/templates/project/app/api/__init__.py.j2 +1 -0
  23. fastapp_cli/templates/project/app/api/deps.py.j2 +33 -0
  24. fastapp_cli/templates/project/app/api/v1/__init__.py.j2 +1 -0
  25. fastapp_cli/templates/project/app/api/v1/endpoints/__init__.py.j2 +1 -0
  26. fastapp_cli/templates/project/app/api/v1/endpoints/health.py.j2 +33 -0
  27. fastapp_cli/templates/project/app/api/v1/endpoints/items.py.j2 +90 -0
  28. fastapp_cli/templates/project/app/api/v1/router.py.j2 +9 -0
  29. fastapp_cli/templates/project/app/core/__init__.py.j2 +1 -0
  30. fastapp_cli/templates/project/app/core/celery_app.py.j2 +62 -0
  31. fastapp_cli/templates/project/app/core/config.py.j2 +105 -0
  32. fastapp_cli/templates/project/app/core/context_var.py.j2 +13 -0
  33. fastapp_cli/templates/project/app/core/database.py.j2 +50 -0
  34. fastapp_cli/templates/project/app/core/exceptions.py.j2 +175 -0
  35. fastapp_cli/templates/project/app/core/logging.py.j2 +125 -0
  36. fastapp_cli/templates/project/app/core/middleware.py.j2 +39 -0
  37. fastapp_cli/templates/project/app/crud/__init__.py.j2 +1 -0
  38. fastapp_cli/templates/project/app/crud/base.py.j2 +229 -0
  39. fastapp_cli/templates/project/app/crud/item.py.j2 +10 -0
  40. fastapp_cli/templates/project/app/main.py.j2 +118 -0
  41. fastapp_cli/templates/project/app/models/__init__.py.j2 +10 -0
  42. fastapp_cli/templates/project/app/models/base.py.j2 +59 -0
  43. fastapp_cli/templates/project/app/models/item.py.j2 +22 -0
  44. fastapp_cli/templates/project/app/schemas/__init__.py.j2 +1 -0
  45. fastapp_cli/templates/project/app/schemas/common.py.j2 +81 -0
  46. fastapp_cli/templates/project/app/schemas/item.py.j2 +35 -0
  47. fastapp_cli/templates/project/app/services/__init__.py.j2 +1 -0
  48. fastapp_cli/templates/project/app/services/base.py.j2 +79 -0
  49. fastapp_cli/templates/project/app/services/item_service.py.j2 +10 -0
  50. fastapp_cli/templates/project/app/tasks/__init__.py.j2 +1 -0
  51. fastapp_cli/templates/project/app/tasks/sample_tasks.py.j2 +28 -0
  52. fastapp_cli/templates/project/app/utils/__init__.py.j2 +1 -0
  53. fastapp_cli/templates/project/docs/SQLModel/345/256/232/344/271/211/347/244/272/344/276/213.md +400 -0
  54. fastapp_cli/templates/project/pm2.config.json.j2 +47 -0
  55. fastapp_cli/templates/project/pyproject.toml.j2 +195 -0
  56. fastapp_cli/templates/project/scripts/celery_beat.sh.j2 +9 -0
  57. fastapp_cli/templates/project/scripts/celery_flower.sh.j2 +22 -0
  58. fastapp_cli/templates/project/scripts/celery_worker.sh.j2 +15 -0
  59. fastapp_cli/templates/project/scripts/start.sh.j2 +17 -0
  60. fastapp_cli/templates/project/tests/api/test_health.py.j2 +15 -0
  61. fastapp_cli/templates/project/tests/api/test_items.py.j2 +61 -0
  62. fastapp_cli/templates/project/tests/conftest.py.j2 +61 -0
  63. fastapp_cli/templates/project/tests/services/test_item_service.py.j2 +44 -0
  64. fastapp_cli-0.1.0.dist-info/METADATA +102 -0
  65. fastapp_cli-0.1.0.dist-info/RECORD +67 -0
  66. fastapp_cli-0.1.0.dist-info/WHEEL +4 -0
  67. 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,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ fastapp = fastapp_cli.main:app