A modular application framework with built-in FastAPI integration and pluggable services
Project description
Processpype
Processpype is a framework for building and managing an application that is composed of services.
Architecture Overview
The core module provides the fundamental building blocks for creating and managing services in the ProcessPype framework.
Core Components
1. Application (application.py)
The central orchestrator that manages the lifecycle of the application and its services.
from processpype.core import Application
app = await Application.create("config.yaml")
await app.start()
Key features:
- Async context manager support
- FastAPI integration
- Service lifecycle management
- Configuration management
2. Application Manager (manager.py)
Handles service registration, state management, and lifecycle operations.
Key responsibilities:
- Service registration and retrieval
- Service state management
- Service startup/shutdown orchestration
3. Router (router.py)
Provides REST API endpoints for application and service management.
Available endpoints:
GET /- Application statusGET /services- List registered servicesPOST /services/{service_name}/start- Start a servicePOST /services/{service_name}/stop- Stop a service
4. Models (models.py)
Core data models and enums for the application.
from processpype.core.models import ServiceState
# Available states
ServiceState.STOPPED
ServiceState.STARTING
ServiceState.RUNNING
ServiceState.STOPPING
ServiceState.ERROR
5. Configuration (config/)
Handles application and service configuration management using Pydantic models.
Implementing New Services
1. Basic Service Structure
from processpype.core.service import Service
from processpype.core.models import ServiceState
class MyService(Service):
def __init__(self, name: str | None = None):
super().__init__(name or "my_service")
async def start(self) -> None:
self.set_state(ServiceState.STARTING)
# Initialize your service
self.set_state(ServiceState.RUNNING)
async def stop(self) -> None:
self.set_state(ServiceState.STOPPING)
# Cleanup resources
self.set_state(ServiceState.STOPPED)
2. Adding Configuration
from pydantic import BaseModel
from processpype.core.config.models import ServiceConfiguration
class MyServiceConfig(ServiceConfiguration):
custom_field: str
port: int = 8080
class MyService(Service):
def configure(self, config: MyServiceConfig) -> None:
self._config = config
# Apply configuration
3. Adding API Routes
from fastapi import APIRouter
class MyService(Service):
def __init__(self, name: str | None = None):
super().__init__(name or "my_service")
self._router = APIRouter(prefix=f"/services/{self.name}")
self._setup_routes()
def _setup_routes(self) -> None:
@self._router.get("/status")
async def get_status():
return {"state": self.state}
4. Error Handling
from processpype.core.models import ServiceState
class MyService(Service):
async def start(self) -> None:
try:
self.set_state(ServiceState.STARTING)
# Initialize
self.set_state(ServiceState.RUNNING)
except Exception as e:
self.set_error(str(e))
self.set_state(ServiceState.ERROR)
raise
Service Lifecycle
- Registration
app = await Application.create("config.yaml")
service = app.register_service(MyService)
- Configuration
# config.yaml
services:
my_service:
enabled: true
custom_field: "value"
port: 8080
- Startup
- Service state transitions: STOPPED → STARTING → RUNNING
- Configuration is applied
- Resources are initialized
- API routes are registered
- Runtime
- Service handles requests
- Maintains state
- Reports health status
- Shutdown
- Service state transitions: RUNNING → STOPPING → STOPPED
- Resources are cleaned up
- API routes are unregistered
Best Practices
- State Management
- Always use
set_state()for state transitions - Handle errors appropriately with
set_error() - Check state before operations
- Configuration
- Use Pydantic models for configuration
- Provide sensible defaults
- Validate configuration in
configure()
- Resource Management
- Initialize resources in
start() - Clean up resources in
stop() - Use async context managers when possible
- Error Handling
- Catch and handle exceptions appropriately
- Set service state to ERROR on failures
- Provide meaningful error messages
- API Design
- Use FastAPI best practices
- Prefix routes with service name
- Provide OpenAPI documentation
Logging
The framework uses structured logging via logfire.py:
from processpype.core.logfire import get_service_logger
class MyService(Service):
def __init__(self, name: str | None = None):
super().__init__(name or "my_service")
self.logger = get_service_logger(self.name)
async def start(self) -> None:
self.logger.info("Starting service", extra={"config": self.config.model_dump()})
Testing Services
- Unit Tests
async def test_my_service():
service = MyService()
await service.start()
assert service.state == ServiceState.RUNNING
await service.stop()
assert service.state == ServiceState.STOPPED
- Integration Tests
from fastapi.testclient import TestClient
async def test_my_service_api():
app = await Application.create()
service = app.register_service(MyService)
client = TestClient(app.api)
response = client.get("/services/my_service/status")
assert response.status_code == 200
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
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
File details
Details for the file processpype-1.1.3.tar.gz.
File metadata
- Download URL: processpype-1.1.3.tar.gz
- Upload date:
- Size: 39.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.1 CPython/3.13.2 Darwin/24.3.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
edcf73d5d05618acb20d0650552671b2cf032ac130cf9f0cb3f7bc335eb1be33
|
|
| MD5 |
7d1dabf6bbb3b44f9763b25bc6cf060c
|
|
| BLAKE2b-256 |
11e546eff20788e1686e33d5522448ff8e24c9cda87b2617f3e538b185313fcb
|
File details
Details for the file processpype-1.1.3-py3-none-any.whl.
File metadata
- Download URL: processpype-1.1.3-py3-none-any.whl
- Upload date:
- Size: 65.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.1 CPython/3.13.2 Darwin/24.3.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
236d19212a988944a95708b53a3c4c4ede98ac184879e464f33911e3fe91d9c4
|
|
| MD5 |
f2e4fc3677f24fd6c9c16ebb0d0be885
|
|
| BLAKE2b-256 |
1051668bb46dad1505d9b051a81795a1777d2b2db7a0ecef2db16cfb3e312c6d
|