From 45d76fa644b9f2e082de1721a55f91eacdcdc520 Mon Sep 17 00:00:00 2001 From: Benjamin Parzella Date: Wed, 15 Mar 2023 00:55:47 +0100 Subject: 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 --- coverage/xmlreport.py | 2 +- tests/test_xml.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) 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.""" -- cgit v1.2.1