Skip to content

Commit 7ad65fe

Browse files
committed
moved validation logic to python script
1 parent ac7e2c3 commit 7ad65fe

2 files changed

Lines changed: 378 additions & 145 deletions

File tree

.github/workflows/validate-published-rules.yml

Lines changed: 5 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -91,151 +91,11 @@ jobs:
9191
run: |
9292
chmod +x open-rules/.github/scripts/run_validation.sh
9393
94-
# Write the JSON-line parser once; called once per test case in the loop below
95-
cat > /tmp/parse_case.py << 'PYEOF'
96-
import sys, json, shlex
97-
d = json.load(sys.stdin)
98-
for k, v in [
99-
('CASE_RULE', d['rule']),
100-
('CASE_TYPE', d['type']),
101-
('CASE_NUM', str(d['num'])),
102-
('EXEC_OK', '\u2705' if d['exec'] else '\u274c'),
103-
('EXPECTED', str(d.get('expected', ''))),
104-
('GOT', str(d.get('got', ''))),
105-
('MATCH', '\u2705' if d.get('match') else '\u274c'),
106-
('DIFF_FILE', str(d.get('diff', ''))),
107-
('STDERR_FILE', str(d.get('stderr', ''))),
108-
]:
109-
print(k + '=' + shlex.quote(v))
110-
PYEOF
111-
112-
PYTHON_CMD="$(pwd)/venv/bin/python"
113-
ENGINE_DIR="$(pwd)/engine"
114-
RULES_ROOT="$(pwd)/open-rules"
115-
PUBLISHED_DIR="$RULES_ROOT/Published"
116-
SCRIPTS_DIR="$RULES_ROOT/.github/scripts"
117-
118-
SUMMARY_TABLE="$(pwd)/summary_table.md"
119-
DETAIL_REPORT="$(pwd)/detail_report.md"
120-
121-
OVERALL_EXIT=0
122-
RULE_PASS=0
123-
RULE_FAIL=0
124-
125-
mapfile -t RULE_DIRS < <(find "$PUBLISHED_DIR" -mindepth 1 -maxdepth 1 -type d | sort)
126-
127-
if [ ${#RULE_DIRS[@]} -eq 0 ]; then
128-
echo "::warning::No rule directories found under Published/"
129-
exit 0
130-
fi
131-
132-
echo "Found ${#RULE_DIRS[@]} rule(s) under Published/"
133-
134-
# -- Initialise summary table
135-
{
136-
echo "# Published Rules Validation — Summary"
137-
echo ""
138-
echo "| Rule | Type | Number | Execution | Expected | Got | Match |"
139-
echo "|------|------|--------|-----------|----------|-----|-------|"
140-
} > "$SUMMARY_TABLE"
141-
142-
# -- Initialise detail report
143-
{
144-
echo "# Published Rules Validation — Failure Details"
145-
echo ""
146-
} > "$DETAIL_REPORT"
147-
148-
for RULE_DIR in "${RULE_DIRS[@]}"; do
149-
RULE_ID=$(basename "$RULE_DIR")
150-
151-
RULE_YML=$(find "$RULE_DIR" -maxdepth 1 -name "*.yml" | head -1)
152-
if [ -z "$RULE_YML" ]; then
153-
echo "::warning::Skipping $RULE_ID — no .yml file found"
154-
continue
155-
fi
156-
157-
echo "========================================"
158-
echo " Validating $RULE_ID"
159-
echo "========================================"
160-
161-
RULE_EXIT=0
162-
ENGINE_DIR_OVERRIDE="$ENGINE_DIR" \
163-
bash "$SCRIPTS_DIR/run_validation.sh" \
164-
"Published/$RULE_ID" \
165-
"$PYTHON_CMD" \
166-
"$RULES_ROOT" \
167-
|| RULE_EXIT=$?
168-
169-
# -- Parse per-test-case results produced by run_validation.sh
170-
CASE_RESULTS="$RULES_ROOT/case_results.jsonl"
171-
RULE_ROW_FAILED=0
172-
173-
if [ -f "$CASE_RESULTS" ]; then
174-
while IFS= read -r line; do
175-
# Parse all fields in a single python3 call — script written once above
176-
eval "$(echo "$line" | python3 /tmp/parse_case.py)"
177-
178-
echo "| $CASE_RULE | $CASE_TYPE | $CASE_NUM | $EXEC_OK | $EXPECTED | $GOT | $MATCH |" >> "$SUMMARY_TABLE"
179-
180-
# Collect detail only for failures
181-
if [[ "$EXEC_OK" == "❌" || "$MATCH" == "❌" ]]; then
182-
RULE_ROW_FAILED=1
183-
{
184-
echo "## $CASE_RULE — $CASE_TYPE / $CASE_NUM"
185-
if [[ "$EXEC_OK" == "❌" ]]; then
186-
echo "**Execution failed.**"
187-
if [ -f "$STDERR_FILE" ]; then
188-
echo '```'
189-
cat "$STDERR_FILE"
190-
echo '```'
191-
fi
192-
else
193-
echo "**Expected:** $EXPECTED **Got:** $GOT"
194-
if [ -n "$DIFF_FILE" ] && [ -f "$DIFF_FILE" ]; then
195-
echo '```diff'
196-
cat "$DIFF_FILE"
197-
echo '```'
198-
fi
199-
fi
200-
echo ""
201-
} >> "$DETAIL_REPORT"
202-
fi
203-
done < "$CASE_RESULTS"
204-
rm -f "$CASE_RESULTS"
205-
else
206-
# write a single aggregate row
207-
EXEC_OK=$( [ $RULE_EXIT -eq 0 ] && echo "✅" || echo "❌" )
208-
echo "| $RULE_ID | — | — | $EXEC_OK | — | — | — |" >> "$SUMMARY_TABLE"
209-
if [ $RULE_EXIT -ne 0 ]; then
210-
RULE_ROW_FAILED=1
211-
# Append whatever markdown run_validation.sh produced
212-
if [ -f "$RULES_ROOT/validation_report.md" ]; then
213-
{
214-
echo "## $RULE_ID"
215-
cat "$RULES_ROOT/validation_report.md"
216-
echo ""
217-
} >> "$DETAIL_REPORT"
218-
fi
219-
fi
220-
fi
221-
222-
rm -f "$RULES_ROOT/validation_report.md"
223-
224-
if [ $RULE_ROW_FAILED -eq 0 ] && [ $RULE_EXIT -eq 0 ]; then
225-
RULE_PASS=$((RULE_PASS + 1))
226-
echo " → $RULE_ID: PASSED"
227-
else
228-
RULE_FAIL=$((RULE_FAIL + 1))
229-
OVERALL_EXIT=1
230-
echo " → $RULE_ID: FAILED"
231-
fi
232-
done
233-
234-
# -- Insert totals line into summary table
235-
TOTALS="**Total:** $((RULE_PASS + RULE_FAIL)) | ✅ Passed: $RULE_PASS | ❌ Failed: $RULE_FAIL"
236-
sed -i "2s|^|$TOTALS\n\n|" "$SUMMARY_TABLE"
237-
238-
exit $OVERALL_EXIT
94+
./venv/bin/python engine/scripts/validate_published_rules.py \
95+
--rules-root "$(pwd)/open-rules" \
96+
--engine-dir "$(pwd)/engine" \
97+
--python-cmd "$(pwd)/venv/bin/python" \
98+
--output-dir "$(pwd)"
23999
240100
# -----------------------------------------------------------------------
241101
# 6. Upload both reports + raw results as artifacts

0 commit comments

Comments
 (0)