FastAPI-fastkit 1.4.0__py3-none-any.whl → 1.5.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 (39) hide show
  1. fastapi_fastkit/__init__.py +1 -1
  2. fastapi_fastkit/backend/inspection/context.py +4 -0
  3. fastapi_fastkit/backend/inspection/core.py +5 -1
  4. fastapi_fastkit/backend/inspection/docker.py +150 -15
  5. fastapi_fastkit/backend/inspection/lint.py +44 -30
  6. fastapi_fastkit/backend/inspection/smoke.py +67 -13
  7. fastapi_fastkit/backend/inspection/strategies.py +32 -1
  8. fastapi_fastkit/backend/main.py +35 -40
  9. fastapi_fastkit/backend/route_generators.py +163 -0
  10. fastapi_fastkit/backend/route_wiring.py +117 -0
  11. fastapi_fastkit/backend/transducer.py +101 -2
  12. fastapi_fastkit/cli.py +13 -2
  13. fastapi_fastkit/core/settings.py +3 -3
  14. fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/pyproject.toml-tpl +1 -1
  15. fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/requirements.txt-tpl +1 -1
  16. fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/api/router.py-tpl +1 -1
  17. fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/router.py-tpl +1 -1
  18. fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/tests/conftest.py-tpl +16 -4
  19. fastapi_fastkit/fastapi_project_template/fastapi-mcp/.env-tpl +1 -1
  20. fastapi_fastkit/fastapi_project_template/fastapi-mcp/README.md-tpl +1 -1
  21. fastapi_fastkit/fastapi_project_template/fastapi-mcp/pyproject.toml-tpl +2 -3
  22. fastapi_fastkit/fastapi_project_template/fastapi-mcp/requirements.txt-tpl +5 -9
  23. fastapi_fastkit/fastapi_project_template/fastapi-mcp/setup.cfg-tpl +2 -3
  24. fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/routes/auth.py-tpl +9 -9
  25. fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/auth/dependencies.py-tpl +2 -2
  26. fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/core/config.py-tpl +1 -1
  27. fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/.env-tpl +2 -0
  28. fastapi_fastkit/fastapi_project_template/modules/domain/__init__.py-tpl +10 -0
  29. fastapi_fastkit/fastapi_project_template/modules/domain/models.py-tpl +11 -0
  30. fastapi_fastkit/fastapi_project_template/modules/domain/repository.py-tpl +50 -0
  31. fastapi_fastkit/fastapi_project_template/modules/domain/router.py-tpl +66 -0
  32. fastapi_fastkit/fastapi_project_template/modules/domain/schemas.py-tpl +16 -0
  33. fastapi_fastkit/fastapi_project_template/modules/domain/service.py-tpl +47 -0
  34. fastapi_fastkit/fragments/auth/jwt.py.j2 +6 -6
  35. {fastapi_fastkit-1.4.0.dist-info → fastapi_fastkit-1.5.0.dist-info}/METADATA +31 -11
  36. {fastapi_fastkit-1.4.0.dist-info → fastapi_fastkit-1.5.0.dist-info}/RECORD +39 -31
  37. {fastapi_fastkit-1.4.0.dist-info → fastapi_fastkit-1.5.0.dist-info}/WHEEL +1 -1
  38. {fastapi_fastkit-1.4.0.dist-info → fastapi_fastkit-1.5.0.dist-info}/entry_points.txt +0 -0
  39. {fastapi_fastkit-1.4.0.dist-info → fastapi_fastkit-1.5.0.dist-info}/licenses/LICENSE +0 -0
@@ -3,10 +3,10 @@ Authentication-related API endpoints.
3
3
  """
4
4
  from datetime import datetime, timedelta, timezone
5
5
 
6
+ import jwt
6
7
  from fastapi import APIRouter, Depends, HTTPException, status
7
8
  from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
8
- from jose import jwt
9
- from passlib.context import CryptContext
9
+ from pwdlib import PasswordHash
10
10
 
11
11
  from src.auth.dependencies import get_current_active_user
12
12
  from src.core.config import settings
@@ -14,8 +14,8 @@ from src.schemas.items import AuthToken, UserInfo, UserLogin
14
14
 
15
15
  router = APIRouter()
16
16
 
17
- # Password hashing
18
- pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
17
+ # Password hashing — argon2id, the recommended default for new applications.
18
+ password_hash = PasswordHash.recommended()
19
19
 
20
20
  # OAuth2 scheme
21
21
  oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@@ -25,19 +25,19 @@ mock_users = {
25
25
  "user1": {
26
26
  "user_id": "user1",
27
27
  "username": "user1",
28
- "hashed_password": pwd_context.hash("password123"),
28
+ "hashed_password": password_hash.hash("password123"),
29
29
  "active": True,
30
30
  },
31
31
  "user2": {
32
32
  "user_id": "user2",
33
33
  "username": "user2",
34
- "hashed_password": pwd_context.hash("password456"),
34
+ "hashed_password": password_hash.hash("password456"),
35
35
  "active": True,
36
36
  },
37
37
  "admin": {
38
38
  "user_id": "admin",
39
39
  "username": "admin",
40
- "hashed_password": pwd_context.hash("admin123"),
40
+ "hashed_password": password_hash.hash("admin123"),
41
41
  "active": True,
42
42
  },
43
43
  }
@@ -45,12 +45,12 @@ mock_users = {
45
45
 
46
46
  def verify_password(plain_password: str, hashed_password: str) -> bool:
47
47
  """Verify a password against its hash."""
48
- return pwd_context.verify(plain_password, hashed_password)
48
+ return password_hash.verify(plain_password, hashed_password)
49
49
 
50
50
 
51
51
  def get_password_hash(password: str) -> str:
52
52
  """Generate password hash."""
53
- return pwd_context.hash(password)
53
+ return password_hash.hash(password)
54
54
 
55
55
 
56
56
  def authenticate_user(username: str, password: str) -> dict | None:
@@ -2,9 +2,9 @@
2
2
  Authentication dependencies for API and MCP endpoints.
3
3
  """
4
4
 
5
+ import jwt
5
6
  from fastapi import Depends, HTTPException, status
6
7
  from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
7
- from jose import JWTError, jwt
8
8
 
9
9
  from src.core.config import settings
10
10
 
@@ -16,7 +16,7 @@ def verify_token(token: str) -> dict:
16
16
  try:
17
17
  payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM])
18
18
  return payload
