Compare commits

..

1 Commits

Author SHA1 Message Date
dependabot[bot] 2d45624282 ⬆ Bump traefik in the docker-compose group across 1 directory
Bumps the docker-compose group with 1 update in the / directory: traefik.


Updates `traefik` from 3.6 to v3.7.5

---
updated-dependencies:
- dependency-name: traefik
  dependency-version: v3.7.4
  dependency-type: direct:production
  dependency-group: docker-compose
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-20 10:12:20 +00:00
31 changed files with 1405 additions and 504 deletions
-1
View File
@@ -1 +0,0 @@
../../.venv/lib/python3.14/site-packages/fastapi/.agents/skills/fastapi
@@ -1,4 +0,0 @@
{
"kind": "tool-skill",
"version": "0.0.19"
}
-37
View File
@@ -1,37 +0,0 @@
---
name: library-skills
description: Use Library Skills to discover, install, refresh, repair, check, and manage agent skills from installed packages.
---
# Library Skills
Use this skill when a project might benefit from agent skills bundled by its installed packages, or when existing Library Skills-managed symlinks are stale, broken, orphaned, or need to be checked.
Run commands from the project root.
Agents bundle their own skills by including an `.agents/skills` directory. More details in [Library Skills](https://library-skills.io).
## First-Time Setup
- Make sure project dependencies are installed first, for example with `uv sync` for Python projects or `npm install` / `bun install` for Node.js projects.
- Run `uvx library-skills` or `npx library-skills` to discover skills bundled by the installed packages and install selected skills interactively.
- Use `uvx library-skills --all` or `npx library-skills --all` only when all newly discovered skills should be installed without selecting individual skills.
- Use `uvx library-skills --tool-skill` or `npx library-skills --tool-skill` to copy this Library Skills tool skill into the project so future agents know how to discover, install, update, repair, and check skills.
## Commands
- Run `uvx library-skills` or `npx library-skills` to discover package-provided skills, install selected new skills, and reconcile existing managed symlinks.
- Run `uvx library-skills list` or `npx library-skills list` to inspect discovered and installed skills.
- Run `uvx library-skills list --json` or `npx library-skills list --json` for machine-readable installed status.
- Run `uvx library-skills scan --json` or `npx library-skills scan --json` for discovery-only automation.
- Run `uvx library-skills --check` or `npx library-skills --check` to validate managed skill symlink state without changing files.
- Run `uvx library-skills --yes` or `npx library-skills --yes` to repair stale managed symlinks and remove orphaned managed symlinks non-interactively.
- Add `--claude` when `.claude/skills` should also be managed.
- Add `--skill NAME` to install a specific discovered skill by name.
## Safety
- Prefer rerunning `library-skills` over editing managed symlinks manually.
- If installed skill symlinks are broken, dependencies may not be installed yet. Try the project's normal install command first, such as `uv sync`, `npm install`, or `bun install`, then rerun `library-skills`.
- Do not delete or overwrite hand-authored skill directories.
- Library Skills only removes managed symlinks. It should not remove copied or hand-authored skill directories.
-1
View File
@@ -1 +0,0 @@
../../.venv/lib/python3.14/site-packages/sqlmodel/.agents/skills/sqlmodel
-1
View File
@@ -1 +0,0 @@
../../.venv/lib/python3.14/site-packages/fastapi/.agents/skills/fastapi
@@ -1,4 +0,0 @@
{
"kind": "tool-skill",
"version": "0.0.19"
}
-37
View File
@@ -1,37 +0,0 @@
---
name: library-skills
description: Use Library Skills to discover, install, refresh, repair, check, and manage agent skills from installed packages.
---
# Library Skills
Use this skill when a project might benefit from agent skills bundled by its installed packages, or when existing Library Skills-managed symlinks are stale, broken, orphaned, or need to be checked.
Run commands from the project root.
Agents bundle their own skills by including an `.agents/skills` directory. More details in [Library Skills](https://library-skills.io).
## First-Time Setup
- Make sure project dependencies are installed first, for example with `uv sync` for Python projects or `npm install` / `bun install` for Node.js projects.
- Run `uvx library-skills` or `npx library-skills` to discover skills bundled by the installed packages and install selected skills interactively.
- Use `uvx library-skills --all` or `npx library-skills --all` only when all newly discovered skills should be installed without selecting individual skills.
- Use `uvx library-skills --tool-skill` or `npx library-skills --tool-skill` to copy this Library Skills tool skill into the project so future agents know how to discover, install, update, repair, and check skills.
## Commands
- Run `uvx library-skills` or `npx library-skills` to discover package-provided skills, install selected new skills, and reconcile existing managed symlinks.
- Run `uvx library-skills list` or `npx library-skills list` to inspect discovered and installed skills.
- Run `uvx library-skills list --json` or `npx library-skills list --json` for machine-readable installed status.
- Run `uvx library-skills scan --json` or `npx library-skills scan --json` for discovery-only automation.
- Run `uvx library-skills --check` or `npx library-skills --check` to validate managed skill symlink state without changing files.
- Run `uvx library-skills --yes` or `npx library-skills --yes` to repair stale managed symlinks and remove orphaned managed symlinks non-interactively.
- Add `--claude` when `.claude/skills` should also be managed.
- Add `--skill NAME` to install a specific discovered skill by name.
## Safety
- Prefer rerunning `library-skills` over editing managed symlinks manually.
- If installed skill symlinks are broken, dependencies may not be installed yet. Try the project's normal install command first, such as `uv sync`, `npm install`, or `bun install`, then rerun `library-skills`.
- Do not delete or overwrite hand-authored skill directories.
- Library Skills only removes managed symlinks. It should not remove copied or hand-authored skill directories.
-1
View File
@@ -1 +0,0 @@
../../.venv/lib/python3.14/site-packages/sqlmodel/.agents/skills/sqlmodel
+24 -1
View File
@@ -29,6 +29,29 @@ jobs:
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- uses: tiangolo/issue-manager@75d60679db1ea348f6f6ea1d0e20de80a7c04645 # 0.7.1
- uses: tiangolo/issue-manager@2fb3484ec9279485df8659e8ec73de262431737d # 0.6.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
config: >
{
"answered": {
"delay": 864000,
"message": "Assuming the original need was handled, this will be automatically closed now. But feel free to add more comments or create new issues or PRs."
},
"waiting": {
"delay": 2628000,
"message": "As this PR has been waiting for the original user for a while but seems to be inactive, it's now going to be closed. But if there's anyone interested, feel free to create a new PR.",
"reminder": {
"before": "P3D",
"message": "Heads-up: this will be closed in 3 days unless there's new activity."
}
},
"invalid": {
"delay": 0,
"message": "This was marked as invalid and will be closed now. If this is an error, please provide additional details."
},
"maybe-ai": {
"delay": 0,
"message": "This was marked as potentially AI generated and will be closed now. If this is an error, please provide additional details, make sure to read the docs about contributing and AI."
}
}
+4 -1
View File
@@ -5,6 +5,9 @@ on:
branches:
- master
pull_request:
types:
- opened
- synchronize
workflow_dispatch:
inputs:
debug_enabled:
@@ -57,7 +60,7 @@ jobs:
bun-version: 1.3.12
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version-file: .python-version
python-version: '3.10'
- name: Setup tmate session
uses: mxschmitt/action-tmate@35b54afac29c97fb54faba5b513f8fbd1882f113 # v3.24
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
+5 -1
View File
@@ -2,6 +2,10 @@ name: pre-commit
on:
pull_request:
types:
- opened
- synchronize
permissions: {}
env:
@@ -44,7 +48,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version-file: .python-version
python-version: "3.11"
- name: Setup uv
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
with:
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
persist-credentials: false
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version-file: .python-version
python-version: "3.13"
- name: Setup uv
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
with:
+5 -1
View File
@@ -5,6 +5,10 @@ on:
branches:
- master
pull_request:
types:
- opened
- synchronize
permissions: {}
jobs:
@@ -19,7 +23,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version-file: .python-version
python-version: "3.10"
- name: Install uv
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
with:
@@ -5,6 +5,10 @@ on:
branches:
- master
pull_request:
types:
- opened
- synchronize
permissions: {}
jobs:
-1
View File
@@ -4,7 +4,6 @@ on:
push:
branches:
- master
pull_request:
workflow_dispatch:
permissions: {}
-1
View File
@@ -1 +0,0 @@
3.14
+2 -2
View File
@@ -1,4 +1,4 @@
FROM python:3.14
FROM python:3.10
ENV PYTHONUNBUFFERED=1
@@ -42,4 +42,4 @@ RUN --mount=type=cache,target=/root/.cache/uv \
WORKDIR /app/backend/
CMD ["fastapi", "run", "--workers", "4"]
CMD ["fastapi", "run", "--workers", "4", "app/main.py"]
+2 -2
View File
@@ -18,7 +18,7 @@ reusable_oauth2 = OAuth2PasswordBearer(
)
def get_db() -> Generator[Session]:
def get_db() -> Generator[Session, None, None]:
with Session(engine) as session:
yield session
@@ -33,7 +33,7 @@ def get_current_user(session: SessionDep, token: TokenDep) -> User:
token, settings.SECRET_KEY, algorithms=[security.ALGORITHM]
)
token_data = TokenPayload(**payload)
except InvalidTokenError, ValidationError:
except (InvalidTokenError, ValidationError):
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Could not validate credentials",
+2 -1
View File
@@ -1,6 +1,6 @@
import secrets
import warnings
from typing import Annotated, Any, Literal, Self
from typing import Annotated, Any, Literal
from pydantic import (
AnyUrl,
@@ -12,6 +12,7 @@ from pydantic import (
model_validator,
)
from pydantic_settings import BaseSettings, SettingsConfigDict
from typing_extensions import Self
def parse_cors(v: Any) -> list[str] | str:
+2 -2
View File
@@ -1,4 +1,4 @@
from datetime import UTC, datetime, timedelta
from datetime import datetime, timedelta, timezone
from typing import Any
import jwt
@@ -20,7 +20,7 @@ ALGORITHM = "HS256"
def create_access_token(subject: str | Any, expires_delta: timedelta) -> str:
expire = datetime.now(UTC) + expires_delta
expire = datetime.now(timezone.utc) + expires_delta
to_encode = {"exp": expire, "sub": str(subject)}
encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
+7 -11
View File
@@ -1,5 +1,5 @@
import uuid
from datetime import UTC, datetime
from datetime import datetime, timezone
from pydantic import EmailStr
from sqlalchemy import DateTime
@@ -7,7 +7,7 @@ from sqlmodel import Field, Relationship, SQLModel
def get_datetime_utc() -> datetime:
return datetime.now(UTC)
return datetime.now(timezone.utc)
# Shared properties
@@ -30,11 +30,8 @@ class UserRegister(SQLModel):
# Properties to receive via API on update, all are optional
class UserUpdate(SQLModel):
email: EmailStr | None = Field(default=None, max_length=255)
is_active: bool | None = None
is_superuser: bool | None = None
full_name: str | None = Field(default=None, max_length=255)
class UserUpdate(UserBase):
email: EmailStr | None = Field(default=None, max_length=255) # type: ignore[assignment]
password: str | None = Field(default=None, min_length=8, max_length=128)
@@ -56,7 +53,7 @@ class User(UserBase, table=True):
default_factory=get_datetime_utc,
sa_type=DateTime(timezone=True), # type: ignore
)
items: list[Item] = Relationship(back_populates="owner", cascade_delete=True)
items: list["Item"] = Relationship(back_populates="owner", cascade_delete=True)
# Properties to return via API, id is always required
@@ -82,9 +79,8 @@ class ItemCreate(ItemBase):
# Properties to receive on item update
class ItemUpdate(SQLModel):
title: str | None = Field(default=None, min_length=1, max_length=255)
description: str | None = Field(default=None, max_length=255)
class ItemUpdate(ItemBase):
title: str | None = Field(default=None, min_length=1, max_length=255) # type: ignore[assignment]
# Database model, database table inferred from class name
+2 -2
View File
@@ -1,6 +1,6 @@
import logging
from dataclasses import dataclass
from datetime import UTC, datetime, timedelta
from datetime import datetime, timedelta, timezone
from pathlib import Path
from typing import Any
@@ -102,7 +102,7 @@ def generate_new_account_email(
def generate_password_reset_token(email: str) -> str:
delta = timedelta(hours=settings.EMAIL_RESET_TOKEN_EXPIRE_HOURS)
now = datetime.now(UTC)
now = datetime.now(timezone.utc)
expires = now + delta
exp = expires.timestamp()
encoded_jwt = jwt.encode(
+5 -7
View File
@@ -2,9 +2,9 @@
name = "app"
version = "0.1.0"
description = ""
requires-python = ">=3.14,<4.0"
requires-python = ">=3.10,<4.0"
dependencies = [
"fastapi[standard]>=0.138.1,<1.0.0",
"fastapi[standard]<1.0.0,>=0.114.2",
"python-multipart<1.0.0,>=0.0.27",
"email-validator<3.0.0.0,>=2.1.0.post1",
"tenacity<10.0.0,>=8.2.3",
@@ -14,7 +14,7 @@ dependencies = [
"alembic<2.0.0,>=1.12.1",
"httpx<1.0.0,>=0.25.1",
"psycopg[binary]<4.0.0,>=3.1.13",
"sqlmodel>=0.0.39,<1.0.0",
"sqlmodel<1.0.0,>=0.0.21",
"pydantic-settings<3.0.0,>=2.2.1",
"sentry-sdk[fastapi]>=2.0.0,<3.0.0",
"pyjwt<3.0.0,>=2.13.0",
@@ -27,6 +27,7 @@ dev = [
"mypy<3.0.0,>=1.8.0",
"ty>=0.0.25",
"ruff<1.0.0,>=0.2.2",
"prek>=0.2.24,<1.0.0",
"coverage<8.0.0,>=7.4.3",
]
@@ -39,7 +40,7 @@ strict = true
exclude = ["venv", ".venv", "alembic"]
[tool.ruff]
target-version = "py314"
target-version = "py310"
exclude = ["alembic"]
[tool.ruff.lint]
@@ -78,6 +79,3 @@ show_contexts = true
[tool.ty.terminal]
error-on-warning = true
[tool.fastapi]
entrypoint = "app.main:app"
+2 -2
View File
@@ -13,7 +13,7 @@ from tests.utils.utils import get_superuser_token_headers
@pytest.fixture(scope="session", autouse=True)
def db() -> Generator[Session]:
def db() -> Generator[Session, None, None]:
with Session(engine) as session:
init_db(session)
yield session
@@ -25,7 +25,7 @@ def db() -> Generator[Session]:
@pytest.fixture(scope="module")
def client() -> Generator[TestClient]:
def client() -> Generator[TestClient, None, None]:
with TestClient(app) as c:
yield c
+1 -1
View File
@@ -6,7 +6,7 @@ services:
# etc. To enable it, update .env, set:
# DOMAIN=localhost.tiangolo.com
proxy:
image: traefik:v3.7
image: traefik:v3.7.5
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ports:
+1 -1
View File
@@ -1,6 +1,6 @@
services:
traefik:
image: traefik:v3.7
image: traefik:v3.7.5
ports:
# Listen on port 80, default for HTTP, necessary to redirect to HTTPS
- 80:80
+6 -18
View File
@@ -431,26 +431,14 @@ export const UserUpdateSchema = {
title: 'Email'
},
is_active: {
anyOf: [
{
type: 'boolean'
},
{
type: 'null'
}
],
title: 'Is Active'
type: 'boolean',
title: 'Is Active',
default: true
},
is_superuser: {
anyOf: [
{
type: 'boolean'
},
{
type: 'null'
}
],
title: 'Is Superuser'
type: 'boolean',
title: 'Is Superuser',
default: false
},
full_name: {
anyOf: [
+2 -2
View File
@@ -92,8 +92,8 @@ export type UsersPublic = {
export type UserUpdate = {
email?: (string | null);
is_active?: (boolean | null);
is_superuser?: (boolean | null);
is_active?: boolean;
is_superuser?: boolean;
full_name?: (string | null);
password?: (string | null);
};
+3 -4
View File
@@ -1,6 +1,8 @@
[tool.uv.workspace]
members = ["backend"]
[dependency-groups]
dev = [
"prek>=0.2.24,<1.0.0",
"zizmor>=1.25.2",
]
@@ -8,9 +10,6 @@ github-actions = [
"smokeshow >=0.5.0",
]
[tool.uv.workspace]
members = ["backend"]
[tool.typos.files]
extend-exclude = [
"img/",
-14
View File
@@ -2,21 +2,13 @@
## Latest Changes
### Features
* 🔧 Use FastAPI entrypoint. PR [#2360](https://github.com/fastapi/full-stack-fastapi-template/pull/2360) by [@tiangolo](https://github.com/tiangolo).
* ♻️ Add library-skills for FastAPI and SQLModel. PR [#2354](https://github.com/fastapi/full-stack-fastapi-template/pull/2354) by [@tiangolo](https://github.com/tiangolo).
### Refactors
* ♻️ Refactor models to improve types. PR [#2356](https://github.com/fastapi/full-stack-fastapi-template/pull/2356) by [@tiangolo](https://github.com/tiangolo).
* 🔧 Add FastAPI VS Code extension to recommended extensions. PR [#2206](https://github.com/fastapi/full-stack-fastapi-template/pull/2206) by [@tiangolo](https://github.com/tiangolo).
* ♻️ Update meta titles. PR [#2179](https://github.com/fastapi/full-stack-fastapi-template/pull/2179) by [@alejsdev](https://github.com/alejsdev).
### Upgrades
* ⬆️ Upgrade FastAPI version. PR [#2357](https://github.com/fastapi/full-stack-fastapi-template/pull/2357) by [@tiangolo](https://github.com/tiangolo).
* ⬆️ Upgrade Python to 3.14. PR [#2352](https://github.com/fastapi/full-stack-fastapi-template/pull/2352) by [@tiangolo](https://github.com/tiangolo).
* ⬆️ Upgrade Sentry and FastAPI. PR [#2181](https://github.com/fastapi/full-stack-fastapi-template/pull/2181) by [@patrick91](https://github.com/patrick91).
### Docs
@@ -27,12 +19,6 @@
### Internal
* ➕ Move prek to top level dependencies. PR [#2353](https://github.com/fastapi/full-stack-fastapi-template/pull/2353) by [@tiangolo](https://github.com/tiangolo).
* 🔧 Sort keys in pyproject.toml. PR [#2350](https://github.com/fastapi/full-stack-fastapi-template/pull/2350) by [@tiangolo](https://github.com/tiangolo).
* 👷 Simplify pull request workflow triggers. PR [#2349](https://github.com/fastapi/full-stack-fastapi-template/pull/2349) by [@tiangolo](https://github.com/tiangolo).
* 👷 Update issue-manager to 0.7.1. PR [#2348](https://github.com/fastapi/full-stack-fastapi-template/pull/2348) by [@tiangolo](https://github.com/tiangolo).
* ⬆️ Update issue-manager to 0.7.0. PR [#2347](https://github.com/fastapi/full-stack-fastapi-template/pull/2347) by [@tiangolo](https://github.com/tiangolo).
* 🔒️ Update zizmor workflow security checks. PR [#2345](https://github.com/fastapi/full-stack-fastapi-template/pull/2345) by [@tiangolo](https://github.com/tiangolo).
* 👷 Add pre-commit hook to catch typos. PR [#2317](https://github.com/fastapi/full-stack-fastapi-template/pull/2317) by [@YuriiMotov](https://github.com/YuriiMotov).
* Bump form-data from 4.0.5 to 4.0.6 in /frontend. PR [#2337](https://github.com/fastapi/full-stack-fastapi-template/pull/2337) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump starlette from 1.0.1 to 1.3.1. PR [#2338](https://github.com/fastapi/full-stack-fastapi-template/pull/2338) by [@dependabot[bot]](https://github.com/apps/dependabot).
Generated
+1325 -342
View File
File diff suppressed because it is too large Load Diff