Skip to content

Commit 155f598

Browse files
committed
Merge branch 'release/4.31.2' into master
2 parents d04596b + 57b4913 commit 155f598

File tree

7 files changed

+3306
-2926
lines changed

7 files changed

+3306
-2926
lines changed

CONTRIBUTORS.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ Dependency Injector Contributors
1616
+ Dmitry Rassoshenko (rda-dev)
1717
+ Fotis Koutoupas (kootoopas)
1818
+ Shubhendra Singh Chauhan (withshubh)
19+
+ sonthonaxrk (sonthonaxrk)

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.31.2
11+
------
12+
- Fix an issue with ``Dict`` provider non-string keys.
13+
See issue: `#435 <https://github.com/ets-labs/python-dependency-injector/issues/435>`_.
14+
Thanks to `@daniel55411 <https://github.com/daniel55411>`_ for reporting the issue.
15+
- Fix Flask scoped contexts example.
16+
See issue: `#440 <https://github.com/ets-labs/python-dependency-injector/pull/440>`_.
17+
Thanks to `@sonthonaxrk <https://github.com/sonthonaxrk>`_ for the contribution.
18+
1019
4.31.1
1120
------
1221
- Fix ``ThreadSafeSingleton`` synchronization issue.

examples/providers/singleton_scoped.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class Service:
1010

1111
class Container(containers.DeclarativeContainer):
1212

13-
service_provider = providers.Singleton(Service)
13+
service_provider = providers.ThreadLocalSingleton(Service)
1414

1515

1616
def index_view():

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

src/dependency_injector/providers.c

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

src/dependency_injector/providers.pyx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3169,7 +3169,7 @@ cdef class Dict(Provider):
31693169
return copied
31703170

31713171
copied = _memorized_duplicate(self, memo)
3172-
copied.set_kwargs(**deepcopy(self.kwargs, memo))
3172+
self._copy_kwargs(copied, memo)
31733173
self._copy_overridings(copied, memo)
31743174
return copied
31753175

@@ -3238,11 +3238,20 @@ cdef class Dict(Provider):
32383238
yield from filter(is_provider, self.kwargs.values())
32393239
yield from super().related
32403240

3241+
def _copy_kwargs(self, copied, memo):
3242+
"""Return copy of kwargs."""
3243+
copied_kwargs = {
3244+
_copy_if_provider(name, memo): _copy_if_provider(value, memo)
3245+
for name, value in self.kwargs.items()
3246+
}
3247+
copied.set_kwargs(copied_kwargs)
3248+
32413249
cpdef object _provide(self, tuple args, dict kwargs):
32423250
"""Return result of provided callable's call."""
32433251
return __provide_keyword_args(kwargs, self.__kwargs, self.__kwargs_len)
32443252

32453253

3254+
32463255
cdef class Resource(Provider):
32473256
"""Resource provider provides a component with initialization and shutdown."""
32483257

tests/unit/providers/test_dict_py2_py3.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,27 @@ def test_deepcopy_kwargs(self):
173173
self.assertIs(dependent_provider2.cls, dependent_provider_copy2.cls)
174174
self.assertIsNot(dependent_provider2, dependent_provider_copy2)
175175

176+
def test_deepcopy_kwargs_non_string_keys(self):
177+
a1 = object()
178+
a2 = object()
179+
180+
dependent_provider1 = providers.Factory(list)
181+
dependent_provider2 = providers.Factory(dict)
182+
183+
provider = providers.Dict({a1: dependent_provider1, a2: dependent_provider2})
184+
185+
provider_copy = providers.deepcopy(provider)
186+
dependent_provider_copy1 = provider_copy.kwargs[a1]
187+
dependent_provider_copy2 = provider_copy.kwargs[a2]
188+
189+
self.assertNotEqual(provider.kwargs, provider_copy.kwargs)
190+
191+
self.assertIs(dependent_provider1.cls, dependent_provider_copy1.cls)
192+
self.assertIsNot(dependent_provider1, dependent_provider_copy1)
193+
194+
self.assertIs(dependent_provider2.cls, dependent_provider_copy2.cls)
195+
self.assertIsNot(dependent_provider2, dependent_provider_copy2)
196+
176197
def test_deepcopy_overridden(self):
177198
provider = providers.Dict()
178199
object_provider = providers.Object(object())

0 commit comments

Comments
 (0)