summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Parzella <bparzella@gmail.com>2023-03-15 00:55:47 +0100
committerGitHub <noreply@github.com>2023-03-14 16:55:47 -0700
commit45d76fa644b9f2e082de1721a55f91eacdcdc520 (patch)
tree986c21b5def79165382a8e50efeb265a84770016
parente47f35462dc7e8b28d2fa94de65a1bf34608d4c8 (diff)
downloadpython-coveragepy-git-45d76fa644b9f2e082de1721a55f91eacdcdc520.tar.gz
fix: generate xml report packages correctly on windows (#1574)
* fix: generate xml report packages correctly on windows * test: check duplicate package names in xml report * fix: shorten long line in test_xml
-rw-r--r--coverage/xmlreport.py2
-rw-r--r--tests/test_xml.py33
2 files changed, 34 insertions, 1 deletions
diff --git a/coverage/xmlreport.py b/coverage/xmlreport.py
index 65da11d2..fd2e9f81 100644
--- a/coverage/xmlreport.py
+++ b/coverage/xmlreport.py
@@ -182,7 +182,7 @@ class XmlReporter:
rel_name = filename[len(source_path)+1:]
break
else:
- rel_name = fr.relative_filename()
+ rel_name = fr.relative_filename().replace("\\", "/")
self.source_paths.add(fr.filename[:-len(rel_name)].rstrip(r"\/"))
dirname = os.path.dirname(rel_name) or "."
diff --git a/tests/test_xml.py b/tests/test_xml.py
index c21a9dd4..94b310e3 100644
--- a/tests/test_xml.py
+++ b/tests/test_xml.py
@@ -318,6 +318,39 @@ class XmlReportTest(XmlTestHelpers, CoverageTest):
"name": "รข",
}
+ def test_no_duplicate_packages(self) -> None:
+ self.make_file(
+ "namespace/package/__init__.py",
+ "from . import sample; from . import test; from .subpackage import test"
+ )
+ self.make_file("namespace/package/sample.py", "print('package.sample')")
+ self.make_file("namespace/package/test.py", "print('package.test')")
+ self.make_file("namespace/package/subpackage/test.py", "print('package.subpackage.test')")
+
+ # no source path passed to coverage!
+ # problem occurs when they are dynamically generated during xml report
+ cov = coverage.Coverage()
+
+ cov.start()
+ import_local_file("foo", "namespace/package/__init__.py") # pragma: nested
+ cov.stop() # pragma: nested
+
+ cov.xml_report()
+
+ dom = ElementTree.parse("coverage.xml")
+
+ # only two packages should be present
+ packages = dom.findall(".//package")
+ assert len(packages) == 2
+
+ # one of them is namespace.package
+ named_package = dom.findall(".//package[@name='namespace.package']")
+ assert len(named_package) == 1
+
+ # the other one namespace.package.subpackage
+ named_sub_package = dom.findall(".//package[@name='namespace.package.subpackage']")
+ assert len(named_sub_package) == 1
+
def unbackslash(v: Any) -> Any:
"""Find strings in `v`, and replace backslashes with slashes throughout."""