mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-10-31 16:07:51 +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:: | ||||
|     :maxdepth: 2 | ||||
| 
 | ||||
|     use_cases_miniapp | ||||
|     use-cases | ||||
|     password-hashing | ||||
|     chained_factories | ||||
|     factory_of_factories | ||||
|  |  | |||
|  | @ -3,6 +3,8 @@ Password hashing example | |||
| 
 | ||||
| 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``: | ||||
| 
 | ||||
| .. literalinclude:: ../../examples/miniapps/password-hashing/example.py | ||||
|  | @ -14,6 +16,4 @@ Instructions for running: | |||
| 
 | ||||
|     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:: | ||||
|  |  | |||
							
								
								
									
										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 | ||||
| 
 | ||||
| from containers import Adapters, TestAdapters, UseCases | ||||
| from .containers import UseCases, Adapters, TestAdapters | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     environment, email = sys.argv[1:] | ||||
| 
 | ||||
| def main(environment: str, email: str) -> None: | ||||
|     if environment == 'prod': | ||||
|         adapters = Adapters() | ||||
|     elif environment == 'test': | ||||
|         adapters = TestAdapters() | ||||
|     else: | ||||
|         raise RuntimeError('Unknown environment') | ||||
| 
 | ||||
|     use_cases = UseCases(adapters=adapters) | ||||
| 
 | ||||
|     use_case = use_cases.signup() | ||||
|     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