Skip to content

Commit 78f623c

Browse files
committed
Merge branch 'release/4.18.0' into master
2 parents 35f280a + e80c56f commit 78f623c

File tree

14 files changed

+1226
-831
lines changed

14 files changed

+1226
-831
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ test-py2: build
5252
coverage report --rcfile=./.coveragerc
5353
coverage html --rcfile=./.coveragerc
5454

55-
test-py3: build
55+
test: build
5656
# Unit tests with coverage report
5757
coverage erase
5858
coverage run --rcfile=./.coveragerc -m unittest2 discover -s tests/unit/ -p test_*py3*.py

docs/containers/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@ Containers module API docs - :py:mod:`dependency_injector.containers`.
2323
dynamic
2424
specialization
2525
overriding
26+
reset_singletons
2627
traversal

docs/containers/reset_singletons.rst

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
Reset container singletons
2+
--------------------------
3+
4+
To reset all container singletons use method ``.reset_singletons()``.
5+
6+
.. literalinclude:: ../../examples/containers/reset_singletons.py
7+
:language: python
8+
:lines: 3-
9+
:emphasize-lines: 16
10+
11+
Method ``.reset_singletons()`` also resets singletons in sub-containers: ``providers.Container`` and
12+
``providers.DependenciesContainer.``
13+
14+
.. literalinclude:: ../../examples/containers/reset_singletons_subcontainers.py
15+
:language: python
16+
:lines: 3-
17+
:emphasize-lines: 21
18+
19+
.. 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.18.0
11+
------
12+
- Add ``container.reset_singleton()`` method to reset container singletons.
13+
- Refactor ``container.apply_container_providers_overridings()`` to use ``container.traverse()``.
14+
This enables deep lazy initialization of ``Container`` providers.
15+
- Add tests for ``Selector`` provider.
16+
- Add tests for ``ProvidedInstance`` and ``MethodCaller`` providers.
17+
- Update Makefile to make Python 3 tests to be a default test command: ``make test``.
18+
1019
4.17.0
1120
------
1221
- Add ``FastAPI`` + ``SQLAlchemy`` example.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"""Container reset singletons example."""
2+
3+
from dependency_injector import containers, providers
4+
5+
6+
class Container(containers.DeclarativeContainer):
7+
8+
service1 = providers.Singleton(object)
9+
service2 = providers.Singleton(object)
10+
11+
12+
if __name__ == '__main__':
13+
container = Container()
14+
15+
service1 = container.service1()
16+
service2 = container.service2()
17+
18+
container.reset_singletons()
19+
20+
assert service1 is not container.service1()
21+
assert service2 is not container.service2()
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"""Container reset singletons in subcontainer example."""
2+
3+
from dependency_injector import containers, providers
4+
5+
6+
class SubContainer(containers.DeclarativeContainer):
7+
8+
service = providers.Singleton(object)
9+
10+
11+
class Container(containers.DeclarativeContainer):
12+
13+
service = providers.Singleton(object)
14+
sub = providers.Container(SubContainer)
15+
16+
17+
if __name__ == '__main__':
18+
container = Container()
19+
20+
service1 = container.service()
21+
service2 = container.sub().service()
22+
23+
container.reset_singletons()
24+
25+
assert service1 is not container.service()
26+
assert service2 is not container.sub().service()

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.17.0'
3+
__version__ = '4.18.0'
44
"""Version number.
55
66
:type: str

src/dependency_injector/containers.c

Lines changed: 991 additions & 821 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/dependency_injector/containers.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ class Container:
4343
def unwire(self) -> None: ...
4444
def init_resources(self) -> Optional[Awaitable]: ...
4545
def shutdown_resources(self) -> Optional[Awaitable]: ...
46+
def apply_container_providers_overridings(self) -> None: ...
47+
def reset_singletons(self) -> None: ...
4648
@overload
4749
def traverse(self, types: Optional[Sequence[Type]] = None) -> Iterator[Provider]: ...
4850
@classmethod

src/dependency_injector/containers.pyx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,11 +268,14 @@ class DynamicContainer(Container):
268268

269269
def apply_container_providers_overridings(self):
270270
"""Apply container providers' overridings."""
271-
for provider in self.providers.values():
272-
if not isinstance(provider, providers.Container):
273-
continue
271+
for provider in self.traverse(types=[providers.Container]):
274272
provider.apply_overridings()
275273

274+
def reset_singletons(self):
275+
"""Reset all container singletons."""
276+
for provider in self.traverse(types=[providers.Singleton]):
277+
provider.reset()
278+
276279

277280
class DeclarativeContainerMetaClass(type):
278281
"""Declarative inversion of control container meta class."""

0 commit comments

Comments
 (0)