Skip to content

Commit c3b4f5a

Browse files
authored
Merge pull request #708 from github/add-verify-amendments-dot-csv
Add verify amendments dot csv
2 parents 3d43eac + 1c0353e commit c3b4f5a

File tree

3 files changed

+184
-51
lines changed

3 files changed

+184
-51
lines changed

.github/workflows/validate-package-files.yml

+7-1
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,10 @@ jobs:
5656
find rule_packages/$LANGUAGE -name \*.json -exec basename {} .json \; | xargs python scripts/generate_rules/generate_package_files.py $LANGUAGE
5757
git diff
5858
git diff --compact-summary
59-
git diff --quiet
59+
git diff --quiet
60+
61+
- name: Validate Amendments
62+
env:
63+
LANGUAGE: ${{ matrix.language }}
64+
run: |
65+
python scripts/validate-amendments-csv.py $LANGUAGE

amendments.csv

+49-50
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,49 @@
1-
language,standard,amendment,rule_id,queryable,implementation_category,implemented,difficulty
2-
c,misra-c-2012,Amendment3,DIR-4-6,Yes,Expand,No,Easy
3-
c,misra-c-2012,Amendment3,DIR-4-9,Yes,Refine,No,Easy
4-
c,misra-c-2012,Amendment3,DIR-4-11,Yes,Refine,No,Import
5-
c,misra-c-2012,Amendment3,RULE-1-4,Yes,Replace,No,Easy
6-
c,misra-c-2012,Amendment3,RULE-10-1,Yes,Replace,No,Easy
7-
c,misra-c-2012,Amendment3,RULE-10-3,Yes,Refine,No,Easy
8-
c,misra-c-2012,Amendment3,RULE-10-4,Yes,Refine,No,Import
9-
c,misra-c-2012,Amendment3,RULE-10-5,Yes,Expand,No,Easy
10-
c,misra-c-2012,Amendment3,RULE-10-7,Yes,Refine,No,Import
11-
c,misra-c-2012,Amendment3,RULE-10-8,Yes,Refine,No,Import
12-
c,misra-c-2012,Amendment3,RULE-21-11,Yes,Clarification,No,Import
13-
c,misra-c-2012,Amendment3,RULE-21-12,Yes,Replace,No,Easy
14-
c,misra-c-2012,Amendment4,RULE-11-3,Yes,Expand,No,Easy
15-
c,misra-c-2012,Amendment4,RULE-11-8,Yes,Expand,No,Easy
16-
c,misra-c-2012,Amendment4,RULE-13-2,Yes,Expand,No,Very Hard
17-
c,misra-c-2012,Amendment4,RULE-18-6,Yes,Expand,No,Medium
18-
c,misra-c-2012,Amendment4,RULE-18-8,Yes,Split,No,Easy
19-
c,misra-c-2012,Corrigendum2,RULE-2-2,Yes,Clarification,No,Import
20-
c,misra-c-2012,Corrigendum2,RULE-2-7,Yes,Clarification,No,Import
21-
c,misra-c-2012,Corrigendum2,RULE-3-1,Yes,Refine,No,Easy
22-
c,misra-c-2012,Corrigendum2,RULE-8-6,Yes,Clarification,No,Import
23-
c,misra-c-2012,Corrigendum2,RULE-8-9,Yes,Clarification,No,Import
24-
c,misra-c-2012,Corrigendum2,RULE-9-4,Yes,Clarification,No,Import
25-
c,misra-c-2012,Corrigendum2,RULE-10-1,Yes,Clarification,No,Import
26-
c,misra-c-2012,Corrigendum2,RULE-18-3,Yes,Clarification,No,Import
27-
c,misra-c-2012,Corrigendum2,RULE-1-4,Yes,Replace,No,Easy
28-
c,misra-c-2012,Corrigendum2,RULE-9-1,Yes,Refine,No,Easy
29-
c,misra-c-2012,Corrigendum2,RULE-9-2,Yes,Refine,No,Import
30-
c,misra-c-2012,Corrigendum2,DIR-4-10,Yes,Clarification,No,Import
31-
c,misra-c-2012,Corrigendum2,RULE-7-4,Yes,Refine,No,Easy
32-
c,misra-c-2012,Corrigendum2,RULE-8-2,Yes,Clarification,No,Import
33-
c,misra-c-2012,Corrigendum2,RULE-8-3,Yes,Refine,No,Easy
34-
c,misra-c-2012,Corrigendum2,RULE-8-7,Yes,Clarification,No,Import
35-
c,misra-c-2012,Corrigendum2,RULE-10-1,Yes,Clarification,No,Import
36-
c,misra-c-2012,Corrigendum2,RULE-10-2,Yes,Refine,No,Easy
37-
c,misra-c-2012,Corrigendum2,RULE-10-3,Yes,Clarification,No,Import
38-
c,misra-c-2012,Corrigendum2,RULE-11-3,Yes,Clarification,No,Import
39-
c,misra-c-2012,Corrigendum2,RULE-11-6,Yes,Clarification,No,Import
40-
c,misra-c-2012,Corrigendum2,RULE-13-2,Yes,Clarification,No,Import
41-
c,misra-c-2012,Corrigendum2,RULE-13-6,Yes,Clarification,No,Import
42-
c,misra-c-2012,Corrigendum2,RULE-14-3,Yes,Refine,No,Easy
43-
c,misra-c-2012,Corrigendum2,RULE-15-7,Yes,Clarification,No,Import
44-
c,misra-c-2012,Corrigendum2,RULE-17-4,Yes,Clarification,No,Import
45-
c,misra-c-2012,Corrigendum2,RULE-17-5,Yes,Clarification,No,Import
46-
c,misra-c-2012,Corrigendum2,RULE-18-1,Yes,Refine,No,Easy
47-
c,misra-c-2012,Corrigendum2,RULE-20-14,Yes,Clarification,No,Import
48-
c,misra-c-2012,Corrigendum2,RULE-21-19,Yes,Clarification,No,Import
49-
c,misra-c-2012,Corrigendum2,RULE-21-20,Yes,Refine,No,Easy
50-
c,misra-c-2012,Corrigendum2,RULE-22-9,Yes,Clarification,No,Import
1+
language,standard,amendment,rule_id,supportable,implementation_category,implemented,difficulty
2+
c,MISRA-C-2012,Amendment3,DIR-4-6,Yes,Expand,No,Easy
3+
c,MISRA-C-2012,Amendment3,DIR-4-9,Yes,Refine,No,Easy
4+
c,MISRA-C-2012,Amendment3,DIR-4-11,Yes,Refine,No,Import
5+
c,MISRA-C-2012,Amendment3,RULE-1-4,Yes,Replace,No,Easy
6+
c,MISRA-C-2012,Amendment3,RULE-10-1,Yes,Replace,No,Easy
7+
c,MISRA-C-2012,Amendment3,RULE-10-3,Yes,Refine,No,Easy
8+
c,MISRA-C-2012,Amendment3,RULE-10-4,Yes,Refine,No,Import
9+
c,MISRA-C-2012,Amendment3,RULE-10-5,Yes,Expand,No,Easy
10+
c,MISRA-C-2012,Amendment3,RULE-10-7,Yes,Refine,No,Import
11+
c,MISRA-C-2012,Amendment3,RULE-10-8,Yes,Refine,No,Import
12+
c,MISRA-C-2012,Amendment3,RULE-21-11,Yes,Clarification,No,Import
13+
c,MISRA-C-2012,Amendment3,RULE-21-12,Yes,Replace,No,Easy
14+
c,MISRA-C-2012,Amendment4,RULE-11-3,Yes,Expand,No,Easy
15+
c,MISRA-C-2012,Amendment4,RULE-11-8,Yes,Expand,No,Easy
16+
c,MISRA-C-2012,Amendment4,RULE-13-2,Yes,Expand,No,Very Hard
17+
c,MISRA-C-2012,Amendment4,RULE-18-6,Yes,Expand,No,Medium
18+
c,MISRA-C-2012,Amendment4,RULE-18-8,Yes,Split,No,Easy
19+
c,MISRA-C-2012,Corrigendum2,RULE-2-2,Yes,Clarification,No,Import
20+
c,MISRA-C-2012,Corrigendum2,RULE-2-7,Yes,Clarification,No,Import
21+
c,MISRA-C-2012,Corrigendum2,RULE-3-1,Yes,Refine,No,Easy
22+
c,MISRA-C-2012,Corrigendum2,RULE-8-6,Yes,Clarification,No,Import
23+
c,MISRA-C-2012,Corrigendum2,RULE-8-9,Yes,Clarification,No,Import
24+
c,MISRA-C-2012,Corrigendum2,RULE-9-4,Yes,Clarification,No,Import
25+
c,MISRA-C-2012,Corrigendum2,RULE-10-1,Yes,Clarification,No,Import
26+
c,MISRA-C-2012,Corrigendum2,RULE-18-3,Yes,Clarification,No,Import
27+
c,MISRA-C-2012,Corrigendum2,RULE-1-4,Yes,Replace,No,Easy
28+
c,MISRA-C-2012,Corrigendum2,RULE-9-1,Yes,Refine,No,Easy
29+
c,MISRA-C-2012,Corrigendum2,RULE-9-2,Yes,Refine,No,Import
30+
c,MISRA-C-2012,Corrigendum2,DIR-4-10,Yes,Clarification,No,Import
31+
c,MISRA-C-2012,Corrigendum2,RULE-7-4,Yes,Refine,No,Easy
32+
c,MISRA-C-2012,Corrigendum2,RULE-8-2,Yes,Clarification,No,Import
33+
c,MISRA-C-2012,Corrigendum2,RULE-8-3,Yes,Refine,No,Easy
34+
c,MISRA-C-2012,Corrigendum2,RULE-8-7,Yes,Clarification,No,Import
35+
c,MISRA-C-2012,Corrigendum2,RULE-10-2,Yes,Refine,No,Easy
36+
c,MISRA-C-2012,Corrigendum2,RULE-10-3,Yes,Clarification,No,Import
37+
c,MISRA-C-2012,Corrigendum2,RULE-11-3,Yes,Clarification,No,Import
38+
c,MISRA-C-2012,Corrigendum2,RULE-11-6,Yes,Clarification,No,Import
39+
c,MISRA-C-2012,Corrigendum2,RULE-13-2,Yes,Clarification,No,Import
40+
c,MISRA-C-2012,Corrigendum2,RULE-13-6,Yes,Clarification,No,Import
41+
c,MISRA-C-2012,Corrigendum2,RULE-14-3,Yes,Refine,No,Easy
42+
c,MISRA-C-2012,Corrigendum2,RULE-15-7,Yes,Clarification,No,Import
43+
c,MISRA-C-2012,Corrigendum2,RULE-17-4,Yes,Clarification,No,Import
44+
c,MISRA-C-2012,Corrigendum2,RULE-17-5,Yes,Clarification,No,Import
45+
c,MISRA-C-2012,Corrigendum2,RULE-18-1,Yes,Refine,No,Easy
46+
c,MISRA-C-2012,Corrigendum2,RULE-20-14,No,Clarification,No,Import
47+
c,MISRA-C-2012,Corrigendum2,RULE-21-19,Yes,Clarification,No,Import
48+
c,MISRA-C-2012,Corrigendum2,RULE-21-20,Yes,Refine,No,Easy
49+
c,MISRA-C-2012,Corrigendum2,RULE-22-9,Yes,Clarification,No,Import

