pozalabs-dependency-injector


Namepozalabs-dependency-injector JSON
Version 4.43.0 PyPI version JSON
download
home_pageNone
SummaryNone
upload_time2024-07-26 09:29:17
maintainerNone
docs_urlNone
authorpozalabs
requires_python<4.0,>=3.11
licenseBSD New
keywords dependency injection di inversion of control ioc factory singleton design patterns flask
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            .. figure:: https://raw.githubusercontent.com/wiki/ets-labs/python-dependency-injector/img/logo.svg
   :target: https://github.com/ets-labs/python-dependency-injector

| 

.. image:: https://img.shields.io/pypi/v/dependency_injector.svg
   :target: https://pypi.org/project/dependency-injector/
   :alt: Latest Version
   
.. image:: https://img.shields.io/pypi/l/dependency_injector.svg
   :target: https://pypi.org/project/dependency-injector/
   :alt: License

.. image:: https://img.shields.io/pypi/pyversions/dependency_injector.svg
   :target: https://pypi.org/project/dependency-injector/
   :alt: Supported Python versions
   
.. image:: https://img.shields.io/pypi/implementation/dependency_injector.svg
   :target: https://pypi.org/project/dependency-injector/
   :alt: Supported Python implementations

.. image:: https://pepy.tech/badge/dependency-injector
   :target: https://pepy.tech/project/dependency-injector
   :alt: Downloads

.. image:: https://pepy.tech/badge/dependency-injector/month
   :target: https://pepy.tech/project/dependency-injector
   :alt: Downloads

.. image:: https://pepy.tech/badge/dependency-injector/week
   :target: https://pepy.tech/project/dependency-injector
   :alt: Downloads

.. image:: https://img.shields.io/pypi/wheel/dependency-injector.svg
   :target: https://pypi.org/project/dependency-injector/
   :alt: Wheel

.. image:: https://img.shields.io/github/actions/workflow/status/ets-labs/python-dependency-injector/tests-and-linters.yml?branch=master
   :target: https://github.com/ets-labs/python-dependency-injector/actions
   :alt: Build Status

.. image:: https://coveralls.io/repos/github/ets-labs/python-dependency-injector/badge.svg?branch=master
   :target: https://coveralls.io/github/ets-labs/python-dependency-injector?branch=master
   :alt: Coverage Status

What is ``Dependency Injector``?
================================

``Dependency Injector`` is a dependency injection framework for Python.

It helps implement the dependency injection principle.

Key features of the ``Dependency Injector``:

- **Providers**. Provides ``Factory``, ``Singleton``, ``Callable``, ``Coroutine``, ``Object``,
  ``List``, ``Dict``, ``Configuration``, ``Resource``, ``Dependency``, and ``Selector`` providers
  that help assemble your objects.
  See `Providers <https://python-dependency-injector.ets-labs.org/providers/index.html>`_.
- **Overriding**. Can override any provider by another provider on the fly. This helps in testing
  and configuring dev/stage environment to replace API clients with stubs etc. See
  `Provider overriding <https://python-dependency-injector.ets-labs.org/providers/overriding.html>`_.
- **Configuration**. Reads configuration from ``yaml``, ``ini``, and ``json`` files, ``pydantic`` settings,
  environment variables, and dictionaries.
  See `Configuration provider <https://python-dependency-injector.ets-labs.org/providers/configuration.html>`_.
- **Resources**. Helps with initialization and configuring of logging, event loop, thread
  or process pool, etc. Can be used for per-function execution scope in tandem with wiring.
  See `Resource provider <https://python-dependency-injector.ets-labs.org/providers/resource.html>`_.
- **Containers**. Provides declarative and dynamic containers.
  See `Containers <https://python-dependency-injector.ets-labs.org/containers/index.html>`_.
- **Wiring**. Injects dependencies into functions and methods. Helps integrate with
  other frameworks: Django, Flask, Aiohttp, Sanic, FastAPI, etc.
  See `Wiring <https://python-dependency-injector.ets-labs.org/wiring.html>`_.
