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 @inject Overriding providers Dependency injection with @autoinject
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.3.tar.gz (10.9 kB view details)

Uploaded Source

Built Distribution

deps_injection-1.5.3-py3-none-any.whl (14.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: deps_injection-1.5.3.tar.gz
  • Upload date:
  • Size: 10.9 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.3.tar.gz
Algorithm Hash digest
SHA256 2c38caa3685c771a7202fa70028c82f8f1f4b813b0eae1f33c15ed07ab6b5f84
MD5 7d456153e1b7bdeaecf2e89cf741ceb9
BLAKE2b-256 785b09fa3ce2171540305701bfc9b808869597a2d57b2c36c6bb387857b37675

See more details on using hashes here.

Provenance

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

Publisher: publish.yml on nightblure/injection

Attestations:

File details

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

File metadata

File hashes

Hashes for deps_injection-1.5.3-py3-none-any.whl
Algorithm Hash digest
SHA256 1df719e6b55c6889bdaa3cce239d667687cf65fbf59c61e4a3bec4eadda148ed
MD5 2565cdd220fb48f10fb1892c98bffe5b
BLAKE2b-256 78c827e54785b48a0dbebbf83bd01dda8e0802861d3049c10e4ffdb690e31de0

See more details on using hashes here.

Provenance

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