Easy dependency injection without wiring
Project description
Injection
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
inFastAPI
; - 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
Release history Release notifications | RSS feed
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)
Built Distribution
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 16c93dec0ded2fc507af7fdd3f62dd681db48aa9881c9393fcbfc083a501a484 |
|
MD5 | 8093799253e6e79e34d8d8ee3d8ebadb |
|
BLAKE2b-256 | 28a89f0460f3dd6b242300630ddece8162256503b2509d866b4dc02eaa237524 |
Provenance
The following attestation bundles were made for deps_injection-1.5.1.tar.gz
:
Publisher:
publish.yml
on nightblure/injection
-
Statement type:
https://in-toto.io/Statement/v1
- Predicate type:
https://docs.pypi.org/attestations/publish/v1
- Subject name:
deps_injection-1.5.1.tar.gz
- Subject digest:
16c93dec0ded2fc507af7fdd3f62dd681db48aa9881c9393fcbfc083a501a484
- Sigstore transparency entry: 149375819
- Sigstore integration time:
- Predicate type:
File details
Details for the file deps_injection-1.5.1-py3-none-any.whl
.
File metadata
- Download URL: deps_injection-1.5.1-py3-none-any.whl
- Upload date:
- Size: 14.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/5.1.1 CPython/3.12.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f53cb76f0894be8062ed4197513072c9ed4f3750a6763267b107b71283698f41 |
|
MD5 | 1efcf1a34acca60aaa20665af8e69302 |
|
BLAKE2b-256 | cad472dda914878be3597dd4277e355b5c9f1a7581b8c57a885d9a65077b93d2 |
Provenance
The following attestation bundles were made for deps_injection-1.5.1-py3-none-any.whl
:
Publisher:
publish.yml
on nightblure/injection
-
Statement type:
https://in-toto.io/Statement/v1
- Predicate type:
https://docs.pypi.org/attestations/publish/v1
- Subject name:
deps_injection-1.5.1-py3-none-any.whl
- Subject digest:
f53cb76f0894be8062ed4197513072c9ed4f3750a6763267b107b71283698f41
- Sigstore transparency entry: 149375820
- Sigstore integration time:
- Predicate type: