Skip to main content

Action0-Service

CI PyPI

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)

Source distribution for action0-service 0.1.1
File Size Uploaded
action0_service-0.1.1.tar.gz 132.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for action0-service 0.1.1
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page