From f668d6f32e2d0864ee84e5f556860a085bc6ecfb Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 15 Mar 2020 18:48:38 -0400 Subject: [PATCH] relative_files makes XML store relative paths. #948. --- CHANGES.rst | 5 +++++ coverage/xmlreport.py | 8 +++++--- tests/test_xml.py | 13 +++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index faed03d5c..2407bc3fd 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -26,6 +26,10 @@ Unreleased - Updated Python 3.9 support to 3.9a4. +- If using the ``[run] relative_files`` setting, the XML report will use + relative files in the ```` elements indicating the location of source + code. Closes `issue 948`_. + - The textual summary report could report missing lines with negative line numbers on PyPy3 7.1 (`issue 943`_). This is now fixed. @@ -39,6 +43,7 @@ Unreleased .. _issue 943: https://github.com/nedbat/coveragepy/issues/943 .. _issue 944: https://github.com/nedbat/coveragepy/issues/944 .. _pull request 945: https://github.com/nedbat/coveragepy/pull/945 +.. _issue 948: https://github.com/nedbat/coveragepy/issues/948 .. _issue 949: https://github.com/nedbat/coveragepy/issues/949 diff --git a/coverage/xmlreport.py b/coverage/xmlreport.py index 265bf02cf..ad44775f2 100644 --- a/coverage/xmlreport.py +++ b/coverage/xmlreport.py @@ -41,7 +41,9 @@ def __init__(self, coverage): if self.config.source: for src in self.config.source: if os.path.exists(src): - self.source_paths.add(files.canonical_filename(src)) + if not self.config.relative_files: + src = files.canonical_filename(src) + self.source_paths.add(src) self.packages = {} self.xml_out = None @@ -144,18 +146,18 @@ def xml_file(self, fr, analysis, has_arcs): # are populated later. Note that a package == a directory. filename = fr.filename.replace("\\", "/") for source_path in self.source_paths: + source_path = files.canonical_filename(source_path) if filename.startswith(source_path.replace("\\", "/") + "/"): rel_name = filename[len(source_path)+1:] break else: rel_name = fr.relative_filename() + self.source_paths.add(fr.filename[:-len(rel_name)].rstrip(r"\/")) dirname = os.path.dirname(rel_name) or u"." dirname = "/".join(dirname.split("/")[:self.config.xml_package_depth]) package_name = dirname.replace("/", ".") - if rel_name != fr.filename: - self.source_paths.add(fr.filename[:-len(rel_name)].rstrip(r"\/")) package = self.packages.setdefault(package_name, [{}, 0, 0, 0, 0]) xclass = self.xml_out.createElement("class") diff --git a/tests/test_xml.py b/tests/test_xml.py index 93fee9b7b..0d789fca2 100644 --- a/tests/test_xml.py +++ b/tests/test_xml.py @@ -370,6 +370,19 @@ def test_source_prefix(self): dom = ElementTree.parse("coverage.xml") self.assert_source(dom, "src") + def test_relative_source(self): + self.make_file("src/mod.py", "print(17)") + cov = coverage.Coverage(source=["src"]) + cov.set_option("run:relative_files", True) + self.start_import_stop(cov, "mod", modfile="src/mod.py") + cov.xml_report() + + with open("coverage.xml") as x: + print(x.read()) + dom = ElementTree.parse("coverage.xml") + elts = dom.findall(".//sources/source") + assert [elt.text for elt in elts] == ["src"] + def compare_xml(expected, actual, **kwargs): """Specialized compare function for our XML files."""