scripts/validate-amendments-csv.py

+128
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
from collections import defaultdict
2+
import csv
3+
import os
4+
from pathlib import Path
5+
import sys
6+
import json
7+
8+
help_statement = """
9+
Usage: {script_name}
10+
11+
A script which detects invalid entries in amendments.csv.
12+
"""
13+
14+
if (len(sys.argv) == 2 and sys.argv[1] == "--help"):
15+
print(help_statement.format(script_name=sys.argv[0]))
16+
sys.exit(0)
17+
18+
if not len(sys.argv) == 2:
19+
print("Error: incorrect number of arguments", file=sys.stderr)
20+
print("Usage: " + sys.argv[0] + " [--help]", file=sys.stderr)
21+
sys.exit(1)
22+
23+
repo_root = Path(__file__).parent.parent
24+
rules_file_path = repo_root.joinpath('rules.csv')
25+
amendments_file_path = repo_root.joinpath('amendments.csv')
26+
language_name = sys.argv[1]
27+
28+
failed = False
29+
30+
rules_from_csv = {}
31+
try:
32+
rules_file = open(rules_file_path, "r")
33+
except PermissionError:
34+
print("Error: No permission to read the rules file located at '" + str(rules_file_path) + "'")
35+
sys.exit(1)
36+
else:
37+
with rules_file:
38+
rules_reader = csv.reader(rules_file)
39+
# Skip header row
40+
next(rules_reader, None)
41+
for rule in rules_reader:
42+
language = rule[0]
43+
rule_id = rule[2]
44+
45+
# only validate rules for the specified language
46+
if not language == language_name:
47+
continue
48+
49+
rule_dict = {
50+
"standard": rule[1],
51+
"rule_id": rule_id,
52+
"supportable": rule[3]
53+
}
54+
rules_from_csv[rule_id] = rule_dict
55+
56+
print(f"Found {len(rules_from_csv)} rules.")
57+
print(f"Verifying amendments")
58+
59+
seen_amendments = set()
60+
try:
61+
amendments_file = open(amendments_file_path, "r")
62+
except PermissionError:
63+
print("Error: No permission to read the amendments file located at '" + str(amendments_file_path) + "'")
64+
sys.exit(1)
65+
else:
66+
with amendments_file:
67+
amendments_reader = csv.reader(amendments_file)
68+
# Skip header row
69+
next(amendments_reader, None)
70+
for amendment in amendments_reader:
71+
language = amendment[0]
72+
73+
# only validate rules for the specified language
74+
if not language == language_name:
75+
continue
76+
77+
if len(amendment) != 8:
78+
print(f"🔴 Error: amendment {amendment} has wrong number of fields")
79+
failed = True
80+
continue
81+
82+
standard = amendment[1]
83+
amendment_name = amendment[2]
84+
rule_id = amendment[3]
85+
supportable = amendment[4]
86+
implemented = amendment[6]
87+
amendment_id = f"{rule_id}-{amendment_name}"
88+
89+
if not rule_id in rules_from_csv:
90+
print(f"🔴 Error: Amendment {amendment_id} references rule {rule_id}, not found in rules.csv")
91+
failed = True
92+
continue
93+
94+
rule = rules_from_csv[rule_id]
95+
96+
if rule["standard"] != standard:
97+
print(f"🟡 Invalid: {amendment_id} has a different standard than the {rule_id} in rules.csv")
98+
print(f" '{standard}' vs '{rule['standard']}'")
99+
failed = True
100+
101+
if supportable not in {"Yes", "No"}:
102+
print(f"🟡 Invalid: {amendment_id} 'supportable' field should be 'Yes' or 'No'.")
103+
print(f" got '{supportable}'")
104+
failed = True
105+
106+
if rule["supportable"] != supportable:
107+
print(f"🟡 Invalid: {amendment_id} supportable does not match rules.csv supportable.")
108+
print(f" '{supportable}' vs '{rule['supportable']}'")
109+
failed = True
110+
111+
if implemented not in {"Yes", "No"}:
112+
print(f"🟡 Invalid: {amendment_id} 'implemented' field should be 'Yes' or 'No'.")
113+
print(f" got '{implemented}'")
114+
failed = True
115+
116+
if amendment_id in seen_amendments:
117+
print(f"🔴 Error: {amendment_id} has duplicate entries")
118+
failed = True
119+
120+
seen_amendments.add(amendment_id)
121+
122+
print(f"Checked {len(seen_amendments)} amendments.")
123+
124+
if failed:
125+
print("❌ FAILED: Validity issues found in amendments.csv!")
126+
sys.exit(1)
127+
else:
128+
print("✅ PASSED: No validity issues found in amendments.csv! 🎉")

0 commit comments

Comments
 (0)