39 |
39 |
40 self.source_paths = set() |
40 self.source_paths = set() |
41 if self.config.source: |
41 if self.config.source: |
42 for src in self.config.source: |
42 for src in self.config.source: |
43 if os.path.exists(src): |
43 if os.path.exists(src): |
44 self.source_paths.add(files.canonical_filename(src)) |
44 if not self.config.relative_files: |
|
45 src = files.canonical_filename(src) |
|
46 self.source_paths.add(src) |
45 self.packages = {} |
47 self.packages = {} |
46 self.xml_out = None |
48 self.xml_out = None |
47 |
49 |
48 def report(self, morfs, outfile=None): |
50 def report(self, morfs, outfile=None): |
49 """Generate a Cobertura-compatible XML report for `morfs`. |
51 """Generate a Cobertura-compatible XML report for `morfs`. |
138 return pct |
140 return pct |
139 |
141 |
140 def xml_file(self, fr, analysis, has_arcs): |
142 def xml_file(self, fr, analysis, has_arcs): |
141 """Add to the XML report for a single file.""" |
143 """Add to the XML report for a single file.""" |
142 |
144 |
|
145 if self.config.skip_empty: |
|
146 if analysis.numbers.n_statements == 0: |
|
147 return |
|
148 |
143 # Create the 'lines' and 'package' XML elements, which |
149 # Create the 'lines' and 'package' XML elements, which |
144 # are populated later. Note that a package == a directory. |
150 # are populated later. Note that a package == a directory. |
145 filename = fr.filename.replace("\\", "/") |
151 filename = fr.filename.replace("\\", "/") |
146 for source_path in self.source_paths: |
152 for source_path in self.source_paths: |
|
153 source_path = files.canonical_filename(source_path) |
147 if filename.startswith(source_path.replace("\\", "/") + "/"): |
154 if filename.startswith(source_path.replace("\\", "/") + "/"): |
148 rel_name = filename[len(source_path)+1:] |
155 rel_name = filename[len(source_path)+1:] |
149 break |
156 break |
150 else: |
157 else: |
151 rel_name = fr.relative_filename() |
158 rel_name = fr.relative_filename() |
|
159 self.source_paths.add(fr.filename[:-len(rel_name)].rstrip(r"\/")) |
152 |
160 |
153 dirname = os.path.dirname(rel_name) or u"." |
161 dirname = os.path.dirname(rel_name) or u"." |
154 dirname = "/".join(dirname.split("/")[:self.config.xml_package_depth]) |
162 dirname = "/".join(dirname.split("/")[:self.config.xml_package_depth]) |
155 package_name = dirname.replace("/", ".") |
163 package_name = dirname.replace("/", ".") |
156 |
164 |
157 if rel_name != fr.filename: |
|
158 self.source_paths.add(fr.filename[:-len(rel_name)].rstrip(r"\/")) |
|
159 package = self.packages.setdefault(package_name, [{}, 0, 0, 0, 0]) |
165 package = self.packages.setdefault(package_name, [{}, 0, 0, 0, 0]) |
160 |
166 |
161 xclass = self.xml_out.createElement("class") |
167 xclass = self.xml_out.createElement("class") |
162 |
168 |
163 xclass.appendChild(self.xml_out.createElement("methods")) |
169 xclass.appendChild(self.xml_out.createElement("methods")) |