Skip to content

Commit 161a926

Browse files
authored
Add ruff as part of PR validation (#72)
1 parent ff00b86 commit 161a926

File tree

10 files changed

+159
-174
lines changed

10 files changed

+159
-174
lines changed

.github/workflows/validation.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ jobs:
3030
- name: Validate pyproject.toml and poetry.lock
3131
run: poetry check
3232

33+
- name: Install dependencies
34+
run: poetry install
35+
36+
- name: Validate code formatting
37+
run: poetry run ruff format --check
38+
39+
- name: Validate code style
40+
run: poetry run ruff check
41+
42+
3343
test:
3444
if: github.repository == 'microsoft/sarif-tools'
3545
runs-on: ubuntu-latest

.vscode/extensions.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
// See https://go.microsoft.com/fwlink/?LinkId=827846
3+
// for the documentation about the extensions.json format
4+
"recommendations": [
5+
"charliermarsh.ruff",
6+
"ms-python.python",
7+
"ms-python.vscode-pylance"
8+
]
9+
}

poetry.lock

Lines changed: 88 additions & 133 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ python-docx = "^1.1.2"
2626
pyyaml = "^6.0.1"
2727

2828
[tool.poetry.dev-dependencies]
29-
black = "^24.3.0"
3029
jsonschema = "^4.23.0"
3130
pylint = "^3.2"
3231
pytest = "^8.3"
3332
pytest-cov = "^5.0"
33+
ruff = "^0.6.8"
3434

3535
[tool.poetry.scripts]
3636
sarif = "sarif.cmdline.main:main"

sarif/operations/blame_op.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,14 @@ def _run_git_blame_on_files(files_to_blame, repo_path):
113113
with subprocess.Popen(cmd, stdout=subprocess.PIPE, cwd=repo_path) as proc:
114114
blame_info = {"commits": {}, "line_to_commit": {}}
115115
file_blame_info[file_path] = blame_info
116-
reading_commit_headers = False
116+
commit_hash: str | None = None
117117
for line_bytes in proc.stdout.readlines():
118118
# Convert byte sequence to string and remove trailing LF
119119
line_string = line_bytes.decode("utf-8")[:-1]
120120
# Now parse output from git blame --porcelain
121-
if reading_commit_headers:
121+
if commit_hash:
122122
if line_string.startswith("\t"):
123-
reading_commit_headers = False
123+
commit_hash = None
124124
# Ignore line contents = source code
125125
elif " " in line_string:
126126
space_pos = line_string.index(" ")
@@ -137,7 +137,7 @@ def _run_git_blame_on_files(files_to_blame, repo_path):
137137
commit_line = commit_line_info[2]
138138
blame_info["commits"].setdefault(commit_hash, {})
139139
blame_info["line_to_commit"][commit_line] = commit_hash
140-
reading_commit_headers = True
140+
141141
# Ensure process terminates
142142
proc.communicate()
143143
if proc.returncode:

sarif/operations/summary_op.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def generate_summary(
3232
output_file_name,
3333
)
3434
with open(output_file, "w", encoding="utf-8") as file_out:
35-
file_out.writelines(l + "\n" for l in summary_lines)
35+
file_out.writelines(line + "\n" for line in summary_lines)
3636
output_file_name = "static_analysis_summary.txt"
3737
output_file = os.path.join(output, output_file_name)
3838

@@ -45,7 +45,7 @@ def generate_summary(
4545
output_file,
4646
)
4747
with open(output_file, "w", encoding="utf-8") as file_out:
48-
file_out.writelines(l + "\n" for l in summary_lines)
48+
file_out.writelines(line + "\n" for line in summary_lines)
4949
else:
5050
for lstr in summary_lines:
5151
print(lstr)

