Update movie lister example

This commit is contained in:
Roman Mogilatov 2016-05-29 17:17:27 +03:00
parent 8fdb190118
commit 83bbbd2be7
4 changed files with 44 additions and 12 deletions

View File

@ -91,14 +91,46 @@ class DeclarativeContainer(object):
def override(container): def override(container):
""":py:class:`DeclarativeContainer` overriding decorator. """:py:class:`DeclarativeContainer` overriding decorator.
:param catalog: Container that should be overridden by decorated container. :param container: Container that should be overridden by decorated
:type catalog: :py:class:`DeclarativeContainer` container.
:type container: :py:class:`DeclarativeContainer`
:return: Declarative container's overriding decorator. :return: Declarative container's overriding decorator.
:rtype: callable(:py:class:`DeclarativeContainer`) :rtype: callable(:py:class:`DeclarativeContainer`)
""" """
def decorator(overriding_container): def _decorator(overriding_container):
"""Overriding decorator.""" """Overriding decorator."""
container.override(overriding_container) container.override(overriding_container)
return 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

View File

@ -24,9 +24,9 @@ class MyMoviesModule(containers.DeclarativeContainer):
"""IoC container for overriding movies module component providers.""" """IoC container for overriding movies module component providers."""
movie_finder = providers.Factory(finders.CsvMovieFinder, movie_finder = providers.Factory(finders.CsvMovieFinder,
movie_model=MoviesModule.movie_model,
csv_file=MOVIES_CSV_PATH, csv_file=MOVIES_CSV_PATH,
delimeter=',') delimeter=',',
**MoviesModule.movie_finder.kwargs)
@injections.inject(MoviesModule.movie_lister) @injections.inject(MoviesModule.movie_lister)

View File

@ -32,8 +32,8 @@ class MyMoviesModule(containers.DeclarativeContainer):
"""IoC container for overriding movies module component providers.""" """IoC container for overriding movies module component providers."""
movie_finder = providers.Factory(finders.SqliteMovieFinder, 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) @injections.inject(MoviesModule.movie_lister)

View File

@ -33,8 +33,8 @@ class DbMoviesModule(MoviesModule):
"""IoC container for overriding movies module component providers.""" """IoC container for overriding movies module component providers."""
movie_finder = providers.Factory(finders.SqliteMovieFinder, movie_finder = providers.Factory(finders.SqliteMovieFinder,
movie_model=MoviesModule.movie_model, database=ApplicationModule.database,
database=ApplicationModule.database) **MoviesModule.movie_finder.kwargs)
@containers.copy(MoviesModule) @containers.copy(MoviesModule)
@ -42,9 +42,9 @@ class CsvMoviesModule(MoviesModule):
"""IoC container for overriding movies module component providers.""" """IoC container for overriding movies module component providers."""
movie_finder = providers.Factory(finders.CsvMovieFinder, movie_finder = providers.Factory(finders.CsvMovieFinder,
movie_model=MoviesModule.movie_model,
csv_file=MOVIES_CSV_PATH, csv_file=MOVIES_CSV_PATH,
delimeter=',') delimeter=',',
**MoviesModule.movie_finder.kwargs)
@injections.inject(db_movie_lister=DbMoviesModule.movie_lister) @injections.inject(db_movie_lister=DbMoviesModule.movie_lister)