19
- except JWTError:
19
+ except jwt.PyJWTError:
20
20
  raise HTTPException(
21
21
  status_code=status.HTTP_401_UNAUTHORIZED,
22
22
  detail="Could not validate credentials",
@@ -28,7 +28,7 @@ class Settings(BaseSettings):
28
28
  MCP_DESCRIPTION: str = "FastAPI endpoints exposed as MCP tools"
29
29
 
30
30
  # Authentication settings
31
- SECRET_KEY: str = "your-secret-key-here"
31
+ SECRET_KEY: str = "your-secret-key-here-change-in-production"
32
32
  ALGORITHM: str = "HS256"
33
33
  ACCESS_TOKEN_EXPIRE_MINUTES: int = 30
34
34
 
@@ -1,4 +1,6 @@
1
1
  # Backend
2
+ # Must be one of the values accepted by src/core/config.py: development | production
3
+ ENVIRONMENT=development
2
4
  SECRET_KEY=changethis
3
5
 
4
6
  # Postgres
@@ -0,0 +1,10 @@
1
+ # --------------------------------------------------------------------------
2
+ # <new_route> domain.
3
+ # --------------------------------------------------------------------------
4
+ from <domain_module> import ( # noqa: F401
5
+ models,
6
+ repository,
7
+ router,
8
+ schemas,
9
+ service,
10
+ )
@@ -0,0 +1,11 @@
1
+ # --------------------------------------------------------------------------
2
+ # <new_route> domain models.
3
+ # --------------------------------------------------------------------------
4
+
5
+ from dataclasses import dataclass
6
+
7
+
8
+ @dataclass
9
+ class <entity_class>:
10
+ id: int
11
+ name: str
@@ -0,0 +1,50 @@
1
+ # --------------------------------------------------------------------------
2
+ # <new_route> repository.
3
+ #
4
+ # Data is stored in memory, lost on restart, and not shared between workers.
5
+ # --------------------------------------------------------------------------
6
+
7
+ from threading import Lock
8
+
9
+ from <domain_module>.models import <entity_class>
10
+
11
+
12
+ class <entity_class>Repository:
13
+ """In-memory storage for <entity_class>."""
14
+
15
+ def __init__(self) -> None:
16
+ self._data: dict[int, <entity_class>] = {}
17
+ self._next_id = 1
18
+ self._lock = Lock()
19
+
20
+ def list_all(self) -> list[<entity_class>]:
21
+ with self._lock:
22
+ return list(self._data.values())
23
+
24
+ def get(self, entity_id: int) -> <entity_class> | None:
25
+ with self._lock:
26
+ return self._data.get(entity_id)
27
+
28
+ def add(self, name: str) -> <entity_class>:
29
+ with self._lock:
30
+ entity = <entity_class>(id=self._next_id, name=name)
31
+ self._data[entity.id] = entity
32
+ self._next_id += 1
33
+ return entity
34
+
35
+ def replace(self, entity_id: int, name: str) -> <entity_class> | None:
36
+ with self._lock:
37
+ if entity_id not in self._data:
38
+ return None
39
+ entity = <entity_class>(id=entity_id, name=name)
40
+ self._data[entity_id] = entity
41
+ return entity
42
+
43
+ def delete(self, entity_id: int) -> bool:
44
+ with self._lock:
45
+ return self._data.pop(entity_id, None) is not None
46
+
47
+ def reset(self) -> None:
48
+ with self._lock:
49
+ self._data.clear()
50
+ self._next_id = 1
@@ -0,0 +1,66 @@
1
+ # --------------------------------------------------------------------------
2
+ # <new_route> API routes.
3
+ # --------------------------------------------------------------------------
4
+
5
+ from fastapi import APIRouter, Depends, HTTPException, Response, status
6
+ from <domain_module>.schemas import <entity_class>Create, <entity_class>Read
7
+ from <domain_module>.service import <entity_class>NotFoundError, <entity_class>Service
8
+
9
+ router = APIRouter()
10
+
11
+
12
+ def get_<new_route>_service() -> <entity_class>Service:
13
+ return <entity_class>Service()
14
+
15
+
16
+ @router.get("", response_model=list[<entity_class>Read])
17
+ def list_<new_route>(
18
+ service: <entity_class>Service = Depends(get_<new_route>_service),
19
+ ) -> list[<entity_class>Read]:
20
+ return [<entity_class>Read.model_validate(entity) for entity in service.list_<new_route>()]
21
+
22
+
23
+ @router.get("/{entity_id}", response_model=<entity_class>Read)
24
+ def get_<new_route>(
25
+ entity_id: int, service: <entity_class>Service = Depends(get_<new_route>_service)
26
+ ) -> <entity_class>Read:
27
+ try:
28
+ return <entity_class>Read.model_validate(service.get_<new_route>(entity_id))
29
+ except <entity_class>NotFoundError as exc:
30
+ raise HTTPException(
31
+ status_code=status.HTTP_404_NOT_FOUND, detail=str(exc)
32
+ ) from exc
33
+
34
+
35
+ @router.post("", response_model=<entity_class>Read, status_code=status.HTTP_201_CREATED)
36
+ def create_<new_route>(
37
+ payload: <entity_class>Create, service: <entity_class>Service = Depends(get_<new_route>_service)
38
+ ) -> <entity_class>Read:
39
+ return <entity_class>Read.model_validate(service.create_<new_route>(payload))
40
+
41
+
42
+ @router.put("/{entity_id}", response_model=<entity_class>Read)
43
+ def replace_<new_route>(
44
+ entity_id: int,
45
+ payload: <entity_class>Create,
46
+ service: <entity_class>Service = Depends(get_<new_route>_service),
47
+ ) -> <entity_class>Read:
48
+ try:
49
+ return <entity_class>Read.model_validate(service.replace_<new_route>(entity_id, payload))
50
+ except <entity_class>NotFoundError as exc:
51
+ raise HTTPException(
52
+ status_code=status.HTTP_404_NOT_FOUND, detail=str(exc)
53
+ ) from exc
54
+
55
+
56
+ @router.delete("/{entity_id}", status_code=status.HTTP_204_NO_CONTENT)
57
+ def delete_<new_route>(
58
+ entity_id: int, service: <entity_class>Service = Depends(get_<new_route>_service)
59
+ ) -> Response:
60
+ try:
61
+ service.delete_<new_route>(entity_id)
62
+ except <entity_class>NotFoundError as exc:
63
+ raise HTTPException(
64
+ status_code=status.HTTP_404_NOT_FOUND, detail=str(exc)
65
+ ) from exc
66
+ return Response(status_code=status.HTTP_204_NO_CONTENT)
@@ -0,0 +1,16 @@
1
+ # --------------------------------------------------------------------------
2
+ # <new_route> API schemas.
3
+ # --------------------------------------------------------------------------
4
+
5
+ from pydantic import BaseModel, ConfigDict, Field
6
+
7
+
8
+ class <entity_class>Create(BaseModel):
9
+ name: str = Field(min_length=1, max_length=120)
10
+
11
+
12
+ class <entity_class>Read(BaseModel):
13
+ id: int
14
+ name: str
15
+
16
+ model_config = ConfigDict(from_attributes=True)
@@ -0,0 +1,47 @@
1
+ # --------------------------------------------------------------------------
2
+ # <new_route> service.
3
+ # --------------------------------------------------------------------------
4
+
5
+ from <domain_module>.models import <entity_class>
6
+ from <domain_module>.repository import <entity_class>Repository
7
+ from <domain_module>.schemas import <entity_class>Create
8
+
9
+ # Share the default repository between requests.
10
+ _default_repository = <entity_class>Repository()
11
+
12
+
13
+ def reset_store() -> None:
14
+ _default_repository.reset()
15
+
16
+
17
+ class <entity_class>NotFoundError(Exception):
18
+ """Raised when <entity_class> is not found."""
19
+
20
+
21
+ class <entity_class>Service:
22
+ """Business logic for <entity_class>."""
23
+
24
+ def __init__(self, repository: <entity_class>Repository | None = None) -> None:
25
+ self._repository = repository if repository is not None else _default_repository
26
+
27
+ def list_<new_route>(self) -> list[<entity_class>]:
28
+ return self._repository.list_all()
29
+
30
+ def get_<new_route>(self, entity_id: int) -> <entity_class>:
31
+ entity = self._repository.get(entity_id)
32
+ if entity is None:
33
+ raise <entity_class>NotFoundError(f"<entity_class> {entity_id} does not exist")
34
+ return entity
35
+
36
+ def create_<new_route>(self, payload: <entity_class>Create) -> <entity_class>:
37
+ return self._repository.add(name=payload.name)
38
+
39
+ def replace_<new_route>(self, entity_id: int, payload: <entity_class>Create) -> <entity_class>:
40
+ entity = self._repository.replace(entity_id=entity_id, name=payload.name)
41
+ if entity is None:
42
+ raise <entity_class>NotFoundError(f"<entity_class> {entity_id} does not exist")
43
+ return entity
44
+
45
+ def delete_<new_route>(self, entity_id: int) -> None:
46
+ if not self._repository.delete(entity_id=entity_id):
47
+ raise <entity_class>NotFoundError(f"<entity_class> {entity_id} does not exist")
@@ -1,8 +1,8 @@
1
1
  {% include "header.j2" %}
2
2
  from datetime import UTC, datetime, timedelta
3
3
 
4
- from jose import jwt
5
- from passlib.context import CryptContext
4
+ import jwt
5
+ from pwdlib import PasswordHash
6
6
  from pydantic_settings import BaseSettings, SettingsConfigDict
7
7
 
8
8
 
@@ -18,18 +18,18 @@ class AuthSettings(BaseSettings):
18
18
 
19
19
  settings = AuthSettings()
20
20
 
21
- # Password hashing
22
- pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
21
+ # Password hashing — argon2id, the recommended default for new applications.
22
+ password_hash = PasswordHash.recommended()
23
23
 
24
24
 
25
25
  def verify_password(plain_password: str, hashed_password: str) -> bool:
26
26
  """Verify a password against a hash."""
27
- return pwd_context.verify(plain_password, hashed_password)
27
+ return password_hash.verify(plain_password, hashed_password)
28
28
 
29
29
 
30
30
  def get_password_hash(password: str) -> str:
31
31
  """Hash a password."""
32
- return pwd_context.hash(password)
32
+ return password_hash.hash(password)
33
33
 
34
34
 
35
35
  def create_access_token(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: FastAPI-fastkit
3
- Version: 1.4.0
3
+ Version: 1.5.0
4
4
  Summary: Fast, easy-to-use starter kit for new users of Python and FastAPI
5
5
  Author-Email: bnbong <bbbong9@gmail.com>
6
6
  License: MIT
@@ -20,6 +20,7 @@ Requires-Dist: pre-commit>=4.0.1; extra == "dev"
20
20
  Requires-Dist: mypy>=1.12.0; extra == "dev"
21
21
  Requires-Dist: isort>=5.13.2; extra == "dev"
22
22
  Requires-Dist: pygments>=2.20.0; extra == "dev"
23
+ Requires-Dist: virtualenv>=21.7.13; extra == "dev"
23
24
  Requires-Dist: types-pyyaml>=6.0.12.20260408; extra == "dev"
24
25
  Description-Content-Type: text/markdown
25
26
 
@@ -82,7 +83,9 @@ $ pip install FastAPI-fastkit
82
83
  ```console
83
84
  fastkit init [OPTIONS]
84
85
  ```
85
- - What it does: Scaffolds an empty FastAPI project, creates a virtual environment, installs dependencies
86
+ > [!TIP]
87
+ > Scaffolds an empty FastAPI project, creates a virtual environment, installs dependencies
88
+
86
89
  - Key options:
87
90
  - `--project-name`, `--author`, `--author-email`, `--description`
88
91
  - `--package-manager` [pip|uv|pdm|poetry]
@@ -98,7 +101,9 @@ fastkit init [OPTIONS]
98
101
  ```console
99
102
  fastkit init --interactive
100
103
  ```
101
- - What it does: Guided step-by-step project setup with intelligent feature selection
104
+ > [!TIP]
105
+ > Guided step-by-step project setup with intelligent feature selection
106
+
102
107
  - Features:
103
108
  - **Architecture preset**: `minimal` | `single-module` | `classic-layered` | `domain-starter` (default)
104
109
  - **Database selection**: PostgreSQL, MySQL, MongoDB, Redis, SQLite
@@ -114,7 +119,7 @@ fastkit init --interactive
114
119
  - **Deployment**: Docker, docker-compose with auto-generated configs
115
120
  - **Package manager**: pip, uv, pdm, poetry
116
121
  - **Custom packages**: Add your own dependencies
117
- - Auto-generates (varies by preset — see [the matrix](https://bnbong.github.io/FastAPI-fastkit/reference/preset-feature-matrix/) for details):
122
+ - Auto-generates (varies by preset - see [the matrix](https://bnbong.github.io/FastAPI-fastkit/reference/preset-feature-matrix/) for details):
118
123
  - `main.py` regenerated from selected features for `minimal` / `single-module`; preserved as-shipped for `classic-layered` / `domain-starter`
119
124
  - Database and authentication configuration files at preset-specific paths
120
125
  - Docker deployment files (`Dockerfile`, `docker-compose.yml`) with the preset's correct uvicorn entrypoint
@@ -127,7 +132,9 @@ fastkit init --interactive
127
132
  ```console
128
133
  fastkit startdemo [TEMPLATE] [OPTIONS]
129
134
  ```
130
- - What it does: Creates a project from a template (e.g., `fastapi-default`) and installs dependencies
135
+ > [!TIP]
136
+ > Creates a project from a template (e.g., `fastapi-default`) and installs dependencies
137
+
131
138
  - Key options:
132
139
  - `--project-name`, `--author`, `--author-email`, `--description`
133
140
  - `--package-manager` [pip|uv|pdm|poetry]
@@ -135,12 +142,6 @@ fastkit startdemo [TEMPLATE] [OPTIONS]
135
142
  - Refuses to run if the target project directory already exists (`--dry-run` excepted)
136
143
  - Tip: List available templates with `fastkit list-templates`
137
144
 
138
- New in v1.4.0: `fastapi-auth-jwt` (JWT auth with refresh rotation),
139
- `fastapi-sqlmodel` (async SQLModel + Alembic + generic CRUD), and
140
- `fastapi-llm-agent` (streaming Claude agent with a tool loop).
141
- `fastapi-dockerized` and `fastapi-async-crud` are deprecated — they still
142
- work, but are no longer recommended starting points.
143
-
144
145
  ### Add a new route
145
146
  ```console
146
147
  fastkit addroute <project_name> <route_name>
@@ -160,6 +161,25 @@ fastkit runserver [OPTIONS]
160
161
  fastkit list-templates
161
162
  ```
162
163
 
164
+ Available templates:
165
+
166
+ | Template | Description | Notes |
167
+ |---|---|---|
168
+ | [`fastapi-default`](src/fastapi_fastkit/fastapi_project_template/fastapi-default/README.md-tpl) | Simple FastAPI project with a classic layered layout | Good first choice |
169
+ | [`fastapi-empty`](src/fastapi_fastkit/fastapi_project_template/fastapi-empty/README.md-tpl) | Minimal FastAPI template | Base for `minimal` preset |
170
+ | [`fastapi-single-module`](src/fastapi_fastkit/fastapi_project_template/fastapi-single-module/README.md-tpl) | Single-file FastAPI app | Base for `single-module` preset |
171
+ | [`fastapi-domain-starter`](src/fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/README.md-tpl) | Domain-oriented, pyproject-first starter for medium-sized APIs | Base for `domain-starter` preset |
172
+ | [`fastapi-auth-jwt`](src/fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/README.md-tpl) | JWT authentication with refresh-token rotation, argon2 hashing and scopes | New in v1.4.0 |
173
+ | [`fastapi-sqlmodel`](src/fastapi_fastkit/fastapi_project_template/fastapi-sqlmodel/README.md-tpl) | Async SQLModel + Alembic migrations + generic CRUD with pagination | New in v1.4.0 |
174
+ | [`fastapi-llm-agent`](src/fastapi_fastkit/fastapi_project_template/fastapi-llm-agent/README.md-tpl) | Streaming Claude chat agent (SSE) with a tool-call loop | New in v1.4.0 |
175
+ | [`fastapi-mcp`](src/fastapi_fastkit/fastapi_project_template/fastapi-mcp/README.md-tpl) | FastAPI app exposed as an MCP server | |
176
+ | [`fastapi-psql-orm`](src/fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/README.md-tpl) | Item management API with PostgreSQL, SQLModel, Alembic and docker-compose | Requires Docker |
177
+ | [`fastapi-custom-response`](src/fastapi_fastkit/fastapi_project_template/fastapi-custom-response/README.md-tpl) | Item management API with a custom response envelope, error handling and pagination | |
178
+ | [`fastapi-async-crud`](src/fastapi_fastkit/fastapi_project_template/fastapi-async-crud/README.md-tpl) | Async item management API | **Deprecated** — use `fastapi-sqlmodel` |
179
+ | [`fastapi-dockerized`](src/fastapi_fastkit/fastapi_project_template/fastapi-dockerized/README.md-tpl) | Dockerized item management API | **Deprecated** — use `fastapi-default` with the Docker option in `init --interactive` |
180
+
181
+ Deprecated templates still work but are no longer recommended starting points. See [Which starter should I choose?](https://bnbong.github.io/FastAPI-fastkit/user-guide/choosing-a-starter/) for a decision guide.
182
+
163
183
  ### Delete a project
164
184
  ```console
165
185
  fastkit deleteproject <project_name>
@@ -1,29 +1,29 @@
1
- fastapi_fastkit-1.4.0.dist-info/METADATA,sha256=wedGfADPNstm5uSxEkzj-L1R8aN_bT7ssYM3ObJ-b3o,11905
2
- fastapi_fastkit-1.4.0.dist-info/WHEEL,sha256=VP-D4TPS230sME9Z3vb3INXvo1yt0924YRm5AOsk_dE,90
3
- fastapi_fastkit-1.4.0.dist-info/entry_points.txt,sha256=IONmgb7zWPnJWsCOcpF3u1yP6AWnPjrgWIv49mr1DZE,76
4
- fastapi_fastkit-1.4.0.dist-info/licenses/LICENSE,sha256=2a9cYM3Uy8DW-so6zpYaqUafYT1Dznd3OCWCFe5CKNA,1066
5
- fastapi_fastkit/__init__.py,sha256=Fc7Dma-w6Qol1wV5ZlHolbiRE3Am7eHtFGZvbNRu_8E,23
1
+ fastapi_fastkit-1.5.0.dist-info/METADATA,sha256=L5ZxmtU6Zq81I3bUEQH41-8Sql6LHdIwKjxe5o1vnX4,14109
2
+ fastapi_fastkit-1.5.0.dist-info/WHEEL,sha256=IuIk3wbaEnFH1cx75iM2R1CmliRI3dFLXTbRakgvgFQ,90
3
+ fastapi_fastkit-1.5.0.dist-info/entry_points.txt,sha256=IONmgb7zWPnJWsCOcpF3u1yP6AWnPjrgWIv49mr1DZE,76
4
+ fastapi_fastkit-1.5.0.dist-info/licenses/LICENSE,sha256=2a9cYM3Uy8DW-so6zpYaqUafYT1Dznd3OCWCFe5CKNA,1066
5
+ fastapi_fastkit/__init__.py,sha256=fKcVJUCHyeAQEeedLhq_-ubvCgf_3xUy2Q8Kmmdi0VE,23
6
6
  fastapi_fastkit/__main__.py,sha256=-FS9yUe4IEgDbJjFC1xso-pFCxRzUJ447j6bYpsBTBM,271
7
7
  fastapi_fastkit/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  fastapi_fastkit/backend/inspection/__init__.py,sha256=hIw6MIOrt5GI52kQtYWsW1INbuVd64vG_OGU_rvfXXE,1088
9
9
  fastapi_fastkit/backend/inspection/checks.py,sha256=rW-CfDaPXejo1Hvoy7LskOKTdInZMK1wPj4hhl1z380,11946
10
10
  fastapi_fastkit/backend/inspection/consistency.py,sha256=kmW9D4eN2qCpiygezM4JpqFZ7SC7-wUImGt53ej4Vu4,4941
11
- fastapi_fastkit/backend/inspection/context.py,sha256=K5GsITSMsa-Pgl6eOmU1C5BqRcaq0Doc0pNEbt33F1E,2582
12
- fastapi_fastkit/backend/inspection/core.py,sha256=AB1eZLIcmdZWJ96XeO1Cs4pNzMbduWja_do1krrPEHs,13454
13
- fastapi_fastkit/backend/inspection/docker.py,sha256=fI6NvGnIdOh-HOItPRgM8hn6OeaAmZJnzcUSmgTJWIU,7112
11
+ fastapi_fastkit/backend/inspection/context.py,sha256=p0KBW6SaKZ2eHn8xY8zcF6mLOqi-4aHp6SCc9_Jz4yE,2846
12
+ fastapi_fastkit/backend/inspection/core.py,sha256=mg8LqrrhfOl5UZGRPEDIiPo5frTTimzBpytdwsRgTUc,13732
13
+ fastapi_fastkit/backend/inspection/docker.py,sha256=pMMSf7_sP83sq4Ibr4l6SLUjRtfoRloDHh5neGIEFLc,12305
14
14
  fastapi_fastkit/backend/inspection/freshness.py,sha256=CVpoV6IwrRTdSP9leaHD8CJU2OKZs-y_HcHiZ9Nbx7w,5418
15
15
  fastapi_fastkit/backend/inspection/fsutils.py,sha256=Vt_FNVBcJuU7qsR71lgQZrFy2WRqo056y7f5Up-D6Ds,4758
16
- fastapi_fastkit/backend/inspection/lint.py,sha256=Lu9rUQL-26VbqzMf_BA6L0llnQmOpuOaeCxue1XnOVY,2664
16
+ fastapi_fastkit/backend/inspection/lint.py,sha256=BEkrghyDY4Sl5NPsHzDi_3Trcjw4SvMTT3tSV_2DBgU,3591
17
17
  fastapi_fastkit/backend/inspection/report.py,sha256=BYkGkotGYXJIEnlolT1g8TxmZRg422ryEXGU2pLnEpI,1930
18
- fastapi_fastkit/backend/inspection/smoke.py,sha256=hDCv4BtFUs6urjOGE3vto9xh7qBwEQeyvM227z_6xAQ,12187
19
- fastapi_fastkit/backend/inspection/strategies.py,sha256=0rfESk2Vet5_-j3uWAZR86urUQEju9LskKEZVtdip-A,12329
18
+ fastapi_fastkit/backend/inspection/smoke.py,sha256=fkEp9l2R3DhkUpwr8qhGCRiYa6GSDvuiuSZfgHq9uIs,14203
19
+ fastapi_fastkit/backend/inspection/strategies.py,sha256=fyOBAcYk9iYUFNRmDE8VVfPLwMvdodUyj719byvZhF8,13546
20
20
  fastapi_fastkit/backend/inspector.py,sha256=73ZY7PQGQvxbbBwWPxfuudJcxOrLKvWkkzBUcS6YgGc,1002
21
21
  fastapi_fastkit/backend/interactive/__init__.py,sha256=wuCVfyaulyjGiG77X0C9sUwY2zr2S6rAGeCeh_17MVA,1873
22
22
  fastapi_fastkit/backend/interactive/config_builder.py,sha256=LKqmUiBw2-Dk5OPk4Ut8D2eYRQvWAfcNP0LyCzAVykE,6928
23
23
  fastapi_fastkit/backend/interactive/prompts.py,sha256=z6xLnStWliFAp_NzhbBGtNlRNQwqN7AO3Wb0TowxORA,22135
24
24
  fastapi_fastkit/backend/interactive/selectors.py,sha256=XXVurHN0_gesRWFrgzhVIG7igX6cCGGtUS4gY8gmOUI,8334
25
25
  fastapi_fastkit/backend/interactive/validators.py,sha256=WaRWuE6H2qQ5UExmHq3NQ41spiCyhbyk7QlYVXcfoHw,4651
26
- fastapi_fastkit/backend/main.py,sha256=0_ekIbxF6qBvwHtpZ2gJd--q39BZ-IXzV4ox4822DeE,61782
26
+ fastapi_fastkit/backend/main.py,sha256=XToW5ii-2ET0LXD1vVxzEQPeEFP3-NgQx262HETydrE,61927
27
27
  fastapi_fastkit/backend/package_managers/__init__.py,sha256=awSaY-pInI9K4mk1aWqdyKk143AGrcPI4NCy5l_48vw,691
28
28
  fastapi_fastkit/backend/package_managers/base.py,sha256=YtpnkjMNBQFJSH8pSQI-VIlqxQ6lbeyY2hZVKjgfi8w,11641
29
29
  fastapi_fastkit/backend/package_managers/factory.py,sha256=rqnIzdLn6T5UiXSy_WTIFsibAK2e8aRwyn-OC16sS9w,5579
@@ -36,12 +36,14 @@ fastapi_fastkit/backend/project_builder/config_generator.py,sha256=riyjO8iOj54N0
36
36
  fastapi_fastkit/backend/project_builder/config_schema.py,sha256=Vj4Mmkr35MnoVbSTOIFaKcR8z5Rfdgn-GBV7T3h_h8c,14093
37
37
  fastapi_fastkit/backend/project_builder/dependency_collector.py,sha256=vj0NYAi3KdvZ5jjgUxFSoP5J5KAHvqIsGdlU5H7xH48,7582
38
38
  fastapi_fastkit/backend/project_builder/preset_layout.py,sha256=E-I8JP3goHW5QwpACBC6LC7XX00c-5BNsPjVlDYOhVQ,16319
39
+ fastapi_fastkit/backend/route_generators.py,sha256=ymyJa-IDuWIYHZuiIn-8zUyOaAYs57nCL0ARNI-RY2s,6237
40
+ fastapi_fastkit/backend/route_wiring.py,sha256=BJZbZlT-H3LshCDGDWEpdbiEnVc5ruA71A6w1m11Tn8,4367
39
41
  fastapi_fastkit/backend/scaffolder.py,sha256=dduEeBN1cdwt_V3JxSxSepHEUMuEB0j-8Sq5FU8KnJ0,21702
40
- fastapi_fastkit/backend/transducer.py,sha256=ZWh5D9o-sBPpLoJYm1l_mT_ppcXYdSIlIdJe0iefDBk,8827
41
- fastapi_fastkit/cli.py,sha256=UxwJcLOkCspwVFnNgJQkbYQyTjsrcNdRpjNnRTE3Rgk,35305
42
+ fastapi_fastkit/backend/transducer.py,sha256=t0tHVNUpPgbQcwF6Ms9WhQ8ALl6MR1zL8CVbvKgD2rs,11977
43
+ fastapi_fastkit/cli.py,sha256=Msb4blZ0QnjcPxRW7Mtl_MI97J8_CI3G-ssRsT93F-I,35734
42
44
  fastapi_fastkit/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
45
  fastapi_fastkit/core/exceptions.py,sha256=W29lbDlKE_yKdS-m_QHaWdDB1j3yGge6mVx5mo_jLrU,972
44
- fastapi_fastkit/core/settings.py,sha256=uIOpO0ZUdUcwpZAUAMHXpJfgYw70TNfZAwSG-lPjJDM,15701
46
+ fastapi_fastkit/core/settings.py,sha256=v9IiAyU4bIYf8haTCAupr_qiDFscAGlc4g_XqyZ0jrU,15675
45
47
  fastapi_fastkit/fastapi_project_template/PROJECT_README_TEMPLATE.md,sha256=5lT_ZY1QItTDbhKYNY6KlOoGlbSTBSrs9DJthcle3D4,1529
46
48
  fastapi_fastkit/fastapi_project_template/README.md,sha256=rXwDDK5rGNVd7xWuNkjuu5KWBE27Yz0v-EW1FNxldXA,6637
47
49
  fastapi_fastkit/fastapi_project_template/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -77,8 +79,8 @@ fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/.gitignore-tpl,sha256=
77
79
  fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/Dockerfile-tpl,sha256=lLAHrVZvnXToGSUcOqGCYQHi3VaKziBsC89yIynUlVo,342
78
80
  fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/README.md-tpl,sha256=kplQU1S29P9d_K1chs2BiMpDdWfAJ0bFgTZyD2pWy9g,8102
79
81
  fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/alembic.ini-tpl,sha256=mFmPqRH42TM3_nqNF7uLYD3DKvE9pnb_9Unr0NL2t08,3747
80
- fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/pyproject.toml-tpl,sha256=UekapeGgLjkeJbazCyzzlA86481d4F7-l0T5iZKLYnk,1811
81
- fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/requirements.txt-tpl,sha256=jpl4SsNQK6SpJ_oEr9_ejCyfCYagtHg2LxouCDku3-Q,428
82
+ fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/pyproject.toml-tpl,sha256=aWEqiJ7WNzRCrQPN846XWb1WDTt0FVmJ7SEN8sKrSAY,1811
83
+ fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/requirements.txt-tpl,sha256=OpqabN8w2cLVvl6uH1pk9By-UAAXdPNRXSgqPleqo2I,428
82
84
  fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/scripts/format.sh-tpl,sha256=wivOKoO8NCXimBSWwLYGh43UW0ufHTRX1LiFm3ZVSmc,44
83
85
  fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/scripts/lint.sh-tpl,sha256=GUCLz6mGOTqrnInfybPoHKShE3_kCpnyzDRZtqelqY4,74
84
86
  fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/scripts/run-server.sh-tpl,sha256=ju9iKsqTBJJVni3_4knSmUnD72SXCNlG7MblPAIMnjg,97
@@ -219,7 +221,7 @@ fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/__init__.py-
219
221
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
220
222
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/api/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
221
223
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/api/health.py-tpl,sha256=k22K5KNeeIXgKvKRBALpHRsUeE5litdaXH4Z5XkG86c,379
222
- fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/api/router.py-tpl,sha256=5Q8_zh8w0do-fcPeDFx9ECT4C-FbbRQYU9DtucnkREU,533
224
+ fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/api/router.py-tpl,sha256=dfEoi7wsrQSy44Vx6l8giqnE9xgDb6VF2FE93evvb2E,566
223
225
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/core/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
224
226
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/core/config.py-tpl,sha256=NTqTESwvNwYgZ7SwPHFDy2KUVZP7AYpyxwKWZgbU9-k,1587
225
227
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/db/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -228,12 +230,12 @@ fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/
228
230
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/__init__.py-tpl,sha256=Oc05YNDcfBRuoQRY1zbPfxL3vzEnt4fWwlAqPsgCDP8,220
229
231
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/models.py-tpl,sha256=Ffnoe6CWURkRfLI3hpzpcp7gVQloNOLTAA0BMsjmYI0,522
230
232
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/repository.py-tpl,sha256=5_VlE3tLlk3-zr9BevKnoJlzRMrFF-m91duCl6LLv48,1773
231
- fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/router.py-tpl,sha256=oumRbsQ9VBPNgvSHSyK5W3KilNmaM58X362juHwrZ_4,2179
233
+ fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/router.py-tpl,sha256=lOt8EWrx3IqlEZfWZn2EmsJWACV8Ke4rmSLph3PWCQg,2148
232
234
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/schemas.py-tpl,sha256=fRKitiBpypPs_cI0eygL0VHAQD_2WjaCW0x2bJzfCjo,626
233
235
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/service.py-tpl,sha256=GnKArMWnZF1FpEBCLjIvum7eg_qM6zuM6LXMY759IdI,1842
234
236
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/main.py-tpl,sha256=Ww3sbrzI0CdWRp3DegTrO3QGhBjxjKbVYav5j7Gx6cE,801
235
237
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/tests/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
236
- fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/tests/conftest.py-tpl,sha256=c1b_Fj15LGW-N66CuRjdbxAeIculFpvO2uupsQ3V4vU,702
238
+ fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/tests/conftest.py-tpl,sha256=gWWRNo21GsWTcQNDSECICclaRz1lmaE758M9HQQX2SY,1081
237
239
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/tests/test_health.py-tpl,sha256=YXVLzRCXRmD6gHMNMmfyYJdwHHrasppWi-Ga0jCh6rs,421
238
240
  fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/tests/test_items.py-tpl,sha256=RLuMinBf_EqlkTfaUquBfUfRrX_IF2yBPKehITLzYmk,2132
239
241
  fastapi_fastkit/fastapi_project_template/fastapi-empty/.env-tpl,sha256=ER5_3eyFYRQUupKW7z1tBOcTVavwEqjzqbbt1kl-Be0,22
@@ -286,25 +288,25 @@ fastapi_fastkit/fastapi_project_template/fastapi-llm-agent/tests/test_chat.py-tp
286
288
  fastapi_fastkit/fastapi_project_template/fastapi-llm-agent/tests/test_health.py-tpl,sha256=JZwOjpKM_1R4vwTY41VbYgD0pNIxnXl_HUy7oWPqFAg,484
287
289
  fastapi_fastkit/fastapi_project_template/fastapi-llm-agent/tests/test_memory.py-tpl,sha256=MiQGVgEX0WdeMp7qFB31CFautIoYdHcOtHKm7eiO6e8,1272
288
290
  fastapi_fastkit/fastapi_project_template/fastapi-llm-agent/tests/test_tools.py-tpl,sha256=lDzyV70_YxpuymCOThFkNqXApYu4yd_tIk7lX6LJlLA,1439
289
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/.env-tpl,sha256=mmBW2Rz0aEIEuU6qDmr1jC5WF2vhU1u-A_7xsQe7iEc,664
290
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/README.md-tpl,sha256=V10bwMeygQPaNZZBkOxAZW0r7CDyDuiSXQK_FtMj8vA,6395
291
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/pyproject.toml-tpl,sha256=q6fg_Yua0MYlSZX8j3R8CyhYoVvN9Ex1d6wMZFo97WY,1750
292
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/requirements.txt-tpl,sha256=Q1_ZimB8ErrkwtzSWFudYrfsI8K2HcB8IphL74u5kNU,1208
291
+ fastapi_fastkit/fastapi_project_template/fastapi-mcp/.env-tpl,sha256=3styxb-X8yguh-V7-XjTWmd95fmnFf2AtLt2Q1kPn_w,695
292
+ fastapi_fastkit/fastapi_project_template/fastapi-mcp/README.md-tpl,sha256=zIyfUG1S80WDsdqQVqpR6sxH_QLi7GY3hHT6SdwEfHQ,6426
293
+ fastapi_fastkit/fastapi_project_template/fastapi-mcp/pyproject.toml-tpl,sha256=txA3oHOFAFXPRcOLqaoyzI4G1qtTP2viDZOWvDZUGlE,1732
294
+ fastapi_fastkit/fastapi_project_template/fastapi-mcp/requirements.txt-tpl,sha256=GEG5DejkhErmaME6GvP1YkGM5n4KScMaxO5ve-I9cMo,1172
293
295
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/format.sh-tpl,sha256=lMHoGl8naqGqYnW3WQ5zKJSkFFrWa4EvooA3xyj5Duk,215
294
296
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/lint.sh-tpl,sha256=TbnPdvBtO-k4XfAnYxUatrsXn4QniW6THmR0gwqshfs,397
295
297
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/run-server.sh-tpl,sha256=Uuti1QOukxvii8ss9RjTf8DzkyJ0V7HyJDGRPhjtazA,195
296
298
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/scripts/test.sh-tpl,sha256=FwcP6i9GGhAiUjyrvczr89z7zT4OEAGVOYQUOVM8vXU,185
297
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/setup.cfg-tpl,sha256=bJLOPvYv39uHfebufJHfXoc5tl9FOXIY37pOGZwWxO0,1940
299
+ fastapi_fastkit/fastapi_project_template/fastapi-mcp/setup.cfg-tpl,sha256=oUvqaL90uwTrq1105fqiw8WcTvsc6avT0v9BXwbljy4,1932
298
300
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/__init__.py-tpl,sha256=bhmTXfHwW_cFBb18cxepy6TQxHYAI1swxEHxIlf15z4,78
299
301
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/__init__.py-tpl,sha256=BDaEDKpisCteGve4mGQWkAsrRPsPToytMgcdyF1IS30,46
300
302
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/api.py-tpl,sha256=MQknnIJ25KUX_nFgjWZR7bsNHsWWw9pLaus_0hL2b0Q,381
301
303
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/routes/__init__.py-tpl,sha256=MgQT6uitMAu1OybStW9h3rZcq7OHreYo4oIvaI0skhM,27
302
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/routes/auth.py-tpl,sha256=KgbkjuERg_5SWL39uAiSkrcby3aE8Ir6Ay_R-zdf8EY,4452
304
+ fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/routes/auth.py-tpl,sha256=9uHoB275h3bcqr5O5aeV5pmoN57GhRrWk-dauc1ZnJU,4480
303
305
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/routes/items.py-tpl,sha256=MSw3t3356SMy5sazaju_6dacPTiDInfUshe_EhjtXPw,5127
304
306
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/auth/__init__.py-tpl,sha256=G-psNiJfSbhWd8POcbLnjkPee8zgCCGFzNYTP1w94d0,53
305
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/auth/dependencies.py-tpl,sha256=WUA9UJoTnEObRSUJeEZm0qngFYhQsBmzTjsQG49rlnw,2977
307
+ fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/auth/dependencies.py-tpl,sha256=1sd-wEiOyhYF7xPGood1Muz2w-VswuEmQ5ajJm_bGHc,2963
306
308
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/core/__init__.py-tpl,sha256=mZUgAUouQG-XnGGliTe99fH7bQE9EKkVMAMyKXZdODE,37
307
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/core/config.py-tpl,sha256=aRlKfb4pbSfU0vgr4DNAgb1zBLcThuP_l0t_1jvlCvc,1587
309
+ fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/core/config.py-tpl,sha256=PKO2kx5--UZ0xfDh_oVBM6iNJhFu_1rUZkmWDmv4eWY,1608
308
310
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/main.py-tpl,sha256=f88-HGszl41NivIau0VsUoG8QmB69hDDADViVhvZv6A,1867
309
311
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/mcp_server/__init__.py-tpl,sha256=TC8tYJfqKT5hx6jucPcYUH2scDDSFCruCcU51_HOLEM,61
310
312
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/mcp_server/router.py-tpl,sha256=UDPdWPBRaPiQmvfvBfJBl73vcBuBXDQqOHKMB6mbaa8,2257
@@ -315,7 +317,7 @@ fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/conftest.py-tpl,sha25
315
317
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/test_auth.py-tpl,sha256=cmxKuioHgRF2YhbpRji0pl8_kF97WQML6v0rYYdOinc,3801
316
318
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/test_items.py-tpl,sha256=dIb_zyUVq_H-zQYqJvrhK2psaYdhLsKlOIiHTONuaeo,3280
317
319
  fastapi_fastkit/fastapi_project_template/fastapi-mcp/tests/test_mcp.py-tpl,sha256=noeUozEtFqNw3R3oSMMbmtBxDiUZhBwTWWZrI17qLmg,2641
318
- fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/.env-tpl,sha256=9aEuqkEeGGT_rJTV7HBmjCSqQDgr6BBaWOiAcWH9hyg,152
320
+ fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/.env-tpl,sha256=tCVg1X0u5jkrafMbnXulu8IDfbI9s7-hh9eZXveoAxw,261
319
321
  fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/.gitignore-tpl,sha256=8QwgyX8vpYhDtg1bcrBjf99yiLQRRO1OkBsGMRfggKY,269
320
322
  fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/Dockerfile-tpl,sha256=mwwhgtBVu94p4ke7Re0lg28G5vhKpeid1xttMvHwLls,325
321
323
  fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/README.md-tpl,sha256=959SSsG-ZCZ7edlWW817Sp6OlNkEARmQ0DogjsJ4iWo,3779
@@ -411,11 +413,17 @@ fastapi_fastkit/fastapi_project_template/modules/api/routes/__init__.py-tpl,sha2
411
413
  fastapi_fastkit/fastapi_project_template/modules/api/routes/new_route.py-tpl,sha256=pJWGpBw7x8HcVHjvQud4hYZ2YVpUwGnDGSUoEGGW7Ig,1265
412
414
  fastapi_fastkit/fastapi_project_template/modules/crud/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
413
415
  fastapi_fastkit/fastapi_project_template/modules/crud/new_route.py-tpl,sha256=m42zC4ye9WdCHggm1M0kNIuwwebscF05VVN8T3282uw,660
416
+ fastapi_fastkit/fastapi_project_template/modules/domain/__init__.py-tpl,sha256=QAbfAHRjOw8hMAks61qaX8bRoFtlJcaioX1eKp2XAAg,288
417
+ fastapi_fastkit/fastapi_project_template/modules/domain/models.py-tpl,sha256=gIQmozKd9O4lA_mRyn33SMdxuNhOnLauswdz9VWPH8g,279
418
+ fastapi_fastkit/fastapi_project_template/modules/domain/repository.py-tpl,sha256=XCdeXiLy_2C4plwHYInRgPybK1Y7HhG6flYDfn9Ntss,1601
419
+ fastapi_fastkit/fastapi_project_template/modules/domain/router.py-tpl,sha256=o0euKXF6n75gJTA7DlJ7IFQYkS7_VIfdrtTyDg1MsXs,2572
420
+ fastapi_fastkit/fastapi_project_template/modules/domain/schemas.py-tpl,sha256=svucP42bZFVR7ImeseUYyMOrl7kB1sAx50UBG-C7XEk,443
421
+ fastapi_fastkit/fastapi_project_template/modules/domain/service.py-tpl,sha256=i38BiqACL5rcLQgtz99D-OEC311mRMsL5SjMRMyeUIA,1889
414
422
  fastapi_fastkit/fastapi_project_template/modules/schemas/__init__.py-tpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
415
423
  fastapi_fastkit/fastapi_project_template/modules/schemas/new_route.py-tpl,sha256=f83oXEj2wJ5lg620Bc0vRmpcjOTIpfMgejzzrHeerGk,569
416
424
  fastapi_fastkit/fragments/README.md,sha256=-Ch-2ZEbSkL6oXUkhaIkn3joR81E0ZLSJj1FaBPghW8,4962
417
425
  fastapi_fastkit/fragments/auth/fastapi_users.py.j2,sha256=ZFR7pdk4KLtSl9MxO5HzFRDMZU7QqN-6V7F6MI3P6GY,265
418
- fastapi_fastkit/fragments/auth/jwt.py.j2,sha256=0eZFVbsx_RS_gGSTMBwBeicQ_a3mZz3w_hZRE7Rxsw8,1299
426
+ fastapi_fastkit/fragments/auth/jwt.py.j2,sha256=DNWxo78LpvQQR7Iw_eu75uh-dn2ki5ZYJg5hiC7qXLY,1321
419
427
  fastapi_fastkit/fragments/auth/oauth2.py.j2,sha256=1k8bhiX8cmCmBSOaUwN7sIGNYbVLsEGYVj50D2EQmpE,3496
420
428
  fastapi_fastkit/fragments/auth/session.py.j2,sha256=ffaoUN4f6LvPTUTjWZXzbrOpCUJF1OmumiW1I6tlEOU,2176
421
429
  fastapi_fastkit/fragments/db/mongodb.py.j2,sha256=TKhvGbVK2eAO3qo-ogwNyR3529_a-mW5d7AXYe_CFr8,530
@@ -481,4 +489,4 @@ fastapi_fastkit/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
481
489
  fastapi_fastkit/utils/config_file.py,sha256=0rZEwCJblHabZlFibjYn2iycNZ8Rp4scOdZpfYtjU4g,9654
482
490
  fastapi_fastkit/utils/logging.py,sha256=oU7BnWInxzl_Gk8kGQ0f6cKdNHZcOVVcSHY4I9MTmR8,6431
483
491
  fastapi_fastkit/utils/main.py,sha256=dCuTSYCME7oCqlvicn-QFGEwA9MeNvMtfKcmThGewyU,13204
484
- fastapi_fastkit-1.4.0.dist-info/RECORD,,
492
+ fastapi_fastkit-1.5.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: pdm-backend (2.4.9)
2
+ Generator: pdm-backend (2.5.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any