Application-agnostic plugin framework built on pluggy
Project description
PluginForge
Application-agnostic Python plugin framework built on pluggy.
PluginForge adds the layers that pluggy is missing: YAML configuration, plugin lifecycle management, enable/disable per config, dependency resolution, FastAPI integration, and i18n support.
Installation
pip install pluginforge
With optional FastAPI support:
pip install pluginforge[fastapi]
Quickstart
1. Create a plugin
from pluginforge import BasePlugin
class HelloPlugin(BasePlugin):
name = "hello"
version = "1.0.0"
description = "A hello world plugin"
def activate(self):
print(f"Hello plugin activated with config: {self.config}")
def get_routes(self):
from fastapi import APIRouter
router = APIRouter()
@router.get("/hello")
def hello():
return {"message": self.config.get("greeting", "Hello!")}
return [router]
2. Configure your app
# config/app.yaml
app:
name: "MyApp"
version: "1.0.0"
default_language: "en"
plugins:
entry_point_group: "myapp.plugins"
enabled:
- "hello"
disabled: []
# config/plugins/hello.yaml
greeting: "Hello from PluginForge!"
3. Use PluginManager
from pluginforge import PluginManager
pm = PluginManager("config/app.yaml")
# Register plugins directly (or use entry points for auto-discovery)
pm.register_plugins([HelloPlugin])
# Access plugins
for plugin in pm.get_active_plugins():
print(f"Active: {plugin.name} v{plugin.version}")
# Mount FastAPI routes
from fastapi import FastAPI
app = FastAPI()
pm.mount_routes(app) # Routes under /api/ (configurable prefix)
Features
- YAML Configuration - App config, per-plugin config, and i18n strings
- Plugin Lifecycle - init, activate, deactivate with error handling
- Hot-Reload - Swap plugins at runtime without app restart
- Enable/Disable - Control plugins via config lists
- Dependency Resolution - Topological sorting with circular dependency detection
- Extension Points - Query plugins by interface with
get_extensions(type) - Config Schema Validation - Declare expected config types per plugin
- Health Checks - Monitor plugin status via
health_check() - Pre-Activate Hooks - Reject plugins before activation (license checks, etc.)
- FastAPI Integration - Mount plugin routes with configurable prefix
- Alembic Support - Collect migration directories from plugins
- i18n - Multi-language strings from YAML with fallback
- Security - Plugin name validation and path traversal prevention
For detailed documentation, see the Wiki.
Entry Point Discovery
Register plugins as entry points in your pyproject.toml:
[project.entry-points."myapp.plugins"]
hello = "myapp.plugins.hello:HelloPlugin"
Then use discover_plugins() instead of register_plugins():
pm = PluginManager("config/app.yaml")
pm.discover_plugins() # Auto-discovers from entry points
i18n
# config/i18n/en.yaml
common:
save: "Save"
cancel: "Cancel"
pm.get_text("common.save", "en") # "Save"
pm.get_text("common.save", "de") # "Speichern"
Documentation
The full documentation is available in the Wiki:
- Getting Started
- BasePlugin
- PluginManager
- Configuration
- Discovery and Dependencies
- Lifecycle
- Hooks
- Extensions
- FastAPI Integration
- Alembic Integration
- i18n
- Security
- Examples
- Changelog
Development
make install-dev # Install with dev dependencies
make test # Run tests
make lint # Run ruff linter
make format # Format code
make ci # Full CI pipeline (lint + format-check + test)
make help # Show all available targets
License
MIT
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 pluginforge-0.5.0.tar.gz.
File metadata
- Download URL: pluginforge-0.5.0.tar.gz
- Upload date:
- Size: 13.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.11.13 Linux/6.8.0-106-lowlatency
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
65ae7d4bb2f5fe69757224553d43f356260fe863bf1e1c3eaca6c202e0a2e01f
|
|
| MD5 |
90b98a92289cf7145433d85f351a9840
|
|
| BLAKE2b-256 |
d9c82a3b4acc07b1b04a604b3d83b6201b4a8aeadb065d38bd86f16481366ded
|
File details
Details for the file pluginforge-0.5.0-py3-none-any.whl.
File metadata
- Download URL: pluginforge-0.5.0-py3-none-any.whl
- Upload date:
- Size: 16.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.11.13 Linux/6.8.0-106-lowlatency
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e120818bfbb93e915f494383a4b17a3c67ba4af8a4e4453a816fa1d752d3d8f2
|
|
| MD5 |
9a1cc1af55ff148745cd20a3718c673e
|
|
| BLAKE2b-256 |
96f6e849aae26f882034070321ce5d0b2b2fa8774e4b131dacf6a6a182c40cec
|