From 7a094fa826aed5f0d2182744261b71a2f39c7396 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 30 Oct 2022 15:11:56 -0400 Subject: [PATCH] ensure results are sorted for file traversal --- src/flake8/checker.py | 4 +++- tests/integration/test_main.py | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/flake8/checker.py b/src/flake8/checker.py index 2d7bcd9..2cae545 100644 --- a/src/flake8/checker.py +++ b/src/flake8/checker.py @@ -6,6 +6,7 @@ import contextlib import errno import logging import multiprocessing.pool +import operator import signal import tokenize from typing import Any @@ -180,8 +181,9 @@ class Manager: A tuple of the total results found and the results reported. """ results_reported = results_found = 0 + self.results.sort(key=operator.itemgetter(0)) for filename, results, _ in self.results: - results.sort(key=lambda tup: (tup[1], tup[2])) + results.sort(key=operator.itemgetter(1, 2)) with self.style_guide.processing_file(filename): results_reported += self._handle_results(filename, results) results_found += len(results) diff --git a/tests/integration/test_main.py b/tests/integration/test_main.py index db60f6b..96d1182 100644 --- a/tests/integration/test_main.py +++ b/tests/integration/test_main.py @@ -98,6 +98,26 @@ t.py:1:1: F401 'os' imported but unused assert err == "" +def test_errors_sorted(tmpdir, capsys): + with tmpdir.as_cwd(): + for c in "abcde": + tmpdir.join(f"{c}.py").write("import os\n") + assert cli.main(["./"]) == 1 + + # file traversal was done in inode-order before + # this uses a significant number of files such that it's unlikely to pass + expected = """\ +./a.py:1:1: F401 'os' imported but unused +./b.py:1:1: F401 'os' imported but unused +./c.py:1:1: F401 'os' imported but unused +./d.py:1:1: F401 'os' imported but unused +./e.py:1:1: F401 'os' imported but unused +""" + out, err = capsys.readouterr() + assert out == expected + assert err == "" + + def test_extend_exclude(tmpdir, capsys): """Ensure that `flake8 --extend-exclude` works.""" for d in ["project", "vendor", "legacy", ".git", ".tox", ".hg"]: