mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2024-11-22 09:36:48 +03:00
Update movie lister example
This commit is contained in:
parent
bff0e58f7f
commit
4e66c47f59
|
@ -11,8 +11,6 @@ Instructions for running:
|
|||
|
||||
.. code-block:: bash
|
||||
|
||||
python create_db.py
|
||||
|
||||
python app_csv.py
|
||||
python app_db.py
|
||||
python app_db_csv.py
|
||||
|
|
|
@ -9,42 +9,40 @@ This mini application uses ``movies`` library, that is configured to work with
|
|||
csv file movies database.
|
||||
"""
|
||||
|
||||
import dependency_injector.containers as containers
|
||||
import dependency_injector.providers as providers
|
||||
import dependency_injector.injections as injections
|
||||
|
||||
import movies
|
||||
import movies.finders
|
||||
|
||||
import example.main
|
||||
import example.db
|
||||
|
||||
import settings
|
||||
|
||||
import dependency_injector.containers as containers
|
||||
import dependency_injector.providers as providers
|
||||
|
||||
|
||||
@containers.override(movies.MoviesModule)
|
||||
class MyMoviesModule(containers.DeclarativeContainer):
|
||||
"""IoC container for overriding movies module component providers."""
|
||||
|
||||
movie_finder = providers.Factory(movies.finders.CsvMovieFinder,
|
||||
csv_file=settings.MOVIES_CSV_PATH,
|
||||
delimeter=',',
|
||||
csv_file_path=settings.MOVIES_CSV_PATH,
|
||||
delimiter=',',
|
||||
**movies.MoviesModule.movie_finder.kwargs)
|
||||
|
||||
|
||||
@injections.inject(movies.MoviesModule.movie_lister)
|
||||
def main(movie_lister):
|
||||
"""Main function.
|
||||
class CsvApplication(containers.DeclarativeContainer):
|
||||
"""IoC container of csv application component providers."""
|
||||
|
||||
This program prints info about all movies that were directed by different
|
||||
persons and then prints all movies that were released in 2015.
|
||||
main = providers.Callable(example.main.main,
|
||||
movie_lister=movies.MoviesModule.movie_lister)
|
||||
|
||||
:param movie_lister: Movie lister instance
|
||||
:type movie_lister: movies.listers.MovieLister
|
||||
"""
|
||||
print movie_lister.movies_directed_by('Francis Lawrence')
|
||||
print movie_lister.movies_directed_by('Patricia Riggen')
|
||||
print movie_lister.movies_directed_by('JJ Abrams')
|
||||
|
||||
print movie_lister.movies_released_in(2015)
|
||||
init_db = providers.Callable(example.db.init_csv,
|
||||
movies_data=settings.MOVIES_SAMPLE_DATA,
|
||||
csv_file_path=settings.MOVIES_CSV_PATH,
|
||||
delimiter=',')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
CsvApplication.init_db()
|
||||
CsvApplication.main()
|
||||
|
|
|
@ -11,18 +11,20 @@ sqlite movies database.
|
|||
|
||||
import sqlite3
|
||||
|
||||
import dependency_injector.containers as containers
|
||||
import dependency_injector.providers as providers
|
||||
import dependency_injector.injections as injections
|
||||
|
||||
import movies
|
||||
import movies.finders
|
||||
|
||||
import example.main
|
||||
import example.db
|
||||
|
||||
import settings
|
||||
|
||||
import dependency_injector.containers as containers
|
||||
import dependency_injector.providers as providers
|
||||
|
||||
class ApplicationModule(containers.DeclarativeContainer):
|
||||
"""IoC container of application component providers."""
|
||||
|
||||
class ResourcesModule(containers.DeclarativeContainer):
|
||||
"""IoC container of application resource providers."""
|
||||
|
||||
database = providers.Singleton(sqlite3.connect, settings.MOVIES_DB_PATH)
|
||||
|
||||
|
@ -32,26 +34,21 @@ class MyMoviesModule(containers.DeclarativeContainer):
|
|||
"""IoC container for overriding movies module component providers."""
|
||||
|
||||
movie_finder = providers.Factory(movies.finders.SqliteMovieFinder,
|
||||
database=ApplicationModule.database,
|
||||
database=ResourcesModule.database,
|
||||
**movies.MoviesModule.movie_finder.kwargs)
|
||||
|
||||
|
||||
@injections.inject(movies.MoviesModule.movie_lister)
|
||||
def main(movie_lister):
|
||||
"""Main function.
|
||||
class DbApplication(containers.DeclarativeContainer):
|
||||
"""IoC container of database application component providers."""
|
||||
|
||||
This program prints info about all movies that were directed by different
|
||||
persons and then prints all movies that were released in 2015.
|
||||
main = providers.Callable(example.main.main,
|
||||
movie_lister=movies.MoviesModule.movie_lister)
|
||||
|
||||
:param movie_lister: Movie lister instance
|
||||
:type movie_lister: movies.listers.MovieLister
|
||||
"""
|
||||
print movie_lister.movies_directed_by('Francis Lawrence')
|
||||
print movie_lister.movies_directed_by('Patricia Riggen')
|
||||
print movie_lister.movies_directed_by('JJ Abrams')
|
||||
|
||||
print movie_lister.movies_released_in(2015)
|
||||
init_db = providers.Callable(example.db.init_sqlite,
|
||||
movies_data=settings.MOVIES_SAMPLE_DATA,
|
||||
database=ResourcesModule.database)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
DbApplication.init_db()
|
||||
DbApplication.main()
|
||||
|
|
|
@ -11,18 +11,20 @@ sqlite movies database and csv file movies database.
|
|||
|
||||
import sqlite3
|
||||
|
||||
import dependency_injector.containers as containers
|
||||
import dependency_injector.providers as providers
|
||||
import dependency_injector.injections as injections
|
||||
|
||||
import movies
|
||||
import movies.finders
|
||||
|
||||
import example.main
|
||||
import example.db
|
||||
|
||||
import settings
|
||||
|
||||
import dependency_injector.containers as containers
|
||||
import dependency_injector.providers as providers
|
||||
|
||||
class ApplicationModule(containers.DeclarativeContainer):
|
||||
"""IoC container of application component providers."""
|
||||
|
||||
class ResourcesModule(containers.DeclarativeContainer):
|
||||
"""IoC container of application resource providers."""
|
||||
|
||||
database = providers.Singleton(sqlite3.connect, settings.MOVIES_DB_PATH)
|
||||
|
||||
|
@ -32,7 +34,7 @@ class DbMoviesModule(movies.MoviesModule):
|
|||
"""IoC container for overriding movies module component providers."""
|
||||
|
||||
movie_finder = providers.Factory(movies.finders.SqliteMovieFinder,
|
||||
database=ApplicationModule.database,
|
||||
database=ResourcesModule.database,
|
||||
**movies.MoviesModule.movie_finder.kwargs)
|
||||
|
||||
|
||||
|
@ -41,31 +43,36 @@ class CsvMoviesModule(movies.MoviesModule):
|
|||
"""IoC container for overriding movies module component providers."""
|
||||
|
||||
movie_finder = providers.Factory(movies.finders.CsvMovieFinder,
|
||||
csv_file=settings.MOVIES_CSV_PATH,
|
||||
delimeter=',',
|
||||
csv_file_path=settings.MOVIES_CSV_PATH,
|
||||
delimiter=',',
|
||||
**movies.MoviesModule.movie_finder.kwargs)
|
||||
|
||||
|
||||
@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.
|
||||
class DbApplication(containers.DeclarativeContainer):
|
||||
"""IoC container of database application component providers."""
|
||||
|
||||
This program prints info about all movies that were directed by different
|
||||
persons and then prints all movies that were released in 2015.
|
||||
main = providers.Callable(example.main.main,
|
||||
movie_lister=DbMoviesModule.movie_lister)
|
||||
|
||||
:param db_movie_lister: Movie lister, configured to work with database
|
||||
:type db_movie_lister: movies.listers.MovieLister
|
||||
init_db = providers.Callable(example.db.init_sqlite,
|
||||
movies_data=settings.MOVIES_SAMPLE_DATA,
|
||||
database=ResourcesModule.database)
|
||||
|
||||
:param csv_movie_lister: Movie lister, configured to work with csv file
|
||||
:type csv_movie_lister: movies.listers.MovieLister
|
||||
"""
|
||||
for movie_lister in (db_movie_lister, csv_movie_lister):
|
||||
print movie_lister.movies_directed_by('Francis Lawrence')
|
||||
print movie_lister.movies_directed_by('Patricia Riggen')
|
||||
print movie_lister.movies_directed_by('JJ Abrams')
|
||||
print movie_lister.movies_released_in(2015)
|
||||
|
||||
class CsvApplication(containers.DeclarativeContainer):
|
||||
"""IoC container of csv application component providers."""
|
||||
|
||||
main = providers.Callable(example.main.main,
|
||||
movie_lister=CsvMoviesModule.movie_lister)
|
||||
|
||||
init_db = providers.Callable(example.db.init_csv,
|
||||
movies_data=settings.MOVIES_SAMPLE_DATA,
|
||||
csv_file_path=settings.MOVIES_CSV_PATH,
|
||||
delimiter=',')
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
DbApplication.init_db()
|
||||
DbApplication.main()
|
||||
|
||||
CsvApplication.init_db()
|
||||
CsvApplication.main()
|
||||
|
|
|
@ -1,33 +0,0 @@
|
|||
"""Script for initializing movie databases."""
|
||||
|
||||
import os
|
||||
import csv
|
||||
import sqlite3
|
||||
import shutil
|
||||
|
||||
from settings import DATA_DIR
|
||||
from settings import MOVIES_CSV_PATH
|
||||
from settings import MOVIES_DB_PATH
|
||||
|
||||
|
||||
MOVIES = (('The Hunger Games: Mockingjay - Part 2', 2015, 'Francis Lawrence'),
|
||||
('The 33', 2015, 'Patricia Riggen'),
|
||||
('Star Wars: Episode VII - The Force Awakens', 2015, 'JJ Abrams'))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# (Re)create data directory:
|
||||
if os.path.exists(DATA_DIR):
|
||||
shutil.rmtree(DATA_DIR)
|
||||
os.makedirs(DATA_DIR)
|
||||
|
||||
# Initialize sqlite database:
|
||||
connection = sqlite3.connect(MOVIES_DB_PATH)
|
||||
with connection:
|
||||
connection.execute('CREATE TABLE movies '
|
||||
'(name text, year int, director text)')
|
||||
connection.executemany('INSERT INTO movies VALUES (?,?,?)', MOVIES)
|
||||
|
||||
# Initialize csv database:
|
||||
with open(MOVIES_CSV_PATH, 'w') as csv_file:
|
||||
csv.writer(csv_file).writerows(MOVIES)
|
5
examples/miniapps/movie_lister/data/.gitignore
vendored
Normal file
5
examples/miniapps/movie_lister/data/.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
# Ignore everything in this directory
|
||||
*
|
||||
|
||||
# Except this file:
|
||||
!.gitignore
|
1
examples/miniapps/movie_lister/example/__init__.py
Normal file
1
examples/miniapps/movie_lister/example/__init__.py
Normal file
|
@ -0,0 +1 @@
|
|||
"""Example top-level package."""
|
35
examples/miniapps/movie_lister/example/db.py
Normal file
35
examples/miniapps/movie_lister/example/db.py
Normal file
|
@ -0,0 +1,35 @@
|
|||
"""Example database module."""
|
||||
|
||||
import csv
|
||||
|
||||
|
||||
def init_sqlite(movies_data, database):
|
||||
"""Initialize sqlite3 movies database.
|
||||
|
||||
:param movies_data: Data about movies
|
||||
:type movies_data: tuple[tuple]
|
||||
|
||||
:param database: Connection to sqlite database with movies data
|
||||
:type database: sqlite3.Connection
|
||||
"""
|
||||
with database:
|
||||
database.execute('CREATE TABLE IF NOT EXISTS movies '
|
||||
'(name text, year int, director text)')
|
||||
database.execute('DELETE FROM movies')
|
||||
database.executemany('INSERT INTO movies VALUES (?,?,?)', movies_data)
|
||||
|
||||
|
||||
def init_csv(movies_data, csv_file_path, delimiter):
|
||||
"""Initialize csv movies database.
|
||||
|
||||
:param movies_data: Data about movies
|
||||
:type movies_data: tuple[tuple]
|
||||
|
||||
:param csv_file_path: Path to csv file with movies data
|
||||
:type csv_file_path: str
|
||||
|
||||
:param delimiter: Csv file's delimiter
|
||||
:type delimiter: str
|
||||
"""
|
||||
with open(csv_file_path, 'w') as csv_file:
|
||||
csv.writer(csv_file, delimiter=delimiter).writerows(movies_data)
|
17
examples/miniapps/movie_lister/example/main.py
Normal file
17
examples/miniapps/movie_lister/example/main.py
Normal file
|
@ -0,0 +1,17 @@
|
|||
"""Example main module."""
|
||||
|
||||
|
||||
def main(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 movie_lister: Movie lister instance
|
||||
:type movie_lister: movies.listers.MovieLister
|
||||
"""
|
||||
print(movie_lister.movies_directed_by('Francis Lawrence'))
|
||||
print(movie_lister.movies_directed_by('Patricia Riggen'))
|
||||
print(movie_lister.movies_directed_by('JJ Abrams'))
|
||||
|
||||
print(movie_lister.movies_released_in(2015))
|
|
@ -12,13 +12,13 @@ concrete finder implementation in terms of library configuration.
|
|||
Each of ``MoviesModule`` providers could be overridden.
|
||||
"""
|
||||
|
||||
import dependency_injector.containers as containers
|
||||
import dependency_injector.providers as providers
|
||||
|
||||
import movies.finders
|
||||
import movies.listers
|
||||
import movies.models
|
||||
|
||||
import dependency_injector.containers as containers
|
||||
import dependency_injector.providers as providers
|
||||
|
||||
|
||||
class MoviesModule(containers.DeclarativeContainer):
|
||||
"""IoC container of movies module component providers."""
|
||||
|
|
|
@ -33,20 +33,20 @@ class MovieFinder(object):
|
|||
class CsvMovieFinder(MovieFinder):
|
||||
"""Movie finder that fetches movies data from csv file."""
|
||||
|
||||
def __init__(self, movie_model, csv_file, delimeter):
|
||||
def __init__(self, movie_model, csv_file_path, delimiter):
|
||||
"""Initializer.
|
||||
|
||||
:param movie_model: Movie model's factory
|
||||
:type movie_model: movies.models.Movie
|
||||
|
||||
:param csv_file: Path to csv file with movies data
|
||||
:type csv_file: str
|
||||
:param csv_file_path: Path to csv file with movies data
|
||||
:type csv_file_path: str
|
||||
|
||||
:param delimeter: Csv file's delimeter
|
||||
:type delimeter: str
|
||||
:param delimiter: Csv file's delimiter
|
||||
:type delimiter: str
|
||||
"""
|
||||
self._csv_file = csv_file
|
||||
self._delimeter = delimeter
|
||||
self._csv_file_path = csv_file_path
|
||||
self._delimiter = delimiter
|
||||
super(CsvMovieFinder, self).__init__(movie_model)
|
||||
|
||||
def find_all(self):
|
||||
|
@ -55,9 +55,9 @@ class CsvMovieFinder(MovieFinder):
|
|||
:rtype: list[movies.models.Movie]
|
||||
:return: List of movie instances.
|
||||
"""
|
||||
with open(self._csv_file) as csv_file:
|
||||
reader = csv.reader(csv_file, delimiter=self._delimeter)
|
||||
return [self._movie_model(*row) for row in reader]
|
||||
with open(self._csv_file_path) as csv_file:
|
||||
csv_reader = csv.reader(csv_file, delimiter=self._delimiter)
|
||||
return [self._movie_model(*row) for row in csv_reader]
|
||||
|
||||
|
||||
class SqliteMovieFinder(MovieFinder):
|
||||
|
|
|
@ -7,8 +7,11 @@ import os
|
|||
|
||||
|
||||
DATA_DIR = os.path.abspath(os.path.dirname(__file__) + '/data')
|
||||
|
||||
MOVIES_CSV_PATH = DATA_DIR + '/movies.csv'
|
||||
MOVIES_CSV_DELIMETER = ','
|
||||
|
||||
MOVIES_DB_PATH = DATA_DIR + '/movies.db'
|
||||
|
||||
MOVIES_SAMPLE_DATA = (
|
||||
('The Hunger Games: Mockingjay - Part 2', 2015, 'Francis Lawrence'),
|
||||
('The 33', 2015, 'Patricia Riggen'),
|
||||
('Star Wars: Episode VII - The Force Awakens', 2015, 'JJ Abrams'),
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue
Block a user