1 """Build the deterministic demo used by the notebook and tests."""
2
3 from __future__ import annotations
4
5 from datetime import datetime, timedelta
6 from decimal import Decimal
7
8 from .application import CommerceApplication
9 from .merchant import SyntheticMerchant
10 from .models import CommercePolicy
11 from .payments import LocalPaymentProcessor
12 from .policy import PolicyEngine
13
14
15 def build_demo(
16 now: datetime,
17 ) -> tuple[CommerceApplication, SyntheticMerchant, LocalPaymentProcessor]:
18 payments = LocalPaymentProcessor()
19 merchant = SyntheticMerchant(payments, now=now)
20 policy = PolicyEngine(
21 CommercePolicy(
22 allowed_merchants=frozenset({"merchant.invalid"}),
23 allowed_purposes=frozenset({"supplier_due_diligence"}),
24 per_request_limit=Decimal("0.50"),
25 per_run_limit=Decimal("1.00"),
26 approval_threshold=Decimal("0.10"),
27 session_expires_at=now + timedelta(minutes=15),
28 )
29 )
30 application = CommerceApplication(
31 client=merchant.client(),
32 policy=policy,
33 payments=payments,
34 )
35 return application, merchant, payments