Skip to content

Commit 548121d

Browse files
committed
Draft documentation and action
1 parent e17d91c commit 548121d

File tree

112 files changed

+7188
-219
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

112 files changed

+7188
-219
lines changed

.github/workflows/docs-deploy.yml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
name: Deploy docs
2+
3+
on:
4+
push:
5+
branches:
6+
- master
7+
paths:
8+
- 'docs/**'
9+
10+
jobs:
11+
deploy:
12+
runs-on: ubuntu-latest
13+
permissions:
14+
contents: write
15+
16+
steps:
17+
- uses: actions/checkout@v4
18+
19+
- uses: actions/setup-python@v5
20+
with:
21+
python-version: '3.x'
22+
23+
- name: Install MkDocs
24+
run: pip install mkdocs-material
25+
26+
- name: Build Documentation
27+
run: |
28+
mkdocs build -f docs/en/mkdocs.yml -d $(pwd)/site
29+
mkdocs build -f docs/ru/mkdocs.yml -d $(pwd)/site/ru
30+
mkdocs build -f docs/es/mkdocs.yml -d $(pwd)/site/es
31+
mkdocs build -f docs/de/mkdocs.yml -d $(pwd)/site/de
32+
mkdocs build -f docs/fr/mkdocs.yml -d $(pwd)/site/fr
33+
34+
- name: Ensure site exists
35+
run: mkdir -p site
36+
37+
- name: Write CNAME
38+
run: echo 'fastopenapi.fatalyst.dev' > site/CNAME
39+
40+
- name: Deploy to GitHub Pages
41+
uses: peaceiris/actions-gh-pages@v4
42+
with:
43+
github_token: ${{ secrets.GITHUB_TOKEN }}
44+
publish_dir: ./site

docs/de/TODO

