From 8798ea1a566863fe646ba79453d44ef448402838 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov Date: Thu, 6 Oct 2016 22:48:43 +0300 Subject: [PATCH] Update services example --- README.rst | 48 ++++++++++++++++--- examples/miniapps/services/README.rst | 2 +- examples/miniapps/services/containers.py | 9 +++- .../services/containers_alt_syntax_1.py | 16 +++++-- .../services/containers_alt_syntax_2.py | 16 +++++-- examples/miniapps/services/example/main.py | 8 ++-- .../miniapps/services/example/services.py | 21 +++++--- examples/miniapps/services/run.py | 39 ++++++++++++--- 8 files changed, 125 insertions(+), 34 deletions(-) diff --git a/README.rst b/README.rst index 5df70f81..6fa6030a 100644 --- a/README.rst +++ b/README.rst @@ -58,9 +58,11 @@ system that consists from several business and platform services: .. code-block:: python - """Example of several Dependency Injector IoC containers.""" + """Example of dependency injection in Python.""" + import logging import sqlite3 + import boto.s3.connection import example.main @@ -73,6 +75,8 @@ system that consists from several business and platform services: class Platform(containers.DeclarativeContainer): """IoC container of platform service providers.""" + logger = providers.Singleton(logging.Logger, name='example') + database = providers.Singleton(sqlite3.connect, ':memory:') s3 = providers.Singleton(boto.s3.connection.S3Connection, @@ -84,13 +88,16 @@ system that consists from several business and platform services: """IoC container of business service providers.""" users = providers.Factory(example.services.Users, + logger=Platform.logger, db=Platform.database) auth = providers.Factory(example.services.Auth, + logger=Platform.logger, db=Platform.database, token_ttl=3600) photos = providers.Factory(example.services.Photos, + logger=Platform.logger, db=Platform.database, s3=Platform.s3) @@ -107,25 +114,52 @@ Next example demonstrates usage of IoC containers & providers defined above: .. code-block:: python - """Run example application.""" + """Run dependency injection example application. - import containers + Instructions for running: + + python run.py 1 secret photo.jpg + """ + + import sys + import logging + + from containers import Platform, Application if __name__ == '__main__': - containers.Application.main() + # Configure platform logger: + Platform.logger().addHandler(logging.StreamHandler(sys.stdout)) + + # Run application: + Application.main(uid=sys.argv[1], + password=sys.argv[2], + photo=sys.argv[3]) # Previous call is an equivalent of next operations: # + # logger = logging.Logger(name='example') # database = sqlite3.connect(':memory:') # s3 = boto.s3.connection.S3Connection(aws_access_key_id='KEY', # aws_secret_access_key='SECRET') # - # example.main.main(users_service=example.services.Users(db=database), - # auth_service=example.services.Auth(db=database, + # example.main.main(uid=sys.argv[1], + # password=sys.argv[2], + # photo=sys.argv[3], + # users_service=example.services.Users(logger=logger, + # db=database), + # auth_service=example.services.Auth(logger=logger, + # db=database, # token_ttl=3600), - # photos_service=example.services.Photos(db=database, + # photos_service=example.services.Photos(logger=logger, + # db=database, # s3=s3)) + # + # Output: + # + # User 1 has been found in database + # User 1 has been successfully authenticated + # Photo photo.jpg has been successfully uploaded by user 1 Alternative definition styles ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/examples/miniapps/services/README.rst b/examples/miniapps/services/README.rst index 9fa352ae..87373537 100644 --- a/examples/miniapps/services/README.rst +++ b/examples/miniapps/services/README.rst @@ -5,4 +5,4 @@ Instructions for running .. code-block:: bash - python run.py + python run.py 1 secret photo.jpg diff --git a/examples/miniapps/services/containers.py b/examples/miniapps/services/containers.py index e12f1436..e859e248 100644 --- a/examples/miniapps/services/containers.py +++ b/examples/miniapps/services/containers.py @@ -1,6 +1,8 @@ -"""Example of several Dependency Injector IoC containers.""" +"""Example of dependency injection in Python.""" +import logging import sqlite3 + import boto.s3.connection import example.main @@ -13,6 +15,8 @@ import dependency_injector.providers as providers class Platform(containers.DeclarativeContainer): """IoC container of platform service providers.""" + logger = providers.Singleton(logging.Logger, name='example') + database = providers.Singleton(sqlite3.connect, ':memory:') s3 = providers.Singleton(boto.s3.connection.S3Connection, @@ -24,13 +28,16 @@ class Services(containers.DeclarativeContainer): """IoC container of business service providers.""" users = providers.Factory(example.services.Users, + logger=Platform.logger, db=Platform.database) auth = providers.Factory(example.services.Auth, + logger=Platform.logger, db=Platform.database, token_ttl=3600) photos = providers.Factory(example.services.Photos, + logger=Platform.logger, db=Platform.database, s3=Platform.s3) diff --git a/examples/miniapps/services/containers_alt_syntax_1.py b/examples/miniapps/services/containers_alt_syntax_1.py index 11803302..bf7389d0 100644 --- a/examples/miniapps/services/containers_alt_syntax_1.py +++ b/examples/miniapps/services/containers_alt_syntax_1.py @@ -1,9 +1,11 @@ -"""Example of several Dependency Injector IoC containers. +"""Example of dependency injection in Python. Alternative injections definition style #1. """ +import logging import sqlite3 + import boto.s3.connection import example.main @@ -16,6 +18,9 @@ import dependency_injector.providers as providers class Platform(containers.DeclarativeContainer): """IoC container of platform service providers.""" + logger = providers.Singleton(logging.Logger) \ + .add_kwargs(name='example') + database = providers.Singleton(sqlite3.connect) \ .add_args(':memory:') @@ -28,14 +33,17 @@ class Services(containers.DeclarativeContainer): """IoC container of business service providers.""" users = providers.Factory(example.services.Users) \ - .add_kwargs(db=Platform.database) + .add_kwargs(logger=Platform.logger, + db=Platform.database) auth = providers.Factory(example.services.Auth) \ - .add_kwargs(db=Platform.database, + .add_kwargs(logger=Platform.logger, + db=Platform.database, token_ttl=3600) photos = providers.Factory(example.services.Photos) \ - .add_kwargs(db=Platform.database, + .add_kwargs(logger=Platform.logger, + db=Platform.database, s3=Platform.s3) diff --git a/examples/miniapps/services/containers_alt_syntax_2.py b/examples/miniapps/services/containers_alt_syntax_2.py index 8e196e62..1388c298 100644 --- a/examples/miniapps/services/containers_alt_syntax_2.py +++ b/examples/miniapps/services/containers_alt_syntax_2.py @@ -1,9 +1,11 @@ -"""Example of several Dependency Injector IoC containers. +"""Example of dependency injection in Python. Alternative injections definition style #2. """ +import logging import sqlite3 + import boto.s3.connection import example.main @@ -16,6 +18,9 @@ import dependency_injector.providers as providers class Platform(containers.DeclarativeContainer): """IoC container of platform service providers.""" + logger = providers.Singleton(logging.Logger) + logger.add_kwargs(name='example') + database = providers.Singleton(sqlite3.connect) database.add_args(':memory:') @@ -28,14 +33,17 @@ class Services(containers.DeclarativeContainer): """IoC container of business service providers.""" users = providers.Factory(example.services.Users) - users.add_kwargs(db=Platform.database) + users.add_kwargs(logger=Platform.logger, + db=Platform.database) auth = providers.Factory(example.services.Auth) - auth.add_kwargs(db=Platform.database, + auth.add_kwargs(logger=Platform.logger, + db=Platform.database, token_ttl=3600) photos = providers.Factory(example.services.Photos) - photos.add_kwargs(db=Platform.database, + photos.add_kwargs(logger=Platform.logger, + db=Platform.database, s3=Platform.s3) diff --git a/examples/miniapps/services/example/main.py b/examples/miniapps/services/example/main.py index 49de9e0f..d3399ff7 100644 --- a/examples/miniapps/services/example/main.py +++ b/examples/miniapps/services/example/main.py @@ -1,8 +1,8 @@ """Example main module.""" -def main(users_service, auth_service, photos_service): +def main(uid, password, photo, users_service, auth_service, photos_service): """Example main function.""" - user = users_service.get_user('user') - auth_service.authenticate(user, 'secret') - photos_service.upload_photo(user['id'], 'photo.jpg') + user = users_service.get_user_by_id(uid) + auth_service.authenticate(user, password) + photos_service.upload_photo(user['uid'], photo) diff --git a/examples/miniapps/services/example/services.py b/examples/miniapps/services/example/services.py index 615a80d5..171f2506 100644 --- a/examples/miniapps/services/example/services.py +++ b/examples/miniapps/services/example/services.py @@ -4,37 +4,44 @@ class Users(object): """Users service.""" - def __init__(self, db): + def __init__(self, logger, db): """Initializer.""" + self.logger = logger self.db = db - def get_user(self, login): + def get_user_by_id(self, uid): """Return user's information by login.""" - return {'id': 1, - 'login': login, + self.logger.debug('User %s has been found in database', uid) + return {'uid': uid, 'password_hash': 'secret_hash'} class Auth(object): """Auth service.""" - def __init__(self, db, token_ttl): + def __init__(self, logger, db, token_ttl): """Initializer.""" + self.logger = logger self.db = db self.token_ttl = token_ttl def authenticate(self, user, password): """Authenticate user.""" assert user['password_hash'] == '_'.join((password, 'hash')) + self.logger.debug('User %s has been successfully authenticated', + user['uid']) class Photos(object): """Photos service.""" - def __init__(self, db, s3): + def __init__(self, logger, db, s3): """Initializer.""" + self.logger = logger self.db = db self.s3 = s3 - def upload_photo(self, user_id, photo_path): + def upload_photo(self, uid, photo_path): """Upload user photo.""" + self.logger.debug('Photo %s has been successfully uploaded by user %s', + photo_path, uid) diff --git a/examples/miniapps/services/run.py b/examples/miniapps/services/run.py index 5c854202..ba97c5cd 100644 --- a/examples/miniapps/services/run.py +++ b/examples/miniapps/services/run.py @@ -1,19 +1,46 @@ -"""Run example application.""" +"""Run dependency injection example application. -import containers +Instructions for running: + + python run.py 1 secret photo.jpg +""" + +import sys +import logging + +from containers import Platform, Application if __name__ == '__main__': - containers.Application.main() + # Configure platform logger: + Platform.logger().addHandler(logging.StreamHandler(sys.stdout)) + + # Run application: + Application.main(uid=sys.argv[1], + password=sys.argv[2], + photo=sys.argv[3]) # Previous call is an equivalent of next operations: # + # logger = logging.Logger(name='example') # database = sqlite3.connect(':memory:') # s3 = boto.s3.connection.S3Connection(aws_access_key_id='KEY', # aws_secret_access_key='SECRET') # - # example.main.main(users_service=example.services.Users(db=database), - # auth_service=example.services.Auth(db=database, + # example.main.main(uid=sys.argv[1], + # password=sys.argv[2], + # photo=sys.argv[3], + # users_service=example.services.Users(logger=logger, + # db=database), + # auth_service=example.services.Auth(logger=logger, + # db=database, # token_ttl=3600), - # photos_service=example.services.Photos(db=database, + # photos_service=example.services.Photos(logger=logger, + # db=database, # s3=s3)) + # + # Output: + # + # User 1 has been found in database + # User 1 has been successfully authenticated + # Photo photo.jpg has been successfully uploaded by user 1