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):
""":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

View File

@ -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)

View File

@ -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)

View File

@ -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)