diff --git a/app/mealie.py b/app/mealie.py index 2fa937b..6d97a19 100644 --- a/app/mealie.py +++ b/app/mealie.py @@ -1,10 +1,32 @@ """Mealie API client — creates recipes and uploads images.""" import io +import re import uuid import requests +def _parse_qty(qty_str: str) -> tuple[float, str]: + """Parse a quantity string, handling ranges like '2-3' or '6- 8'. + + Returns (number, range_note) where range_note is the original range + string if the quantity is a range, or empty string if it's a plain number. + """ + if not qty_str: + return (0, "") + # Try plain number first + try: + return (float(qty_str.replace(",", ".")), "") + except (ValueError, TypeError): + pass + # Try range: "2-3", "2- 3", "6 - 8" + m = re.match(r"^(\d+(?:[.,]\d+)?)\s*-\s*(\d+(?:[.,]\d+)?)$", qty_str.strip()) + if m: + first = float(m.group(1).replace(",", ".")) + return (first, qty_str.strip()) + return (0, "") + + class MealieClient: """Thin wrapper around the Mealie REST API.""" @@ -275,11 +297,9 @@ class MealieClient: unit_ref = self._ensure_unit(unit_str) if unit_str else None food_ref = self._ensure_food(food_str) - qty = 0 - try: - qty = float(qty_str.replace(",", ".")) - except (ValueError, TypeError): - pass + qty, range_note = _parse_qty(qty_str) + if range_note: + extra = f"{range_note} {unit_str}; {extra}".strip("; ") if extra else f"{range_note} {unit_str}".strip() return { "referenceId": str(uuid.uuid4()), diff --git a/app/tandoor.py b/app/tandoor.py index 52565cc..2cb11e8 100644 --- a/app/tandoor.py +++ b/app/tandoor.py @@ -5,6 +5,25 @@ import re import requests +def _parse_qty(qty_str: str) -> tuple[float, str]: + """Parse a quantity string, handling ranges like '2-3' or '6- 8'. + + Returns (number, range_note) where range_note is the original range + string if the quantity is a range, or empty string if it's a plain number. + """ + if not qty_str: + return (0, "") + try: + return (float(qty_str.replace(",", ".")), "") + except (ValueError, TypeError): + pass + m = re.match(r"^(\d+(?:[.,]\d+)?)\s*-\s*(\d+(?:[.,]\d+)?)$", qty_str.strip()) + if m: + first = float(m.group(1).replace(",", ".")) + return (first, qty_str.strip()) + return (0, "") + + class TandoorClient: """Thin wrapper around the Tandoor REST API.""" @@ -184,11 +203,9 @@ class TandoorClient: has_structured = bool(qty_str or unit_str) if has_structured and food_str: - qty = 0 - try: - qty = float(qty_str.replace(",", ".")) - except (ValueError, TypeError): - pass + qty, range_note = _parse_qty(qty_str) + if range_note: + extra = f"{range_note} {unit_str}; {extra}".strip("; ") if extra else f"{range_note} {unit_str}".strip() return { "food": {"name": food_str},