From 1ac2de6cef6c9f34999bd27e0c72e452a6397458 Mon Sep 17 00:00:00 2001 From: Peter Bittner Date: Wed, 11 Nov 2026 20:40:26 +0100 Subject: [PATCH] Clean up coverage data files of parallel runs With pytest-xdist, coverage writes one data file per process, named `.coverage..pid.Xx`, optionally followed by `.Hh`. Without `coverage combine`, they stay behind. The coverage topic now removes them, but not `.coveragerc` or other files. --- README.rst | 2 +- pyclean/debris.py | 1 + tests/test_debris.py | 21 +++++++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 7d24bac..e5b72d6 100644 --- a/README.rst +++ b/README.rst @@ -200,7 +200,7 @@ popular Python development tools in their default locations, along with Python bytecode. The following topics are currently covered: - Cache (general purpose folder for several tools, e.g. Python eggs, legacy Pytest) -- Coverage (coverage database, and supported file formats) +- Coverage (coverage database, also of parallel runs, and supported file formats) - Packaging (build files and folders) - Pytest (build files and folders) - Ruff (ruff cache folder) diff --git a/pyclean/debris.py b/pyclean/debris.py index c16cd08..ef8c041 100644 --- a/pyclean/debris.py +++ b/pyclean/debris.py @@ -25,6 +25,7 @@ ], 'coverage': [ '.coverage', + '.coverage.*.pid*.X*', 'coverage.json', 'coverage.lcov', 'coverage.xml', diff --git a/tests/test_debris.py b/tests/test_debris.py index 5baa565..7c5f5ba 100644 --- a/tests/test_debris.py +++ b/tests/test_debris.py @@ -106,6 +106,27 @@ def test_debris_recursive(): assert dir_nested_topic.parent.exists() +def test_debris_coverage_parallel_data_files(): + """ + Are the data files of parallel coverage runs deleted, but not the + coverage configuration? + """ + with TemporaryDirectory() as tmp: + directory = Path(tmp) + data_files = [ + directory / '.coverage.myhost.pid1234.XqzCbEdx', + directory / '.coverage.myhost.pid1234.XqzCbEdx.Ha0jIIxXkNjh', + ] + config_file = directory / '.coveragerc' + for file in [*data_files, config_file]: + file.touch() + + remove_debris_for('coverage', directory) + + assert not any(file.exists() for file in data_files) + assert config_file.exists() + + def test_detect_debris_in_directory(): """ Does ``detect_debris_in_directory()`` identify debris artifacts?