forked from python-injector/injector
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CHANGES
228 lines (156 loc) · 6.55 KB
/
CHANGES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
Injector Change Log
===================
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 <injector.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=...) <injector.AssistedBuilder>`
* 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.