Skip to content

Commit b557d7b

Browse files
Fix sonar metadata (#824)
* Fix issue name and finding ID in Sonar metadata * Update fixed findings with metadata from ToolRule * Hardening suggestions for codemodder-python / fix-sonar-metadata (#825) Use Assignment Expression (Walrus) In Conditional Co-authored-by: pixeebot[bot] <104101892+pixeebot[bot]@users.noreply.github.com> --------- Co-authored-by: pixeebot[bot] <104101892+pixeebot[bot]@users.noreply.github.com>
1 parent 51344e5 commit b557d7b

File tree

4 files changed

+44
-3
lines changed

4 files changed

+44
-3
lines changed

src/codemodder/codemods/base_codemod.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ def detection_tool(self) -> DetectionTool | None:
131131
name=self._metadata.tool.name,
132132
)
133133

134+
@property
135+
def detection_tool_rules(self) -> list[ToolRule]:
136+
return self._metadata.tool.rules if self._metadata.tool else []
137+
134138
@cached_property
135139
def docs_module(self) -> Traversable:
136140
return importlib.resources.files(self.docs_module_path)

src/codemodder/context.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from codemodder.registry import CodemodRegistry
2626
from codemodder.result import ResultSet
2727
from codemodder.utils.timer import Timer
28+
from codemodder.utils.update_finding_metadata import update_finding_metadata
2829

2930
if TYPE_CHECKING:
3031
from openai import OpenAI
@@ -180,6 +181,11 @@ def process_results(self, codemod_id: str, results: Iterator[FileContext]):
180181
def compile_results(self, codemods: list[BaseCodemod]) -> list[CodeTFResult]:
181182
results = []
182183
for codemod in codemods:
184+
changesets = update_finding_metadata(
185+
codemod.detection_tool_rules,
186+
self.get_changesets(codemod.id),
187+
)
188+
183189
result = CodeTFResult(
184190
codemod=codemod.id,
185191
summary=codemod.summary,
@@ -188,7 +194,7 @@ def compile_results(self, codemods: list[BaseCodemod]) -> list[CodeTFResult]:
188194
references=codemod.references,
189195
properties={},
190196
failedFiles=[str(file) for file in self.get_failures(codemod.id)],
191-
changeset=self.get_changesets(codemod.id),
197+
changeset=changesets,
192198
unfixedFindings=self.get_unfixed_findings(codemod.id),
193199
)
194200

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from __future__ import annotations
2+
3+
import typing
4+
5+
if typing.TYPE_CHECKING:
6+
from codemodder.codemods.base_codemod import ToolRule
7+
8+
from codemodder.codetf import ChangeSet
9+
10+
11+
def update_finding_metadata(
12+
tool_rules: list[ToolRule],
13+
changesets: list[ChangeSet],
14+
) -> list[ChangeSet]:
15+
if not (tool_rule_map := {rule.id: (rule.name, rule.url) for rule in tool_rules}):
16+
return changesets
17+
18+
for changeset in changesets:
19+
for change in changeset.changes:
20+
for finding in change.findings or []:
21+
if finding.id in tool_rule_map:
22+
finding.rule.name = tool_rule_map[finding.id][0]
23+
finding.rule.url = tool_rule_map[finding.id][1]
24+
25+
# TODO: eventually make this functional and return a new list
26+
return changesets

src/core_codemods/sonar/results.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,21 @@ def from_result(cls, result: dict) -> Self:
4949
for flow in result.get("flows", [])
5050
]
5151

52+
finding_id = result.get("key", rule_id)
53+
54+
# Both issues and hotspots have a `message` key
55+
name = result.get("message", None) or rule_id
56+
5257
return cls(
53-
finding_id=rule_id,
58+
finding_id=finding_id,
5459
rule_id=rule_id,
5560
locations=locations,
5661
codeflows=all_flows,
5762
finding=Finding(
5863
id=rule_id,
5964
rule=Rule(
6065
id=rule_id,
61-
name=rule_id,
66+
name=name,
6267
url=sonar_url_from_id(rule_id),
6368
),
6469
),

0 commit comments

Comments
 (0)