- **Asynchronous**. Supports asynchronous injections.
  See `Asynchronous injections <https://python-dependency-injector.ets-labs.org/providers/async.html>`_.
- **Typing**. Provides typing stubs, ``mypy``-friendly.
  See `Typing and mypy <https://python-dependency-injector.ets-labs.org/providers/typing_mypy.html>`_.
- **Performance**. Fast. Written in ``Cython``.
- **Maturity**. Mature and production-ready. Well-tested, documented, and supported.

.. code-block:: python

   from dependency_injector import containers, providers
   from dependency_injector.wiring import Provide, inject


   class Container(containers.DeclarativeContainer):

       config = providers.Configuration()

       api_client = providers.Singleton(
           ApiClient,
           api_key=config.api_key,
           timeout=config.timeout,
       )

       service = providers.Factory(
           Service,
           api_client=api_client,
       )


   @inject
   def main(service: Service = Provide[Container.service]) -> None:
       ...


   if __name__ == "__main__":
       container = Container()
       container.config.api_key.from_env("API_KEY", required=True)
       container.config.timeout.from_env("TIMEOUT", as_=int, default=5)
       container.wire(modules=[__name__])

       main()  # <-- dependency is injected automatically

       with container.api_client.override(mock.Mock()):
           main()  # <-- overridden dependency is injected automatically

When you call the ``main()`` function the ``Service`` dependency is assembled and injected automatically.

When you do testing, you call the ``container.api_client.override()`` method to replace the real API
client with a mock. When you call ``main()``, the mock is injected.

You can override any provider with another provider.

It also helps you in a re-configuring project for different environments: replace an API client
with a stub on the dev or stage.

With the ``Dependency Injector``, object assembling is consolidated in a container. Dependency injections are defined explicitly.
This makes it easier to understand and change how an application works.

.. figure:: https://raw.githubusercontent.com/wiki/ets-labs/python-dependency-injector/img/di-readme.svg
   :target: https://github.com/ets-labs/python-dependency-injector

Visit the docs to know more about the
`Dependency injection and inversion of control in Python <https://python-dependency-injector.ets-labs.org/introduction/di_in_python.html>`_.

Installation
------------

The package is available on the `PyPi`_::

    pip install dependency-injector

Documentation
-------------

The documentation is available `here <https://python-dependency-injector.ets-labs.org/>`_.

Examples
--------

Choose one of the following:

- `Application example (single container) <https://python-dependency-injector.ets-labs.org/examples/application-single-container.html>`_
- `Application example (multiple containers) <https://python-dependency-injector.ets-labs.org/examples/application-multiple-containers.html>`_
- `Decoupled packages example (multiple containers) <https://python-dependency-injector.ets-labs.org/examples/decoupled-packages.html>`_
- `Boto3 example <https://python-dependency-injector.ets-labs.org/examples/boto3.html>`_
- `Django example <https://python-dependency-injector.ets-labs.org/examples/django.html>`_
- `Flask example <https://python-dependency-injector.ets-labs.org/examples/flask.html>`_
- `Aiohttp example <https://python-dependency-injector.ets-labs.org/examples/aiohttp.html>`_
- `Sanic example <https://python-dependency-injector.ets-labs.org/examples/sanic.html>`_
- `FastAPI example <https://python-dependency-injector.ets-labs.org/examples/fastapi.html>`_
- `FastAPI + Redis example <https://python-dependency-injector.ets-labs.org/examples/fastapi-redis.html>`_
- `FastAPI + SQLAlchemy example <https://python-dependency-injector.ets-labs.org/examples/fastapi-sqlalchemy.html>`_

Tutorials
---------

Choose one of the following:

