Skip to content

Commit 45d76fa

Browse files
authored
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
1 parent e47f354 commit 45d76fa

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

coverage/xmlreport.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ def xml_file(self, fr: FileReporter, analysis: Analysis, has_arcs: bool) -> None
182182
rel_name = filename[len(source_path)+1:]
183183
break
184184
else:
185-
rel_name = fr.relative_filename()
185+
rel_name = fr.relative_filename().replace("\\", "/")
186186
self.source_paths.add(fr.filename[:-len(rel_name)].rstrip(r"\/"))
187187

188188
dirname = os.path.dirname(rel_name) or "."

tests/test_xml.py

+33
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,39 @@ def test_accented_directory(self) -> None:
318318
"name": "â",
319319
}
320320

321+
def test_no_duplicate_packages(self) -> None:
322+
self.make_file(
323+
"namespace/package/__init__.py",
324+
"from . import sample; from . import test; from .subpackage import test"
325+
)
326+
self.make_file("namespace/package/sample.py", "print('package.sample')")
327+
self.make_file("namespace/package/test.py", "print('package.test')")
328+
self.make_file("namespace/package/subpackage/test.py", "print('package.subpackage.test')")
329+
330+
# no source path passed to coverage!
331+
# problem occurs when they are dynamically generated during xml report
332+
cov = coverage.Coverage()
333+
334+
cov.start()
335+
import_local_file("foo", "namespace/package/__init__.py") # pragma: nested
336+
cov.stop() # pragma: nested
337+
338+
cov.xml_report()
339+
340+
dom = ElementTree.parse("coverage.xml")
341+
342+
# only two packages should be present
343+
packages = dom.findall(".//package")
344+
assert len(packages) == 2
345+
346+
# one of them is namespace.package
347+
named_package = dom.findall(".//package[@name='namespace.package']")
348+
assert len(named_package) == 1
349+
350+
# the other one namespace.package.subpackage
351+
named_sub_package = dom.findall(".//package[@name='namespace.package.subpackage']")
352+
assert len(named_sub_package) == 1
353+
321354

322355
def unbackslash(v: Any) -> Any:
323356
"""Find strings in `v`, and replace backslashes with slashes throughout."""

0 commit comments

Comments
 (0)