Skip to main content

Arrest is a wrapper of pydantic and httpx to make your REST api calls type-safe and structured

Project description

Arrest

Tests

codecov

PyPi

Enable data validation for REST APIs.

Arrest provides an easy and declarative way of defining, managing, and calling RESTful HTTP APIs with type validation, retries, exception handling, and other batteries included.

Arrest lets you define your RESTful API services in a simple encapsulation that takes care of the following:

  1. Type validation for request and response data
  2. HTTP request retries
  3. Manage your services definitions in one place
  4. Exception handling
  5. Hooks for custom exceptions
  6. Callbacks
  7. Automatic code generation from OpenAPI Schema

Contents

  1. Installation
  2. Getting Started
  3. Examples
  4. Contributing

Installation

Using pip

pip install arrest

Using poetry

poetry add arrest

Using uv

uv add arrest

Getting Started

Assuming you already have arrest installed in your system, let us create a simple connection. We have a REST endpoint htthttps://www.xyz-service.default.local.cluster/api/v1 which has a resource /users with method GET.

import logging
from arrest import Resource, Service
from arrest.exceptions import ArrestHTTPException


xyz_service = Service(
    name="xyz",
    url="https://www.xyz-service.default.local.cluster/api/v1",
    resources=[
        Resource(
            route="/users",
            handlers=[
                ("GET", "/"),
                ("GET", "/{user_id:int}"),
                ("POST", "/")
            ]
        )
    ]
)

try:
    response = await xyz_service.users.get("/123")
except ArrestHTTPException as exc:
    logging.warning(f"{exc.status_code} {exc.data}")

This will make an HTTP GET request to https://www.xyz-service.default.local.cluster/api/v1/users/123.

You can also provide a request type for your handlers. This can be done by passing a third entry to your handler tuple containing the pydantic class, or pass it directly to the handler dict or ResourceHandler initialization.

from pydantic import BaseModel

class UserRequest(BaseModel):
    name: str
    email: str
    password: str
    role: str

Resource(
    route="/users,
    handlers=[
        ("POST", "/", UserRequest) # or ResourceHandler(method="POST", route="/", request=UserRequest)
                                   # or {"method": "POST", "route": "/", "request": UserRequest}
    ]
)

await service.users.post("/", request={
    "name": "John Doe",
    "email": "john_doe@gmail.com",
    "password": "secret",
    "role": "admin"
    }
)

This gets automatically validated and parsed as UserRequest before sending the request payload to the server. If any validation error is raised the request won't go.

Similar to request, you can pass an additional fourth argument in the handler tuple for specifying a pydantic model for the handler. If provided it will automatically deserialize the returned success json response into either a model instance or a list of model instances.

class UserResponse(BaseModel):
    name: str
    email: str
    role: str
    created_at: datetime
    updated_at: datetime
    is_deleted: bool

Resource(
    route="/user",
    handlers=[
        ("GET", "/{user_id}", None, UserResponse), # if no request type to be supplied, leave it as `None`
    ]
)

user_id = "123"
response = await svc.user.get(f"/{user_id}") # type: UserResponse

Here, the JSON response from https://www.xyz-service.default.local.cluster/api/v1/users/123 will be deserialized into UserResponse model instance.

For more info, please check the docs

Examples

You can check out the example folder under the project repository to get a feel of how to use Arrest.

The example_service contains a minimal FastAPI application for task management with CRUD endpoints for users and tasks.

To generate the Arrest boilerplate from the OpenAPI specs, simply run the FastAPI application using uvicorn at http://127.0.0.1:8080/docs, and run the arrest CLI as followed:

$ arrest -u http://localhost:8080/openapi.json -d example_service

This will generate models.py, containing the Pydantic schemas corresponding to the OpenAPI components, a resources.py containing the RESTful resource definitions and a services.py containing the service definition that includes the resources.

To use the service, simply call example_service.users.get("").

Contributing

Please see the CONTRIBUTING.md for more information.

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

arrest-0.1.10.tar.gz (23.6 kB view details)

Uploaded Source

Built Distribution

arrest-0.1.10-py3-none-any.whl (29.3 kB view details)

Uploaded Python 3

File details

Details for the file arrest-0.1.10.tar.gz.

File metadata

  • Download URL: arrest-0.1.10.tar.gz
  • Upload date:
  • Size: 23.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.4.2 CPython/3.10.15 Linux/6.5.0-1025-azure

File hashes

Hashes for arrest-0.1.10.tar.gz
Algorithm Hash digest
SHA256 896cb241e9028f2988683b32dc98d64c1cdb1e9768e254dc356d457d124d65e7
MD5 84861c927bd7286381563a87d3d0880f
BLAKE2b-256 ddb8f5ae624bc9e306ed5d926630100463a2bca9cfb46803b2fcc4624e952137

See more details on using hashes here.

File details

Details for the file arrest-0.1.10-py3-none-any.whl.

File metadata

  • Download URL: arrest-0.1.10-py3-none-any.whl
  • Upload date:
  • Size: 29.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.4.2 CPython/3.10.15 Linux/6.5.0-1025-azure

File hashes

Hashes for arrest-0.1.10-py3-none-any.whl
Algorithm Hash digest
SHA256 9be117b22a67ac4af67028212d7dc545f197973979468c0b842b1fae7e431896
MD5 62fc2b2be42c10dc896e67ac8164f76e
BLAKE2b-256 fa5b63a7713418a77cdc7a021d9653a04d7ba2a1bdd74a0dec045b1e2e9e5a26

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