⚠️ This project is no longer maintained
This package will not receive future updates. It remains usable as-is.
The author's current dependency injection work is in semifun, which is a different library with a broader scope — not a drop-in replacement.
tiny-fastapi-di
Production-ready async dependency injection in ~220 lines. FastAPI-compatible patterns, minimal code, no hidden complexity.
Installation
pip install tiny-fastapi-di
# With Pydantic validation
pip install tiny-fastapi-di[pydantic]
Quick Start
from tiny_fastapi_di import Depends, empty_di_ctx
def get_db():
return "database_connection"
async def get_user(db: str = Depends(get_db)):
return f"User from {db}"
# One call handles context and cleanup
result = await empty_di_ctx.call_fn(get_user)
Why tiny-fastapi-di?
- Production-ready: ~220 lines of auditable code. No hidden complexity.
- Familiar API: Same
Depends()pattern as FastAPI - Framework-agnostic: Use in CLI tools, workers, pipelines, anywhere
- Correct by default: Cleanup runs automatically, circular dependencies detected
Core Features
from typing import Annotated
from tiny_fastapi_di import Depends, empty_di_ctx
# Basic dependency
async def endpoint(db = Depends(get_db)): ...
# Annotated syntax
async def endpoint(db: Annotated[DB, Depends(get_db)]): ...
# Infer callable from type
async def endpoint(db: Annotated[DB, Depends()]): ...
# Disable caching
async def endpoint(db = Depends(get_db, use_cache=False)): ...
# Yield dependencies with automatic cleanup
def get_db():
db = connect()
try:
yield db
finally:
db.close()
Value Injection
result = await empty_di_ctx.call_fn(my_endpoint, request_id=123, user_id=456)
Dependency Substitution (Testing)
result = await empty_di_ctx.call_fn(
my_endpoint,
fn_map={real_db: mock_db}
)
Pydantic Validation
from tiny_fastapi_di.pydantic import pydantic_di_ctx
async def endpoint(user: User): # User is a Pydantic model
return user
result = await pydantic_di_ctx.call_fn(endpoint, user={"name": "Alice", "age": 30})
Feature Comparison
| Feature | FastAPI | tiny-fastapi-di |
|---|---|---|
Depends() |
✅ | ✅ |
Depends(use_cache=False) |
✅ | ✅ |
Annotated[T, Depends()] |
✅ | ✅ |
yield dependencies |
✅ | ✅ |
| Async dependencies | ✅ | ✅ |
| Circular detection | ❌ | ✅ |
| Value injection | ❌ | ✅ |
| Dependency substitution | partial | ✅ |
| Optional validation | ❌ | ✅ |
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tiny_fastapi_di-0.2.2.tar.gz.
File metadata
- Download URL: tiny_fastapi_di-0.2.2.tar.gz
- Upload date:
- Size: 65.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3a67cfa1ce687021d482198366ab6a1b626be0dbdc312df94bcd56f24d2e1d5
|
|
| MD5 |
a4e1d1ab0e8e67a5b484941f998a8da1
|
|
| BLAKE2b-256 |
fa1fd0751c200dea330aa6001ef66d8a1484b7e3ddb4d180f4e597a5d9fd84ae
|
File details
Details for the file tiny_fastapi_di-0.2.2-py3-none-any.whl.
File metadata
- Download URL: tiny_fastapi_di-0.2.2-py3-none-any.whl
- Upload date:
- Size: 7.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
888b150c46863ae449e5bcc0695e079aa73a75d6a4894d56835fed8d6655d006
|
|
| MD5 |
e5fd8f56c310eb47b75c0d9b810e7eae
|
|
| BLAKE2b-256 |
05726b6dc79f913f2cefe234a6aed316c047de78c7f001d7a93e23416793ffa3
|