From 398a49ef82818610aacd3f4830bb1ed9a00df661 Mon Sep 17 00:00:00 2001 From: Tarun Bandi <57272137+tarun-bandi@users.noreply.github.com> Date: Fri, 24 Jul 2026 21:05:14 -0700 Subject: [PATCH] Preserve escaped test data section lines --- mypy/test/test_update_data.py | 36 +++++++++++++++++++++++++++++++++++ mypy/test/update_data.py | 15 +++++++++++++-- 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 mypy/test/test_update_data.py diff --git a/mypy/test/test_update_data.py b/mypy/test/test_update_data.py new file mode 100644 index 0000000000000..cc6e5a3c2b4b7 --- /dev/null +++ b/mypy/test/test_update_data.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +from types import SimpleNamespace +from typing import cast +from unittest import TestCase + +from mypy.test.data import DataDrivenTestCase, DataFileFix +from mypy.test.update_data import _iter_fixes + + +class UpdateDataSuite(TestCase): + def test_preserves_escaped_section_header_like_file_line(self) -> None: + testcase = cast( + DataDrivenTestCase, + SimpleNamespace( + data="[file foo.ini]\n\\[mypy]\npython_version = 3.14\n", line=1, name="testCase" + ), + ) + + fixes = [fix for fix in _iter_fixes(testcase, [], incremental_step=1) if fix.lines] + + assert fixes == [ + DataFileFix(lineno=3, end_lineno=5, lines=["\\[mypy]", "python_version = 3.14"]) + ] + + def test_escapes_updated_source_line_that_looks_like_section_header(self) -> None: + testcase = cast( + DataDrivenTestCase, SimpleNamespace(data="\\[1] + 1\n", line=1, name="testCase") + ) + actual = ["main:1: error: Something sus [sus]"] + + fixes = list(_iter_fixes(testcase, actual, incremental_step=1)) + + assert fixes == [ + DataFileFix(lineno=2, end_lineno=3, lines=["\\[1] + 1 # E: Something sus [sus]"]) + ] diff --git a/mypy/test/update_data.py b/mypy/test/update_data.py index 84b6383b3f0cf..077bed7bb786a 100644 --- a/mypy/test/update_data.py +++ b/mypy/test/update_data.py @@ -76,12 +76,23 @@ def _iter_fixes( is_last = j == len(reports) - 1 severity_char = severity[0].upper() continuation = "" if is_last else " \\" - fix_lines.append(f"{out_l}{indent}# {severity_char}: {msg}{continuation}") + fix_lines.append( + _escape_section_header_like_line( + f"{out_l}{indent}# {severity_char}: {msg}{continuation}" + ) + ) else: - fix_lines.append(source_line) + fix_lines.append(_escape_section_header_like_line(source_line)) yield DataFileFix( lineno=testcase.line + test_item.line - 1, end_lineno=testcase.line + test_item.end_line - 1, lines=fix_lines + [""] * test_item.trimmed_newlines, ) + + +def _escape_section_header_like_line(line: str) -> str: + """Escape source lines that would be parsed as .test section headers.""" + if line.startswith("[") and line.strip().endswith("]"): + return f"\\{line}" + return line