Metadata-Version: 2.4
Name: spryx-di
Version: 3.0.0
Summary: Lightweight type-based dependency injection for Python modular monoliths
Author-email: Spryx <dev@spryx.ai>
License: MIT
License-File: LICENSE
Keywords: container,dependency-injection,di,fastapi,modular-monolith
Classifier: Development Status :: 3 - Alpha
Classifier: Framework :: FastAPI
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Software Development :: Libraries
Classifier: Typing :: Typed
Requires-Python: >=3.11
Provides-Extra: celery
Requires-Dist: celery>=5.0; extra == 'celery'
Provides-Extra: cli
Requires-Dist: typer>=0.9; extra == 'cli'
Provides-Extra: dev
Requires-Dist: build==1.2.2; extra == 'dev'
Requires-Dist: fastapi==0.135.3; extra == 'dev'
Requires-Dist: httpx==0.28.1; extra == 'dev'
Requires-Dist: pre-commit==4.5.1; extra == 'dev'
Requires-Dist: pydantic-settings==2.13.1; extra == 'dev'
Requires-Dist: pytest-asyncio==1.3.0; extra == 'dev'
Requires-Dist: pytest-cov==6.2.1; extra == 'dev'
Requires-Dist: pytest==9.0.2; extra == 'dev'
Requires-Dist: python-semantic-release==10.5.3; extra == 'dev'
Requires-Dist: ruff==0.15.9; extra == 'dev'
Requires-Dist: ty==0.0.28; extra == 'dev'
Requires-Dist: typer>=0.9; extra == 'dev'
Provides-Extra: docs
Requires-Dist: zensical; extra == 'docs'
Provides-Extra: fastapi
Requires-Dist: fastapi==0.135.3; extra == 'fastapi'
Provides-Extra: settings
Requires-Dist: pydantic-settings==2.13.1; extra == 'settings'
Description-Content-Type: text/markdown

# spryx-di

[![CI](https://github.com/spryx-ai/spryx-di/actions/workflows/ci.yml/badge.svg)](https://github.com/spryx-ai/spryx-di/actions/workflows/ci.yml)
[![PyPI](https://img.shields.io/pypi/v/spryx-di)](https://pypi.org/project/spryx-di/)
[![Python](https://img.shields.io/pypi/pyversions/spryx-di)](https://pypi.org/project/spryx-di/)
[![License](https://img.shields.io/github/license/spryx-ai/spryx-di)](https://github.com/spryx-ai/spryx-di/blob/main/LICENSE)

Lightweight dependency injection for Python modular monoliths.

- **NestJS-inspired modules** with providers, exports, and imports
- **Type-based auto-wiring** via `__init__` type hints
- **Module boundary enforcement** at boot time
- **Zero runtime dependencies**
- **Zero intrusion** in domain code

## Install

```bash
pip install spryx-di
```

## Quick Example

```python
from spryx_di import ClassProvider, Module, ApplicationContext

identity_module = Module(
    name="identity",
    providers=[
        ClassProvider(provide=UserRepository, use_class=PgUserRepository),
        ClassProvider(provide=UserReader, use_class=PgUserReader),
    ],
    exports=[UserReader],
)

orders_module = Module(
    name="orders",
    providers=[
        ClassProvider(provide=OrderRepository, use_class=PgOrderRepository),
    ],
    imports=[identity_module],
)

ctx = ApplicationContext(modules=[identity_module, orders_module])
handler = ctx.resolve(CreateOrderHandler)  # auto-wired from type hints
```

Handlers declare dependencies via `__init__` — no decorators, no DI imports:

```python
class CreateOrderHandler:
    def __init__(self, repo: OrderRepository, reader: UserReader) -> None:
        self._repo = repo
        self._reader = reader
```

## Features

| Feature | Description |
|---|---|
| `ClassProvider`, `FactoryProvider`, `ValueProvider`, `ExistingProvider` | Typed providers — `use_class`, `use_factory`, `use_value`, `use_existing` with `Scope.SINGLETON` (default) or `TRANSIENT` |
| `Module` | Declarative `providers`, `exports`, `imports`, `on_destroy` |
| `ApplicationContext` | Composes modules with boundary enforcement and boot-time validation |
| `forward_ref()` | Circular module dependencies without Python import errors |
| Lifecycle | `on_destroy` per module, auto-close managed instances, `await ctx.shutdown()` |
| FastAPI | `Inject()`, `ScopedInject()`, `configure()`, request scope middleware |
| Testing | `override()` context manager, `Container` with fakes |

## Documentation

[https://spryx-ai.github.io/spryx-di](https://spryx-ai.github.io/spryx-di)

## Development

```bash
make install   # deps + pre-commit hooks
make check     # lint + typecheck + tests
make docs      # serve docs locally
```

## License

MIT
