A Python library for dependency orchestration and “demand/supply” resolution (function DI).
Inspired by advanced dependency-injection/inversion control, it lets you register “supplier” functions by key/type, and lets any supplier demand values from others—allowing composition, overrides, and dependency graphs.
- Register “suppliers” (functions) for different types/keys
- Compose suppliers & override them dynamically
- Pass context (scope) through demands
- Supports both, async and sync suppliers
- Auto-manages dependency graph and supplier registry merging
pip install supply-demandor
python -m pip install supply-demandor
python3 -m pip install supply-demandfrom supply_demand import supply_demand import asyncio async def value_supplier(data, scope): return 42 async def root_supplier(data, scope): answer = await scope.demand({"type": "value"}) print("Supply chain returned:", answer) suppliers = {"value": value_supplier} asyncio.run(supply_demand(root_supplier, suppliers))async def A(data, scope): return 1 async def B(data, scope): a_val = await scope.demand({"type": "A"}) return a_val + 5 async def root(data, scope): result = await scope.demand({"type": "B"}) print("Result:", result) suppliers = {"A": A, "B": B} asyncio.run(supply_demand(root, suppliers))Output: Result: 6
- root_supplier: Callable
(data, scope). The entry point. - suppliers: Dict of
{type: supplier_func, ...}.
- props["type"] — The supplier type to demand.
- Can override suppliers, pass data, etc.
Supports registry extension, override, additive/clear logic via:
scope.demand({ "type": "X", "suppliers": {"add": {"X": custom_x_supplier}} })MIT