Action0-Service
A lightweight service registry and dependency injection framework: register classes, factories, or ready-made instances — by type or by name — and request them back with their constructor dependencies resolved automatically. Scopes (singleton, transient, thread-local, context-local), YAML service definitions, and a test-friendly override mechanism included. The core has zero dependencies.
Requires Python 3.11 or newer.
Full documentation including the API reference: https://laughinjar.github.io/action0-service/
Installation
pip install action0-service # or: uv add action0-service
pip install "action0-service[yaml]" # with YAML support (PyYAML)
Usage
Register services and let the registry wire them together:
from action0.service import Registry, Scope
class Database:
def __init__(self, dsn: str = "sqlite://"):
self.dsn = dsn
class UserRepository:
def __init__(self, db: Database): # injected from the registry
self.db = db
registry = Registry()
registry.register(Database, params={"dsn": "postgres://db/app"})
registry.register(UserRepository)
repo = registry.get(UserRepository)
print(repo.db.dsn)
# postgres://db/app
print(registry.get(UserRepository) is repo) # singletons by default
# True
Services can be named (several implementations of one type), scoped, and looked up by type — subclass-aware — or by name:
registry.register(Database, name="replica", params={"dsn": "postgres://replica/app"})
registry.get("replica") # by name
registry.get(Database) # the unnamed default
registry.get(Database, name="replica") # typed + named
registry.register(UserRepository, name="fresh", scope=Scope.TRANSIENT, replace=True)
Or define whole registries in YAML (anchors and merges work as usual):
database:
factory: myapp.db.Database
dsn: !ENV ${DATABASE_DSN:-sqlite://}
user-repository:
factory: myapp.repo.UserRepository
db: !ref database
registry.load_yaml("conf/services.yaml")
registry.validate() # catch config mistakes at boot, not at first use
For tests, swap any service temporarily:
with registry.override(Database, FakeDatabase()):
...
See the documentation for
injection rules, scopes, custom scopes, the full YAML format, parent
registries, lifecycle management (warmup() / close()), and the
@registry.inject function decorator.
The action0 namespace is simply the one the author likes to use for
personal projects.
AI disclosure
This library is developed with heavy use of AI coding tools: the code, tests, and documentation are largely written by Claude Code, working from the author's design brief and reviewed by the author. If that changes how much you want to rely on this package, that's a fair call — read the source, it's small.
License
MIT — see LICENSE.
Release files for action0-service 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| action0_service-0.1.1.tar.gz | 132.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| action0_service-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 171.6 kB
Release files / action0_service-0.1.1.tar.gz
| Download URL | action0_service-0.1.1.tar.gz |
|---|---|
| Size | 132.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
158ece2d1c99a2b14afab8cdf121788e05cfccb66585a3884e1177acfd2c21c0
|
|
BLAKE2b-256 checksum How to use checksums |
25dba01c17523ec71c7d3329895f14ee3c3d14840673ceda94a250ad305c1d78
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency logRelease files / action0_service-0.1.1-py3-none-any.whl
| Download URL | action0_service-0.1.1-py3-none-any.whl |
|---|---|
| Size | 38.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1d36556d8a95fbfc24f8c2d8828243e2a599b2e574ef0b6fee199ca87af34074
|
|
BLAKE2b-256 checksum How to use checksums |
438c2eabc6adfc6d62a6ce75161ce54b97715fa61676c5c88519dd905381e7e2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 8, 2026.
Transparency log