ClassRegistry
At the intersection of the Registry and Factory patterns lies the ClassRegistry:
Define global factories that generate new class instances based on configurable keys.
Seamlessly create powerful service registries.
Integrate with setuptools’s entry_points system to make your registries infinitely extensible by 3rd-party libraries!
And more!
Upgrading from ClassRegistry v4
Getting Started
Create a registry using the class_registry.ClassRegistry class, then decorate any classes that you wish to register with its register method:
from class_registry import ClassRegistry
pokedex = ClassRegistry()
@pokedex.register('fire')
class Charizard(Pokemon):
...
@pokedex.register('grass')
class Bulbasaur(Pokemon):
...
@pokedex.register('water')
class Squirtle(Pokemon):
...
To create a class instance from a registry, use the subscript operator:
# Charizard, I choose you!
fighter1 = pokedex['fire']
# CHARIZARD fainted!
# How come my rival always picks the type that my pokémon is weak against??
fighter2 = pokedex['grass']
Advanced Usage
There’s a whole lot more you can do with ClassRegistry, including:
Provide args and kwargs to new class instances.
Automatically register non-abstract classes.
Integrate with setuptools’s entry_points system so that 3rd-party libraries can add their own classes to your registries.
Wrap your registry in an instance cache to create a service registry.
And more!
For more advanced usage, check out the documentation on ReadTheDocs!
Requirements
ClassRegistry is known to be compatible with the following Python versions:
3.14
3.13
3.12
Installation
Install the latest stable version via pip:
pip install phx-class-registry
Maintainers
To install the distribution for local development, some additional setup is required:
Install uv (only needs to be done once).
Run the following command to install additional dependencies:
uv sync --group=dev
Activate pre-commit hook:
uv run autohooks activate --mode=pythonpath
Running Unit Tests and Type Checker
Run the tests for all supported versions of Python using tox:
uv run tox -p
The -p flag runs tests for each version of Python in parallel. Omit it if you want to see the tests run for one Python version at a time.
If you just want to run unit tests in the current virtualenv (using pytest):
uv run pytest
If you just want to run type checking in the current virtualenv (using mypy):
uv run mypy src test
Documentation
To build the documentation locally:
Switch to the docs directory:
cd docs
Build the documentation:
uv run make html
Releases
Steps to build releases are based on Packaging Python Projects Tutorial.
One-time Setup
Install the keyring tool and add it to your PATH:
uv tool install keyring uv tool update-shell
Restart your shell after running update-shell.
Create a PyPI API token and store it in the OS keychain:
keyring set https://upload.pypi.org/legacy/ __token__
Paste the pypi-... token when prompted.
1. Build the Project
Delete artefacts from previous builds, if applicable:
rm dist/*
Run the build:
uv build
The build artefacts will be located in the dist directory at the top level of the project.
2. Upload to PyPI
Bump the version (also updates uv.lock):
uv version <version>
Upload build artefacts to PyPI:
uv publish --username __token__
3. Create GitHub Release
Create a tag and push to GitHub:
git tag -a <version> -m "Release <version>" git push origin <version>
Go to the Releases page for the repo.
Click Draft a new release.
Select the tag that you created in step 1.
Specify the title of the release (e.g., ClassRegistry v1.2.3).
Write a description for the release. Make sure to include: - Credit for code contributed by community members. - Significant functionality that was added/changed/removed. - Any backwards-incompatible changes and/or migration instructions. - SHA256 hashes of the build artefacts.
GPG-sign the description for the release (ASCII-armoured).
Attach the build artefacts to the release.
Click Publish release.
Release files for phx-class-registry 5.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| phx_class_registry-5.2.2.tar.gz | 163.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| phx_class_registry-5.2.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 178.9 kB
Release files / phx_class_registry-5.2.2.tar.gz
| Download URL | phx_class_registry-5.2.2.tar.gz |
|---|---|
| Size | 163.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c8f792b8856a6c0af990f648be108de10ed0560771555d81a0452c4627f8f489
|
|
BLAKE2b-256 checksum How to use checksums |
1c8a112b75d64bf57ce8dc561ae7e084d54a8b22c8203b5a1506afeed42520d7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":null,"id":"forky","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / phx_class_registry-5.2.2-py3-none-any.whl
| Download URL | phx_class_registry-5.2.2-py3-none-any.whl |
|---|---|
| Size | 15.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
38901ed17fb42a548a781e14d46b3d3b1560ead772424449a3425ee1b77a5c6f
|
|
BLAKE2b-256 checksum How to use checksums |
daa2340e189bab289045a0c0d9cd0ab3689cfc23a62fd32c8171a5c31382bb9e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":null,"id":"forky","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|