mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-07-04 20:33:13 +03:00
Update CLI application (movie lister) tutorial
This commit is contained in:
parent
2d006d5326
commit
d3d2e70079
|
@ -575,13 +575,11 @@ Let's inject the ``lister`` into the ``main()`` function.
|
||||||
Edit ``__main__.py``:
|
Edit ``__main__.py``:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
:emphasize-lines: 3-7,11-12,19
|
:emphasize-lines: 3-5,9-10,17
|
||||||
|
|
||||||
"""Main module."""
|
"""Main module."""
|
||||||
|
|
||||||
import sys
|
from dependency_injector.wiring import Provide, inject
|
||||||
|
|
||||||
from dependency_injector.wiring import inject, Provide
|
|
||||||
|
|
||||||
from .listers import MovieLister
|
from .listers import MovieLister
|
||||||
from .containers import Container
|
from .containers import Container
|
||||||
|
@ -595,7 +593,7 @@ Edit ``__main__.py``:
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
container = Container()
|
container = Container()
|
||||||
container.config.from_yaml("config.yml")
|
container.config.from_yaml("config.yml")
|
||||||
container.wire(modules=[sys.modules[__name__]])
|
container.wire(modules=[__name__])
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
@ -607,13 +605,11 @@ Francis Lawrence and movies released in 2016.
|
||||||
Edit ``__main__.py``:
|
Edit ``__main__.py``:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
:emphasize-lines: 13-19
|
:emphasize-lines: 11-17
|
||||||
|
|
||||||
"""Main module."""
|
"""Main module."""
|
||||||
|
|
||||||
import sys
|
from dependency_injector.wiring import Provide, inject
|
||||||
|
|
||||||
from dependency_injector.wiring import inject, Provide
|
|
||||||
|
|
||||||
from .listers import MovieLister
|
from .listers import MovieLister
|
||||||
from .containers import Container
|
from .containers import Container
|
||||||
|
@ -633,7 +629,7 @@ Edit ``__main__.py``:
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
container = Container()
|
container = Container()
|
||||||
container.config.from_yaml("config.yml")
|
container.config.from_yaml("config.yml")
|
||||||
container.wire(modules=[sys.modules[__name__]])
|
container.wire(modules=[__name__])
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
@ -863,13 +859,11 @@ Now we need to read the value of the ``config.finder.type`` option from the envi
|
||||||
Edit ``__main__.py``:
|
Edit ``__main__.py``:
|
||||||
|
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
:emphasize-lines: 25
|
:emphasize-lines: 23
|
||||||
|
|
||||||
"""Main module."""
|
"""Main module."""
|
||||||
|
|
||||||
import sys
|
from dependency_injector.wiring import Provide, inject
|
||||||
|
|
||||||
from dependency_injector.wiring import inject, Provide
|
|
||||||
|
|
||||||
from .listers import MovieLister
|
from .listers import MovieLister
|
||||||
from .containers import Container
|
from .containers import Container
|
||||||
|
|
|
@ -6,19 +6,19 @@ import pathlib
|
||||||
|
|
||||||
|
|
||||||
SAMPLE_DATA = [
|
SAMPLE_DATA = [
|
||||||
('The Hunger Games: Mockingjay - Part 2', 2015, 'Francis Lawrence'),
|
("The Hunger Games: Mockingjay - Part 2", 2015, "Francis Lawrence"),
|
||||||
('Rogue One: A Star Wars Story', 2016, 'Gareth Edwards'),
|
("Rogue One: A Star Wars Story", 2016, "Gareth Edwards"),
|
||||||
('The Jungle Book', 2016, 'Jon Favreau'),
|
("The Jungle Book", 2016, "Jon Favreau"),
|
||||||
]
|
]
|
||||||
|
|
||||||
FILE = pathlib.Path(__file__)
|
FILE = pathlib.Path(__file__)
|
||||||
DIR = FILE.parent
|
DIR = FILE.parent
|
||||||
CSV_FILE = DIR / 'movies.csv'
|
CSV_FILE = DIR / "movies.csv"
|
||||||
SQLITE_FILE = DIR / 'movies.db'
|
SQLITE_FILE = DIR / "movies.db"
|
||||||
|
|
||||||
|
|
||||||
def create_csv(movies_data, path):
|
def create_csv(movies_data, path):
|
||||||
with open(path, 'w') as opened_file:
|
with open(path, "w") as opened_file:
|
||||||
writer = csv.writer(opened_file)
|
writer = csv.writer(opened_file)
|
||||||
for row in movies_data:
|
for row in movies_data:
|
||||||
writer.writerow(row)
|
writer.writerow(row)
|
||||||
|
@ -27,18 +27,18 @@ def create_csv(movies_data, path):
|
||||||
def create_sqlite(movies_data, path):
|
def create_sqlite(movies_data, path):
|
||||||
with sqlite3.connect(path) as db:
|
with sqlite3.connect(path) as db:
|
||||||
db.execute(
|
db.execute(
|
||||||
'CREATE TABLE IF NOT EXISTS movies '
|
"CREATE TABLE IF NOT EXISTS movies "
|
||||||
'(title text, year int, director text)'
|
"(title text, year int, director text)"
|
||||||
)
|
)
|
||||||
db.execute('DELETE FROM movies')
|
db.execute("DELETE FROM movies")
|
||||||
db.executemany('INSERT INTO movies VALUES (?,?,?)', movies_data)
|
db.executemany("INSERT INTO movies VALUES (?,?,?)", movies_data)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
create_csv(SAMPLE_DATA, CSV_FILE)
|
create_csv(SAMPLE_DATA, CSV_FILE)
|
||||||
create_sqlite(SAMPLE_DATA, SQLITE_FILE)
|
create_sqlite(SAMPLE_DATA, SQLITE_FILE)
|
||||||
print('OK')
|
print("OK")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
"""Main module."""
|
"""Main module."""
|
||||||
|
|
||||||
import sys
|
from dependency_injector.wiring import Provide, inject
|
||||||
|
|
||||||
from dependency_injector.wiring import inject, Provide
|
|
||||||
|
|
||||||
from .listers import MovieLister
|
from .listers import MovieLister
|
||||||
from .containers import Container
|
from .containers import Container
|
||||||
|
@ -10,19 +8,19 @@ from .containers import Container
|
||||||
|
|
||||||
@inject
|
@inject
|
||||||
def main(lister: MovieLister = Provide[Container.lister]) -> None:
|
def main(lister: MovieLister = Provide[Container.lister]) -> None:
|
||||||
print('Francis Lawrence movies:')
|
print("Francis Lawrence movies:")
|
||||||
for movie in lister.movies_directed_by('Francis Lawrence'):
|
for movie in lister.movies_directed_by("Francis Lawrence"):
|
||||||
print('\t-', movie)
|
print("\t-", movie)
|
||||||
|
|
||||||
print('2016 movies:')
|
print("2016 movies:")
|
||||||
for movie in lister.movies_released_in(2016):
|
for movie in lister.movies_released_in(2016):
|
||||||
print('\t-', movie)
|
print("\t-", movie)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == "__main__":
|
||||||
container = Container()
|
container = Container()
|
||||||
container.config.from_yaml('config.yml')
|
container.config.from_yaml("config.yml")
|
||||||
container.config.finder.type.from_env('MOVIE_FINDER_TYPE')
|
container.config.finder.type.from_env("MOVIE_FINDER_TYPE")
|
||||||
container.wire(modules=[sys.modules[__name__]])
|
container.wire(modules=[__name__])
|
||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
|
@ -9,7 +9,7 @@ class Movie:
|
||||||
self.director = str(director)
|
self.director = str(director)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return '{0}(title={1}, year={2}, director={3})'.format(
|
return "{0}(title={1}, year={2}, director={3})".format(
|
||||||
self.__class__.__name__,
|
self.__class__.__name__,
|
||||||
repr(self.title),
|
repr(self.title),
|
||||||
repr(self.year),
|
repr(self.year),
|
||||||
|
|
|
@ -46,5 +46,5 @@ class SqliteMovieFinder(MovieFinder):
|
||||||
|
|
||||||
def find_all(self) -> List[Movie]:
|
def find_all(self) -> List[Movie]:
|
||||||
with self._database as db:
|
with self._database as db:
|
||||||
rows = db.execute('SELECT title, year, director FROM movies')
|
rows = db.execute("SELECT title, year, director FROM movies")
|
||||||
return [self._movie_factory(*row) for row in rows]
|
return [self._movie_factory(*row) for row in rows]
|
||||||
|
|
|
@ -11,14 +11,14 @@ from .containers import Container
|
||||||
def container():
|
def container():
|
||||||
container = Container()
|
container = Container()
|
||||||
container.config.from_dict({
|
container.config.from_dict({
|
||||||
'finder': {
|
"finder": {
|
||||||
'type': 'csv',
|
"type": "csv",
|
||||||
'csv': {
|
"csv": {
|
||||||
'path': '/fake-movies.csv',
|
"path": "/fake-movies.csv",
|
||||||
'delimiter': ',',
|
"delimiter": ",",
|
||||||
},
|
},
|
||||||
'sqlite': {
|
"sqlite": {
|
||||||
'path': '/fake-movies.db',
|
"path": "/fake-movies.db",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
@ -28,23 +28,23 @@ def container():
|
||||||
def test_movies_directed_by(container):
|
def test_movies_directed_by(container):
|
||||||
finder_mock = mock.Mock()
|
finder_mock = mock.Mock()
|
||||||
finder_mock.find_all.return_value = [
|
finder_mock.find_all.return_value = [
|
||||||
container.movie('The 33', 2015, 'Patricia Riggen'),
|
container.movie("The 33", 2015, "Patricia Riggen"),
|
||||||
container.movie('The Jungle Book', 2016, 'Jon Favreau'),
|
container.movie("The Jungle Book", 2016, "Jon Favreau"),
|
||||||
]
|
]
|
||||||
|
|
||||||
with container.finder.override(finder_mock):
|
with container.finder.override(finder_mock):
|
||||||
lister = container.lister()
|
lister = container.lister()
|
||||||
movies = lister.movies_directed_by('Jon Favreau')
|
movies = lister.movies_directed_by("Jon Favreau")
|
||||||
|
|
||||||
assert len(movies) == 1
|
assert len(movies) == 1
|
||||||
assert movies[0].title == 'The Jungle Book'
|
assert movies[0].title == "The Jungle Book"
|
||||||
|
|
||||||
|
|
||||||
def test_movies_released_in(container):
|
def test_movies_released_in(container):
|
||||||
finder_mock = mock.Mock()
|
finder_mock = mock.Mock()
|
||||||
finder_mock.find_all.return_value = [
|
finder_mock.find_all.return_value = [
|
||||||
container.movie('The 33', 2015, 'Patricia Riggen'),
|
container.movie("The 33", 2015, "Patricia Riggen"),
|
||||||
container.movie('The Jungle Book', 2016, 'Jon Favreau'),
|
container.movie("The Jungle Book", 2016, "Jon Favreau"),
|
||||||
]
|
]
|
||||||
|
|
||||||
with container.finder.override(finder_mock):
|
with container.finder.override(finder_mock):
|
||||||
|
@ -52,4 +52,4 @@ def test_movies_released_in(container):
|
||||||
movies = lister.movies_released_in(2015)
|
movies = lister.movies_released_in(2015)
|
||||||
|
|
||||||
assert len(movies) == 1
|
assert len(movies) == 1
|
||||||
assert movies[0].title == 'The 33'
|
assert movies[0].title == "The 33"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user