mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-01-31 03:36:41 +03:00
Add docs for the use cases example
This commit is contained in:
parent
f84d3e6f4e
commit
36ece67586
|
@ -13,7 +13,7 @@ This sections contains assorted ``Dependency Injector`` examples.
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
use_cases_miniapp
|
use-cases
|
||||||
password-hashing
|
password-hashing
|
||||||
chained_factories
|
chained_factories
|
||||||
factory_of_factories
|
factory_of_factories
|
||||||
|
|
|
@ -3,6 +3,8 @@ Password hashing example
|
||||||
|
|
||||||
This example demonstrates an injection of the ``Callable`` provider.
|
This example demonstrates an injection of the ``Callable`` provider.
|
||||||
|
|
||||||
|
The source code is available on the `Github <https://github.com/ets-labs/python-dependency-injector/tree/master/examples/miniapps/password-hashing>`_.
|
||||||
|
|
||||||
Listing of the ``example.py``:
|
Listing of the ``example.py``:
|
||||||
|
|
||||||
.. literalinclude:: ../../examples/miniapps/password-hashing/example.py
|
.. literalinclude:: ../../examples/miniapps/password-hashing/example.py
|
||||||
|
@ -14,6 +16,4 @@ Instructions for running:
|
||||||
|
|
||||||
python example.py
|
python example.py
|
||||||
|
|
||||||
You can find the source code on the `Github <https://github.com/ets-labs/python-dependency-injector/tree/master/examples/miniapps/password-hashing>`_.
|
|
||||||
|
|
||||||
.. disqus::
|
.. disqus::
|
||||||
|
|
71
docs/examples-other/use-cases.rst
Normal file
71
docs/examples-other/use-cases.rst
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
Use cases example
|
||||||
|
=================
|
||||||
|
|
||||||
|
.. currentmodule:: dependency_injector.providers
|
||||||
|
|
||||||
|
This example demonstrates a usage of the ``DependenciesContainer`` provider.
|
||||||
|
|
||||||
|
The source code is available on the `Github <https://github.com/ets-labs/python-dependency-injector/tree/master/examples/miniapps/decoupled-packages>`_.
|
||||||
|
|
||||||
|
Application structure
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Example application has next structure:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
|
||||||
|
./
|
||||||
|
└── example/
|
||||||
|
├── __init__.py
|
||||||
|
├── __main__.py
|
||||||
|
├── adapters.py
|
||||||
|
├── containers.py
|
||||||
|
└── usecases.py
|
||||||
|
|
||||||
|
Containers
|
||||||
|
----------
|
||||||
|
|
||||||
|
Listing of the ``example/containers.py``:
|
||||||
|
|
||||||
|
.. literalinclude:: ../../examples/miniapps/use-cases/example/containers.py
|
||||||
|
:language: python
|
||||||
|
|
||||||
|
Main module
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Listing of the ``example/__main__.py``:
|
||||||
|
|
||||||
|
.. literalinclude:: ../../examples/miniapps/use-cases/example/__main__.py
|
||||||
|
:language: python
|
||||||
|
|
||||||
|
|
||||||
|
Run the application
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
Instructions for running in the "test" mode:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
python run.py test example@example.com
|
||||||
|
|
||||||
|
Instructions for running in the "prod" mode:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
python run.py prod example@example.com
|
||||||
|
|
||||||
|
Adapters and use cases
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Listing of the ``example/adapters.py``:
|
||||||
|
|
||||||
|
.. literalinclude:: ../../examples/miniapps/use-cases/example/adapters.py
|
||||||
|
:language: python
|
||||||
|
|
||||||
|
Listing of the ``example/usecases.py``:
|
||||||
|
|
||||||
|
.. literalinclude:: ../../examples/miniapps/use-cases/example/usecases.py
|
||||||
|
:language: python
|
||||||
|
|
||||||
|
.. disqus::
|
|
@ -1,55 +0,0 @@
|
||||||
Use cases mini application example
|
|
||||||
----------------------------------
|
|
||||||
|
|
||||||
.. currentmodule:: dependency_injector.providers
|
|
||||||
|
|
||||||
"Use cases" miniapp demonstrate usage of :py:class:`DependenciesContainer`
|
|
||||||
provider.
|
|
||||||
|
|
||||||
Example application
|
|
||||||
~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
"Use cases" mini application has next structure:
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
use_cases/
|
|
||||||
example/ <-- Example package
|
|
||||||
__init__.py
|
|
||||||
adapters.py
|
|
||||||
use_cases.py
|
|
||||||
containers.py <-- Dependency injection containers
|
|
||||||
run.py <-- Entrypoint
|
|
||||||
|
|
||||||
|
|
||||||
IoC containers
|
|
||||||
~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Listing of ``use_cases/containers.py``:
|
|
||||||
|
|
||||||
.. literalinclude:: ../../examples/miniapps/use_cases/containers.py
|
|
||||||
:language: python
|
|
||||||
|
|
||||||
Run application
|
|
||||||
~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Listing of ``run.py``:
|
|
||||||
|
|
||||||
.. literalinclude:: ../../examples/miniapps/use_cases/run.py
|
|
||||||
:language: python
|
|
||||||
|
|
||||||
Instructions for running:
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
python run.py prod example@example.com # Running in "production" environment
|
|
||||||
python run.py test example@example.com # Running in "testing" environment
|
|
||||||
|
|
||||||
Links
|
|
||||||
~~~~~
|
|
||||||
|
|
||||||
+ `Dependency Injector <https://github.com/ets-labs/python-dependency-injector/>`_
|
|
||||||
+ `Full example sources <https://github.com/ets-labs/python-dependency-injector/tree/master/examples/miniapps/use_cases>`_
|
|
||||||
|
|
||||||
|
|
||||||
.. disqus::
|
|
11
examples/miniapps/use-cases/README.rst
Normal file
11
examples/miniapps/use-cases/README.rst
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
Use cases
|
||||||
|
=========
|
||||||
|
|
||||||
|
This example demonstrates a usage of the ``DependenciesContainer`` provider.
|
||||||
|
|
||||||
|
Instructions for running:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
python -m example prod example@example.com
|
||||||
|
python -m example test example@example.com
|
1
examples/miniapps/use-cases/example/__init__.py
Normal file
1
examples/miniapps/use-cases/example/__init__.py
Normal file
|
@ -0,0 +1 @@
|
||||||
|
"""Top-level package."""
|
|
@ -1,19 +1,23 @@
|
||||||
"""Run 'Use Cases' example application."""
|
"""Main module."""
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from containers import Adapters, TestAdapters, UseCases
|
from .containers import UseCases, Adapters, TestAdapters
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
def main(environment: str, email: str) -> None:
|
||||||
environment, email = sys.argv[1:]
|
|
||||||
|
|
||||||
if environment == 'prod':
|
if environment == 'prod':
|
||||||
adapters = Adapters()
|
adapters = Adapters()
|
||||||
elif environment == 'test':
|
elif environment == 'test':
|
||||||
adapters = TestAdapters()
|
adapters = TestAdapters()
|
||||||
|
else:
|
||||||
|
raise RuntimeError('Unknown environment')
|
||||||
|
|
||||||
use_cases = UseCases(adapters=adapters)
|
use_cases = UseCases(adapters=adapters)
|
||||||
|
|
||||||
use_case = use_cases.signup()
|
use_case = use_cases.signup()
|
||||||
use_case.execute(email)
|
use_case.execute(email)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main(*sys.argv[1:])
|
22
examples/miniapps/use-cases/example/adapters.py
Normal file
22
examples/miniapps/use-cases/example/adapters.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
"""Adapters module."""
|
||||||
|
|
||||||
|
import abc
|
||||||
|
|
||||||
|
|
||||||
|
class EmailSender(metaclass=abc.ABCMeta):
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def send(self, to: str, body: str) -> None:
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
class SmtpEmailSender:
|
||||||
|
|
||||||
|
def send(self, to: str, body: str) -> None:
|
||||||
|
print(f'Sending an email to {to} over SMTP, body="{body}"')
|
||||||
|
|
||||||
|
|
||||||
|
class EchoEmailSender:
|
||||||
|
|
||||||
|
def send(self, to: str, body: str) -> None:
|
||||||
|
print(f'Fake sending an email to {to}, body="{body}"')
|
25
examples/miniapps/use-cases/example/containers.py
Normal file
25
examples/miniapps/use-cases/example/containers.py
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
"""Containers module."""
|
||||||
|
|
||||||
|
from dependency_injector import containers, providers
|
||||||
|
|
||||||
|
from . import adapters, usecases
|
||||||
|
|
||||||
|
|
||||||
|
class Adapters(containers.DeclarativeContainer):
|
||||||
|
|
||||||
|
email_sender = providers.Singleton(adapters.SmtpEmailSender)
|
||||||
|
|
||||||
|
|
||||||
|
class TestAdapters(containers.DeclarativeContainer):
|
||||||
|
|
||||||
|
email_sender = providers.Singleton(adapters.EchoEmailSender)
|
||||||
|
|
||||||
|
|
||||||
|
class UseCases(containers.DeclarativeContainer):
|
||||||
|
|
||||||
|
adapters = providers.DependenciesContainer()
|
||||||
|
|
||||||
|
signup = providers.Factory(
|
||||||
|
usecases.SignupUseCase,
|
||||||
|
email_sender=adapters.email_sender,
|
||||||
|
)
|
22
examples/miniapps/use-cases/example/usecases.py
Normal file
22
examples/miniapps/use-cases/example/usecases.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
"""Use cases module."""
|
||||||
|
|
||||||
|
import abc
|
||||||
|
|
||||||
|
from .adapters import EmailSender
|
||||||
|
|
||||||
|
|
||||||
|
class UseCase(metaclass=abc.ABCMeta):
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def execute(self) -> None:
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
class SignupUseCase:
|
||||||
|
|
||||||
|
def __init__(self, email_sender: EmailSender) -> None:
|
||||||
|
self.email_sender = email_sender
|
||||||
|
|
||||||
|
def execute(self, email: str) -> None:
|
||||||
|
print(f'Sign up user {email}')
|
||||||
|
self.email_sender.send(email, f'Welcome, {email}')
|
|
@ -1,9 +0,0 @@
|
||||||
Dependency Injector Use Cases example
|
|
||||||
=====================================
|
|
||||||
|
|
||||||
Instructions for running
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
python run.py prod example@example.com # Running in "production" environment
|
|
||||||
python run.py test example@example.com # Running in "testing" environment
|
|
|
@ -1,30 +0,0 @@
|
||||||
"""Dependency injection containers for 'Use Cases' example application."""
|
|
||||||
|
|
||||||
from dependency_injector import containers, providers
|
|
||||||
|
|
||||||
from example.adapters import SmtpEmailSender, EchoEmailSender
|
|
||||||
from example.use_cases import SignupUseCase
|
|
||||||
|
|
||||||
|
|
||||||
class Adapters(containers.DeclarativeContainer):
|
|
||||||
"""Adapters container."""
|
|
||||||
|
|
||||||
email_sender = providers.Singleton(SmtpEmailSender)
|
|
||||||
|
|
||||||
|
|
||||||
class TestAdapters(containers.DeclarativeContainer):
|
|
||||||
"""Adapters container.
|
|
||||||
|
|
||||||
This container is used for testing purposes.
|
|
||||||
"""
|
|
||||||
|
|
||||||
email_sender = providers.Singleton(EchoEmailSender)
|
|
||||||
|
|
||||||
|
|
||||||
class UseCases(containers.DeclarativeContainer):
|
|
||||||
"""Use cases container."""
|
|
||||||
|
|
||||||
adapters = providers.DependenciesContainer()
|
|
||||||
|
|
||||||
signup = providers.Factory(SignupUseCase,
|
|
||||||
email_sender=adapters.email_sender)
|
|
|
@ -1 +0,0 @@
|
||||||
"""Example top-level package."""
|
|
|
@ -1,25 +0,0 @@
|
||||||
"""Example adapters package."""
|
|
||||||
|
|
||||||
|
|
||||||
class EmailSender:
|
|
||||||
"""Abstract email sender."""
|
|
||||||
|
|
||||||
def send(self, to, body):
|
|
||||||
"""Send email to specified email."""
|
|
||||||
raise NotImplementedError()
|
|
||||||
|
|
||||||
|
|
||||||
class SmtpEmailSender:
|
|
||||||
"""SMTP email sender uses SMTP protocol for sending emails."""
|
|
||||||
|
|
||||||
def send(self, to, body):
|
|
||||||
"""Send email to specified email."""
|
|
||||||
# Send email via SMTP
|
|
||||||
|
|
||||||
|
|
||||||
class EchoEmailSender:
|
|
||||||
"""Echo email sender prints emails to stdout."""
|
|
||||||
|
|
||||||
def send(self, to, body):
|
|
||||||
"""Send email to specified email."""
|
|
||||||
print('Sending email to "{0}", body = "{1}"'.format(to, body))
|
|
|
@ -1,22 +0,0 @@
|
||||||
"""Example use cases package."""
|
|
||||||
|
|
||||||
|
|
||||||
class UseCase:
|
|
||||||
"""Abstract use case."""
|
|
||||||
|
|
||||||
def execute(self):
|
|
||||||
"""Execute use case handling."""
|
|
||||||
raise NotImplementedError()
|
|
||||||
|
|
||||||
|
|
||||||
class SignupUseCase:
|
|
||||||
"""Sign up use cases registers users."""
|
|
||||||
|
|
||||||
def __init__(self, email_sender):
|
|
||||||
"""Initialize instance."""
|
|
||||||
self.email_sender = email_sender
|
|
||||||
|
|
||||||
def execute(self, email):
|
|
||||||
"""Execute use case handling."""
|
|
||||||
print('Sign up user {0}'.format(email))
|
|
||||||
self.email_sender.send(email, 'Welcome, "{}"'.format(email))
|
|
Loading…
Reference in New Issue
Block a user