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.
- fastapi_fastkit/__init__.py +1 -1
- fastapi_fastkit/backend/inspection/context.py +4 -0
- fastapi_fastkit/backend/inspection/core.py +5 -1
- fastapi_fastkit/backend/inspection/docker.py +150 -15
- fastapi_fastkit/backend/inspection/lint.py +44 -30
- fastapi_fastkit/backend/inspection/smoke.py +67 -13
- fastapi_fastkit/backend/inspection/strategies.py +32 -1
- fastapi_fastkit/backend/main.py +35 -40
- fastapi_fastkit/backend/route_generators.py +163 -0
- fastapi_fastkit/backend/route_wiring.py +117 -0
- fastapi_fastkit/backend/transducer.py +101 -2
- fastapi_fastkit/cli.py +13 -2
- fastapi_fastkit/core/settings.py +3 -3
- fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/pyproject.toml-tpl +1 -1
- fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/requirements.txt-tpl +1 -1
- fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/api/router.py-tpl +1 -1
- fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/src/app/domains/items/router.py-tpl +1 -1
- fastapi_fastkit/fastapi_project_template/fastapi-domain-starter/tests/conftest.py-tpl +16 -4
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/.env-tpl +1 -1
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/README.md-tpl +1 -1
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/pyproject.toml-tpl +2 -3
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/requirements.txt-tpl +5 -9
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/setup.cfg-tpl +2 -3
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/api/routes/auth.py-tpl +9 -9
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/auth/dependencies.py-tpl +2 -2
- fastapi_fastkit/fastapi_project_template/fastapi-mcp/src/core/config.py-tpl +1 -1
- fastapi_fastkit/fastapi_project_template/fastapi-psql-orm/.env-tpl +2 -0
- fastapi_fastkit/fastapi_project_template/modules/domain/__init__.py-tpl +10 -0
- fastapi_fastkit/fastapi_project_template/modules/domain/models.py-tpl +11 -0
- fastapi_fastkit/fastapi_project_template/modules/domain/repository.py-tpl +50 -0
- fastapi_fastkit/fastapi_project_template/modules/domain/router.py-tpl +66 -0
- fastapi_fastkit/fastapi_project_template/modules/domain/schemas.py-tpl +16 -0
- fastapi_fastkit/fastapi_project_template/modules/domain/service.py-tpl +47 -0
- fastapi_fastkit/fragments/auth/jwt.py.j2 +6 -6
- {fastapi_fastkit-1.4.0.dist-info → fastapi_fastkit-1.5.0.dist-info}/METADATA +31 -11
- {fastapi_fastkit-1.4.0.dist-info → fastapi_fastkit-1.5.0.dist-info}/RECORD +39 -31
- {fastapi_fastkit-1.4.0.dist-info → fastapi_fastkit-1.5.0.dist-info}/WHEEL +1 -1
- {fastapi_fastkit-1.4.0.dist-info → fastapi_fastkit-1.5.0.dist-info}/entry_points.txt +0 -0
- {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
|
|
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
|
-
|
|
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":
|
|
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":
|
|
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":
|
|
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
|
|
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
|
|
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
|
|
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
|
|
|
@@ -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
|
-
|
|
5
|
-
from
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
2
|
-
fastapi_fastkit-1.
|
|
3
|
-
fastapi_fastkit-1.
|
|
4
|
-
fastapi_fastkit-1.
|
|
5
|
-
fastapi_fastkit/__init__.py,sha256=
|
|
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=
|
|
12
|
-
fastapi_fastkit/backend/inspection/core.py,sha256=
|
|
13
|
-
fastapi_fastkit/backend/inspection/docker.py,sha256=
|
|
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=
|
|
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=
|
|
19
|
-
fastapi_fastkit/backend/inspection/strategies.py,sha256=
|
|
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=
|
|
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=
|
|
41
|
-
fastapi_fastkit/cli.py,sha256=
|
|
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=
|
|
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=
|
|
81
|
-
fastapi_fastkit/fastapi_project_template/fastapi-auth-jwt/requirements.txt-tpl,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
290
|
-
fastapi_fastkit/fastapi_project_template/fastapi-mcp/README.md-tpl,sha256=
|
|
291
|
-
fastapi_fastkit/fastapi_project_template/fastapi-mcp/pyproject.toml-tpl,sha256=
|
|
292
|
-
fastapi_fastkit/fastapi_project_template/fastapi-mcp/requirements.txt-tpl,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
492
|
+
fastapi_fastkit-1.5.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|