From 24b6b4af2893ab50b322ba0cccc45af75e761877 Mon Sep 17 00:00:00 2001 From: gilesb Date: Sun, 11 Jan 2026 23:17:55 +0000 Subject: [PATCH] Give clear error when sexp module not available Instead of falling through to YAML parsing (which gives confusing errors), return a clear message that artdag.sexp is required but not installed. Co-Authored-By: Claude Opus 4.5 --- app/routers/recipes.py | 4 +++- app/services/recipe_service.py | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/routers/recipes.py b/app/routers/recipes.py index 290efdd..38d1eff 100644 --- a/app/routers/recipes.py +++ b/app/routers/recipes.py @@ -73,7 +73,9 @@ async def upload_recipe( variable_inputs = [] fixed_inputs = [] - if is_sexp and SEXP_AVAILABLE: + if is_sexp: + if not SEXP_AVAILABLE: + raise HTTPException(500, "S-expression recipes require artdag.sexp module (not installed on server)") # Parse S-expression try: compiled = compile_string(content) diff --git a/app/services/recipe_service.py b/app/services/recipe_service.py index fb3c1a4..119e4b2 100644 --- a/app/services/recipe_service.py +++ b/app/services/recipe_service.py @@ -68,7 +68,9 @@ class RecipeService: recipe_data = None is_sexp = _is_sexp_format(content) - if is_sexp and SEXP_AVAILABLE: + if is_sexp: + if not SEXP_AVAILABLE: + return {"error": "S-expression recipes require artdag.sexp module (not installed)", "recipe_id": recipe_id} # Parse as S-expression try: compiled = compile_string(content) @@ -153,7 +155,9 @@ class RecipeService: # Detect format is_sexp = _is_sexp_format(content) - if is_sexp and SEXP_AVAILABLE: + if is_sexp: + if not SEXP_AVAILABLE: + return None, "S-expression recipes require artdag.sexp module (not installed on server)" # Validate S-expression try: compiled = compile_string(content)