From 7ec2afe17f9a92f21e964b1125d49e7553a02ae1 Mon Sep 17 00:00:00 2001 From: Roman Mogylatov Date: Thu, 8 Oct 2020 15:43:53 -0400 Subject: [PATCH] Refactor asyncio monitoring daemon example application --- .../monitoring-daemon-asyncio/README.rst | 19 ++++++++--------- .../monitoringdaemon/__main__.py | 21 +++++++++++-------- .../monitoringdaemon/containers.py | 5 ++--- .../monitoringdaemon/dispatcher.py | 1 + .../monitoringdaemon/monitors.py | 2 +- .../monitoringdaemon/tests.py | 4 ++-- 6 files changed, 27 insertions(+), 25 deletions(-) diff --git a/examples/miniapps/monitoring-daemon-asyncio/README.rst b/examples/miniapps/monitoring-daemon-asyncio/README.rst index c9432dab..7616ff4e 100644 --- a/examples/miniapps/monitoring-daemon-asyncio/README.rst +++ b/examples/miniapps/monitoring-daemon-asyncio/README.rst @@ -1,8 +1,10 @@ -Asyncio Daemon Dependency Injection Example -=========================================== +Asyncio Daemon + Dependency Injector Example +============================================ -Application ``monitoringdaemon`` is an `asyncio `_ -+ `Dependency Injector `_ application. +This is an `asyncio `_ + +`Dependency Injector `_ example application. + +The example application is a daemon that monitors availability of web services. Run --- @@ -31,19 +33,16 @@ The output should be something like: monitor_1 | response code: 200 monitor_1 | content length: 648 monitor_1 | request took: 0.074 seconds - monitor_1 | monitor_1 | [2020-08-08 17:04:36,811] [INFO] [HttpMonitor]: Check monitor_1 | GET https://httpbin.org/get monitor_1 | response code: 200 monitor_1 | content length: 310 monitor_1 | request took: 0.153 seconds - monitor_1 | monitor_1 | [2020-08-08 17:04:41,731] [INFO] [HttpMonitor]: Check monitor_1 | GET http://example.com monitor_1 | response code: 200 monitor_1 | content length: 648 monitor_1 | request took: 0.067 seconds - monitor_1 | monitor_1 | [2020-08-08 17:04:41,787] [INFO] [HttpMonitor]: Check monitor_1 | GET https://httpbin.org/get monitor_1 | response code: 200 @@ -77,11 +76,11 @@ The output should be something like: Name Stmts Miss Cover ---------------------------------------------------- monitoringdaemon/__init__.py 0 0 100% - monitoringdaemon/__main__.py 9 9 0% + monitoringdaemon/__main__.py 12 12 0% monitoringdaemon/containers.py 11 0 100% - monitoringdaemon/dispatcher.py 43 5 88% + monitoringdaemon/dispatcher.py 44 5 89% monitoringdaemon/http.py 6 3 50% monitoringdaemon/monitors.py 23 1 96% monitoringdaemon/tests.py 37 0 100% ---------------------------------------------------- - TOTAL 129 18 86% + TOTAL 133 21 84% diff --git a/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/__main__.py b/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/__main__.py index 69b66dd7..c0341357 100644 --- a/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/__main__.py +++ b/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/__main__.py @@ -1,18 +1,21 @@ """Main module.""" -from .containers import ApplicationContainer +import sys + +from dependency_injector.wiring import Provide + +from .dispatcher import Dispatcher +from .containers import Container -def main() -> None: - """Run the application.""" - container = ApplicationContainer() - - container.config.from_yaml('config.yml') - container.configure_logging() - - dispatcher = container.dispatcher() +def main(dispatcher: Dispatcher = Provide[Container.dispatcher]) -> None: dispatcher.run() if __name__ == '__main__': + container = Container() + container.config.from_yaml('config.yml') + container.configure_logging() + container.wire(modules=[sys.modules[__name__]]) + main() diff --git a/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/containers.py b/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/containers.py index c66ec327..cc134f7b 100644 --- a/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/containers.py +++ b/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/containers.py @@ -1,4 +1,4 @@ -"""Application containers module.""" +"""Containers module.""" import logging import sys @@ -8,8 +8,7 @@ from dependency_injector import containers, providers from . import http, monitors, dispatcher -class ApplicationContainer(containers.DeclarativeContainer): - """Application container.""" +class Container(containers.DeclarativeContainer): config = providers.Configuration() diff --git a/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/dispatcher.py b/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/dispatcher.py index a71f850c..e3d00118 100644 --- a/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/dispatcher.py +++ b/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/dispatcher.py @@ -44,6 +44,7 @@ class Dispatcher: self._logger.info('Shutting down') for task, monitor in zip(self._monitor_tasks, self._monitors): task.cancel() + self._monitor_tasks.clear() self._logger.info('Shutdown finished successfully') @staticmethod diff --git a/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/monitors.py b/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/monitors.py index ebcc8d0a..d814ac1c 100644 --- a/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/monitors.py +++ b/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/monitors.py @@ -47,7 +47,7 @@ class HttpMonitor(Monitor): ' %s %s\n' ' response code: %s\n' ' content length: %s\n' - ' request took: %s seconds\n', + ' request took: %s seconds', self._method, self._url, response.status, diff --git a/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/tests.py b/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/tests.py index df16e6fa..6d118e97 100644 --- a/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/tests.py +++ b/examples/miniapps/monitoring-daemon-asyncio/monitoringdaemon/tests.py @@ -6,7 +6,7 @@ from unittest import mock import pytest -from .containers import ApplicationContainer +from .containers import Container @dataclasses.dataclass @@ -17,7 +17,7 @@ class RequestStub: @pytest.fixture def container(): - container = ApplicationContainer() + container = Container() container.config.from_dict({ 'log': { 'level': 'INFO',