Injector Change Log
===================
0.22.0
------
Date: 2024-07-08
Added:
- Added support for injecting `PEP 593 `_
`Annotated `_
Removed:
- Dropped Python 3.7 support
0.21.0
------
- Improved the documentation, thanks to jonathanmach and Jakub Wilk
- Fixed a thread-safety regression
- Improved the type annotations, thanks to David Pärsson
- Fixed singleton scope behavior with parent/child injectors, thanks to David Pärsson
- Stopped using a deprecated test function, thanks to ljnsn
0.20.1
------
- Added support for PEP 604 union types (Python 3.10+), thanks to David Pärsson
- Fixed building with pypandoc 1.8+, thanks to Søren Fuglede Jørgensen
0.20.0
------
- Fixed handling of Union combined with Annotated, thanks to Tobias Nilsson
- Fixed AssitedBuilder/child Injector interaction, thanks to Erik Cederberg
- Made get_bindings() and injections work even if a injectee's return type
annotation is a forward reference that can't be resolved
Backwards incompatible:
- Dropped Python 3.6 support
0.19.0
------
- Added the license to the source distribution, thanks to Joshua Adelman
- Added Python 3.9 and 3.10 support, this includes fixing Python 3.10 compatibility, thanks to Torge Matthies
- Improved the documentation, thanks to Takahiro Kojima
- Improved the source distribution so that it can be used to build and install wheels, thanks to Janusz Skonieczny
- Added requirements files for easier development, thanks to Greg Eremeev
Backwards incompatible:
- Removed Python 3.5 support
0.18.4
------
- Fixed a bug where only one of multiple NoInject annotations was interpreted
0.18.3
------
- Fixed Python 3.5.3 compatibility
0.18.2
------
- Added remaining type hints to the codebase so that the client code can have better static typing safety
- Fixed UnsatisfiedRequirement string representation (this time for real)
- Added forward return type reference support to provider methods
0.18.1
------
- Fixed UnsatisfiedRequirement instantiation (trying to get its string representation would fail)
- Fixed injecting a subclass of a generic type on Python versions older than 3.7.0
- Fixed regression that caused BoundKey injection failure
0.18.0
------
- Added new public :func:`get_bindings ` function to see what parameters will be injected
into a function
- Added new generic types using a draft implementation of `PEP 593 `_:
:data:`Inject ` and :data:`NoInject `. Those serve as additional ways to
declare (non)injectable parameters while :func:`inject ` won't go away any time soon
:func:`noninjectable ` may be removed once `NoInject` is cofirmed to work.
Backwards incompatible:
- Removed previously deprecated `Key`, `BindingKey`, `SequenceKey` and `MappingKey` pseudo-types
0.17.0
------
- Added support for using `typing.Dict` and `typing.List` in multibindings. See :meth:`multibind `.
- Added multibinding-specific :func:`provider ` variant: :func:`multiprovider `
- Deprecated using :func:`provider ` for multibindings
- Fixed failure to provide a default value to a `NewType`-aliased type with auto_bind enabled
- Deprecated :func:`Key `, :func:`SequenceKey ` and
:func:`MappingKey ` – use real types or type aliases instead
- Deprecated using single-item lists and dictionaries for multibindings - use real types or type aliases instead
Technically backwards incompatible:
- typing.List and typing.Dict specializations are now explicitly disallowed as :meth:`bind `
interfaces and types returned by :func:`provider `-decorated methods
0.16.2
------
- (Re)added support for decorating classes themselves with :func:`@inject `. This is the same
as decorating their constructors. Among other things this gives us
`dataclasses `_ integration.
0.16.1
------
- Reuploaded to fix incorrectly formatted project description
0.16.0
------
- Added support for overriding injectable parameters with positional arguments (previously only
possible with keyword arguments)
- Fixed crashes caused by typed self in method signatures
- Improved typing coverage
Backwards incompatible:
- Dropped Python 3.4 support
- Removed previously deprecated constructs: with_injector, Injector.install_into, Binder.bind_scope
- Dependencies are no longer injected into Module.configure and raw module functions (previously
deprecated)
- Removed unofficial support for injecting into parent class constructors
0.15.0
------
- Added type information for Injector.create_object() (patch #101 thanks to David Pärsson)
- Made the code easier to understand (patch #105 thanks to Christian Clauss)
- Opted the package into distributing type information and checking it (PEP 561)
0.14.1
------
- Fixed regression that required all noninjectable parameters to be typed
0.14.0
------
- Added NewType support
- Added type hints
Backwards incompatible:
- Passing invalid parameter names to @noninjectable() will now result in an error
- Dropped Python 3.3 support
0.13.4
------
- Deprecated with_injector. There's no one migration path recommended, it depends on
a particular case.
- Deprecated install_into.
0.13.3
------
- Fixed a bug with classes deriving from PyQt classes not being able to be
instantiated manually (bug #75, patch #76 thanks to David Pärsson)
0.13.2
------
- Fixed a bug with values shared between Injectors in a hierarchy (bugs #52 and #72)
- Binding scopes explicitly (``Binder.bind_scope``) is no longer necessary and ``bind_scope`` is a no-op now.
0.13.1
------
- Improved some error messages
0.13.0
------
Backwards incompatible:
- Dropped Python 3.2 support
- Dropped Injector use_annotations constructor parameter. Whenever @inject is
used parameter annotations will be used automatically.
- Dropped Python 2 support (this includes PyPy)
- Removed @provides decorator, use @provider instead
- Removed support for passing keyword arguments to @inject
0.12.0
------
- Fixed binding inference in presence of * and ** arguments (previously Injector
would generate extra arguments, now it just ignores them)
- Improved error reporting
- Fixed compatibility with newer typing versions (that includes the one
bundled with Python 3.6)
Technically backwards incompatible:
- Forward references as PEP 484 understands them are being resolved now when
Python 3-style annotations are used. See
https://www.python.org/dev/peps/pep-0484/#forward-references for details.
Optional parameters are treated as compulsory for the purpose of injection.
0.11.1
------
- 0.11.0 packages uploaded to PyPI are broken (can't be installed), this is
a fix-only release.
0.11.0
------
* The following way to declare dependencies is introduced and recommended
now:
.. code-block:: python
class SomeClass:
@inject
def __init__(self, other: OtherClass):
# ...
The following ways are still supported but are deprecated and will be
removed in the future:
.. code-block:: python
# Python 2-compatible style
class SomeClass
@inject(other=OtherClass)
def __init__(self, other):
# ...
# Python 3 style without @inject-decoration but with use_annotations
class SomeClass:
def __init__(self, other: OtherClass):
# ...
injector = Injector(use_annotations=True)
# ...
* The following way to declare Module provider methods is introduced and
recommended now:
.. code-block:: python
class MyModule(Module):
@provider
def provide_something(self, dependency: Dependency) -> Something:
# ...
@provider implies @inject.
Previously it would look like this:
.. code-block:: python
class MyModule(Module):
@provides(Something)
@inject
def provide_something(self, dependency: Dependency):
# ...
The :func:`~injector.provides` decorator will be removed in the future.
* Added a :func:`~injector.noninjectable` decorator to mark parameters as not injectable
(this serves as documentation and a way to avoid some runtime errors)
Backwards incompatible:
* Removed support for decorating classes with :func:`@inject `. Previously:
.. code-block:: python
@inject(something=Something)
class Class:
pass
Now:
.. code-block:: python
class Class:
@inject
def __init__(self, something: Something):
self.something = something
* Removed support for injecting partially applied functions, previously:
.. code-block:: python
@inject(something=Something)
def some_function(something):
pass
class Class:
@inject(function=some_function)
def __init__(self, function):
# ...
Now you need to move the function with injectable dependencies to a class.
* Removed support for getting :class:`AssistedBuilder(callable=...) `
* Dropped Python 2.6 support
* Changed the way :class:`~injector.AssistedBuilder` and :class:`~injector.ProviderOf` are used.
Previously:
.. code-block:: python
builder1 = injector.get(AssistedBuilder(Something))
# or: builder1 = injector.get(AssistedBuilder(interface=Something))
builder2 = injector.get(AssistedBuilder(cls=SomethingElse))
provider = injector.get(ProviderOf(SomeOtherThing))
Now:
.. code-block:: python
builder1 = injector.get(AssistedBuilder[Something])
builder2 = injector.get(ClassAssistedBuilder[cls=SomethingElse])
provider = injector.get(ProviderOf[SomeOtherThing])
* Removed support for injecting into non-constructor methods
0.10.1
------
- Fixed a false positive bug in dependency cycle detection (AssistedBuilder can be
used to break dependency cycles now)
0.10.0
------
- :meth:`injector.Provider.get()` now requires an :class:`injector.Injector` instance as
its parameter
- deprecated injecting arguments into modules (be it functions/callables,
:class:`~injector.Module` constructors or :meth:`injector.Module.configure` methods)
- removed `extends` decorator
- few classes got useful __repr__ implementations
- fixed injecting ProviderOf and AssistedBuilders when :class:`injector.Injector`
auto_bind is set to False (previously would result in `UnsatisfiedRequirement`
error)
- fixed crash occurring when Python 3-function annotation use is enabled and
__init__ method has a return value annotation ("injector.UnknownProvider:
couldn't determine provider for None to None"), should also apply to free
functions as well
0.9.1
-----
- Bug fix release.
0.9.0
-----
- Child :class:`~injector.Injector` can rebind dependancies bound in parent Injector (that changes :class:`~injector.Provider` semantics), thanks to Ilya Orlov
- :class:`~injector.CallableProvider` callables can be injected into, thanks to Ilya Strukov
- One can request :class:`~injector.ProviderOf` (Interface) and get a :class:`~injector.BoundProvider` which can be used to get an implementation of Interface when needed
0.8.0
-----
- Binding annotations are removed. Use :func:`~injector.Key` to create unique types instead.
0.7.9
-----
- Fixed regression with injecting unbound key resulting in None instead of raising an exception
0.7.8
-----
- Exception is raised when :class:`~injector.Injector` can't install itself into a class instance due to __slots__ presence
- Some of exception messages are now more detailed to make debugging easier when injection fails
- You can inject functions now - :class:`~injector.Injector` provides a wrapper that takes care of injecting dependencies into the original function
0.7.7
-----
- Made :class:`~injector.AssistedBuilder` behave more explicitly: it can build either innstance of a concrete class (``AssistedBuilder(cls=Class)``) or it will follow Injector bindings (if exist) and construct instance of a class pointed by an interface (``AssistedBuilder(interface=Interface)``). ``AssistedBuilder(X)`` behaviour remains the same, it's equivalent to ``AssistedBuilder(interface=X)``
0.7.6
-----
- Auto-convert README.md to RST for PyPi.
0.7.5
-----
- Added a ChangeLog!
- Added support for using Python3 annotations as binding types.