@@ -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