# Cell removed - using PluginMetadata from cjm-fasthtml-pluginsPlugins
Optional plugin integration for extensible settings systems
Plugin Integration
This module provides integration with the cjm-fasthtml-plugins library for extensible settings systems.
- Uses
PluginMetadatafromcjm-fasthtml-plugins - Defines
PluginRegistryProtocolfor registry compatibility - Applications should use
UnifiedPluginRegistryfromcjm-fasthtml-pluginsinstead ofSimplePluginRegistry
# Cell removed - PluginMetadata now imported from cjm-fasthtml-plugins
# The imported version includes additional features:
# - Execution mode tracking (local, cloud, subprocess, etc.)
# - Resource management (child PIDs, containers, cloud instances)
# - Lifecycle awareness supportPlugin Registry Protocol
PluginRegistryProtocol
PluginRegistryProtocol (*args, **kwargs)
Protocol that plugin registries should implement.
# Example: Using UnifiedPluginRegistry from cjm-fasthtml-plugins
from cjm_fasthtml_plugins.core.registry import UnifiedPluginRegistry
# Mock plugin manager for demonstration
from dataclasses import dataclass as dc
@dc
class MockPluginData:
name: str
version: str
class MockPluginManager:
def discover_plugins(self):
return [
MockPluginData("plugin_a", "1.0.0"),
MockPluginData("plugin_b", "1.0.0")
]
def get_plugin_config_schema(self, name: str):
return {
"type": "object",
"title": f"{name.title()} Configuration",
"properties": {
"enabled": {"type": "boolean", "default": True}
}
}
with tempfile.TemporaryDirectory() as tmpdir:
# Create unified registry
registry = UnifiedPluginRegistry(config_dir=Path(tmpdir))
# Register a plugin manager for a category
registry.register_plugin_manager(
category="data_processing",
manager=MockPluginManager(),
display_name="Data Processing"
)
# The registry implements PluginRegistryProtocol
print(f"Implements protocol: {isinstance(registry, PluginRegistryProtocol)}")
print(f"Categories: {registry.get_categories_with_plugins()}")
print(f"Plugins in category: {[p.name for p in registry.get_plugins_by_category('data_processing')]}")
# Get a specific plugin
plugin = registry.get_plugin("data_processing_plugin_a")
print(f"\nPlugin metadata:")
print(f" Name: {plugin.name}")
print(f" Category: {plugin.category}")
print(f" Title: {plugin.title}")
print(f" Unique ID: {plugin.get_unique_id()}")
# Save and load config
registry.save_plugin_config("data_processing_plugin_a", {"enabled": False})
loaded = registry.load_plugin_config("data_processing_plugin_a")
print(f"\nSaved and loaded config: {loaded}")Implements protocol: True
Categories: ['data_processing']
Plugins in category: ['plugin_a', 'plugin_b']
Plugin metadata:
Name: plugin_a
Category: data_processing
Title: Plugin_A Configuration
Unique ID: data_processing_plugin_a
Saved and loaded config: {'enabled': False}