API Reference¶
Auto-generated from docstrings. Work in progress
Clients¶
clientcraft.client.APIClient ¶
Bases: BaseAPIClient[HttpBackend]
Base class for declarative synchronous API clients.
Subclass this and declare endpoints using type annotations:
class UserAPI(APIClient):
get_user: Get[GetUserRequest, User, Literal["/users/{user_id}"]]
create_user: Post[CreateUserRequest, User, Literal["/users"]]
delete_user: Delete[DeleteUserRequest, None, Literal["/users/{user_id}"]]
client = UserAPI(base_url="https://api.example.com", backend=backend)
user = client.get_user(GetUserRequest(user_id="123"))
Source code in src/clientcraft/client.py
clientcraft.async_client.AsyncAPIClient ¶
Bases: BaseAPIClient[AsyncHttpBackend]
Base class for declarative asynchronous API clients.
Subclass this and declare endpoints using type annotations:
class UserAPI(AsyncAPIClient):
get_user: AsyncGet[GetUserRequest, User, Literal["/users/{user_id}"]]
create_user: AsyncPost[CreateUserRequest, User, Literal["/users"]]
delete_user: AsyncDelete[DeleteUserRequest, None, Literal["/users/{user_id}"]]
client = UserAPI(base_url="https://api.example.com", backend=backend)
user = await client.get_user(GetUserRequest(user_id="123"))
Source code in src/clientcraft/async_client.py
Endpoint types¶
The endpoint types (Get, Post, Put, Patch, Delete and their Async*
counterparts) are constructed at runtime via a metaclass and described
statically by the bundled type stubs. See How It Works for the
mechanism and Endpoints for usage.
Response wrappers¶
clientcraft.TextResponse ¶
Bases: BaseModel
Wrapper for text responses.
Usage
get_health: Get[None, TextResponse, Literal["/health"]]
Source code in src/clientcraft/_responses.py
clientcraft.BytesResponse ¶
Bases: BaseModel
Wrapper for binary responses.
Usage
download_file: Get[FileRequest, BytesResponse, Literal["/files/{id}"]]
Source code in src/clientcraft/_responses.py
Errors¶
clientcraft.HttpError ¶
Bases: Exception
HTTP error with status code, response content, and the failed endpoint.
Source code in src/clientcraft/_base.py
Core types¶
clientcraft.RequestStyle ¶
Bases: Enum
How to serialize request data for the HTTP call.
Source code in src/clientcraft/_types.py
clientcraft.ResponseStyle ¶
Bases: Enum
How to deserialize response data.
Source code in src/clientcraft/_types.py
clientcraft.EndpointInfo
dataclass
¶
Metadata about an endpoint, stored in Annotated type.
Source code in src/clientcraft/_types.py
clientcraft.ExtractedEndpoint
dataclass
¶
Result of extracting endpoint info from a type hint.
Source code in src/clientcraft/_types.py
Backend protocols¶
clientcraft.backends.HttpBackend ¶
Bases: Protocol
Protocol for synchronous HTTP backends.
Any object with a matching request method works - no inheritance required.
This allows easy integration with requests, httpx, or custom implementations.
Example with requests
class RequestsBackend: def init(self, session: requests.Session | None = None): self.session = session or requests.Session()
def request(self, method, url, *, content=None, headers=None, timeout=None):
resp = self.session.request(method, url, data=content, headers=headers, timeout=timeout)
return resp # requests.Response satisfies HttpResponse protocol
Source code in src/clientcraft/backends/_protocols.py
request ¶
request(
method: str,
url: str,
*,
content: bytes | None = None,
headers: dict[str, str] | None = None,
timeout: float | None = None,
) -> HttpResponse
Make a synchronous HTTP request.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
method
|
str
|
HTTP method (GET, POST, PUT, DELETE, etc.) |
required |
url
|
str
|
Full URL to request |
required |
content
|
bytes | None
|
Optional request body as bytes |
None
|
headers
|
dict[str, str] | None
|
Optional request headers |
None
|
timeout
|
float | None
|
Optional timeout in seconds |
None
|
Returns:
| Type | Description |
|---|---|
HttpResponse
|
An object satisfying the HttpResponse protocol |
Source code in src/clientcraft/backends/_protocols.py
clientcraft.backends.AsyncHttpBackend ¶
Bases: Protocol
Protocol for asynchronous HTTP backends.
Any object with a matching async request method works - no inheritance required.
This allows easy integration with httpx.AsyncClient, aiohttp, or custom implementations.
Example with httpx
class HttpxBackend: def init(self, client: httpx.AsyncClient | None = None): self.client = client or httpx.AsyncClient()
async def request(self, method, url, *, content=None, headers=None, timeout=None):
resp = await self.client.request(method, url, content=content, headers=headers, timeout=timeout)
return resp # httpx.Response satisfies HttpResponse protocol
Source code in src/clientcraft/backends/_protocols.py
request
async
¶
request(
method: str,
url: str,
*,
content: bytes | None = None,
headers: dict[str, str] | None = None,
timeout: float | None = None,
) -> HttpResponse
Make an asynchronous HTTP request.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
method
|
str
|
HTTP method (GET, POST, PUT, DELETE, etc.) |
required |
url
|
str
|
Full URL to request |
required |
content
|
bytes | None
|
Optional request body as bytes |
None
|
headers
|
dict[str, str] | None
|
Optional request headers |
None
|
timeout
|
float | None
|
Optional timeout in seconds |
None
|
Returns:
| Type | Description |
|---|---|
HttpResponse
|
An object satisfying the HttpResponse protocol |
Source code in src/clientcraft/backends/_protocols.py
clientcraft.backends.HttpResponse ¶
Bases: Protocol
Protocol for HTTP responses.
Any object with these properties works - no inheritance required. Most HTTP libraries (requests, httpx, aiohttp) return responses that satisfy this protocol or can be easily adapted.