All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Fixes import for Protocols support regardless of Python version (partially broken for Python 3.9), by @fennel-akunesh
- Adds support for resolving
Protocol
classes even when they don't define an__init__
method, by @lucas-labs - Fixes bug in service provider build logic causing singletons to be instantiated n times when they are registered after its dependant, by @lucas-labs
- Changes the "ignore attributes" logic so that if a class variable has already been initialized externally, rodi doesn't attempt to reinitialize it (and to also prevent overriding it if the initialized class variable is also a registered object), by @lucas-labs
- Fixes bug in Singleton implementation: stop singleton provider from recreating
objects implementing
__len__
, by Klavionik. - Add Python 3.12 and remove Python 3.7 from the build matrix.
- Checks
scoped_services
before resolving from map when in a scope, by StummeJ. - Allow getting from scope context without needing to provide scope, by StummeJ.
- Ignores
ClassVar
properties when resolving dependencies by class notations. - Marks
rodi
2 as stable.
- Removes the strict requirement for resolved classes to have
__init__
methods defined, to add support forProtocol
s that do not define an__init__
method (thus using*args
,**kwargs
), akhundMurad's contribution. - Corrects a code smell, replacing an
i
counter withenumerate
, GLEF1X's contribution.
- Introduces a
ContainerProtocol
to improve interoperability between libraries and alternative implementations of DI containers. The protocol is inspired by punq, since its code API is the most user-friendly and intelligible of those that were reviewed. TheContainerProtocol
can be used through composition to replacerodi
with alternative implementations of dependency injection in those libraries that useDI
. - Simplifies the code API of the library to support using the
Container
class toregister
andresolve
services. The classServices
is still used and available, but it's no more necessary to use it directly. - Replaces
setup.py
withpyproject.toml
. - Renames context classes: "GetServiceContext" to "ActivationScope", "ResolveContext" to "ResolutionContext".
- The "add_exact*" methods have been made private, to simplify the public API.
- Improves type annotations; MaximZayats' contribution.
- Adds typehints to GetServiceContext init params; guscardvs' contribution.
- Corrects a bug that would cause false positives when raising exceptions for circular dependencies. The code now let recursion errors happen if they need to happen, re-raising a circular dependency error.
- Adds
py.typed
file. - Applies
isort
and enforcesisort
andblack
checks in CI pipeline. - Corrects the type annotation for
FactoryCallableType
.
- Adds support for Generics and GenericAlias
Mapping[X, Y]
,Iterable[T]
,List[T]
,Set[T]
,Tuple[T, ...]
, Python 3.9list[T]
, etc. (fixes #9). - Improves typing-friendliness making the
ServiceProvider.get
method returning a value of the input type. - Adds support for Python 3.10.0a5 ✨. However, when classes and functions require locals, they need to be decorated. See PEP 563.
- Adds support to resolve class attributes annotations.
- Changes how classes without an
__init__
method are handled. - Updates links to the GitHub organization, Neoteroi.
- Completely migrates to GitHub Workflows.
- Improves build to test Python 3.6 and 3.9.
- Adds a changelog.
- Improves badges.