Whitespace-only changes.
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Erweiterte Nutzung
2+
3+
In diesem Abschnitt behandeln wir fortgeschrittene Themen wie die Architektur von FastOpenAPI, die Erweiterung auf neue Frameworks und die Anpassung des generierten Verhaltens oder der Dokumentation. Diese Informationen richten sich an Entwickler:innen, die FastOpenAPI tiefer verstehen, anpassen oder in nicht-standardisierte Umgebungen integrieren möchten.
4+
5+
## Architekturüberblick
6+
7+
Das Design von FastOpenAPI ist von FastAPI inspiriert, aber framework-unabhängig aufgebaut. Die Hauptkomponenten sind:
8+
9+
- **BaseRouter**: Die zentrale Basisklasse, welche Routing, OpenAPI-Schema-Generierung und Verarbeitung von Requests/Responses kapselt. Sie ist nicht an ein spezifisches Framework gebunden.
10+
- **Framework-spezifische Router**: Subklassen von `BaseRouter`, z. B. `FlaskRouter`, `StarletteRouter` usw., die die Integration mit konkreten Frameworks übernehmen.
11+
- **Pydantic-Modelle**: FastOpenAPI nutzt Pydantic zur Definition, Validierung und Dokumentation von Datenstrukturen.
12+
- **OpenAPI-Generierung**: FastOpenAPI erstellt auf Basis von Metadaten (Routen, Parameter, Modelle) automatisch ein vollständiges OpenAPI-3.1-Schema. Dieses ist unter `/openapi.json` abrufbar.
13+
- **Dokumentationsrouten**: Über `/docs` (Swagger UI) und `/redoc` (ReDoc) stehen interaktive Dokumentationen zur Verfügung.
14+
15+
## Ablauf eines Requests
16+
17+
1. Eine Anfrage trifft auf die Route einer Anwendung (z. B. in Flask), die mit FastOpenAPI registriert wurde.
18+
2. Der Dekorator `@router.get/post/...` hat die Funktion registriert.
19+
3. Vor dem Funktionsaufruf führt FastOpenAPI:
20+
- Extraktion von Pfadparametern (meist durch das Framework selbst),
21+
- Validierung von Query-/Header-/Body-Parametern (via Pydantic),
22+
- Fehlerbehandlung bei ungültigen Eingaben durch.
23+
4. Die Funktion wird mit validierten Parametern aufgerufen.
24+
5. Die Antwort wird je nach `response_model` serialisiert (validiert und in JSON umgewandelt).
25+
6. Im Fehlerfall (z. B. `ResourceNotFoundError`) wird eine JSON-Fehlermeldung erzeugt.
26+
7. Die Antwort wird durch das Framework zurückgegeben.
27+
28+
## Erweiterung auf weitere Frameworks
29+
30+
FastOpenAPI ist modular konzipiert. Wenn dein Framework nicht unterstützt wird, kannst du eine eigene Integration schreiben.
31+
32+
### Vorgehen:
33+
34+
- Erstelle eine neue Klasse, die `BaseRouter` erweitert.
35+
- Implementiere:
36+
- Registrierung von Routen (z. B. `add_route()`),
37+
- (Optional) Startlogik der App,
38+
- Einbindung von `/docs`, `/redoc`, `/openapi.json`.
39+
40+
### Hinweise:
41+
42+
- Bestehende Implementierungen wie `FlaskRouter`, `StarletteRouter` etc. dienen als gute Vorlage.
43+
- Methoden wie `get_openapi_schema()` in `BaseRouter` sind wiederverwendbar.
44+
45+
## Beispiel: Eigener Router
46+
47+
Wenn du z. B. einen `MyCustomFrameworkRouter` erstellen willst:
48+
49+
```python
50+
from fastopenapi.base_router import BaseRouter
51+
52+
class MyCustomRouter(BaseRouter):
53+
def add_route(self, path, method, handler):
54+
# Framework-spezifische Logik
55+
pass
56+
```
57+
58+
Du kannst bestehende Methoden überschreiben oder Hooks hinzufügen.
59+
60+
---
61+
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
# API-Referenz
2+
3+
In diesem Abschnitt findest du eine detaillierte Referenz zu den Klassen und Modulen von FastOpenAPI, inklusive Schnittstellen, Methoden und konkreter Anwendungsbeispiele.
4+
5+
## Projektstruktur
6+
7+
FastOpenAPI verwendet eine modulare Architektur:
8+
9+
```
10+
fastopenapi/
11+
├── base_router.py
12+
└── routers/
13+
├── aiohttp.py
14+
├── falcon.py
15+
├── flask.py
16+
├── quart.py
17+
├── sanic.py
18+
├── starlette.py
19+
└── tornado.py
20+
```
21+
22+
---
23+
24+
## BaseRouter
25+
26+
**Beschreibung:** Abstrakte Basisklasse, die Routing-Logik, OpenAPI-Schema-Generierung und Validierungsverhalten kapselt. Wird von den Framework-spezifischen Routern geerbt.
27+
28+
### Wichtige Methoden
29+
30+
- `__init__(...)`
31+
- `get(path, **options)`: Registriert einen GET-Endpunkt.
32+
- `post(path, **options)`: Registriert einen POST-Endpunkt.
33+
- `put(path, **options)`: Registriert einen PUT-Endpunkt.
34+
- `patch(path, **options)`: Registriert einen PATCH-Endpunkt.
35+
- `delete(path, **options)`: Registriert einen DELETE-Endpunkt.
36+
- `include_router(other_router, prefix="")`: Ermöglicht das Einbinden anderer Router unter einem Präfix.
37+
- `generate_openapi_schema()`: Erzeugt das OpenAPI-Schema.
38+
39+
### Attribute
40+
41+
- `app`: Das verbundene Framework-Objekt.
42+
- `docs_url`, `redoc_url`, `openapi_url`: Endpunkte für die Dokumentation.
43+
- `title`, `description`, `version`: Metadaten für die OpenAPI-Dokumentation.
44+
45+
---
46+
47+
## Framework-Router
48+
49+
Jedes unterstützte Framework hat einen eigenen Router, der von `BaseRouter` erbt:
50+
51+
- **AioHttpRouter**
52+
- **FalconRouter**
53+
- **FlaskRouter**
54+
- **QuartRouter**
55+
- **SanicRouter**
56+
- **StarletteRouter**
57+
- **TornadoRouter**
58+
59+
---
60+
61+
## Subrouter verwenden
62+
63+
Du kannst Routen modular strukturieren:
64+
65+
```python
66+
api_v1 = <Framework>Router()
67+
68+
@api_v1.get("/users")
69+
def users():
70+
return [{"name": "Alice"}, {"name": "Bob"}]
71+
72+
main_router = <Framework>Router(app=app)
73+
main_router.include_router(api_v1, prefix="/v1")
74+
```
75+
76+
---
77+
78+
## Fehlerbehandlung
79+
80+
### Bibliotheksinterne Fehlerklassen
81+
82+
```python
83+
from fastopenapi.error_handler import BadRequestError, ResourceNotFoundError
84+
85+
@router.get("/validate")
86+
def validate_input(param: int):
87+
if param < 0:
88+
raise BadRequestError("Parameter muss positiv sein")
89+
90+
@router.get("/items/{item_id}")
91+
def get_item(item_id: int):
92+
item = db.get(item_id)
93+
if item is None:
94+
raise ResourceNotFoundError(f"Item {item_id} nicht gefunden")
95+
```
96+
97+
### Fehlerbehandlung je Framework
98+
99+
FastOpenAPI unterstützt auch Framework-eigene Fehler:
100+
101+
#### AioHTTP
102+
103+
```python
104+
from aiohttp import web
105+
106+
@router.get("/notfound")
107+
def aiohttp_notfound():
108+
raise web.HTTPNotFound(reason="Not Found")
109+
```
110+
111+
#### Falcon
112+
113+
```python
114+
import falcon
115+
116+
@router.get("/notfound")
117+
async def falcon_notfound():
118+
raise falcon.HTTPNotFound(title="Not Found", description="Falcon error")
119+
```
120+
121+
#### Flask
122+
123+
```python
124+
from flask import abort
125+
126+
@router.get("/notfound")
127+
def flask_notfound():
128+
abort(404, description="Flask error")
129+
```
130+
131+
#### Quart
132+
133+
```python
134+
from quart import abort
135+
136+
@router.get("/notfound")
137+
async def quart_notfound():
138+
abort(404, description="Quart error")
139+
```
140+
141+
#### Sanic
142+
143+
```python
144+
from sanic import NotFound
145+
146+
@router.get("/notfound")
147+
async def sanic_notfound():
148+
raise NotFound()
149+
```
150+
151+
#### Starlette
152+
153+
```python
154+
from starlette.exceptions import HTTPException
155+
156+
@router.get("/notfound")
157+
async def starlette_notfound():
158+
raise HTTPException(status_code=404, detail="Not Found")
159+
```
160+
161+
#### Tornado
162+
163+
```python
164+
from tornado.web import HTTPError
165+
166+
@router.get("/notfound")
167+
async def tornado_notfound():
168+
raise HTTPError(status_code=404, reason="Not Found")
169+
```
170+
171+
---
172+

