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, 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 @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.0.tar.gz (11.1 kB view details)

Uploaded Source

Built Distribution

deps_injection-1.5.0-py3-none-any.whl (14.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: deps_injection-1.5.0.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.0.tar.gz
Algorithm Hash digest
SHA256 7cc4e9dd0e10c26abf842e346cf073ebd891020dd3775ad45250b627ea1dc06c
MD5 320031ddb1112f3c3217250ce41e20de
BLAKE2b-256 f675f30816dd99dd09f8158e4d8583ce2fffe46fb3097eb6604a20597546919f

See more details on using hashes here.

Provenance

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

Publisher: publish.yml on nightblure/injection

Attestations:

File details

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

File metadata

File hashes

Hashes for deps_injection-1.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 396a9325ecf12577e8e095f81cd4aad573d26ec161179f8e54243e621c9263a8
MD5 636c1f3d82d2ce67ddd17e46aa679d2d
BLAKE2b-256 71d1c1a16307aa608b90f4d5b9c65da10c767722a0e3a8bd4473ab3d481bd9ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for deps_injection-1.5.0-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