summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2023-01-02 11:33:52 -0500
committerNed Batchelder <ned@nedbatchelder.com>2023-01-02 12:31:49 -0500
commitd08e6d08cb01d07209bcc5a96807e48eeb593ed9 (patch)
tree35a5658e4441cde4d32e09cda15a0de42cada672
parent3f0bce2f5f4658bfa1d9cd6ddb2f6d7e520897e8 (diff)
downloadpython-coveragepy-git-d08e6d08cb01d07209bcc5a96807e48eeb593ed9.tar.gz
fix: relative_files should keep relative path maps. #1519
-rw-r--r--CHANGES.rst5
-rw-r--r--coverage/files.py13
-rw-r--r--tests/test_files.py14
3 files changed, 26 insertions, 6 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index 352ddb65..fa83063d 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -20,6 +20,10 @@ development at the same time, such as 4.5.x and 5.0.
Unreleased
----------
+- Fix: when using the ``[run] relative_files = True`` setting, a relative
+ ``[paths]`` pattern was still being made absolute. This is now fixed,
+ closing `issue 1519`_.
+
- Fix: if Python doesn't provide tomllib, then TOML configuration files can
only be read if coverage.py is installed with the ``[toml]`` extra.
Coverage.py will raise an error if toml support is not installed when it sees
@@ -41,6 +45,7 @@ Unreleased
.. _issue 1515: https://github.com/nedbat/coveragepy/issues/1515
.. _issue 1516: https://github.com/nedbat/coveragepy/issues/1516
+.. _issue 1519: https://github.com/nedbat/coveragepy/issues/1519
.. _changes_7-0-1:
diff --git a/coverage/files.py b/coverage/files.py
index ed37067f..11dbdaa3 100644
--- a/coverage/files.py
+++ b/coverage/files.py
@@ -395,7 +395,11 @@ class PathAliases:
map a path through those aliases to produce a unified path.
"""
- def __init__(self, debugfn:Optional[Callable[[str], None]]=None, relative:bool=False) -> None:
+ def __init__(
+ self,
+ debugfn: Optional[Callable[[str], None]]=None,
+ relative: bool=False,
+ ) -> None:
# A list of (original_pattern, regex, result)
self.aliases: List[Tuple[str, Regex, str]] = []
self.debugfn = debugfn or (lambda msg: 0)
@@ -431,10 +435,11 @@ class PathAliases:
if pattern.endswith("*"):
raise ConfigError("Pattern must not end with wildcards.")
- # The pattern is meant to match a filepath. Let's make it absolute
+ # The pattern is meant to match a file path. Let's make it absolute
# unless it already is, or is meant to match any prefix.
- if not pattern.startswith('*') and not isabs_anywhere(pattern + pattern_sep):
- pattern = abs_file(pattern)
+ if not self.relative:
+ if not pattern.startswith('*') and not isabs_anywhere(pattern + pattern_sep):
+ pattern = abs_file(pattern)
if not pattern.endswith(pattern_sep):
pattern += pattern_sep
diff --git a/tests/test_files.py b/tests/test_files.py
index 54c91628..2d029a04 100644
--- a/tests/test_files.py
+++ b/tests/test_files.py
@@ -17,7 +17,9 @@ from coverage.files import (
GlobMatcher, ModuleMatcher, PathAliases, TreeMatcher, abs_file,
actual_path, find_python_files, flat_rootname, globs_to_regex,
)
+
from tests.coveragetest import CoverageTest
+from tests.helpers import os_sep
class FilesTest(CoverageTest):
@@ -415,8 +417,16 @@ class PathAliasesTest(CoverageTest):
# The result shouldn't start with "./" if the map result didn't.
aliases = PathAliases(relative=rel_yn)
aliases.add('*/project', '.')
- # Because the map result has no slash, the actual result is os-dependent.
- self.assert_mapped(aliases, '/ned/home/project/src/a.py', f'src{os.sep}a.py')
+ self.assert_mapped(aliases, '/ned/home/project/src/a.py', os_sep('src/a.py'))
+
+ def test_relative_pattern(self):
+ aliases = PathAliases(relative=True)
+ aliases.add(".tox/*/site-packages", "src")
+ self.assert_mapped(
+ aliases,
+ ".tox/py314/site-packages/proj/a.py",
+ os_sep("src/proj/a.py"),
+ )
def test_multiple_patterns(self, rel_yn):
# also test the debugfn...