Treat Mealie's "no image" sentinel as a missing cover

Mealie stores the literal string "no image" in the recipe's image field when
there is no cover, so bool(recipe["image"]) reported a cover that is not
there: the check meant to catch a missing image downgraded to a warning
instead of failing. Observed on a recipe created through Mealie's own image
import, which returned image: "no image".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-18 12:55:27 +02:00
parent 204c333c73
commit 2846289df1
2 changed files with 26 additions and 1 deletions
+18 -1
View File
@@ -16,6 +16,10 @@ from .normalize import (
looks_mangled,
)
#: Mealie stores this sentinel in ``image`` when a recipe has no cover, so a
#: truthiness test on the field reports a cover that is not there.
NO_IMAGE_SENTINEL = "no image"
Status = Literal["pass", "fail", "warn"]
@@ -23,6 +27,19 @@ def _check(check_id: str, status: Status, detail: str) -> dict[str, str]:
return {"check": check_id, "status": status, "detail": detail}
def has_cover_image(recipe: dict[str, Any]) -> bool:
"""Whether the recipe carries a real cover image.
Mealie writes the literal string ``"no image"`` instead of an empty value
when a recipe has no cover, so an emptiness test has to reject that
sentinel too.
"""
image = recipe.get("image")
if not isinstance(image, str):
return bool(image)
return image.strip().casefold() not in ("", NO_IMAGE_SENTINEL)
def is_parsed(recipe: dict[str, Any]) -> bool:
"""Whether Mealie will stop showing 'your ingredients aren't parsed yet'.
@@ -149,7 +166,7 @@ def verify_recipe(
)
)
has_image_field = bool(recipe.get("image"))
has_image_field = has_cover_image(recipe)
if image_verified:
image_status: Status = "pass"
image_detail = "Image step ran and was verified by the caller"