Skip to content

Commit

Permalink
fix: source paths with trailing slashes causing inconsistent sources …
Browse files Browse the repository at this point in the history
…in XML report with relative_paths (#1608)

* Added failing test for source with trailing slash

This test is nearly identical to the one above it, with the only
change being the source that is used. This may end up turning into
a fixture instead if the tests end up being identical after the
fix is made.

* Strip trailing slash for relative source paths

This fixes an issue introduced in 45cf793
where using `relative_files=True` and `src` with a trailing slash,
the source inserted as `<sources>` in the XML report would also have
a trailing slash. This also fixes an issue introduced in the same
commit where an empty `<source>` would be inserted as well for cases
where the `src` has a trailing slash.
  • Loading branch information
kevin-brown committed Apr 27, 2023
1 parent 74b1758 commit df1bf08
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 1 deletion.
2 changes: 2 additions & 0 deletions coverage/xmlreport.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ def __init__(self, coverage: Coverage) -> None:
if os.path.exists(src):
if not self.config.relative_files:
src = files.canonical_filename(src)
else:
src = src.rstrip(r"\/")
self.source_paths.add(src)
self.packages: Dict[str, PackageData] = {}
self.xml_out: xml.dom.minidom.Document
Expand Down
15 changes: 14 additions & 1 deletion tests/test_xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ def test_accented_directory(self) -> None:

def test_no_duplicate_packages(self) -> None:
self.make_file(
"namespace/package/__init__.py",
"namespace/package/__init__.py",
"from . import sample; from . import test; from .subpackage import test"
)
self.make_file("namespace/package/sample.py", "print('package.sample')")
Expand Down Expand Up @@ -489,6 +489,19 @@ def test_relative_source(self) -> None:
elts = dom.findall(".//sources/source")
assert [elt.text for elt in elts] == ["src"]

def test_relative_source_trailing_slash(self) -> None:
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: str, actual: str, actual_extra: bool = False) -> None:
"""Specialized compare function for our XML files."""
Expand Down

0 comments on commit df1bf08

Please sign in to comment.