diff --git a/README.rst b/README.rst index 9a58a85c..f76f864e 100644 --- a/README.rst +++ b/README.rst @@ -62,169 +62,6 @@ Documentation Examples -------- -.. code-block:: python - - """Pythonic way for Dependency Injection.""" - - from dependency_injector import providers - from dependency_injector import injections - - - @providers.DelegatedCallable - def get_user_info(user_id): - """Return user info.""" - raise NotImplementedError() - - - @providers.Factory - @injections.inject(get_user_info=get_user_info) - class AuthComponent(object): - """Some authentication component.""" - - def __init__(self, get_user_info): - """Initializer.""" - self.get_user_info = get_user_info - - def authenticate_user(self, token): - """Authenticate user by token.""" - user_info = self.get_user_info(user_id=token + '1') - return user_info - - - print AuthComponent - print get_user_info - - - @providers.override(get_user_info) - @providers.DelegatedCallable - def get_user_info(user_id): - """Return user info.""" - return {'user_id': user_id} - - - print AuthComponent().authenticate_user(token='abc') - # {'user_id': 'abc1'} - -Example of catalog usage: - -.. code-block:: python - - """Concept example of `Dependency Injector`.""" - - import sqlite3 - - from dependency_injector import catalogs - from dependency_injector import providers - from dependency_injector import injections - - - class UsersService(object): - """Users service, that has dependency on database.""" - - def __init__(self, db): - """Initializer.""" - self.db = db - - - class AuthService(object): - """Auth service, that has dependencies on users service and database.""" - - def __init__(self, db, users_service): - """Initializer.""" - self.db = db - self.users_service = users_service - - - class Services(catalogs.DeclarativeCatalog): - """Catalog of service providers.""" - - @providers.Singleton - def database(): - """Provide database connection. - - :rtype: providers.Provider -> sqlite3.Connection - """ - return sqlite3.connect(':memory:') - - @providers.Factory - @injections.inject(db=database) - def users(**kwargs): - """Provide users service. - - :rtype: providers.Provider -> UsersService - """ - return UsersService(**kwargs) - - @providers.Factory - @injections.inject(db=database) - @injections.inject(users_service=users) - def auth(**kwargs): - """Provide users service. - - :rtype: providers.Provider -> AuthService - """ - return AuthService(**kwargs) - - - # Retrieving catalog providers: - users_service = Services.users() - auth_service = Services.auth() - - # Making some asserts: - assert users_service.db is auth_service.db is Services.database() - assert isinstance(auth_service.users_service, UsersService) - assert users_service is not Services.users() - assert auth_service is not Services.auth() - - - # Making some "inline" injections: - @injections.inject(users_service=Services.users) - @injections.inject(auth_service=Services.auth) - @injections.inject(database=Services.database) - def example(users_service, auth_service, database): - """Example callback.""" - assert users_service.db is auth_service.db - assert auth_service.db is database - assert database is Services.database() - - - # Making a call of decorated callback: - example() - - - # Overriding auth service provider and making some asserts: - class ExtendedAuthService(AuthService): - """Extended version of auth service.""" - - def __init__(self, db, users_service, ttl): - """Initializer.""" - self.ttl = ttl - super(ExtendedAuthService, self).__init__(db=db, - users_service=users_service) - - - class OverriddenServices(Services): - """Catalog of service providers.""" - - @providers.override(Services.auth) - @providers.Factory - @injections.inject(db=Services.database) - @injections.inject(users_service=Services.users) - @injections.inject(ttl=3600) - def auth(**kwargs): - """Provide users service. - - :rtype: providers.Provider -> AuthService - """ - return ExtendedAuthService(**kwargs) - - - auth_service = Services.auth() - - assert isinstance(auth_service, ExtendedAuthService) - -One more example with catalog: - .. code-block:: python """Pythonic way for Dependency Injection (example with Catalog).""" @@ -316,6 +153,51 @@ One more example with catalog: assert isinstance(auth_service, ExtendedAuthService) +Authentication system example: + +.. code-block:: python + + """Pythonic way for Dependency Injection.""" + + from dependency_injector import providers + from dependency_injector import injections + + + @providers.DelegatedCallable + def get_user_info(user_id): + """Return user info.""" + raise NotImplementedError() + + + @providers.Factory + @injections.inject(get_user_info=get_user_info) + class AuthComponent(object): + """Some authentication component.""" + + def __init__(self, get_user_info): + """Initializer.""" + self.get_user_info = get_user_info + + def authenticate_user(self, token): + """Authenticate user by token.""" + user_info = self.get_user_info(user_id=token + '1') + return user_info + + + print AuthComponent + print get_user_info + + + @providers.override(get_user_info) + @providers.DelegatedCallable + def get_user_info(user_id): + """Return user info.""" + return {'user_id': user_id} + + + print AuthComponent().authenticate_user(token='abc') + # {'user_id': 'abc1'} + You can get more *Dependency Injector* examples in ``/examples`` directory on GitHub: diff --git a/dependency_injector/__init__.py b/dependency_injector/__init__.py index 3bfddd14..607403f3 100644 --- a/dependency_injector/__init__.py +++ b/dependency_injector/__init__.py @@ -51,7 +51,7 @@ from .errors import UndefinedProviderError from . import catalogs catalog = catalogs -VERSION = '1.14.10' +VERSION = '1.14.11' """Version number that follows semantic versioning. :type: str diff --git a/docs/main/changelog.rst b/docs/main/changelog.rst index 7951e57c..f812348a 100644 --- a/docs/main/changelog.rst +++ b/docs/main/changelog.rst @@ -11,6 +11,10 @@ Development version ------------------- - No features. +1.14.11 +------- +- Update README. + 1.14.10 ------- - Add "catalog-providing-callbacks" example and several tests for it.