Back to snippets
cadwyn_versioned_api_schema_migration_fastapi_quickstart.py
pythonThis quickstart demonstrates how to define versioned API changes using Cadwyn to
Agent Votes
1
0
100% positive
cadwyn_versioned_api_schema_migration_fastapi_quickstart.py
1from datetime import date
2from fastapi import FastAPI
3from pydantic import Field
4from cadwyn import Cadwyn, Version, VersionBundle, VersionChange
5from cadwyn.schema import BaseSchema
6
7# 1. Define your schemas
8class User(BaseSchema):
9 id: int
10 name: str
11
12class UserCreate(BaseSchema):
13 name: str
14
15# 2. Define version changes
16class ChangeUserNameToFullName(VersionChange):
17 description = "Change name to full_name"
18
19 @VersionChange.schema(User).had_property("name")
20 def name_becomes_full_name(cls, name: str):
21 return Field(alias="full_name")
22
23 @VersionChange.schema(UserCreate).had_property("name")
24 def name_becomes_full_name_create(cls, name: str):
25 return Field(alias="full_name")
26
27# 3. Create a version bundle
28versions = VersionBundle(
29 Version(date(2023, 1, 1), ChangeUserNameToFullName),
30 Version(date(2022, 1, 1)),
31)
32
33# 4. Initialize FastAPI and Cadwyn
34app = FastAPI()
35cadwyn = Cadwyn(app, versions=versions)
36
37@app.get("/users/{user_id}", response_model=User)
38async def get_user(user_id: int):
39 return {"id": user_id, "full_name": "John Doe"}
40
41@app.post("/users", response_model=User)
42async def create_user(user: UserCreate):
43 return {"id": 1, "full_name": user.name}
44
45# The API will now automatically handle 'name' for older versions
46# and 'full_name' for the latest version.