- `Flask web application tutorial <https://python-dependency-injector.ets-labs.org/tutorials/flask.html>`_
- `Aiohttp REST API tutorial <https://python-dependency-injector.ets-labs.org/tutorials/aiohttp.html>`_
- `Asyncio monitoring daemon tutorial <https://python-dependency-injector.ets-labs.org/tutorials/asyncio-daemon.html>`_
- `CLI application tutorial <https://python-dependency-injector.ets-labs.org/tutorials/cli.html>`_

Concept
-------

The framework stands on the `PEP20 (The Zen of Python) <https://www.python.org/dev/peps/pep-0020/>`_ principle:

.. code-block:: bash

   Explicit is better than implicit

You need to specify how to assemble and where to inject the dependencies explicitly.

The power of the framework is in its simplicity.
``Dependency Injector`` is a simple tool for the powerful concept.

Frequently asked questions
--------------------------

What is dependency injection?
 - dependency injection is a principle that decreases coupling and increases cohesion

Why should I do the dependency injection?
 - your code becomes more flexible, testable, and clear 😎

How do I start applying the dependency injection?
 - you start writing the code following the dependency injection principle
 - you register all of your application components and their dependencies in the container
 - when you need a component, you specify where to inject it or get it from the container

What price do I pay and what do I get?
 - you need to explicitly specify the dependencies
 - it will be extra work in the beginning
 - it will payoff as project grows

Have a question?
 - Open a `Github Issue <https://github.com/ets-labs/python-dependency-injector/issues>`_

Found a bug?
 - Open a `Github Issue <https://github.com/ets-labs/python-dependency-injector/issues>`_

Want to help?
 - |star| Star the ``Dependency Injector`` on the `Github <https://github.com/ets-labs/python-dependency-injector/>`_
 - |new| Start a new project with the ``Dependency Injector``
 - |tell| Tell your friend about the ``Dependency Injector``

Want to contribute?
 - |fork| Fork the project
 - |pull| Open a pull request to the ``develop`` branch

.. _PyPi: https://pypi.org/project/dependency-injector/

