eric7/DebugClients/Python/coverage/plugin_support.py

branch
eric7
changeset 8775
0802ae193343
parent 8312
800c432b34c8
child 8929
fcca2fa618bf
equal deleted inserted replaced
8774:d728227e8ebb 8775:0802ae193343
5 5
6 import os 6 import os
7 import os.path 7 import os.path
8 import sys 8 import sys
9 9
10 from coverage.misc import CoverageException, isolate_module 10 from coverage.exceptions import CoverageException
11 from coverage.misc import isolate_module
11 from coverage.plugin import CoveragePlugin, FileTracer, FileReporter 12 from coverage.plugin import CoveragePlugin, FileTracer, FileReporter
12 13
13 os = isolate_module(os) 14 os = isolate_module(os)
14 15
15 16
16 class Plugins(object): 17 class Plugins:
17 """The currently loaded collection of coverage.py plugins.""" 18 """The currently loaded collection of coverage.py plugins."""
18 19
19 def __init__(self): 20 def __init__(self):
20 self.order = [] 21 self.order = []
21 self.names = {} 22 self.names = {}
42 mod = sys.modules[module] 43 mod = sys.modules[module]
43 44
44 coverage_init = getattr(mod, "coverage_init", None) 45 coverage_init = getattr(mod, "coverage_init", None)
45 if not coverage_init: 46 if not coverage_init:
46 raise CoverageException( 47 raise CoverageException(
47 "Plugin module %r didn't define a coverage_init function" % module 48 f"Plugin module {module!r} didn't define a coverage_init function"
48 ) 49 )
49 50
50 options = config.get_plugin_options(module) 51 options = config.get_plugin_options(module)
51 coverage_init(plugins, options) 52 coverage_init(plugins, options)
52 53
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
120 def get(self, plugin_name): 121 def get(self, plugin_name):
121 """Return a plugin by name.""" 122 """Return a plugin by name."""
122 return self.names[plugin_name] 123 return self.names[plugin_name]
123 124
124 125
125 class LabelledDebug(object): 126 class LabelledDebug:
126 """A Debug writer, but with labels for prepending to the messages.""" 127 """A Debug writer, but with labels for prepending to the messages."""
127 128
128 def __init__(self, label, debug, prev_labels=()): 129 def __init__(self, label, debug, prev_labels=()):
129 self.labels = list(prev_labels) + [label] 130 self.labels = list(prev_labels) + [label]
130 self.debug = debug 131 self.debug = debug
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),))

eric ide

mercurial