Skip to main content

Easy dependency injection without wiring

Project description

Injection

PyPI - Version GitHub License

PyPI - Python Version

Latest Release Documentation Status

Tests And Linting codecov

Ruff Hatch project pdm-managed MyPy Strict

Maintainability GitHub Downloads (all assets, all releases)

PyPI - Month Downloads GitHub Repo stars


Easy dependency injection for all, works with Python 3.8-3.12. Main features and advantages:

  • support Python 3.8-3.12;
  • works with FastAPI, Litestar, Flask and Django REST Framework;
  • support dependency injection via Annotated in FastAPI;
  • the code is fully typed and checked with mypy;
  • no third-party dependencies;
  • no wiring;
  • the life cycle of objects (scope) is implemented by providers;
  • overriding dependencies for testing;
  • 100% code coverage;
  • good documentation;
  • intuitive and almost identical api with dependency-injector, which will allow you to easily migrate to injection (see migration from dependency injector);

Installation

pip install deps-injection

Compatibility between web frameworks and injection features

Framework Dependency injection with or without @inject Dependency injection with @autoinject (experimental) Overriding providers
FastAPI
Flask
Django REST Framework
Litestar

Using example with FastAPI

from typing import Annotated
from unittest.mock import Mock

import pytest
from fastapi import APIRouter, Depends, FastAPI
from fastapi.testclient import TestClient
from injection import DeclarativeContainer, Provide, inject, providers


class Settings:
    redis_url: str = "redis://localhost"
    redis_port: int = 6379


class Redis:
    def __init__(self, *, url: str, port: int):
        self.uri = url + ":" + str(port)
        self.url = url
        self.port = port

    def get(self, key):
        return key


class Container(DeclarativeContainer):
    settings = providers.Singleton(Settings)
    redis = providers.Singleton(
        Redis,
        port=settings.provided.redis_port,
        url=settings.provided.redis_url,
    )


router = APIRouter(prefix="/api")


def create_app():
    app = FastAPI()
    app.include_router(router)
    return app


RedisDependency = Annotated[Redis, Depends(Provide[Container.redis])]


@router.get("/values")
@inject
def some_get_endpoint_handler(redis: RedisDependency):
    value = redis.get(299)
    return {"detail": value}

Testing example with overriding providers for above FastAPI example

@pytest.fixture(scope="session")
def app():
    return create_app()


@pytest.fixture(scope="session")
def container():
    return Container.instance()


@pytest.fixture()
def test_client(app):
    client = TestClient(app)
    return client


def test_override_providers(test_client, container):
    def mock_get_method(_):
        return "mock_get_method"

    mock_redis = Mock()
    mock_redis.get = mock_get_method

    providers_to_override = {"redis": mock_redis}

    with container.override_providers(providers_to_override):
        response = test_client.get("/api/values")

    assert response.status_code == 200
    body = response.json()
    assert body["detail"] == "mock_get_method"

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

deps_injection-1.5.1.tar.gz (11.1 kB view details)

Uploaded Source

Built Distribution

deps_injection-1.5.1-py3-none-any.whl (14.4 kB view details)

Uploaded Python 3

File details

Details for the file deps_injection-1.5.1.tar.gz.

File metadata

  • Download URL: deps_injection-1.5.1.tar.gz
  • Upload date:
  • Size: 11.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for deps_injection-1.5.1.tar.gz
Algorithm Hash digest
SHA256 16c93dec0ded2fc507af7fdd3f62dd681db48aa9881c9393fcbfc083a501a484
MD5 8093799253e6e79e34d8d8ee3d8ebadb
BLAKE2b-256 28a89f0460f3dd6b242300630ddece8162256503b2509d866b4dc02eaa237524

See more details on using hashes here.

Provenance

The following attestation bundles were made for deps_injection-1.5.1.tar.gz:

Publisher: publish.yml on nightblure/injection

Attestations:

File details

Details for the file deps_injection-1.5.1-py3-none-any.whl.

File metadata

File hashes

Hashes for deps_injection-1.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f53cb76f0894be8062ed4197513072c9ed4f3750a6763267b107b71283698f41
MD5 1efcf1a34acca60aaa20665af8e69302
BLAKE2b-256 cad472dda914878be3597dd4277e355b5c9f1a7581b8c57a885d9a65077b93d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for deps_injection-1.5.1-py3-none-any.whl:

Publisher: publish.yml on nightblure/injection

Attestations:

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page