From 80aad7748de7bde3676d5c94d90de96d1ec3f502 Mon Sep 17 00:00:00 2001 From: Roman Mogylatov Date: Mon, 10 Aug 2020 22:04:04 -0400 Subject: [PATCH] Update README.rst --- README.rst | 122 ++++++++++++++++++++++------------------------------- 1 file changed, 51 insertions(+), 71 deletions(-) diff --git a/README.rst b/README.rst index 8ee6e065..db9e2d55 100644 --- a/README.rst +++ b/README.rst @@ -71,10 +71,8 @@ How does it different from the other frameworks? ``Dependency Injector`` is a simple tool for the powerful concept. -Why do I need it? -================= - -``Dependency Injector`` helps you understand and change the structure of the application. +Example +======= With the ``Dependency Injector`` you keep **application structure in one place**. This place is called **the container**. You use the container to manage all the components of the @@ -86,98 +84,80 @@ the application structure. It is **easy to understand and change** it. *The container is like a map of your application. You always know what depends on what.* -``Flask`` + ``Dependency Injector`` example application container: +Example application container: .. code-block:: python - from dependency_injector import containers, providers - from dependency_injector.ext import flask - from flask import Flask - from flask_bootstrap import Bootstrap - from github import Github + import logging + import sys - from . import views, services + from dependency_injector import containers, providers + + from . import http, monitors, dispatcher - class ApplicationContainer(containers.DeclarativeContainer): - """Application container.""" + class ApplicationContainer(containers.DeclarativeContainer): - app = flask.Application(Flask, __name__) + config = providers.Configuration() - bootstrap = flask.Extension(Bootstrap) + configure_logging = providers.Callable( + logging.basicConfig, + stream=sys.stdout, + level=config.log.level, + format=config.log.format, + ) - config = providers.Configuration() + http_client = providers.Factory(http.HttpClient) - github_client = providers.Factory( - Github, - login_or_token=config.github.auth_token, - timeout=config.github.request_timeout, - ) + example_monitor = providers.Factory( + monitors.HttpMonitor, + http_client=http_client, + options=config.monitors.example, + ) - search_service = providers.Factory( - services.SearchService, - github_client=github_client, - ) + httpbin_monitor = providers.Factory( + monitors.HttpMonitor, + http_client=http_client, + options=config.monitors.httpbin, + ) - index_view = flask.View( - views.index, - search_service=search_service, - default_query=config.search.default_query, - default_limit=config.search.default_limit, - ) + dispatcher = providers.Factory( + dispatcher.Dispatcher, + monitors=providers.List( + example_monitor, + httpbin_monitor, + ), + ) -Running such container looks like this: +Running of such container looks like this: .. code-block:: python - from .containers import ApplicationContainer + from .containers import ApplicationContainer - def create_app(): - """Create and return Flask application.""" - container = ApplicationContainer() - container.config.from_yaml('config.yml') - container.config.github.auth_token.from_env('GITHUB_TOKEN') + def main() -> None: + container = ApplicationContainer() - app = container.app() - app.container = container + container.config.from_yaml('config.yml') + container.configure_logging() - bootstrap = container.bootstrap() - bootstrap.init_app(app) - - app.add_url_rule('/', view_func=container.index_view.as_view()) - - return app - -And testing looks like: - -.. code-block:: python - - from unittest import mock - - import pytest - from github import Github - from flask import url_for - - from .application import create_app + dispatcher = container.dispatcher() + dispatcher.run() - @pytest.fixture - def app(): - return create_app() + if __name__ == '__main__': + main() +Tutorials +========= +Tutorial will be a good point to start. - def test_index(client, app): - github_client_mock = mock.Mock(spec=Github) - # Configure mock +You can pass one of the dependency injection tutorials: - with app.container.github_client.override(github_client_mock): - response = client.get(url_for('index')) - - assert response.status_code == 200 - # Do more asserts - -See complete example here - `Flask + Dependency Injector Example `_ +- `Flask web application tutorial `_ +- `Aiohttp REST API tutorial `_ +- `Asyncio monitoring daemon tutorial `_ How to install? ---------------