Code generator for Python backends following DDD principles.
Describe your domain in a single Python file, get a full stack: domain models, repository, use cases, DTOs and FastAPI routers. Architecture is Onion, no ActiveRecord, strict layer separation.
pip install bendykit# manifest.py
from decimal import Decimal
from enum import Enum
from typing import Optional
from datetime import datetime
from bendy import Aggregate, ValueObject, Field, auto_now
class OrderStatus(Enum):
PENDING = "pending"
CONFIRMED = "confirmed"
class Address(ValueObject):
street: str
city: str
country: str = "US"
class Order(Aggregate):
customer_id: str
total_amount: Decimal
status: OrderStatus = OrderStatus.PENDING
shipping_address: Address
notes: Optional[str] = None
created_at: datetime = auto_now
class Meta:
use_cases = ["create", "get", "update", "delete", "list"]bendykit manifest.py ./srcGenerates for each aggregate:
src/order/
├── domain/
│ ├── models.py # @dataclass Order
│ ├── enums.py # OrderStatus(Enum)
│ ├── value_objects.py # @dataclass(frozen=True) Address
│ └── repository.py # OrderRepository(ABC)
├── application/
│ ├── dtos.py # OrderCreate / OrderUpdate / OrderResponse
│ └── use_cases.py # Create/Get/Update/Delete/ListOrderUseCase
├── presentation/
│ └── router.py # FastAPI router
└── infrastructure/
├── models.py # OrderModel(Base) — SQLAlchemy 2.0
└── repository.py # SqlalchemyOrderRepository + mapper
| Manifest | Python | SQLAlchemy |
|---|---|---|
str |
str |
String |
int |
int |
Integer |
float |
float |
Float |
bool |
bool |
Boolean |
Decimal |
Decimal |
Numeric |
datetime |
datetime |
DateTime |
date |
date |
Date |
UUID |
UUID |
String |
Optional[X] |
Optional[X] |
nullable=True |
MyEnum(Enum) |
MyEnum |
String + mapper |
MyVO(ValueObject) |
MyVO |
JSON |
auto_now— value is set server-side, excluded from Create/Update DTOsField(unique=True, index=True, max_length=N)— column metadataValueObject— nested object without id, stored as JSONMeta.use_cases— operations to generate:create,get,update,delete,list(default:create,get)
- Phase I — CLI generator
- Phase II — Python manifests (Enum, ValueObject, Field, auto_now, Meta)
- Phase III —
bendykit.runtime: Unit of Work, Domain Events
MIT