Cookwala / SDK and scenarios / 062
Record a handover: all accepted, partly accepted, or all rejected
HAND names the offer, the kilograms accepted, optionally REJ with the kilograms rejected and a reason code, and a temperature. Zero accepted with REJ means the whole load was turned away.
Read first: /docs/HUMANITARIAN-PROFILE/ /humanitarian/
Steps
All 36 kg accepted at 4.6 °C; no rejected line is written.
parseSms30 kg accepted, 6 kg rejected for damaged packaging.
parseSmsNothing accepted: 18 kg of hot food measured at 52 °C is rejected for temperature.
parseSmsREJ without a quantity and reason: usage error.
parseSmsNo quantity at all: usage error.
parseSms
Outcome
You can record the three outcomes of a handover. Next: scenarios 063 and 064 list every rejection reason code.
Command line
cookwala sms "HAND A7K 36 T4.6"
cookwala sms "HAND A7K 0 REJ 18 TEMP T52"Recorded output
Status: ok
[1] parseSms: {"ok": true, "command": "HAND", "offer": "A7K", "kgAccepted": 36.0, "tempC": 4.6, "findings": []}
[2] parseSms: {"ok": true, "command": "HAND", "offer": "A7K", "kgAccepted": 30.0, "kgRejected": 6.0, "reason": "packaging_damaged", "reasonCode": "PACK", "tempC": 4.6, "findings": []}
[3] parseSms: {"ok": true, "command": "HAND", "offer": "A7K", "kgAccepted": 0.0, "kgRejected": 18.0, "reason": "temp_out_of_range", "reasonCode": "TEMP", "tempC": 52.0, "findings": []}
[4] parseSms: {"ok": false, "error": "usage"}
[5] parseSms: {"ok": false, "error": "usage"}Code
Run: python scenarios/out/062-handover-accepted-partly-accepted-or-rejected/python.py
# Scenario 062: Record a handover: all accepted, partly accepted, or all rejected
# HAND names the offer, the kilograms accepted, optionally REJ with the kilograms rejected and a reason code, and a temperature. Zero accepted with REJ means the whole load was turned away.
# Run a hub first: python hub/cookwala_hub.py --recipes examples
import json, os
from cookwala.client import CookwalaClient, CookwalaProblem
def load(path):
with open(path, encoding="utf-8") as f:
return json.load(f)
def pick(obj, path):
for part in path.replace("]", "").replace("[", ".").split("."):
obj = obj[int(part)] if part.isdigit() else (len(obj) if part == "length" else obj.get(part))
return obj
c = CookwalaClient(os.environ.get("COOKWALA_HUB", "http://localhost:7878"))
# Step 1: All 36 kg accepted at 4.6 °C; no rejected line is written.
full = c.parse_sms("HAND A7K 36 T4.6")
assert pick(full, "ok") == True, pick(full, "ok")
print("ok", "ok", "=", True)
assert pick(full, "command") == "HAND", pick(full, "command")
print("ok", "command", "=", "HAND")
assert pick(full, "kgAccepted") == 36.0, pick(full, "kgAccepted")
print("ok", "kgAccepted", "=", 36.0)
assert pick(full, "kgRejected") == None, pick(full, "kgRejected")
print("ok", "kgRejected", "=", None)
assert pick(full, "tempC") == 4.6, pick(full, "tempC")
print("ok", "tempC", "=", 4.6)
# Step 2: 30 kg accepted, 6 kg rejected for damaged packaging.
partial = c.parse_sms("HAND A7K 30 REJ 6 PACK T4.6")
assert pick(partial, "kgAccepted") == 30.0, pick(partial, "kgAccepted")
print("ok", "kgAccepted", "=", 30.0)
assert pick(partial, "kgRejected") == 6.0, pick(partial, "kgRejected")
print("ok", "kgRejected", "=", 6.0)
assert pick(partial, "reason") == "packaging_damaged", pick(partial, "reason")
print("ok", "reason", "=", "packaging_damaged")
assert pick(partial, "reasonCode") == "PACK", pick(partial, "reasonCode")
print("ok", "reasonCode", "=", "PACK")
# Step 3: Nothing accepted: 18 kg of hot food measured at 52 °C is rejected for temperature.
rejected = c.parse_sms("HAND A7K 0 REJ 18 TEMP T52")
assert pick(rejected, "kgAccepted") == 0.0, pick(rejected, "kgAccepted")
print("ok", "kgAccepted", "=", 0.0)
assert pick(rejected, "kgRejected") == 18.0, pick(rejected, "kgRejected")
print("ok", "kgRejected", "=", 18.0)
assert pick(rejected, "reason") == "temp_out_of_range", pick(rejected, "reason")
print("ok", "reason", "=", "temp_out_of_range")
assert pick(rejected, "tempC") == 52.0, pick(rejected, "tempC")
print("ok", "tempC", "=", 52.0)
# Step 4: REJ without a quantity and reason: usage error.
usage = c.parse_sms("HAND A7K 36 REJ")
assert pick(usage, "ok") == False, pick(usage, "ok")
print("ok", "ok", "=", False)
assert pick(usage, "error") == "usage", pick(usage, "error")
print("ok", "error", "=", "usage")
# Step 5: No quantity at all: usage error.
usage2 = c.parse_sms("HAND A7K")
assert pick(usage2, "ok") == False, pick(usage2, "ok")
print("ok", "ok", "=", False)
assert pick(usage2, "error") == "usage", pick(usage2, "error")
print("ok", "error", "=", "usage")
print("scenario complete")
scenarios/062-handover-accepted-partly-accepted-or-rejected.json