Skip to main content

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 StatusError mixin
  • Support for path parameters, query parameters, headers, body, JSON, form data, and file uploads
  • Built on top of msgspex for fast serialization and kungfu for 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

cool_api = API.endpoint("/coolapi/v1").bind_auth(HTTPBearer)


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="abc123...")

    # Or using aiohttp
    # async with ClientSession() as session:
    #     cool_api.build(AiohttpClient(session, base_url="https://api.example.com"))

    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


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.0.1.tar.gz (61.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

saronia-1.0.1-py3-none-any.whl (20.8 kB view details)

Uploaded Python 3

File details

Details for the file saronia-1.0.1.tar.gz.

File metadata

  • Download URL: saronia-1.0.1.tar.gz
  • Upload date:
  • Size: 61.9 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

Hashes for saronia-1.0.1.tar.gz
Algorithm Hash digest
SHA256 4ac4de5b5427ce296626b87cfe057bfda44a64321c820b3b990c61e95a4e204c
MD5 29866b875328b24b52587038f2bdfda8
BLAKE2b-256 da6c28fe5feabf27f6b5f495eb623204554f63deb5439169eb3db99c6a60b071

See more details on using hashes here.

File details

Details for the file saronia-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: saronia-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 20.8 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

Hashes for saronia-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 79cce9416c72889496eb4e3fc5cb85618f960a6b525c1828ed2b9ead0e1b015c
MD5 a2bdd18edb4abe65b3fae3a88857c512
BLAKE2b-256 69661726ae62afa0d801af468039a5da10bdcbaf360bc47e677cfecdfe75f831

See more details on using hashes here.

Supported by

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