DebugClients/Python3/coverage/xmlreport.py

changeset 5051
3586ebd9fac8
parent 4489
d0d6e4ad31bd
--- a/DebugClients/Python3/coverage/xmlreport.py	Sat Jul 23 13:33:54 2016 +0200
+++ b/DebugClients/Python3/coverage/xmlreport.py	Sun Jul 24 12:01:01 2016 +0200
@@ -4,13 +4,20 @@
 """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
 
+os = isolate_module(os)
+
+
 DTD_URL = (
     'https://raw.githubusercontent.com/cobertura/web/'
     'f0366e5e2cf18f111cbd61fc34ef720a6584ba02'
@@ -33,6 +40,10 @@
         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()
@@ -81,15 +92,14 @@
         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:
@@ -112,7 +122,10 @@
         xcoverage.setAttribute("branch-rate", branch_rate)
 
         # Use the DOM to write the output file.
-        outfile.write(self.xml_out.toprettyxml())
+        out = self.xml_out.toprettyxml()
+        if env.PY2:
+            out = out.encode("utf8")
+        outfile.write(out)
 
         # Return the total percentage.
         denom = lnum_tot + bnum_tot
@@ -127,15 +140,20 @@
 
         # 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")
@@ -145,8 +163,8 @@
         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()
@@ -193,7 +211,7 @@
             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

eric ide

mercurial