A lightweight, spec-driven builder for API clients and controllers.
Project description
saronia
A lightweight, spec-driven builder for API clients and controllers.
- Declarative API controller syntax
- Type-safe request/response handling with
APIResult - Support for multiple HTTP clients (
rnet,aiohttp, or custom) - Comprehensive error handling with
StatusErrormixin - Support for path parameters, query parameters, headers, body, JSON, form data, and file uploads
- Built on top of
msgspexfor fast serialization andkungfufor functional types
Getting Started
# Base installation
pip install saronia
# With rnet client
pip install saronia[rnet]
# With aiohttp client
pip install saronia[aiohttp]
import asyncio
from uuid import UUID
from http import HTTPStatus
from kungfu import Error
from msgspex import Model
from saronia import API, APIResult, HTTPBearer, StatusError, get, post
from rnet import Client
from saronia import RnetClient
class Auth(Model):
bearer: HTTPBearer
cool_api = API.endpoint("/coolapi/v1").bind_auth(Auth)
class ValidationError(Model, StatusError[HTTPStatus.INTERNAL_SERVER_ERROR]):
message: str
class NotFoundError(Model, StatusError[HTTPStatus.NOT_FOUND]):
message: str
class Book(Model):
id: UUID
name: str
class CreateBookDTO(Model):
id: UUID
name: str
@cool_api("/books")
class BooksController:
@get("/{book_id}")
async def get_book_by_id(self, book_id: UUID) -> APIResult[Book, ValidationError | NotFoundError]:
...
@post("/create", CreateBookDTO)
async def create_book(self) -> APIResult[Book, ValidationError | NotFoundError]:
...
books = BooksController()
async def main() -> None:
client = Client()
cool_api.build(RnetClient(client, base_url="https://api.example.com", request_timeout=45.0))
cool_api.auth(token=HTTPBearer("abc123..."))
book = (await books.get_book_by_id(UUID("12345678-1234-5678-1234-567812345678"))).unwrap()
print(f"Book: {book.name}")
match await books.create_book(id=UUID("87654321-4321-8765-4321-876543218765"), name="New Book"):
case Error(error):
print(f"Error: {error}")
asyncio.run(main())
License
saronia is MIT licensed
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
saronia-1.2.0.tar.gz
(65.6 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
saronia-1.2.0-py3-none-any.whl
(23.5 kB
view details)
File details
Details for the file saronia-1.2.0.tar.gz.
File metadata
- Download URL: saronia-1.2.0.tar.gz
- Upload date:
- Size: 65.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d6234f4ba2fb09ad927ecf9b858cf0ab6551897c2b609d4b3ad1700888c43134
|
|
| MD5 |
fadd70830bf2f8e0e5d424061b5b883f
|
|
| BLAKE2b-256 |
981ed12813c5581162a747a04607522d9095be9566c30a0e8cf71316ced7aa6f
|
File details
Details for the file saronia-1.2.0-py3-none-any.whl.
File metadata
- Download URL: saronia-1.2.0-py3-none-any.whl
- Upload date:
- Size: 23.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a4dda1d88973b54fb297ef189ec35e1c881dfb7354c8369f94681f99d47084a
|
|
| MD5 |
d4b228d0d01cf71532a5d1fd25a734b7
|
|
| BLAKE2b-256 |
b56f497d538a49ee906dae5707a0ba1c34f86b78aab00f885ef2faa61baf378a
|