..a tiny but powerful DI library for Python.
Project description
hazrakah (הזרקה) is a tiny but powerful DI library for Python.
This README is only a high-level introduction to hazrakah. For more detailed documentation, please view the official docs at https://hazrakah.readthedocs.io.
Features
- Supports Transient, Singleton and Instance registrations.
- Registration targets can be a concrete type or a factory function.
- Container is mutable by default, but can be frozen on-demand.
- Hierarchical container scopes can be created, and scoped registrations are isolated to their respective scope.
Installation
You can install hazrakah from PyPI through usual means, such as pip:
pip install hazrakah
Usage
To use hazrakah simply create a Container instance and create one or more type registrations. Afterward, the container can be used to resolve instances for the types you have registered:
from hazrakah import Container
# assume you have three classes, Fizz, Buzz, and FizzBuzz,
# and also assume you have Protocols (interfaces) for each.
container = Container()
scoped_container = container.create_scope()
# TRANSIENT == a new instance of `Foo` is created
# for every resolve of `IFoo`.
container.register_transient(IFizz, Fizz)
#
fizz1 = container.resolve(IFizz)
fizz2 = container.resolve(IFizz)
assert fizz1 is not fizz2, 'transient reg, every resolve is a new instance.'
# CHILD SCOPED registrations cannot be resolved
# from PARENT SCOPE.
scoped_container.register_transient(IBuzz, Buzz)
buzz1 = scoped_container.resolve(IBuzz)
assert buzz1 is not None, 'scopes should allow new registrations.'
try:
_ = container.resolve(IBuzz)
except KeyError:
pass
else:
raise AssertionError('parent scopes should not resolve child scope registrations.')
# INSTANCE == the provided instance is returned
# for every resolve of `FizzBuzz`.
container.register_instance(FizzBuzz, FizzBuzz())
#
fizzbuzz1 = container.resolve(FizzBuzz)
fizzbuzz2 = scoped_container.resolve(FizzBuzz)
assert fizzbuzz1 is fizzbuzz2, 'instance resolves always yield the provided instance'
# NOTE: "scopes" resolve hierarchically any "non-scoped" type registration,
# this is why `scoped_container`` resolved the same instance as `container`.
# if this were a scoped registration a NEW instance would have been created.
# this scoping logic is true for INSTANCE, SINGLETON, and TRANSIENT regs.
# SINGLETON == a SINGLE instance will be created
# for ALL resolves of `IFizzBuzz`.
container.register_singleton(IFizzBuzz, lambda c: c.resolve(FizzBuzz))
fizzbuzz3 = container.resolve(IFizzBuzz)
fizzbuzz4 = container.resolve(IFizzBuzz)
assert fizzbuzz3 is fizzbuzz4, 'singleton resolves always yield a single instance.'
# for completeness, concrete types can self-regsiter without a target spec.
container.register_transient(Fizz)
fizz3 = container.resolve(Fizz)
assert fizz3 is not None
# and last, but not least, containers can be frozen,
# making them immutable (also freezing any scopes
# created after being frozen.) once frozen, they
# cannot be unfrozen.
try:
container.freeze()
container.register_instance(Fizz, Fizz())
except RegistrationError:
pass
else:
assert False, 'Frozen containers should be immutable.'
try:
scoped_container.register_instance(Fizz, Fizz())
except:
assert False, 'Scopes created BEFORE freezing are NOT frozen.'
try:
scope2 = container.create_scope()
scope2.register_instance(Fizz, Fizz())
except RegistrationError:
pass
else:
assert False, 'Scopes created AFETR freezing are also frozen.'
try:
setattr(container, '__frozen', False)
except AttributeError:
pass
else:
assert False, 'Attempts to modify Container directly will fail.'
Contact
You can reach me on Discord or open an Issue on Github.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
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 hazrakah-1.0.0-py3-none-any.whl.
File metadata
- Download URL: hazrakah-1.0.0-py3-none-any.whl
- Upload date:
- Size: 7.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15+
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a45417255bc146e253d29ba68d8922b8ff744b1b9abe43d8db7b4d4a19c16719
|
|
| MD5 |
0cc20960449108e8ac63403a054d29e4
|
|
| BLAKE2b-256 |
285ddf452ad77cc34f386c3fad036a9a894055da43a1fd62faa1f15a9ff1612f
|