docs/de/docs/changelog.md

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# Changelog
2+
3+
Alle bedeutenden Änderungen an FastOpenAPI werden in dieser Datei dokumentiert.
4+
5+
## [0.5.0] – Unveröffentlicht
6+
7+
### Hinzugefügt
8+
- **AioHttpRouter** zur Integration mit dem AIOHTTP-Framework (async-Unterstützung).
9+
- Klassencache für Pydantic-Model-Schemas zur Leistungsverbesserung (vermeidet wiederholte Generierung von JSON Schema).
10+
- `response_errors`-Parameter für Routen-Dekoratoren, um Fehlerrückgaben in OpenAPI zu dokumentieren.
11+
- Modul `error_handler` für standardisierte Fehlerantworten (stellt Fehlerklassen wie `BadRequestError`, `ResourceNotFoundError` usw. bereit).
12+
- Unterstützung einfacher Python-Typen (`int`, `float`, `bool`, `str`) als `response_model`.
13+
14+
## [0.4.0] – 20.03.2025
15+
16+
### Hinzugefügt
17+
- Unterstützung für **ReDoc UI** (verfügbar unter `/redoc`).
18+
- **TornadoRouter** für das Tornado-Framework.
19+
20+
### Geändert
21+
- Alle Tests überarbeitet zur Verbesserung der Abdeckung und Zuverlässigkeit.
22+
23+
### Behoben
24+
- Fehlercode bei internen Fehlern geändert: von 422 auf 500, gemäß HTTP-Standards.
25+
26+
### Entfernt
27+
- `add_docs_route` und `add_openapi_route` Methoden aus `BaseRouter` entfernt – Dokumentationsrouten werden jetzt automatisch hinzugefügt.
28+
29+
## [0.3.1] – 15.03.2025
30+
31+
### Behoben
32+
- Fehler beim Import von Routern ohne installiertes Framework (Abfangen von `ModuleNotFoundError`).
33+
34+
## [0.3.0] – 15.03.2025
35+
36+
### Hinzugefügt
37+
- **QuartRouter** für das Quart-Framework (async).
38+
- Erste Dokumentation (Einführung und Grundbeispiele) im Repository.
39+
40+
### Geändert
41+
- Vereinfachter Import: jetzt `from fastopenapi.routers import YourRouter`.
42+
43+
### Behoben
44+
- Query-Parameter über Pydantic-Modelle in GET-Routen werden nun korrekt erkannt und genutzt.
45+
46+
## [0.2.1] – 12.03.2025
47+
48+
### Behoben
49+
- Serialisierung von Antworten: `_serialize_response` konvertiert BaseModel jetzt korrekt in ein dict vor JSON.
50+
- Fehler im `DataLoader` bei leeren Daten beseitigt.
51+
- Zusätzliche Tests für obige Fälle hinzugefügt.
52+
- Diese Changelog-Datei (`CHANGELOG.md`) hinzugefügt.
53+
54+
## [0.2.0] – 11.03.2025
55+
56+
### Hinzugefügt
57+
- `resolve_endpoint_params` in `BaseRouter` implementiert zur Parameterauswertung (path, query, body).
58+
- `prefix`-Support in `include_router` zur Gruppierung von Routen.
59+
- `status_code`-Support in Dekoratoren (Default-Statuscode setzen).
60+
61+
### Geändert
62+
- Refactoring aller Router-Implementierungen zur Vereinheitlichung und Reduzierung von Redundanz.
63+
64+
### Entfernt
65+
- `register_routes` aus Starlette-Implementierung entfernt (veraltet durch Refactoring).
66+
67+
## [0.1.0] – 01.03.2025
68+
69+
### Hinzugefügt
70+
- Erste Veröffentlichung von FastOpenAPI.
71+
- Grundfunktionalität implementiert:
72+
- Basisrouter-Klassen
73+
- Unterstützung für Falcon, Flask, Sanic, Starlette
74+
- OpenAPI-Schema-Generierung über Pydantic v2
75+
- Parameter- und Body-Validierung
76+
- README und einfache Beispiele hinzugefügt.
77+
- Erste Tests zur Schema-Generierung und Routenregistrierung integriert.

0 commit comments

Comments
 (0)