Skip to content

Commit b89dcf0

Browse files
committed
Gate validates string options, prompt uses resolved integration, loop normalizes max_iterations
1 parent d299495 commit b89dcf0

3 files changed

Lines changed: 10 additions & 4 deletions

File tree

src/specify_cli/workflows/engine.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,9 @@ def _execute_steps(
615615
if step_type in ("while", "do-while"):
616616
from .expressions import evaluate_condition
617617

618-
max_iters = step_config.get("max_iterations", 10)
618+
max_iters = step_config.get("max_iterations")
619+
if not isinstance(max_iters, int) or max_iters < 1:
620+
max_iters = 10
619621
condition = step_config.get("condition", False)
620622
for _loop_iter in range(max_iters - 1):
621623
if not evaluate_condition(condition, context):

src/specify_cli/workflows/steps/gate/__init__.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,13 @@ def validate(self, config: dict[str, Any]) -> list[str]:
9797
f"Gate step {config.get('id', '?')!r} is missing 'message' field."
9898
)
9999
options = config.get("options", ["approve", "reject"])
100-
if not isinstance(options, list):
100+
if not isinstance(options, list) or not options:
101101
errors.append(
102-
f"Gate step {config.get('id', '?')!r}: 'options' must be a list."
102+
f"Gate step {config.get('id', '?')!r}: 'options' must be a non-empty list."
103+
)
104+
elif not all(isinstance(o, str) for o in options):
105+
errors.append(
106+
f"Gate step {config.get('id', '?')!r}: all options must be strings."
103107
)
104108
on_reject = config.get("on_reject", "abort")
105109
if on_reject not in ("abort", "skip", "retry"):

src/specify_cli/workflows/steps/prompt/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def execute(self, config: dict[str, Any], context: StepContext) -> StepResult:
8989
output=output,
9090
error=(
9191
f"Cannot dispatch prompt: "
92-
f"integration {config.get('integration') or context.default_integration!r} "
92+
f"integration {integration!r} "
9393
f"CLI not found or not installed."
9494
),
9595
)

0 commit comments

Comments
 (0)