Add sub-app to generate open api spec

This commit is contained in:
Vincent Maillol
2020-10-23 19:44:44 +02:00
parent 1ffde607c9
commit d6b5fc26f3
24 changed files with 932 additions and 124 deletions

0
demo/__init__.py Normal file
View File

25
demo/__main__.py Normal file
View File

@@ -0,0 +1,25 @@
from aiohttp import web
from aiohttp_pydantic import oas
from aiohttp.web import middleware
from .view import PetItemView, PetCollectionView
from .model import Model
@middleware
async def pet_not_found_to_404(request, handler):
try:
return await handler(request)
except Model.NotFound as key:
return web.json_response({"error": f"Pet {key} does not exist"}, status=404)
app = web.Application(middlewares=[pet_not_found_to_404])
oas.setup(app)
app["model"] = Model()
app.router.add_view("/pets", PetCollectionView)
app.router.add_view("/pets/{id}", PetItemView)
web.run_app(app)

43
demo/model.py Normal file
View File

@@ -0,0 +1,43 @@
from pydantic import BaseModel
class Pet(BaseModel):
id: int
name: str
class Model:
"""
To keep simple this demo, we use a simple dict as database to
store the models.
"""
class NotFound(KeyError):
"""
Raised when a pet is not found.
"""
def __init__(self):
self.storage = {}
def add_pet(self, pet: Pet):
self.storage[pet.id] = pet
def remove_pet(self, id: int):
try:
del self.storage[id]
except KeyError as error:
raise self.NotFound(str(error))
def update_pet(self, id: int, pet: Pet):
self.remove_pet(id)
self.add_pet(pet)
def find_pet(self, id: int):
try:
return self.storage[id]
except KeyError as error:
raise self.NotFound(str(error))
def list_pets(self):
return list(self.storage.values())

28
demo/view.py Normal file
View File

@@ -0,0 +1,28 @@
from aiohttp_pydantic import PydanticView
from aiohttp import web
from .model import Pet
class PetCollectionView(PydanticView):
async def get(self):
pets = self.request.app["model"].list_pets()
return web.json_response([pet.dict() for pet in pets])
async def post(self, pet: Pet):
self.request.app["model"].add_pet(pet)
return web.json_response(pet.dict())
class PetItemView(PydanticView):
async def get(self, id: int, /):
pet = self.request.app["model"].find_pet(id)
return web.json_response(pet.dict())
async def put(self, id: int, /, pet: Pet):
self.request.app["model"].update_pet(id, pet)
return web.json_response(pet.dict())
async def delete(self, id: int, /):
self.request.app["model"].remove_pet(id)
return web.json_response(id)