@@ -733,43 +733,44 @@ def override(object container):
733733 return _decorator
734734
735735
736- def copy (object container ):
736+ def copy (object base_container ):
737737 """ :py:class:`DeclarativeContainer` copying decorator.
738738
739739 This decorator copies all providers from provided container to decorated one.
740740 If one of the decorated container providers matches to source container
741741 providers by name, it would be replaced by reference.
742742
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`
745745
746746 :return: Declarative container's copying decorator.
747747 :rtype: callable(:py:class:`DeclarativeContainer`)
748748 """
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:
756753 continue
757- else :
758- memo[id (source_provider)] = provider
754+ source_provider = base_providers[new_provider_name]
755+ memo[id (source_provider)] = new_provider
759756
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)
763760 return memo
764761
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))
767769
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
771773
772- return copied_container
773774 return _decorator
774775
775776
0 commit comments