summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2020-03-15 18:48:38 -0400
committerNed Batchelder <ned@nedbatchelder.com>2020-03-15 18:48:38 -0400
commitf668d6f32e2d0864ee84e5f556860a085bc6ecfb (patch)
tree16e256dae636b1fab94475151b42f716cb5cc1ab
parentfa2e0e49fea9f6cbaab9e2dc3a203dc59b8fb2c2 (diff)
downloadpython-coveragepy-git-f668d6f32e2d0864ee84e5f556860a085bc6ecfb.tar.gz
relative_files makes XML store relative paths. #948.
-rw-r--r--CHANGES.rst5
-rw-r--r--coverage/xmlreport.py8
-rw-r--r--tests/test_xml.py13
3 files changed, 23 insertions, 3 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index faed03d5..2407bc3f 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 ``<source>`` 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 265bf02c..ad44775f 100644
--- a/coverage/xmlreport.py
+++ b/coverage/xmlreport.py
@@ -41,7 +41,9 @@ class XmlReporter(object):
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 @@ class XmlReporter(object):
# 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 93fee9b7..0d789fca 100644
--- a/tests/test_xml.py
+++ b/tests/test_xml.py
@@ -370,6 +370,19 @@ class XmlPackageStructureTest(XmlTestHelpers, CoverageTest):
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."""