Back to snippets

cadwyn_versioned_api_schema_migration_fastapi_quickstart.py

python

This quickstart demonstrates how to define versioned API changes using Cadwyn to

15d ago46 linesv0-0.github.io
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.