sarif/sarif_file_utils.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,15 @@ def read_result_severity(result, run) -> Literal["none", "note", "warning", "err
168168
# Honor the invocation's configuration override if present...
169169
invocation = read_result_invocation(result, run)
170170
if invocation:
171-
ruleConfigurationOverrides = invocation.get("ruleConfigurationOverrides", [])
171+
ruleConfigurationOverrides = invocation.get(
172+
"ruleConfigurationOverrides", []
173+
)
172174
override = next(
173175
(
174176
override
175177
for override in ruleConfigurationOverrides
176-
if override.get("descriptor", {}).get("id") == rule.get("id") or
177-
override.get("descriptor", {}).get("index") == ruleIndex
178+
if override.get("descriptor", {}).get("id") == rule.get("id")
179+
or override.get("descriptor", {}).get("index") == ruleIndex
178180
),
179181
None,
180182
)

tests/diff/test_diff_issues_reordered.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,7 @@
141141

142142
def test_diff_issues_reordered():
143143
mtime = datetime.datetime.now()
144-
sarif = sarif_file.SarifFile(
145-
"SARIF", SARIF, mtime=mtime
146-
)
144+
sarif = sarif_file.SarifFile("SARIF", SARIF, mtime=mtime)
147145
sarif_reordered = sarif_file.SarifFile(
148146
"SARIF_WITH_ISSUES_REORDERED", SARIF_WITH_ISSUES_REORDERED, mtime=mtime
149147
)

tests/test_general_filter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import pytest
2-
from sarif.filter.general_filter import GeneralFilter, PropertyFilter, load_filter_file
2+
from sarif.filter.general_filter import GeneralFilter, load_filter_file
33
from sarif.filter.filter_stats import load_filter_stats_from_json
44

55

tests/test_sarif_file_utils.py

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,16 @@ def test_combine_code_and_description_long_code():
3838

3939

4040
def test_read_result_rule():
41-
run = {"tool":
42-
{"driver":
43-
{"rules": [
44-
{"id": "id0", "defaultConfiguration": {"level": "none"}},
45-
{"id": "id1", "defaultConfiguration": {"level": "error"}}
46-
]}}}
41+
run = {
42+
"tool": {
43+
"driver": {
44+
"rules": [
45+
{"id": "id0", "defaultConfiguration": {"level": "none"}},
46+
{"id": "id1", "defaultConfiguration": {"level": "error"}},
47+
]
48+
}
49+
}
50+
}
4751
rule_id0 = run["tool"]["driver"]["rules"][0]
4852
rule_id1 = run["tool"]["driver"]["rules"][1]
4953

@@ -57,7 +61,7 @@ def test_read_result_rule():
5761
assert rule == rule_id1
5862
assert ruleIndex == 1
5963

60-
result = {"rule": { "index": 1}}
64+
result = {"rule": {"index": 1}}
6165
(rule, ruleIndex) = sarif_file_utils.read_result_rule(result, run)
6266
assert rule == rule_id1
6367
assert ruleIndex == 1
@@ -67,7 +71,7 @@ def test_read_result_rule():
6771
assert rule == rule_id1
6872
assert ruleIndex == 1
6973

70-
result = {"rule": { "id": "id1"}}
74+
result = {"rule": {"id": "id1"}}
7175
(rule, ruleIndex) = sarif_file_utils.read_result_rule(result, run)
7276
assert rule == rule_id1
7377
assert ruleIndex == 1
@@ -84,10 +88,7 @@ def test_read_result_rule():
8488

8589

8690
def test_read_result_invocation():
87-
run = {"invocations": [
88-
{"foo": 1},
89-
{"bar": "baz"}
90-
]}
91+
run = {"invocations": [{"foo": 1}, {"bar": "baz"}]}
9192

9293
result = {}
9394
invocation = sarif_file_utils.read_result_invocation(result, run)
@@ -124,19 +125,29 @@ def test_read_result_severity():
124125
severity = sarif_file_utils.read_result_severity(result, {})
125126
assert severity == "none"
126127

127-
run = {"invocations": [
128-
{"ruleConfigurationOverrides": [ {"descriptor": {"id": "id1"}, "configuration": {"level": "note"}} ]},
129-
{"ruleConfigurationOverrides": [ {"descriptor": {"index": 1}, "configuration": {"level": "note"}} ]},
130-
{ }
131-
],
132-
"tool":
133-
{"driver":
134-
{"rules": [
135-
{"id": "id0", "defaultConfiguration": {"level": "none"}},
136-
{"id": "id1", "defaultConfiguration": {"level": "error"}}
137-
]}
138-
}
139-
}
128+
run = {
129+
"invocations": [
130+
{
131+
"ruleConfigurationOverrides": [
132+
{"descriptor": {"id": "id1"}, "configuration": {"level": "note"}}
133+
]
134+
},
135+
{
136+
"ruleConfigurationOverrides": [
137+
{"descriptor": {"index": 1}, "configuration": {"level": "note"}}
138+
]
139+
},
140+
{},
141+
],
142+
"tool": {
143+
"driver": {
144+
"rules": [
145+
{"id": "id0", "defaultConfiguration": {"level": "none"}},
146+
{"id": "id1", "defaultConfiguration": {"level": "error"}},
147+
]
148+
}
149+
},
150+
}
140151

141152
# If kind has the value "fail" and level is absent, then level SHALL be determined by the following procedure:
142153
# IF rule is present THEN
@@ -167,15 +178,15 @@ def test_read_result_severity():
167178
severity = sarif_file_utils.read_result_severity(result, run)
168179
assert severity == "error"
169180

170-
result = {"rule": { "index": 1}}
181+
result = {"rule": {"index": 1}}
171182
severity = sarif_file_utils.read_result_severity(result, run)
172183
assert severity == "error"
173184

174185
result = {"ruleId": "id1"}
175186
severity = sarif_file_utils.read_result_severity(result, run)
176187
assert severity == "error"
177188

178-
result = {"rule": { "id": "id1"}}
189+
result = {"rule": {"id": "id1"}}
179190
severity = sarif_file_utils.read_result_severity(result, run)
180191
assert severity == "error"
181192

0 commit comments

Comments
 (0)