Skip to content

Order case

Orders bring several mapping ideas together. This example contains an identifier, an optional address, a list of items, and an optional note. It does not contain a customer field. Nested mappings preserve scalar, optional, and list shapes. A context derivation passes order-level request context to every line-item mapping once per nested boundary.

Example

from dataclasses import dataclass

from betwixt import Betwixt, field_refs, nested_rightward

@dataclass
class Order:
    identifier: int
    address: None
    items: list

@dataclass
class OrderView:
    identifier: int
    address: None
    items: list

left, right = field_refs(Order, OrderView)

class OrderMapping(Betwixt):
    left = Order
    right = OrderView
    address = nested_rightward(left=left.address, right=right.address, via=None,
                               rightward=lambda value: value,
                               context_rightward=lambda context: context)
    items = nested_rightward(left=left.items, right=right.items, via=None,
                             rightward=lambda value: value,
                             context_rightward=lambda context: context)

mapping = OrderMapping()
translated = mapping.rightward(Order(42, None, []), context={"minor_units": 100})
patch = mapping.rightward_partial({"items": []})

The patch is sparse: omitted fields stay omitted, present None stays present, and defaults never appear in a partial result.