Zero-boilerplate metaclass-driven plugin registry system with lazy discovery and caching
Project description
metaclass-registry
Zero-boilerplate metaclass-driven plugin registry system with lazy discovery and caching
Features
- Zero Boilerplate: No custom metaclasses, no manual registry creation, just class attributes
- Lazy Discovery: Plugins discovered automatically on first access
- Registry Inheritance: Child classes inherit parent's registry for clean interface hierarchies
- Secondary Registries: Auto-populate related registries from primary registry
- Persistent Caching: Cache discovery results across process restarts
- Auto-Configuration: Automatic inference of discovery packages and recursive settings
- Type-Safe: Full type hints and mypy support
Quick Start
from metaclass_registry import AutoRegisterMeta
# Define a base class with registry configuration
class PluginBase(metaclass=AutoRegisterMeta):
__registry_key__ = 'plugin_name' # Attribute to use as registry key
plugin_name: str = None # Subclasses set this to register
# Access the auto-created registry
PLUGINS = PluginBase.__registry__
# Define plugins - they auto-register!
class MyPlugin(PluginBase):
plugin_name = 'my_plugin'
def run(self):
return "Hello from my plugin!"
# Use the registry
print(list(PLUGINS.keys())) # ['my_plugin']
plugin = PLUGINS['my_plugin']()
print(plugin.run()) # "Hello from my plugin!"
Installation
pip install metaclass-registry
Why metaclass-registry?
Most plugin systems require boilerplate code:
Before (Traditional approach):
# Custom metaclass per registry
class PluginMeta(type):
def __new__(mcs, name, bases, namespace):
cls = super().__new__(mcs, name, bases, namespace)
if hasattr(cls, 'plugin_name') and cls.plugin_name:
PLUGINS[cls.plugin_name] = cls
return cls
# Manual registry creation
PLUGINS = {}
# Base class with custom metaclass
class PluginBase(metaclass=PluginMeta):
plugin_name = None
After (metaclass-registry):
# Just class attributes!
class PluginBase(metaclass=AutoRegisterMeta):
__registry_key__ = 'plugin_name'
# Access auto-created registry
PLUGINS = PluginBase.__registry__
Advanced Features
Registry Inheritance
class BackendBase(metaclass=AutoRegisterMeta):
__registry_key__ = 'backend_type'
class StorageBackend(BackendBase):
pass # Inherits BackendBase.__registry__
class ReadOnlyBackend(BackendBase):
pass # Also inherits BackendBase.__registry__
# All share the SAME registry!
assert StorageBackend.__registry__ is BackendBase.__registry__
Secondary Registries
METADATA_HANDLERS = {}
class MicroscopeHandler(metaclass=AutoRegisterMeta):
__registry_key__ = 'microscope_type'
__secondary_registries__ = [
SecondaryRegistry(
registry_dict=METADATA_HANDLERS,
key_source=PRIMARY_KEY,
attr_name='metadata_handler_class'
)
]
Custom Key Extractors
def extract_key_from_suffix(cls):
"""Extract 'foo' from 'FooHandler'."""
name = cls.__name__
if name.endswith('Handler'):
return name[:-7].lower()
return None
class Handler(metaclass=AutoRegisterMeta):
__registry_key__ = 'handler_type'
__key_extractor__ = extract_key_from_suffix
Documentation
Full documentation available at metaclass-registry.readthedocs.io
License
MIT License - see LICENSE file for details
Contributing
Contributions welcome! Please see CONTRIBUTING.md for guidelines.
Credits
Developed by Tristan Simas as part of the OpenHCS project.
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 metaclass_registry-0.1.4.tar.gz.
File metadata
- Download URL: metaclass_registry-0.1.4.tar.gz
- Upload date:
- Size: 22.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ed7e42ded30a5fcd47b70ef81689aa8c64e3091fe43fca22dfb8d338312432a
|
|
| MD5 |
327e0c12d9bd709be4f4f05cac302932
|
|
| BLAKE2b-256 |
4e1b13efa820cbf7b61a52ac0266023f5173156baa0648612fe132bdf1b32371
|
Provenance
The following attestation bundles were made for metaclass_registry-0.1.4.tar.gz:
Publisher:
publish.yml on OpenHCSDev/metaclass-registry
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
metaclass_registry-0.1.4.tar.gz -
Subject digest:
5ed7e42ded30a5fcd47b70ef81689aa8c64e3091fe43fca22dfb8d338312432a - Sigstore transparency entry: 854732450
- Sigstore integration time:
-
Permalink:
OpenHCSDev/metaclass-registry@1e61e0535fbf0fb7be0059d04b8e6e947b158f7a -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/OpenHCSDev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1e61e0535fbf0fb7be0059d04b8e6e947b158f7a -
Trigger Event:
push
-
Statement type:
File details
Details for the file metaclass_registry-0.1.4-py3-none-any.whl.
File metadata
- Download URL: metaclass_registry-0.1.4-py3-none-any.whl
- Upload date:
- Size: 18.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f229e2eabe41eb0db64d0504dc882780345cfbf66f7a593088ebf1f2bbc23a4
|
|
| MD5 |
d805c08db415fb436263af27f14707e2
|
|
| BLAKE2b-256 |
c6fb072fdcea75b9f361c238b327097e60e4b23ea61f009ba673ca5146681b9e
|
Provenance
The following attestation bundles were made for metaclass_registry-0.1.4-py3-none-any.whl:
Publisher:
publish.yml on OpenHCSDev/metaclass-registry
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
metaclass_registry-0.1.4-py3-none-any.whl -
Subject digest:
6f229e2eabe41eb0db64d0504dc882780345cfbf66f7a593088ebf1f2bbc23a4 - Sigstore transparency entry: 854732451
- Sigstore integration time:
-
Permalink:
OpenHCSDev/metaclass-registry@1e61e0535fbf0fb7be0059d04b8e6e947b158f7a -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/OpenHCSDev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1e61e0535fbf0fb7be0059d04b8e6e947b158f7a -
Trigger Event:
push
-
Statement type: