diff options
Diffstat (limited to 'coverage/xmlreport.py')
-rw-r--r-- | coverage/xmlreport.py | 38 |
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 |