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;
  • support async injections;
  • 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.6.0.tar.gz (11.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

deps_injection-1.6.0-py3-none-any.whl (15.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: deps_injection-1.6.0.tar.gz
  • Upload date:
  • Size: 11.7 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.6.0.tar.gz
Algorithm Hash digest
SHA256 26a93ea3955b31cee570aab0b63ed9aac08ab527677f8e5f44763e87252e1b99
MD5 90e7d5af96022f21c7de48a357fbf41e
BLAKE2b-256 5ded07f2cd147cb630c8361ad7d9478b7cf0941e4f49afbd6415d3f7d38e738d

See more details on using hashes here.

Provenance

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

Publisher: publish.yml on nightblure/injection

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: deps_injection-1.6.0-py3-none-any.whl
  • Upload date:
  • Size: 15.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for deps_injection-1.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 52e2f7797cfe7dd0777d9e001dd5e1eb5dc791bdb0c6764596132f653e059c7a
MD5 77da608c5fe748b3337f0e622a0ee5f8
BLAKE2b-256 0beca7916eb73c44f86c9c2ca3e6a3348dfefef483c2d1094d6c95d61d9b0ef0

See more details on using hashes here.

Provenance

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

Publisher: publish.yml on nightblure/injection

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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