summaryrefslogtreecommitdiff
path: root/coverage/xmlreport.py
diff options
context:
space:
mode:
Diffstat (limited to 'coverage/xmlreport.py')
-rw-r--r--coverage/xmlreport.py38
1 files changed, 24 insertions, 14 deletions
diff --git a/coverage/xmlreport.py b/coverage/xmlreport.py
index d7c2f44a..dbda5f28 100644
--- a/coverage/xmlreport.py
+++ b/coverage/xmlreport.py
@@ -4,12 +4,14 @@
"""XML reporting for coverage.py"""
import os
+import os.path
import sys
import time
import xml.dom.minidom
from coverage import env
from coverage import __url__, __version__, files
+from coverage.backward import iitems
from coverage.misc import isolate_module
from coverage.report import Reporter
@@ -38,6 +40,10 @@ class XmlReporter(Reporter):
super(XmlReporter, self).__init__(coverage, config)
self.source_paths = set()
+ if config.source:
+ for src in config.source:
+ if os.path.exists(src):
+ self.source_paths.add(files.canonical_filename(src))
self.packages = {}
self.xml_out = None
self.has_arcs = coverage.data.has_arcs()
@@ -86,15 +92,14 @@ class XmlReporter(Reporter):
xcoverage.appendChild(xpackages)
# Populate the XML DOM with the package info.
- for pkg_name in sorted(self.packages.keys()):
- pkg_data = self.packages[pkg_name]
+ for pkg_name, pkg_data in sorted(iitems(self.packages)):
class_elts, lhits, lnum, bhits, bnum = pkg_data
xpackage = self.xml_out.createElement("package")
xpackages.appendChild(xpackage)
xclasses = self.xml_out.createElement("classes")
xpackage.appendChild(xclasses)
- for class_name in sorted(class_elts.keys()):
- xclasses.appendChild(class_elts[class_name])
+ for _, class_elt in sorted(iitems(class_elts)):
+ xclasses.appendChild(class_elt)
xpackage.setAttribute("name", pkg_name.replace(os.sep, '.'))
xpackage.setAttribute("line-rate", rate(lhits, lnum))
if self.has_arcs:
@@ -135,15 +140,20 @@ class XmlReporter(Reporter):
# Create the 'lines' and 'package' XML elements, which
# are populated later. Note that a package == a directory.
- filename = fr.relative_filename()
- filename = filename.replace("\\", "/")
- dirname = os.path.dirname(filename) or "."
- parts = dirname.split("/")
- dirname = "/".join(parts[:self.config.xml_package_depth])
+ filename = fr.filename.replace("\\", "/")
+ for source_path in self.source_paths:
+ if filename.startswith(source_path.replace("\\", "/") + "/"):
+ rel_name = filename[len(source_path)+1:]
+ break
+ else:
+ rel_name = fr.relative_filename()
+
+ dirname = os.path.dirname(rel_name) or "."
+ dirname = "/".join(dirname.split("/")[:self.config.xml_package_depth])
package_name = dirname.replace("/", ".")
- className = fr.relative_filename()
- self.source_paths.add(files.relative_directory().rstrip('/'))
+ if rel_name != fr.filename:
+ self.source_paths.add(fr.filename[:-len(rel_name)].rstrip(r"\/"))
package = self.packages.setdefault(package_name, [{}, 0, 0, 0, 0])
xclass = self.xml_out.createElement("class")
@@ -153,8 +163,8 @@ class XmlReporter(Reporter):
xlines = self.xml_out.createElement("lines")
xclass.appendChild(xlines)
- xclass.setAttribute("name", os.path.relpath(filename, dirname))
- xclass.setAttribute("filename", filename)
+ xclass.setAttribute("name", os.path.relpath(rel_name, dirname))
+ xclass.setAttribute("filename", fr.relative_filename().replace("\\", "/"))
xclass.setAttribute("complexity", "0")
branch_stats = analysis.branch_stats()
@@ -201,7 +211,7 @@ class XmlReporter(Reporter):
branch_rate = "0"
xclass.setAttribute("branch-rate", branch_rate)
- package[0][className] = xclass
+ package[0][rel_name] = xclass
package[1] += class_hits
package[2] += class_lines
package[3] += class_br_hits