Skip to main content

A framework for building API clients with minimal boilerplate

Project description

ClientFactory

A Python framework for building API clients with minimal boilerplate while maintaining full configurability and extensibility.

Features

  • Declarative API Definition: Define your API structure using Python classes and decorators
  • Multiple Authentication Methods: Built-in support for:
    • API Key authentication (header or query parameter)
    • OAuth 2.0 (client credentials, authorization code)
    • Session-based authentication with browser automation
    • Basic HTTP authentication
    • Token-based authentication
    • Custom authentication handlers
  • Resource Management:
    • Organize endpoints into logical resource groups
    • Support for nested resources
    • Automatic URL construction
    • Path parameter handling
  • Request Processing:
    • Pre-processing hooks for request modification
    • Post-processing hooks for response transformation
    • Automatic retries with configurable backoff
    • File upload support with progress tracking
  • Session Management:
    • Persistent sessions with encryption
    • Cookie handling
    • Proxy support
    • Custom header management
  • Type Safety: Full type hinting support for better IDE integration
  • Extensibility: Every component is designed to be extended and customized

Installation

pip install clientfactory

Quick Start

Basic Usage

from clientfactory import Client, resource, get, post, ApiKeyAuth

class GitHub(Client):
    baseurl = "https://api.github.com"
    auth = ApiKeyAuth.header("your-token", "Authorization", prefix="Bearer")

    @resource
    class Repos:
        @get("user/repos")
        def list_repos(self): pass

        @post("user/repos")
        def create_repo(self, name: str, private: bool = False):
            return {"name": name, "private": private}

# Use the client
github = GitHub()
repos = github.repos.list_repos()

Request Processing

from clientfactory import Client, resource, get, preprocess, postprocess
from clientfactory.utils import Request, Response

class DataAPI(Client):
    baseurl = "https://api.example.com"

    @resource
    class Data:
        @preprocess
        def add_timestamp(self, request: Request) -> Request:
            """Add timestamp to all requests"""
            return request.WITH(
                headers={"X-Timestamp": str(time.time())}
            )

        @postprocess
        def extract_data(self, response: Response) -> dict:
            """Extract data field from response"""
            return response.json()["data"]

        @get("data/{id}")
        def get_data(self, id: str): pass

File Uploads

from clientfactory import Client, resource, post, UploadConfig
from clientfactory.utils import FileUpload

class Storage(Client):
    baseurl = "https://storage.example.com"

    @resource
    class Files:
        def progress(self, current: int, total: int):
            print(f"Uploaded {current}/{total} bytes")

        @post("upload")
        def upload(self, file: str):
            uploader = FileUpload(
                config=UploadConfig(
                    progresscallback=self.progress
                )
            )
            return uploader.multipart(
                url=self.url + "/upload",
                files={"file": file}
            )

OAuth Authentication

from clientfactory import Client, OAuth2Auth, resource, get

class ServiceAPI(Client):
    baseurl = "https://api.service.com"
    auth = OAuth2Auth.clientcredentials(
        clientid="your-client-id",
        clientsecret="your-client-secret",
        tokenurl="https://auth.service.com/token"
    )

    @resource
    class Users:
        @get("users/me")
        def me(self): pass

Builder Pattern

from clientfactory import ClientBuilder, ApiKeyAuth

# Create client programmatically
client = (ClientBuilder()
    .baseurl("https://api.example.com")
    .auth(ApiKeyAuth.header("your-key"))
    .sessioncfg(verify=False)  # Disable SSL verification
    .requestconfig(timeout=30.0)
    .headers({
        "User-Agent": "MyApp/1.0",
        "Accept": "application/json"
    })
    .build())

Session Persistence

from clientfactory import Client, DiskPersist, PersistConfig

class WebApp(Client):
    baseurl = "https://webapp.example.com"

    def __init__(self):
        # Setup encrypted session persistence
        self.persist = DiskPersist(
            config=PersistConfig(
                path="~/.myapp/session",
                encrypt=True
            )
        )
        super().__init__()

Advanced Usage

For more advanced usage examples, including:

  • Custom authentication handlers
  • Complex request/response processing
  • Browser automation for web apps
  • Request retries and backoff strategies
  • Resource hierarchies
  • Error handling

Visit our Advanced Usage Guide.

Development

# Clone the repository
git clone https://github.com/schizoprada/clientfactory.git
cd clientfactory

# Create a virtual environment
python -m venv venv
source venv/bin/activate  # or `venv\Scripts\activate` on Windows

# Install development dependencies
pip install -e ".[test,docs]"

# Run tests
pytest

# Build documentation
cd docs
make html

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

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

clientfactory-0.5.5.tar.gz (47.7 kB view details)

Uploaded Source

Built Distribution

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

clientfactory-0.5.5-py3-none-any.whl (41.2 kB view details)

Uploaded Python 3

File details

Details for the file clientfactory-0.5.5.tar.gz.

File metadata

  • Download URL: clientfactory-0.5.5.tar.gz
  • Upload date:
  • Size: 47.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.7

File hashes

Hashes for clientfactory-0.5.5.tar.gz
Algorithm Hash digest
SHA256 0842bc9328e96eaa3bc2c56d979d79751f8bd256632162683b900e56fcd0256f
MD5 0b88b1efb1576071a58239bb7c90fb41
BLAKE2b-256 bfb4ad4aee3cf2c2e631e85c3efcee9b78aa5bb22207c3f9c706fc2ead961ac7

See more details on using hashes here.

File details

Details for the file clientfactory-0.5.5-py3-none-any.whl.

File metadata

  • Download URL: clientfactory-0.5.5-py3-none-any.whl
  • Upload date:
  • Size: 41.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.7

File hashes

Hashes for clientfactory-0.5.5-py3-none-any.whl
Algorithm Hash digest
SHA256 910da8011f684c7c735f1213c6126ebcbbf4e3bf39c7de1c5435341ac3de688f
MD5 2067801f048bdaaade4c8b629b554b30
BLAKE2b-256 778f7ff7ce04dcb924f91b75c3a4592a9a6e947a0670d9d098dd2120416aec4d

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