From 83bbbd2be7363eefd64e4fa363994fe092769ae0 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov Date: Sun, 29 May 2016 17:17:27 +0300 Subject: [PATCH] Update movie lister example --- dependency_injector/containers.py | 40 ++++++++++++++++++-- examples/miniapps/movie_lister/app_csv.py | 4 +- examples/miniapps/movie_lister/app_db.py | 4 +- examples/miniapps/movie_lister/app_db_csv.py | 8 ++-- 4 files changed, 44 insertions(+), 12 deletions(-) diff --git a/dependency_injector/containers.py b/dependency_injector/containers.py index 6c6d690d..0982e0ef 100644 --- a/dependency_injector/containers.py +++ b/dependency_injector/containers.py @@ -91,14 +91,46 @@ class DeclarativeContainer(object): def override(container): """:py:class:`DeclarativeContainer` overriding decorator. - :param catalog: Container that should be overridden by decorated container. - :type catalog: :py:class:`DeclarativeContainer` + :param container: Container that should be overridden by decorated + container. + :type container: :py:class:`DeclarativeContainer` :return: Declarative container's overriding decorator. :rtype: callable(:py:class:`DeclarativeContainer`) """ - def decorator(overriding_container): + def _decorator(overriding_container): """Overriding decorator.""" container.override(overriding_container) return overriding_container - return decorator + return _decorator + + +def copy(container): + """:py:class:`DeclarativeContainer` copying decorator. + + This decorator copy all providers from provided container to decorated one. + If one of the decorated container providers matches to source container + providers by name, it would be replaced by reference. + + :param container: Container that should be copied by decorated container. + :type container :py:class:`DeclarativeContainer` + + :return: Declarative container's copying decorator. + :rtype: callable(:py:class:`DeclarativeContainer`) + """ + def _decorator(copied_container): + memo = dict() + for name, provider in six.iteritems(copied_container.cls_providers): + try: + source_provider = getattr(container, name) + except AttributeError: + pass + else: + memo[id(source_provider)] = provider + + providers_copy = utils._copy_providers(container.providers, memo) + for name, provider in six.iteritems(providers_copy): + setattr(copied_container, name, provider) + + return copied_container + return _decorator diff --git a/examples/miniapps/movie_lister/app_csv.py b/examples/miniapps/movie_lister/app_csv.py index 64a3866f..3fb5bba3 100644 --- a/examples/miniapps/movie_lister/app_csv.py +++ b/examples/miniapps/movie_lister/app_csv.py @@ -24,9 +24,9 @@ class MyMoviesModule(containers.DeclarativeContainer): """IoC container for overriding movies module component providers.""" movie_finder = providers.Factory(finders.CsvMovieFinder, - movie_model=MoviesModule.movie_model, csv_file=MOVIES_CSV_PATH, - delimeter=',') + delimeter=',', + **MoviesModule.movie_finder.kwargs) @injections.inject(MoviesModule.movie_lister) diff --git a/examples/miniapps/movie_lister/app_db.py b/examples/miniapps/movie_lister/app_db.py index 5e62676b..a6555f17 100644 --- a/examples/miniapps/movie_lister/app_db.py +++ b/examples/miniapps/movie_lister/app_db.py @@ -32,8 +32,8 @@ class MyMoviesModule(containers.DeclarativeContainer): """IoC container for overriding movies module component providers.""" movie_finder = providers.Factory(finders.SqliteMovieFinder, - movie_model=MoviesModule.movie_model, - database=ApplicationModule.database) + database=ApplicationModule.database, + **MoviesModule.movie_finder.kwargs) @injections.inject(MoviesModule.movie_lister) diff --git a/examples/miniapps/movie_lister/app_db_csv.py b/examples/miniapps/movie_lister/app_db_csv.py index 83d2739f..975d1b5d 100644 --- a/examples/miniapps/movie_lister/app_db_csv.py +++ b/examples/miniapps/movie_lister/app_db_csv.py @@ -33,8 +33,8 @@ class DbMoviesModule(MoviesModule): """IoC container for overriding movies module component providers.""" movie_finder = providers.Factory(finders.SqliteMovieFinder, - movie_model=MoviesModule.movie_model, - database=ApplicationModule.database) + database=ApplicationModule.database, + **MoviesModule.movie_finder.kwargs) @containers.copy(MoviesModule) @@ -42,9 +42,9 @@ class CsvMoviesModule(MoviesModule): """IoC container for overriding movies module component providers.""" movie_finder = providers.Factory(finders.CsvMovieFinder, - movie_model=MoviesModule.movie_model, csv_file=MOVIES_CSV_PATH, - delimeter=',') + delimeter=',', + **MoviesModule.movie_finder.kwargs) @injections.inject(db_movie_lister=DbMoviesModule.movie_lister)