Skip to content

Commit

Permalink
fix: generate xml report packages correctly on windows (#1574)
Browse files Browse the repository at this point in the history
* fix: generate xml report packages correctly on windows

* test: check duplicate package names in xml report

* fix: shorten long line in test_xml
  • Loading branch information
bparzella committed Mar 14, 2023
1 parent e47f354 commit 45d76fa
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 1 deletion.
2 changes: 1 addition & 1 deletion coverage/xmlreport.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ def xml_file(self, fr: FileReporter, analysis: Analysis, has_arcs: bool) -> None
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 "."
Expand Down
33 changes: 33 additions & 0 deletions tests/test_xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,39 @@ def test_accented_directory(self) -> None:
"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."""
Expand Down

0 comments on commit 45d76fa

Please sign in to comment.