Skip to content

Commit 9427529

Browse files
authored
Use 1-based line numbers for RegexTransformer changes (#759)
* Use 1-based line numbers for RegexTransformer changes * Add line number validation to CodeTF Change model
1 parent adeef45 commit 9427529

File tree

4 files changed

+21
-5
lines changed

4 files changed

+21
-5
lines changed

src/codemodder/codemods/regex_transformer.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111

1212

1313
class RegexTransformerPipeline(BaseTransformerPipeline):
14-
pattern: Pattern
14+
pattern: Pattern | str
1515
replacement: str
1616
change_description: str
1717

18-
def __init__(self, pattern: Pattern, replacement: str, change_description: str):
18+
def __init__(
19+
self, pattern: Pattern | str, replacement: str, change_description: str
20+
):
1921
super().__init__()
2022
self.pattern = pattern
2123
self.replacement = replacement
@@ -27,6 +29,7 @@ def apply(
2729
file_context: FileContext,
2830
results: list[Result] | None,
2931
) -> ChangeSet | None:
32+
del results
3033

3134
changes = []
3235
updated_lines = []
@@ -35,12 +38,13 @@ def apply(
3538
original_lines = f.readlines()
3639

3740
for lineno, line in enumerate(original_lines):
41+
# TODO: use results to filter out which lines to change
3842
changed_line = re.sub(self.pattern, self.replacement, line)
3943
updated_lines.append(changed_line)
4044
if line != changed_line:
4145
changes.append(
4246
Change(
43-
lineNumber=lineno,
47+
lineNumber=lineno + 1,
4448
description=self.change_description,
4549
findings=file_context.get_findings_for_location(lineno),
4650
)

src/codemodder/codetf.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ class Change(BaseModel):
5454
packageActions: Optional[list[PackageAction]] = None
5555
findings: Optional[list[Finding]] = None
5656

57+
@model_validator(mode="after")
58+
def validate_lineNumber(self):
59+
if self.lineNumber < 1:
60+
raise ValueError("lineNumber must be greater than 0")
61+
return self
62+
5763

5864
class AIMetadata(BaseModel):
5965
provider: Optional[str] = None

tests/test_codetf.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ def test_change_diffside(side):
5858
assert change.model_dump()["diffSide"] == side
5959

6060

61+
def test_change_invalid_line_number():
62+
with pytest.raises(ValueError):
63+
Change(lineNumber=0, description="Change 1 to 2")
64+
65+
6166
def test_write_codetf(tmpdir, mocker, codetf_schema):
6267
path = tmpdir / "test.codetf.json"
6368

tests/test_regex_transformer.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def test_transformer_no_change(mocker, caplog, tmp_path_factory):
2020
dry_run=True,
2121
verbose=False,
2222
registry=mocker.MagicMock(),
23-
providers=None,
23+
providers=mocker.MagicMock(),
2424
repo_manager=mocker.MagicMock(),
2525
path_include=[],
2626
path_exclude=[],
@@ -53,7 +53,7 @@ def test_transformer(mocker, tmp_path_factory):
5353
dry_run=False,
5454
verbose=False,
5555
registry=mocker.MagicMock(),
56-
providers=None,
56+
providers=mocker.MagicMock(),
5757
repo_manager=mocker.MagicMock(),
5858
path_include=[],
5959
path_exclude=[],
@@ -69,3 +69,4 @@ def test_transformer(mocker, tmp_path_factory):
6969
)
7070
assert changeset is not None
7171
assert code.read_text() == text.replace("hello", "bye")
72+
assert changeset.changes[0].lineNumber == 1

0 commit comments

Comments
 (0)