Add example of catalog copying into MovieLister example

This commit is contained in:
Roman Mogilatov 2016-04-10 16:54:34 +03:00
parent 7cdeede38a
commit f89ba4c5a9
1 changed files with 76 additions and 0 deletions

View File

@ -0,0 +1,76 @@
"""A naive example of dependency injection in Python.
Example implementation of dependency injection in Python from Martin Fowler's
article about dependency injection and inversion of control:
http://www.martinfowler.com/articles/injection.html
This mini application uses ``movies`` library, that is configured to work with
csv file movies database.
"""
import sqlite3
from dependency_injector import catalogs
from dependency_injector import providers
from dependency_injector import injections
from movies import MoviesModule
from movies import finders
from settings import MOVIES_CSV_PATH
from settings import MOVIES_DB_PATH
class ApplicationModule(catalogs.DeclarativeCatalog):
"""Catalog of application component providers."""
database = providers.Singleton(sqlite3.connect, MOVIES_DB_PATH)
@catalogs.copy(MoviesModule)
class DbMoviesModule(MoviesModule):
"""Customized catalog of movies module component providers."""
movie_finder = providers.Factory(finders.SqliteMovieFinder,
*MoviesModule.movie_finder.injections,
database=ApplicationModule.database)
@catalogs.copy(MoviesModule)
class CsvMoviesModule(MoviesModule):
"""Customized catalog of movies module component providers."""
movie_finder = providers.Factory(finders.CsvMovieFinder,
*MoviesModule.movie_finder.injections,
csv_file=MOVIES_CSV_PATH,
delimeter=',')
@injections.inject(db_movie_lister=DbMoviesModule.movie_lister)
@injections.inject(csv_movie_lister=CsvMoviesModule.movie_lister)
def main(db_movie_lister, csv_movie_lister):
"""Main function.
This program prints info about all movies that were directed by different
persons and then prints all movies that were released in 2015.
:param db_movie_lister: Database movie lister instance
:type db_movie_lister: movies.listers.MovieLister
:param csv_movie_lister: Database movie lister instance
:type csv_movie_lister: movies.listers.MovieLister
"""
print db_movie_lister.movies_directed_by('Francis Lawrence')
print db_movie_lister.movies_directed_by('Patricia Riggen')
print db_movie_lister.movies_directed_by('JJ Abrams')
print db_movie_lister.movies_released_in(2015)
print csv_movie_lister.movies_directed_by('Francis Lawrence')
print csv_movie_lister.movies_directed_by('Patricia Riggen')
print csv_movie_lister.movies_directed_by('JJ Abrams')
print csv_movie_lister.movies_released_in(2015)
if __name__ == '__main__':
main()