Skip to content

Commit 398a49e

Browse files
committed
Preserve escaped test data section lines
1 parent 0e3b5db commit 398a49e

2 files changed

Lines changed: 49 additions & 2 deletions

File tree

mypy/test/test_update_data.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from __future__ import annotations
2+
3+
from types import SimpleNamespace
4+
from typing import cast
5+
from unittest import TestCase
6+
7+
from mypy.test.data import DataDrivenTestCase, DataFileFix
8+
from mypy.test.update_data import _iter_fixes
9+
10+
11+
class UpdateDataSuite(TestCase):
12+
def test_preserves_escaped_section_header_like_file_line(self) -> None:
13+
testcase = cast(
14+
DataDrivenTestCase,
15+
SimpleNamespace(
16+
data="[file foo.ini]\n\\[mypy]\npython_version = 3.14\n", line=1, name="testCase"
17+
),
18+
)
19+
20+
fixes = [fix for fix in _iter_fixes(testcase, [], incremental_step=1) if fix.lines]
21+
22+
assert fixes == [
23+
DataFileFix(lineno=3, end_lineno=5, lines=["\\[mypy]", "python_version = 3.14"])
24+
]
25+
26+
def test_escapes_updated_source_line_that_looks_like_section_header(self) -> None:
27+
testcase = cast(
28+
DataDrivenTestCase, SimpleNamespace(data="\\[1] + 1\n", line=1, name="testCase")
29+
)
30+
actual = ["main:1: error: Something sus [sus]"]
31+
32+
fixes = list(_iter_fixes(testcase, actual, incremental_step=1))
33+
34+
assert fixes == [
35+
DataFileFix(lineno=2, end_lineno=3, lines=["\\[1] + 1 # E: Something sus [sus]"])
36+
]

mypy/test/update_data.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,23 @@ def _iter_fixes(
7676
is_last = j == len(reports) - 1
7777
severity_char = severity[0].upper()
7878
continuation = "" if is_last else " \\"
79-
fix_lines.append(f"{out_l}{indent}# {severity_char}: {msg}{continuation}")
79+
fix_lines.append(
80+
_escape_section_header_like_line(
81+
f"{out_l}{indent}# {severity_char}: {msg}{continuation}"
82+
)
83+
)
8084
else:
81-
fix_lines.append(source_line)
85+
fix_lines.append(_escape_section_header_like_line(source_line))
8286

8387
yield DataFileFix(
8488
lineno=testcase.line + test_item.line - 1,
8589
end_lineno=testcase.line + test_item.end_line - 1,
8690
lines=fix_lines + [""] * test_item.trimmed_newlines,
8791
)
92+
93+
94+
def _escape_section_header_like_line(line: str) -> str:
95+
"""Escape source lines that would be parsed as .test section headers."""
96+
if line.startswith("[") and line.strip().endswith("]"):
97+
return f"\\{line}"
98+
return line

0 commit comments

Comments
 (0)