From 6fac06fd9165a3bfc7766972abe789244211a49b Mon Sep 17 00:00:00 2001 From: Roman Mogylatov Date: Tue, 1 Sep 2020 21:16:54 -0400 Subject: [PATCH] Edit Dependency provider docs --- docs/images/providers/dependency.png | Bin 42660 -> 0 bytes docs/main/changelog.rst | 2 +- docs/providers/dependency.rst | 44 +++--------- examples/providers/dependency.py | 101 +++++++++++---------------- 4 files changed, 51 insertions(+), 96 deletions(-) delete mode 100644 docs/images/providers/dependency.png diff --git a/docs/images/providers/dependency.png b/docs/images/providers/dependency.png deleted file mode 100644 index dfd2f149874d8c5d3e391c4b6f52c6f7f8efa494..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42660 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 P?+>Moxk9~kE9k!frZ*Ty diff --git a/docs/main/changelog.rst b/docs/main/changelog.rst index 134b6e24..83459780 100644 --- a/docs/main/changelog.rst +++ b/docs/main/changelog.rst @@ -10,7 +10,7 @@ follows `Semantic versioning`_ Development version ------------------- - Update documentation and rework examples for: ``Singleton``, ``Callable``, ``Coroutine``, - ``Object``, ``List``, ``Configuration``, ``Selector`` providers. + ``Object``, ``List``, ``Configuration``, ``Selector``, and ``Dependency`` providers. - Fix mypy stub of the ``DeclarativeContainer`` to specify the ``__init__`` interface. 3.34.0 diff --git a/docs/providers/dependency.rst b/docs/providers/dependency.rst index 4bd9bf2f..9ce3977b 100644 --- a/docs/providers/dependency.rst +++ b/docs/providers/dependency.rst @@ -1,43 +1,21 @@ -Dependency providers --------------------- +Dependency provider +------------------- .. currentmodule:: dependency_injector.providers -:py:class:`Dependency` provider can be useful for development of -self-sufficient libraries / modules / applications that have required external -dependencies. +:py:class:`Dependency` provider is a placeholder for the dependency of the specified type. -For example, you have created self-sufficient library / module / application, -that has dependency on *database connection*. +The first argument of the ``Dependency`` provider specifies a type of the dependency. It is +called ``instance_of``. ``Dependency`` provider controls the type of the returned object to be an +instance of the ``instance_of`` type. -Second step you want to do is to make this software component to be easy -reusable by wide amount of developers and to be easily integrated into many -applications. - -It may be good idea, to move all external dependencies (like -*database connection*) to the top level and make them to be injected on your -software component's initialization. It will make third party developers feel -themselves free about integration of your component in their applications, -because they would be able to find right place / right way for doing this -in their application's architectures. - -At the same time, you can be sure, that your external dependency will be -satisfied with appropriate instance. - -Example: - -.. note:: - - Class ``UsersService`` is a part of some library. ``UsersService`` has - dependency on database connection, which can be satisfied with any - DBAPI 2.0 database connection. Being a self-sufficient library, - ``UsersService`` doesn't hardcode any kind of database management logic. - Instead of this, ``UsersService`` has external dependency, that has to - be satisfied by client's code, out of library's scope. - -.. image:: /images/providers/dependency.png +The ``Dependency`` provider must be overridden before usage. It can be overridden by any type of +the provider. The only rule is that overriding provider must return an instance of ``instance_of`` +dependency type. .. literalinclude:: ../../examples/providers/dependency.py :language: python + :lines: 3- + :emphasize-lines: 26 .. disqus:: diff --git a/examples/providers/dependency.py b/examples/providers/dependency.py index a96aa58d..a1114cba 100644 --- a/examples/providers/dependency.py +++ b/examples/providers/dependency.py @@ -1,73 +1,50 @@ -"""`Dependency` providers example.""" +"""`Dependency` provider example.""" -import sqlite3 -import contextlib +import abc +import dataclasses -import dependency_injector.providers as providers +from dependency_injector import containers, providers, errors -class UsersService: - """Example class UsersService. - - UsersService has dependency on DBAPI 2.0 database connection. - """ - - def __init__(self, database): - """Initialize instance. - - :param database: Database connection. - :type database: sqlite3.dbapi2.Connection - """ - self.database = database - self.database.row_factory = sqlite3.dbapi2.Row - - def init_database(self): - """Initialize database, if it has not been initialized yet.""" - with contextlib.closing(self.database.cursor()) as cursor: - cursor.execute(""" - CREATE TABLE IF NOT EXISTS users( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name VARCHAR(32) - ) - """) - - def create(self, name): - """Create user with provided name and return his id.""" - with contextlib.closing(self.database.cursor()) as cursor: - cursor.execute('INSERT INTO users(name) VALUES (?)', (name,)) - return cursor.lastrowid - - def get_by_id(self, id): - """Return user info by user id.""" - with contextlib.closing(self.database.cursor()) as cursor: - cursor.execute('SELECT id, name FROM users WHERE id=?', (id,)) - return cursor.fetchone() +class DbAdapter(metaclass=abc.ABCMeta): + ... -# Database and UsersService providers: -database = providers.Dependency(instance_of=sqlite3.dbapi2.Connection) -users_service_factory = providers.Factory(UsersService, - database=database) +class SqliteDbAdapter(DbAdapter): + ... -# Out of library's scope. -# -# Setting database provider: -database.provided_by(providers.Singleton(sqlite3.dbapi2.Connection, - database=':memory:', - timeout=30, - detect_types=True, - isolation_level='EXCLUSIVE')) -# Creating UsersService instance: -users_service = users_service_factory() +class PostgresDbAdapter(DbAdapter): + ... -# Initializing UsersService database: -users_service.init_database() -# Creating test user and retrieving full information about him: -test_user_id = users_service.create(name='test_user') -test_user = users_service.get_by_id(test_user_id) +@dataclasses.dataclass +class UserService: + database: DbAdapter -# Making some asserts: -assert test_user['id'] == 1 -assert test_user['name'] == 'test_user' + +class Container(containers.DeclarativeContainer): + + database = providers.Dependency(instance_of=DbAdapter) + + user_service = providers.Factory( + UserService, + database=database, + ) + + +if __name__ == '__main__': + container1 = Container(database=providers.Singleton(SqliteDbAdapter)) + container2 = Container(database=providers.Singleton(PostgresDbAdapter)) + + assert isinstance(container1.user_service().database, SqliteDbAdapter) + assert isinstance(container2.user_service().database, PostgresDbAdapter) + + container3 = Container(database=providers.Singleton(object)) + try: + container3.user_service() + except errors.Error as exception: + print(exception) + # The output is: + # is not an + # instance of