@@ -733,43 +733,44 @@ def override(object container):
733
733
return _decorator
734
734
735
735
736
- def copy (object container ):
736
+ def copy (object base_container ):
737
737
""" :py:class:`DeclarativeContainer` copying decorator.
738
738
739
739
This decorator copies all providers from provided container to decorated one.
740
740
If one of the decorated container providers matches to source container
741
741
providers by name, it would be replaced by reference.
742
742
743
- :param container : Container that should be copied by decorated container.
744
- :type container : :py:class:`DeclarativeContainer`
743
+ :param base_container : Container that should be copied by decorated container.
744
+ :type base_container : :py:class:`DeclarativeContainer`
745
745
746
746
:return: Declarative container's copying decorator.
747
747
:rtype: callable(:py:class:`DeclarativeContainer`)
748
748
"""
749
- def _get_providers_memo (from_providers , source_providers ):
750
- memo = dict ()
751
-
752
- for name, provider in from_providers.items():
753
- try :
754
- source_provider = source_providers[name]
755
- except KeyError :
749
+ def _get_memo_for_matching_names (new_providers , base_providers ):
750
+ memo = {}
751
+ for new_provider_name, new_provider in six.iteritems(new_providers):
752
+ if new_provider_name not in base_providers:
756
753
continue
757
- else :
758
- memo[id (source_provider)] = provider
754
+ source_provider = base_providers[new_provider_name]
755
+ memo[id (source_provider)] = new_provider
759
756
760
- if hasattr (provider , ' providers' ) and hasattr (source_provider, ' providers' ):
761
- sub_memo = _get_providers_memo(provider .providers, source_provider.providers)
762
- memo.update(sub_memo)
757
+ if hasattr (new_provider , ' providers' ) and hasattr (source_provider, ' providers' ):
758
+ sub_memo = _get_memo_for_matching_names(new_provider .providers, source_provider.providers)
759
+ memo.update(sub_memo)
763
760
return memo
764
761
765
- def _decorator (copied_container ):
766
- memo = _get_providers_memo(copied_container.cls_providers, container.providers)
762
+ def _decorator (new_container ):
763
+ memo = {}
764
+ memo.update(_get_memo_for_matching_names(new_container.cls_providers, base_container.providers))
765
+
766
+ new_providers = {}
767
+ new_providers.update(providers.deepcopy(base_container.providers, memo))
768
+ new_providers.update(providers.deepcopy(new_container.cls_providers, memo))
767
769
768
- providers_copy = providers.deepcopy(container.providers, memo)
769
- for name, provider in six.iteritems(providers_copy):
770
- setattr (copied_container, name, provider)
770
+ for name, provider in six.iteritems(new_providers):
771
+ setattr (new_container, name, provider)
772
+ return new_container
771
773
772
- return copied_container
773
774
return _decorator
774
775
775
776
0 commit comments