third_party.pylibs.pylint.src/pylint/testutils/functional/lint_module_output_update.py
Pierre Sassoulas 9e0baf370a Simplify hard to maintain copyright notice
git is the source of truth for the copyright, copyrite (the tool)
was taking exponentially longer with each release, and it's
polluting the code with sometime as much as 50 lines of names.
2022-03-24 13:06:15 +01:00

56 lines
2.1 KiB
Python

# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/PyCQA/pylint/graphs/contributors
import csv
import os
from typing import List, Optional
from _pytest.config import Config
from pylint.constants import PY38_PLUS
from pylint.testutils.functional.test_file import FunctionalTestFile
from pylint.testutils.lint_module_test import LintModuleTest, MessageCounter
from pylint.testutils.output_line import OutputLine
class LintModuleOutputUpdate(LintModuleTest):
"""Class to be used if expected output files should be updated instead of checked."""
class TestDialect(csv.excel):
"""Dialect used by the csv writer."""
delimiter = ":"
lineterminator = "\n"
csv.register_dialect("test", TestDialect)
def __init__(
self, test_file: FunctionalTestFile, config: Optional[Config] = None
) -> None:
if not PY38_PLUS:
raise RuntimeError(
"You need at least python 3.8 for the functional test updater to work. "
"This is because python 3.8 includes a new AST parser, which amongst others "
"returns the end line and end column of most nodes."
)
super().__init__(test_file, config)
def _check_output_text(
self,
_: MessageCounter,
expected_output: List[OutputLine],
actual_output: List[OutputLine],
) -> None:
"""Overwrite or remove the expected output file based on actual output."""
# Remove the file if no output is actually expected and a file exists
if not expected_output and not actual_output:
if os.path.exists(self._test_file.expected_output):
os.remove(self._test_file.expected_output)
return
# Write file with expected output
with open(self._test_file.expected_output, "w", encoding="utf-8") as f:
writer = csv.writer(f, dialect="test")
for line in actual_output:
writer.writerow(line.to_csv())