Skip to main content

No project description provided

Project description

verselect

FastAPI based framework to select an API version.

Battle-tested at Monite in production.

Explanation

At Monite, we are using header-based versioning, meaning that the client has to specify the version of the API it wants to use in the header in the YYYY-MM-DD format.

The issue with this approach is that when releasing a new API version, we need to support it in every service, which is a lot of work. verselect resolves this issue.

How it works

verselect supports waterflowing the requests to the latest version of the API if the request header doesn't match any of the versions.

If the app has two versions: 2022-01-02 and 2022-01-05, and the request header is 2022-01-03, then the request will be routed to 2022-01-02 version as it the closest version, but lower than the request header.

Exact match is always preferred over partial match and a request will never be matched to the higher versioned route

Also non-versioned routes and routers can be added for the endpoints, like webhooks

Usage

from contextvars import ContextVar
from datetime import date

from fastapi import APIRouter
import uvicorn
from starlette.responses import Response

from verselect import HeaderRoutingFastAPI

api_version_var: ContextVar[date] = ContextVar("api_version")
router = APIRouter()
webhook_router = APIRouter()


@router.get("/users")
def users():
    return Response(f"Hello from {api_version_var.get()}", media_type="text/plain")

@webhook_router.get("/webhooks")
def webhooks():
    return Response("webhooks", media_type="text/plain")

versions = [
    "2022-01-10",
    "2022-02-11",
    "1998-11-15",
    "2022-03-12",
    "2027-11-15",
    "2022-04-14",
]
mixed_hosts_app = HeaderRoutingFastAPI(
    api_version_header_name="X-API-Version",
    api_version_var=api_version_var,
)
for version in versions:
    mixed_hosts_app.add_header_versioned_routers(
        router,
        header_value=version,
    )
    mixed_hosts_app.add_unversioned_routers(webhook_router)

if __name__ == '__main__':
    uvicorn.run(mixed_hosts_app)

By running the app, at http://localhost:8000/docs you will see a dashboard with the available versions.

More examples can be found in the tests._resources folder.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

verselect-0.2.0.tar.gz (11.4 kB view details)

Uploaded Source

Built Distribution

verselect-0.2.0-py3-none-any.whl (10.6 kB view details)

Uploaded Python 3

File details

Details for the file verselect-0.2.0.tar.gz.

File metadata

  • Download URL: verselect-0.2.0.tar.gz
  • Upload date:
  • Size: 11.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.4.2 CPython/3.10.4 Darwin/23.3.0

File hashes

Hashes for verselect-0.2.0.tar.gz
Algorithm Hash digest
SHA256 583695dc0c5b92e580373da20bcc68cb3989c7afd9de0563f665b1c25a852d10
MD5 0beac2be67a48460fd700374e61b42b4
BLAKE2b-256 e06a98ab79b5e1fb09641a9579ded6b60faff49cff15e6994e6b8fb928749efa

See more details on using hashes here.

File details

Details for the file verselect-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: verselect-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 10.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.4.2 CPython/3.10.4 Darwin/23.3.0

File hashes

Hashes for verselect-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a400c3a8882bcb88a75ea42b65919b55e1b3b23fe48c0f571be6a6003aba2351
MD5 9da7ef67ea7f0ff48ad8f603234f2625
BLAKE2b-256 0f52a663f899bf9a8fc271578aa1dad7aea88534aa8341ac0e2698379a139c49

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page