Skip to content

Commit 68c734a

Browse files
committed
Merge branch 'release/3.10.0' into master
2 parents 7e4528e + 4a37433 commit 68c734a

File tree

17 files changed

+6754
-4421
lines changed

17 files changed

+6754
-4421
lines changed

docs/examples/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ and powered by *Dependency Injector* framework.
1818
movie_lister
1919
services_miniapp
2020
bundles_miniapp
21+
use_cases_miniapp
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
Use cases mini application example
2+
----------------------------------
3+
4+
.. currentmodule:: dependency_injector.providers
5+
6+
"Use cases" miniapp demonstrate usage of :py:class:`DependenciesContainer`
7+
provider.
8+
9+
Example application
10+
~~~~~~~~~~~~~~~~~~~
11+
12+
"Use cases" mini application has next structure:
13+
14+
.. code-block:: bash
15+
16+
use_cases/
17+
example/ <-- Example package
18+
__init__.py
19+
adapters.py
20+
use_cases.py
21+
containers.py <-- Dependency injection containers
22+
run.py <-- Entrypoint
23+
24+
25+
IoC containers
26+
~~~~~~~~~~~~~~
27+
28+
Listing of ``use_cases/containers.py``:
29+
30+
.. literalinclude:: ../../examples/miniapps/use_cases/containers.py
31+
:language: python
32+
:linenos:
33+
34+
Run application
35+
~~~~~~~~~~~~~~~
36+
37+
Listing of ``run.py``:
38+
39+
.. literalinclude:: ../../examples/miniapps/use_cases/run.py
40+
:language: python
41+
:linenos:
42+
43+
Instructions for running:
44+
45+
.. code-block:: bash
46+
47+
python run.py prod [email protected] # Running in "production" environment
48+
python run.py test [email protected] # Running in "testing" environment
49+
50+
Links
51+
~~~~~
52+
53+
+ `Dependency Injector <https://github.com/ets-labs/python-dependency-injector/>`_
54+
+ `Full example sources <https://github.com/ets-labs/python-dependency-injector/tree/master/examples/miniapps/use_cases>`_
55+
56+
57+
.. disqus::

docs/main/changelog.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ that were made in every particular version.
77
From version 0.7.6 *Dependency Injector* framework strictly
88
follows `Semantic versioning`_
99

10+
11+
3.10.0
12+
------
13+
- Add ``DependenciesContainer`` provider.
14+
- Add "use_cases" example miniapp.
15+
- Update documentation requirements to use fixed version of
16+
``sphinxcontrib-disqus``.
17+
18+
1019
3.9.1
1120
-----
1221
- Fix docs build problem (``sphinx`` is frozen on ``1.5.6`` version because of

examples/miniapps/movie_lister/movies/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@
2323
class MoviesModule(containers.DeclarativeContainer):
2424
"""IoC container of movies module component providers."""
2525

26-
models_factory = providers.Factory(movies.models.Movie)
26+
movie = providers.Factory(movies.models.Movie)
2727

2828
finder = providers.AbstractFactory(movies.finders.MovieFinder,
29-
movie_model=models_factory.delegate())
29+
movie_model=movie.provider)
3030

3131
lister = providers.Factory(movies.listers.MovieLister,
3232
movie_finder=finder)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
Dependency Injector Use Cases example
2+
=====================================
3+
4+
Instructions for running
5+
6+
.. code-block:: bash
7+
8+
python run.py prod [email protected] # Running in "production" environment
9+
python run.py test [email protected] # Running in "testing" environment
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""Dependency injection containers for 'Use Cases' example application."""
2+
3+
from dependency_injector import containers, providers
4+
5+
from example.adapters import SmtpEmailSender, EchoEmailSender
6+
from example.use_cases import SignupUseCase
7+
8+
9+
class Adapters(containers.DeclarativeContainer):
10+
"""Adapters container."""
11+
12+
email_sender = providers.Singleton(SmtpEmailSender)
13+
14+
15+
class TestAdapters(containers.DeclarativeContainer):
16+
"""Adapters container.
17+
18+
This container is used for testing purposes.
19+
"""
20+
21+
email_sender = providers.Singleton(EchoEmailSender)
22+
23+
24+
class UseCases(containers.DeclarativeContainer):
25+
"""Use cases container."""
26+
27+
adapters = providers.DependenciesContainer()
28+
29+
signup = providers.Factory(SignupUseCase,
30+
email_sender=adapters.email_sender)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"""Example top-level package."""
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
"""Example adapters package."""
2+
3+
4+
class EmailSender(object):
5+
"""Abstract email sender."""
6+
7+
def send(self, to, body):
8+
"""Send email to specified email."""
9+
raise NotImplementedError()
10+
11+
12+
class SmtpEmailSender(object):
13+
"""SMTP email sender uses SMTP protocol for sending emails."""
14+
15+
def send(self, to, body):
16+
"""Send email to specified email."""
17+
# Send email via SMTP
18+
19+
20+
class EchoEmailSender(object):
21+
"""Echo email sender prints emails to stdout."""
22+
23+
def send(self, to, body):
24+
"""Send email to specified email."""
25+
print('Sending email to "{0}", body = "{1}"'.format(to, body))
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
"""Example use cases package."""
2+
3+
4+
class UseCase(object):
5+
"""Abstract use case."""
6+
7+
def execute(self):
8+
"""Execute use case handling."""
9+
raise NotImplementedError()
10+
11+
12+
class SignupUseCase(object):
13+
"""Sign up use cases registers users."""
14+
15+
def __init__(self, email_sender):
16+
"""Initializer."""
17+
self.email_sender = email_sender
18+
19+
def execute(self, email):
20+
"""Execute use case handling."""
21+
print('Sign up user {0}'.format(email))
22+
self.email_sender.send(email, 'Welcome, "{}"'.format(email))

examples/miniapps/use_cases/run.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
"""Run 'Use Cases' example application."""
2+
3+
import sys
4+
5+
from containers import Adapters, TestAdapters, UseCases
6+
7+
8+
if __name__ == '__main__':
9+
environment, email = sys.argv[1:]
10+
11+
if environment == 'prod':
12+
adapters = Adapters()
13+
elif environment == 'test':
14+
adapters = TestAdapters()
15+
16+
use_cases = UseCases(adapters=adapters)
17+
18+
use_case = use_cases.signup()
19+
use_case.execute(email)

0 commit comments

Comments
 (0)