.. |star| unicode:: U+2B50 U+FE0F .. star sign1
.. |new| unicode:: U+1F195 .. new sign
.. |tell| unicode:: U+1F4AC .. tell sign
.. |fork| unicode:: U+1F500 .. fork sign
.. |pull| unicode:: U+2B05 U+FE0F .. pull sign

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "pozalabs-dependency-injector",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.11",
    "maintainer_email": null,
    "keywords": "Dependency injection, DI, Inversion of Control, IoC, Factory, Singleton, Design patterns, Flask",
    "author": "pozalabs",
    "author_email": "contact@pozalabs.com",
    "download_url": "https://files.pythonhosted.org/packages/d3/48/666fcf1d8c8505e0cb259a1187a76eafdd0d11e1aed28a4c595b3463474e/pozalabs_dependency_injector-4.43.0.tar.gz",
    "platform": null,
    "description": ".. figure:: https://raw.githubusercontent.com/wiki/ets-labs/python-dependency-injector/img/logo.svg\n   :target: https://github.com/ets-labs/python-dependency-injector\n\n| \n\n.. image:: https://img.shields.io/pypi/v/dependency_injector.svg\n   :target: https://pypi.org/project/dependency-injector/\n   :alt: Latest Version\n   \n.. image:: https://img.shields.io/pypi/l/dependency_injector.svg\n   :target: https://pypi.org/project/dependency-injector/\n   :alt: License\n\n.. image:: https://img.shields.io/pypi/pyversions/dependency_injector.svg\n   :target: https://pypi.org/project/dependency-injector/\n   :alt: Supported Python versions\n   \n.. image:: https://img.shields.io/pypi/implementation/dependency_injector.svg\n   :target: https://pypi.org/project/dependency-injector/\n   :alt: Supported Python implementations\n\n.. image:: https://pepy.tech/badge/dependency-injector\n   :target: https://pepy.tech/project/dependency-injector\n   :alt: Downloads\n\n.. image:: https://pepy.tech/badge/dependency-injector/month\n   :target: https://pepy.tech/project/dependency-injector\n   :alt: Downloads\n\n.. image:: https://pepy.tech/badge/dependency-injector/week\n   :target: https://pepy.tech/project/dependency-injector\n   :alt: Downloads\n\n.. image:: https://img.shields.io/pypi/wheel/dependency-injector.svg\n   :target: https://pypi.org/project/dependency-injector/\n   :alt: Wheel\n\n.. image:: https://img.shields.io/github/actions/workflow/status/ets-labs/python-dependency-injector/tests-and-linters.yml?branch=master\n   :target: https://github.com/ets-labs/python-dependency-injector/actions\n   :alt: Build Status\n\n.. image:: https://coveralls.io/repos/github/ets-labs/python-dependency-injector/badge.svg?branch=master\n   :target: https://coveralls.io/github/ets-labs/python-dependency-injector?branch=master\n   :alt: Coverage Status\n\nWhat is ``Dependency Injector``?\n================================\n\n``Dependency Injector`` is a dependency injection framework for Python.\n\nIt helps implement the dependency injection principle.\n\nKey features of the ``Dependency Injector``:\n\n- **Providers**. Provides ``Factory``, ``Singleton``, ``Callable``, ``Coroutine``, ``Object``,\n  ``List``, ``Dict``, ``Configuration``, ``Resource``, ``Dependency``, and ``Selector`` providers\n  that help assemble your objects.\n  See `Providers <https://python-dependency-injector.ets-labs.org/providers/index.html>`_.\n- **Overriding**. Can override any provider by another provider on the fly. This helps in testing\n  and configuring dev/stage environment to replace API clients with stubs etc. See\n  `Provider overriding <https://python-dependency-injector.ets-labs.org/providers/overriding.html>`_.\n- **Configuration**. Reads configuration from ``yaml``, ``ini``, and ``json`` files, ``pydantic`` settings,\n  environment variables, and dictionaries.\n  See `Configuration provider <https://python-dependency-injector.ets-labs.org/providers/configuration.html>`_.\n- **Resources**. Helps with initialization and configuring of logging, event loop, thread\n  or process pool, etc. Can be used for per-function execution scope in tandem with wiring.\n  See `Resource provider <https://python-dependency-injector.ets-labs.org/providers/resource.html>`_.\n- **Containers**. Provides declarative and dynamic containers.\n  See `Containers <https://python-dependency-injector.ets-labs.org/containers/index.html>`_.\n- **Wiring**. Injects dependencies into functions and methods. Helps integrate with\n  other frameworks: Django, Flask, Aiohttp, Sanic, FastAPI, etc.\n  See `Wiring <https://python-dependency-injector.ets-labs.org/wiring.html>`_.\n- **Asynchronous**. Supports asynchronous injections.\n  See `Asynchronous injections <https://python-dependency-injector.ets-labs.org/providers/async.html>`_.\n- **Typing**. Provides typing stubs, ``mypy``-friendly.\n  See `Typing and mypy <https://python-dependency-injector.ets-labs.org/providers/typing_mypy.html>`_.\n- **Performance**. Fast. Written in ``Cython``.\n- **Maturity**. Mature and production-ready. Well-tested, documented, and supported.\n\n.. code-block:: python\n\n   from dependency_injector import containers, providers\n   from dependency_injector.wiring import Provide, inject\n\n\n   class Container(containers.DeclarativeContainer):\n\n       config = providers.Configuration()\n\n       api_client = providers.Singleton(\n           ApiClient,\n           api_key=config.api_key,\n           timeout=config.timeout,\n       )\n\n       service = providers.Factory(\n           Service,\n           api_client=api_client,\n       )\n\n\n   @inject\n   def main(service: Service = Provide[Container.service]) -> None:\n       ...\n\n\n   if __name__ == \"__main__\":\n       container = Container()\n       container.config.api_key.from_env(\"API_KEY\", required=True)\n       container.config.timeout.from_env(\"TIMEOUT\", as_=int, default=5)\n       container.wire(modules=[__name__])\n\n       main()  # <-- dependency is injected automatically\n\n       with container.api_client.override(mock.Mock()):\n           main()  # <-- overridden dependency is injected automatically\n\nWhen you call the ``main()`` function the ``Service`` dependency is assembled and injected automatically.\n\nWhen you do testing, you call the ``container.api_client.override()`` method to replace the real API\nclient with a mock. When you call ``main()``, the mock is injected.\n\nYou can override any provider with another provider.\n\nIt also helps you in a re-configuring project for different environments: replace an API client\nwith a stub on the dev or stage.\n\nWith the ``Dependency Injector``, object assembling is consolidated in a container. Dependency injections are defined explicitly.\nThis makes it easier to understand and change how an application works.\n\n.. figure:: https://raw.githubusercontent.com/wiki/ets-labs/python-dependency-injector/img/di-readme.svg\n   :target: https://github.com/ets-labs/python-dependency-injector\n\nVisit the docs to know more about the\n`Dependency injection and inversion of control in Python <https://python-dependency-injector.ets-labs.org/introduction/di_in_python.html>`_.\n\nInstallation\n------------\n\nThe package is available on the `PyPi`_::\n\n    pip install dependency-injector\n\nDocumentation\n-------------\n\nThe documentation is available `here <https://python-dependency-injector.ets-labs.org/>`_.\n\nExamples\n--------\n\nChoose one of the following:\n\n- `Application example (single container) <https://python-dependency-injector.ets-labs.org/examples/application-single-container.html>`_\n- `Application example (multiple containers) <https://python-dependency-injector.ets-labs.org/examples/application-multiple-containers.html>`_\n- `Decoupled packages example (multiple containers) <https://python-dependency-injector.ets-labs.org/examples/decoupled-packages.html>`_\n- `Boto3 example <https://python-dependency-injector.ets-labs.org/examples/boto3.html>`_\n- `Django example <https://python-dependency-injector.ets-labs.org/examples/django.html>`_\n- `Flask example <https://python-dependency-injector.ets-labs.org/examples/flask.html>`_\n- `Aiohttp example <https://python-dependency-injector.ets-labs.org/examples/aiohttp.html>`_\n- `Sanic example <https://python-dependency-injector.ets-labs.org/examples/sanic.html>`_\n- `FastAPI example <https://python-dependency-injector.ets-labs.org/examples/fastapi.html>`_\n- `FastAPI + Redis example <https://python-dependency-injector.ets-labs.org/examples/fastapi-redis.html>`_\n- `FastAPI + SQLAlchemy example <https://python-dependency-injector.ets-labs.org/examples/fastapi-sqlalchemy.html>`_\n\nTutorials\n---------\n\nChoose one of the following:\n\n- `Flask web application tutorial <https://python-dependency-injector.ets-labs.org/tutorials/flask.html>`_\n- `Aiohttp REST API tutorial <https://python-dependency-injector.ets-labs.org/tutorials/aiohttp.html>`_\n- `Asyncio monitoring daemon tutorial <https://python-dependency-injector.ets-labs.org/tutorials/asyncio-daemon.html>`_\n- `CLI application tutorial <https://python-dependency-injector.ets-labs.org/tutorials/cli.html>`_\n\nConcept\n-------\n\nThe framework stands on the `PEP20 (The Zen of Python) <https://www.python.org/dev/peps/pep-0020/>`_ principle:\n\n.. code-block:: bash\n\n   Explicit is better than implicit\n\nYou need to specify how to assemble and where to inject the dependencies explicitly.\n\nThe power of the framework is in its simplicity.\n``Dependency Injector`` is a simple tool for the powerful concept.\n\nFrequently asked questions\n--------------------------\n\nWhat is dependency injection?\n - dependency injection is a principle that decreases coupling and increases cohesion\n\nWhy should I do the dependency injection?\n - your code becomes more flexible, testable, and clear \ud83d\ude0e\n\nHow do I start applying the dependency injection?\n - you start writing the code following the dependency injection principle\n - you register all of your application components and their dependencies in the container\n - when you need a component, you specify where to inject it or get it from the container\n\nWhat price do I pay and what do I get?\n - you need to explicitly specify the dependencies\n - it will be extra work in the beginning\n - it will payoff as project grows\n\nHave a question?\n - Open a `Github Issue <https://github.com/ets-labs/python-dependency-injector/issues>`_\n\nFound a bug?\n - Open a `Github Issue <https://github.com/ets-labs/python-dependency-injector/issues>`_\n\nWant to help?\n - |star| Star the ``Dependency Injector`` on the `Github <https://github.com/ets-labs/python-dependency-injector/>`_\n - |new| Start a new project with the ``Dependency Injector``\n - |tell| Tell your friend about the ``Dependency Injector``\n\nWant to contribute?\n - |fork| Fork the project\n - |pull| Open a pull request to the ``develop`` branch\n\n.. _PyPi: https://pypi.org/project/dependency-injector/\n\n.. |star| unicode:: U+2B50 U+FE0F .. star sign1\n.. |new| unicode:: U+1F195 .. new sign\n.. |tell| unicode:: U+1F4AC .. tell sign\n.. |fork| unicode:: U+1F500 .. fork sign\n.. |pull| unicode:: U+2B05 U+FE0F .. pull sign\n",
    "bugtrack_url": null,
    "license": "BSD New",
    "summary": null,
    "version": "4.43.0",
    "project_urls": null,
    "split_keywords": [
        "dependency injection",
        " di",
        " inversion of control",
        " ioc",
        " factory",
        " singleton",
        " design patterns",
        " flask"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "87433ec1f1795d4075e4b6f01d613602f8b1f199d19ea440ad0ff28cdd7e7d36",
                "md5": "c0666bc5d7e6148cb091102445ca11f1",
                "sha256": "b0c07c5d85d70314b1f20d5304c09d3ebffca14163e46354ef60fc6584228d87"
            },
            "downloads": -1,
            "filename": "pozalabs_dependency_injector-4.43.0-cp311-cp311-manylinux_2_35_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c0666bc5d7e6148cb091102445ca11f1",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": "<4.0,>=3.11",
            "size": 5998311,
            "upload_time": "2024-07-26T09:29:15",
            "upload_time_iso_8601": "2024-07-26T09:29:15.132143Z",
            "url": "https://files.pythonhosted.org/packages/87/43/3ec1f1795d4075e4b6f01d613602f8b1f199d19ea440ad0ff28cdd7e7d36/pozalabs_dependency_injector-4.43.0-cp311-cp311-manylinux_2_35_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d348666fcf1d8c8505e0cb259a1187a76eafdd0d11e1aed28a4c595b3463474e",
                "md5": "0154d13585395566930b992c04b1a5b3",
                "sha256": "b30f53608ba24fdad353bd8a419ce8ade830e58e7da17bc9a3bf9f49fbb225cc"
            },
            "downloads": -1,
            "filename": "pozalabs_dependency_injector-4.43.0.tar.gz",
            "has_sig": false,
            "md5_digest": "0154d13585395566930b992c04b1a5b3",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.11",
            "size": 845014,
            "upload_time": "2024-07-26T09:29:17",
            "upload_time_iso_8601": "2024-07-26T09:29:17.357757Z",
            "url": "https://files.pythonhosted.org/packages/d3/48/666fcf1d8c8505e0cb259a1187a76eafdd0d11e1aed28a4c595b3463474e/pozalabs_dependency_injector-4.43.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-07-26 09:29:17",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "pozalabs-dependency-injector"
}
        
Elapsed time: 2.54811s