Skip to content

Commit f1a3ad0

Browse files
committed
Merge branch 'release/4.29.0' into master
2 parents e0b0a1e + 3f02688 commit f1a3ad0

File tree

17 files changed

+19965
-15515
lines changed

17 files changed

+19965
-15515
lines changed

.github/workflows/tests-and-linters.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ jobs:
66

77
test-on-different-versions:
88
name: Run tests
9-
runs-on: ubuntu-latest
9+
runs-on: ubuntu-18.04
1010
strategy:
1111
matrix:
1212
python-version: [2.7, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, pypy2, pypy3]

docs/containers/reset_singletons.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ Method ``.reset_singletons()`` also resets singletons in sub-containers: ``provi
1818
:lines: 3-
1919
:emphasize-lines: 21
2020

21+
You can use ``.reset_singletons()`` method with a context manager. Singletons will be reset on
22+
both entering and exiting a context.
23+
24+
.. literalinclude:: ../../examples/containers/reset_singletons_with.py
25+
:language: python
26+
:lines: 3-
27+
:emphasize-lines: 14-15
28+
2129
See also: :ref:`singleton-provider`.
2230

2331
.. disqus::

docs/main/changelog.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ that were made in every particular version.
77
From version 0.7.6 *Dependency Injector* framework strictly
88
follows `Semantic versioning`_
99

10+
4.29.0
11+
------
12+
- Implement context manager interface for resetting a singleton provider.
13+
See issue: `#413 <https://github.com/ets-labs/python-dependency-injector/issues/413>`_.
14+
Thanks to `@Arrowana <https://github.com/Arrowana>`_ for suggesting the improvement.
15+
- Implement overriding interface to container provider.
16+
See issue: `#415 <https://github.com/ets-labs/python-dependency-injector/issues/415>`_.
17+
Thanks to `@wackazong <https://github.com/wackazong>`_ for bringing up the use case.
18+
1019
4.28.1
1120
------
1221
- Fix async mode mode exception handling issue in ``Dependency`` provider.

docs/providers/singleton.rst

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,12 @@ returns it on the rest of the calls.
2020
:language: python
2121
:lines: 3-
2222

23-
``Singleton`` provider handles an injection of the dependencies the same way like a
24-
:ref:`factory-provider`.
23+
``Singleton`` provider handles dependencies injection the same way like a :ref:`factory-provider`.
2524

2625
.. note::
2726

28-
``Singleton`` provider does dependencies injection only when creates the object. When the object
29-
is created and memorized ``Singleton`` provider just returns it without applying the injections.
27+
``Singleton`` provider makes dependencies injection only when creates an object. When an object
28+
is created and memorized ``Singleton`` provider just returns it without applying injections.
3029

3130
Specialization of the provided type and abstract singletons work the same like like for the
3231
factories:
@@ -56,6 +55,21 @@ provider.
5655
Resetting of the memorized object clears the reference to it. Further object's lifecycle is
5756
managed by the garbage collector.
5857

58+
You can use ``.reset()`` method with a context manager. Memorized instance will be reset on
59+
both entering and exiting a context.
60+
61+
.. literalinclude:: ../../examples/providers/singleton_resetting_with.py
62+
:language: python
63+
:lines: 3-
64+
:emphasize-lines: 18-19
65+
66+
Context manager ``.reset()`` returns resetting singleton provider. You can use it for aliasing.
67+
68+
.. code-block:: python
69+
70+
with container.user_service.reset() as user_service:
71+
...
72+
5973
Method ``.reset()`` resets only current provider. To reset all dependent singleton providers
6074
call ``.full_reset()`` method.
6175

@@ -64,6 +78,13 @@ call ``.full_reset()`` method.
6478
:lines: 3-
6579
:emphasize-lines: 25
6680

81+
Method ``.full_reset()`` supports context manager interface like ``.reset()`` does.
82+
83+
.. code-block:: python
84+
85+
with container.user_service.full_reset() as user_service:
86+
...
87+
6788
See also: :ref:`reset-container-singletons`.
6889

6990
Using singleton with multiple threads
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"""Container reset singletons context manager example."""
2+
3+
from dependency_injector import containers, providers
4+
5+
6+
class Container(containers.DeclarativeContainer):
7+
8+
service = providers.Singleton(object)
9+
10+
11+
if __name__ == '__main__':
12+
container = Container()
13+
14+
service1 = container.service()
15+
16+
with container.reset_singletons():
17+
service2 = container.service()
18+
19+
service3 = container.service()
20+
21+
assert service1 is not service2
22+
assert service2 is not service3
23+
assert service3 is not service1
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
"""`Singleton` provider resetting context manager example."""
2+
3+
from dependency_injector import containers, providers
4+
5+
6+
class UserService:
7+
...
8+
9+
10+
class Container(containers.DeclarativeContainer):
11+
12+
user_service = providers.Singleton(UserService)
13+
14+
15+
if __name__ == '__main__':
16+
container = Container()
17+
18+
user_service1 = container.user_service()
19+
20+
with container.user_service.reset():
21+
user_service2 = container.user_service()
22+
23+
user_service3 = container.user_service()
24+
25+
assert user_service1 is not user_service2
26+
assert user_service2 is not user_service3
27+
assert user_service3 is not user_service1

src/dependency_injector/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Top-level package."""
22

3-
__version__ = '4.28.1'
3+
__version__ = '4.29.0'
44
"""Version number.
55
66
:type: str

0 commit comments

Comments
 (0)