93 |
94 |
94 `plugin` is a :class:`CoveragePlugin` instance to add. `specialized` |
95 `plugin` is a :class:`CoveragePlugin` instance to add. `specialized` |
95 is a list to append the plugin to. |
96 is a list to append the plugin to. |
96 |
97 |
97 """ |
98 """ |
98 plugin_name = "%s.%s" % (self.current_module, plugin.__class__.__name__) |
99 plugin_name = f"{self.current_module}.{plugin.__class__.__name__}" |
99 if self.debug and self.debug.should('plugin'): |
100 if self.debug and self.debug.should('plugin'): |
100 self.debug.write("Loaded plugin %r: %r" % (self.current_module, plugin)) |
101 self.debug.write(f"Loaded plugin {self.current_module!r}: {plugin!r}") |
101 labelled = LabelledDebug("plugin %r" % (self.current_module,), self.debug) |
102 labelled = LabelledDebug(f"plugin {self.current_module!r}", self.debug) |
102 plugin = DebugPluginWrapper(plugin, labelled) |
103 plugin = DebugPluginWrapper(plugin, labelled) |
103 |
104 |
104 # pylint: disable=attribute-defined-outside-init |
105 # pylint: disable=attribute-defined-outside-init |
105 plugin._coverage_plugin_name = plugin_name |
106 plugin._coverage_plugin_name = plugin_name |
106 plugin._coverage_enabled = True |
107 plugin._coverage_enabled = True |
138 prefixes = self.labels + [''] |
139 prefixes = self.labels + [''] |
139 return ":\n".join(" "*i+label for i, label in enumerate(prefixes)) |
140 return ":\n".join(" "*i+label for i, label in enumerate(prefixes)) |
140 |
141 |
141 def write(self, message): |
142 def write(self, message): |
142 """Write `message`, but with the labels prepended.""" |
143 """Write `message`, but with the labels prepended.""" |
143 self.debug.write("%s%s" % (self.message_prefix(), message)) |
144 self.debug.write(f"{self.message_prefix()}{message}") |
144 |
145 |
145 |
146 |
146 class DebugPluginWrapper(CoveragePlugin): |
147 class DebugPluginWrapper(CoveragePlugin): |
147 """Wrap a plugin, and use debug to report on what it's doing.""" |
148 """Wrap a plugin, and use debug to report on what it's doing.""" |
148 |
149 |
149 def __init__(self, plugin, debug): |
150 def __init__(self, plugin, debug): |
150 super(DebugPluginWrapper, self).__init__() |
151 super().__init__() |
151 self.plugin = plugin |
152 self.plugin = plugin |
152 self.debug = debug |
153 self.debug = debug |
153 |
154 |
154 def file_tracer(self, filename): |
155 def file_tracer(self, filename): |
155 tracer = self.plugin.file_tracer(filename) |
156 tracer = self.plugin.file_tracer(filename) |
156 self.debug.write("file_tracer(%r) --> %r" % (filename, tracer)) |
157 self.debug.write(f"file_tracer({filename!r}) --> {tracer!r}") |
157 if tracer: |
158 if tracer: |
158 debug = self.debug.add_label("file %r" % (filename,)) |
159 debug = self.debug.add_label(f"file {filename!r}") |
159 tracer = DebugFileTracerWrapper(tracer, debug) |
160 tracer = DebugFileTracerWrapper(tracer, debug) |
160 return tracer |
161 return tracer |
161 |
162 |
162 def file_reporter(self, filename): |
163 def file_reporter(self, filename): |
163 reporter = self.plugin.file_reporter(filename) |
164 reporter = self.plugin.file_reporter(filename) |
164 self.debug.write("file_reporter(%r) --> %r" % (filename, reporter)) |
165 self.debug.write(f"file_reporter({filename!r}) --> {reporter!r}") |
165 if reporter: |
166 if reporter: |
166 debug = self.debug.add_label("file %r" % (filename,)) |
167 debug = self.debug.add_label(f"file {filename!r}") |
167 reporter = DebugFileReporterWrapper(filename, reporter, debug) |
168 reporter = DebugFileReporterWrapper(filename, reporter, debug) |
168 return reporter |
169 return reporter |
169 |
170 |
170 def dynamic_context(self, frame): |
171 def dynamic_context(self, frame): |
171 context = self.plugin.dynamic_context(frame) |
172 context = self.plugin.dynamic_context(frame) |
172 self.debug.write("dynamic_context(%r) --> %r" % (frame, context)) |
173 self.debug.write(f"dynamic_context({frame!r}) --> {context!r}") |
173 return context |
174 return context |
174 |
175 |
175 def find_executable_files(self, src_dir): |
176 def find_executable_files(self, src_dir): |
176 executable_files = self.plugin.find_executable_files(src_dir) |
177 executable_files = self.plugin.find_executable_files(src_dir) |
177 self.debug.write("find_executable_files(%r) --> %r" % (src_dir, executable_files)) |
178 self.debug.write(f"find_executable_files({src_dir!r}) --> {executable_files!r}") |
178 return executable_files |
179 return executable_files |
179 |
180 |
180 def configure(self, config): |
181 def configure(self, config): |
181 self.debug.write("configure(%r)" % (config,)) |
182 self.debug.write(f"configure({config!r})") |
182 self.plugin.configure(config) |
183 self.plugin.configure(config) |
183 |
184 |
184 def sys_info(self): |
185 def sys_info(self): |
185 return self.plugin.sys_info() |
186 return self.plugin.sys_info() |
186 |
187 |
199 frame.f_lineno, |
200 frame.f_lineno, |
200 ) |
201 ) |
201 |
202 |
202 def source_filename(self): |
203 def source_filename(self): |
203 sfilename = self.tracer.source_filename() |
204 sfilename = self.tracer.source_filename() |
204 self.debug.write("source_filename() --> %r" % (sfilename,)) |
205 self.debug.write(f"source_filename() --> {sfilename!r}") |
205 return sfilename |
206 return sfilename |
206 |
207 |
207 def has_dynamic_source_filename(self): |
208 def has_dynamic_source_filename(self): |
208 has = self.tracer.has_dynamic_source_filename() |
209 has = self.tracer.has_dynamic_source_filename() |
209 self.debug.write("has_dynamic_source_filename() --> %r" % (has,)) |
210 self.debug.write(f"has_dynamic_source_filename() --> {has!r}") |
210 return has |
211 return has |
211 |
212 |
212 def dynamic_source_filename(self, filename, frame): |
213 def dynamic_source_filename(self, filename, frame): |
213 dyn = self.tracer.dynamic_source_filename(filename, frame) |
214 dyn = self.tracer.dynamic_source_filename(filename, frame) |
214 self.debug.write("dynamic_source_filename(%r, %s) --> %r" % ( |
215 self.debug.write("dynamic_source_filename({!r}, {}) --> {!r}".format( |
215 filename, self._show_frame(frame), dyn, |
216 filename, self._show_frame(frame), dyn, |
216 )) |
217 )) |
217 return dyn |
218 return dyn |
218 |
219 |
219 def line_number_range(self, frame): |
220 def line_number_range(self, frame): |
220 pair = self.tracer.line_number_range(frame) |
221 pair = self.tracer.line_number_range(frame) |
221 self.debug.write("line_number_range(%s) --> %r" % (self._show_frame(frame), pair)) |
222 self.debug.write(f"line_number_range({self._show_frame(frame)}) --> {pair!r}") |
222 return pair |
223 return pair |
223 |
224 |
224 |
225 |
225 class DebugFileReporterWrapper(FileReporter): |
226 class DebugFileReporterWrapper(FileReporter): |
226 """A debugging `FileReporter`.""" |
227 """A debugging `FileReporter`.""" |
227 |
228 |
228 def __init__(self, filename, reporter, debug): |
229 def __init__(self, filename, reporter, debug): |
229 super(DebugFileReporterWrapper, self).__init__(filename) |
230 super().__init__(filename) |
230 self.reporter = reporter |
231 self.reporter = reporter |
231 self.debug = debug |
232 self.debug = debug |
232 |
233 |
233 def relative_filename(self): |
234 def relative_filename(self): |
234 ret = self.reporter.relative_filename() |
235 ret = self.reporter.relative_filename() |
235 self.debug.write("relative_filename() --> %r" % (ret,)) |
236 self.debug.write(f"relative_filename() --> {ret!r}") |
236 return ret |
237 return ret |
237 |
238 |
238 def lines(self): |
239 def lines(self): |
239 ret = self.reporter.lines() |
240 ret = self.reporter.lines() |
240 self.debug.write("lines() --> %r" % (ret,)) |
241 self.debug.write(f"lines() --> {ret!r}") |
241 return ret |
242 return ret |
242 |
243 |
243 def excluded_lines(self): |
244 def excluded_lines(self): |
244 ret = self.reporter.excluded_lines() |
245 ret = self.reporter.excluded_lines() |
245 self.debug.write("excluded_lines() --> %r" % (ret,)) |
246 self.debug.write(f"excluded_lines() --> {ret!r}") |
246 return ret |
247 return ret |
247 |
248 |
248 def translate_lines(self, lines): |
249 def translate_lines(self, lines): |
249 ret = self.reporter.translate_lines(lines) |
250 ret = self.reporter.translate_lines(lines) |
250 self.debug.write("translate_lines(%r) --> %r" % (lines, ret)) |
251 self.debug.write(f"translate_lines({lines!r}) --> {ret!r}") |
251 return ret |
252 return ret |
252 |
253 |
253 def translate_arcs(self, arcs): |
254 def translate_arcs(self, arcs): |
254 ret = self.reporter.translate_arcs(arcs) |
255 ret = self.reporter.translate_arcs(arcs) |
255 self.debug.write("translate_arcs(%r) --> %r" % (arcs, ret)) |
256 self.debug.write(f"translate_arcs({arcs!r}) --> {ret!r}") |
256 return ret |
257 return ret |
257 |
258 |
258 def no_branch_lines(self): |
259 def no_branch_lines(self): |
259 ret = self.reporter.no_branch_lines() |
260 ret = self.reporter.no_branch_lines() |
260 self.debug.write("no_branch_lines() --> %r" % (ret,)) |
261 self.debug.write(f"no_branch_lines() --> {ret!r}") |
261 return ret |
262 return ret |
262 |
263 |
263 def exit_counts(self): |
264 def exit_counts(self): |
264 ret = self.reporter.exit_counts() |
265 ret = self.reporter.exit_counts() |
265 self.debug.write("exit_counts() --> %r" % (ret,)) |
266 self.debug.write(f"exit_counts() --> {ret!r}") |
266 return ret |
267 return ret |
267 |
268 |
268 def arcs(self): |
269 def arcs(self): |
269 ret = self.reporter.arcs() |
270 ret = self.reporter.arcs() |
270 self.debug.write("arcs() --> %r" % (ret,)) |
271 self.debug.write(f"arcs() --> {ret!r}") |
271 return ret |
272 return ret |
272 |
273 |
273 def source(self): |
274 def source(self): |
274 ret = self.reporter.source() |
275 ret = self.reporter.source() |
275 self.debug.write("source() --> %d chars" % (len(ret),)) |
276 self.debug.write("source() --> %d chars" % (len(ret),)) |