From 44527cc9db62aa3979c69abe4edb7070aafd6897 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Thu, 12 Jun 2014 17:17:38 -0400 Subject: Hacked-in django template support --HG-- branch : django --- coverage/collector.py | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) (limited to 'coverage/collector.py') diff --git a/coverage/collector.py b/coverage/collector.py index 94af5df5..07a87e03 100644 --- a/coverage/collector.py +++ b/coverage/collector.py @@ -45,6 +45,7 @@ class PyTracer(object): self.should_trace = None self.should_trace_cache = None self.warn = None + self.handler = None self.cur_file_data = None self.last_line = 0 self.data_stack = [] @@ -76,7 +77,7 @@ class PyTracer(object): self.cur_file_data[pair] = None if self.coroutine_id_func: self.data_stack = self.data_stacks[self.coroutine_id_func()] - self.cur_file_data, self.last_line = self.data_stack.pop() + self.handler, self.cur_file_data, self.last_line = self.data_stack.pop() self.last_exc_back = None if event == 'call': @@ -85,19 +86,22 @@ class PyTracer(object): if self.coroutine_id_func: self.data_stack = self.data_stacks[self.coroutine_id_func()] self.last_coroutine = self.coroutine_id_func() - self.data_stack.append((self.cur_file_data, self.last_line)) + self.data_stack.append((self.handler, self.cur_file_data, self.last_line)) filename = frame.f_code.co_filename if filename not in self.should_trace_cache: - tracename = self.should_trace(filename, frame) - self.should_trace_cache[filename] = tracename + tracename, handler = self.should_trace(filename, frame) + self.should_trace_cache[filename] = tracename, handler else: - tracename = self.should_trace_cache[filename] + tracename, handler = self.should_trace_cache[filename] #print("called, stack is %d deep, tracename is %r" % ( # len(self.data_stack), tracename)) + if tracename and handler: + tracename = handler.file_name(frame) if tracename: if tracename not in self.data: self.data[tracename] = {} self.cur_file_data = self.data[tracename] + self.handler = handler else: self.cur_file_data = None # Set the last_line to -1 because the next arc will be entering a @@ -107,14 +111,20 @@ class PyTracer(object): # Record an executed line. #if self.coroutine_id_func: # assert self.last_coroutine == self.coroutine_id_func() - if self.cur_file_data is not None: - if self.arcs: - #print("lin", self.last_line, frame.f_lineno) - self.cur_file_data[(self.last_line, frame.f_lineno)] = None - else: - #print("lin", frame.f_lineno) - self.cur_file_data[frame.f_lineno] = None - self.last_line = frame.f_lineno + if self.handler: + lineno_from, lineno_to = self.handler.line_number_range(frame) + else: + lineno_from, lineno_to = frame.f_lineno, frame.f_lineno + if lineno_from != -1: + if self.cur_file_data is not None: + if self.arcs: + #print("lin", self.last_line, frame.f_lineno) + self.cur_file_data[(self.last_line, lineno_from)] = None + else: + #print("lin", frame.f_lineno) + for lineno in range(lineno_from, lineno_to+1): + self.cur_file_data[lineno] = None + self.last_line = lineno_to elif event == 'return': if self.arcs and self.cur_file_data: first = frame.f_code.co_firstlineno @@ -123,7 +133,7 @@ class PyTracer(object): if self.coroutine_id_func: self.data_stack = self.data_stacks[self.coroutine_id_func()] self.last_coroutine = self.coroutine_id_func() - self.cur_file_data, self.last_line = self.data_stack.pop() + self.handler, self.cur_file_data, self.last_line = self.data_stack.pop() #print("returned, stack is %d deep" % (len(self.data_stack))) elif event == 'exception': #print("exc", self.last_line, frame.f_lineno) -- cgit v1.2.1 From acb2e8e79230e9a6967fd82e95ec2fde8a293b08 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 15 Jun 2014 22:51:42 -0400 Subject: should_trace now returns a FileDisposition object --HG-- branch : django --- coverage/collector.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'coverage/collector.py') diff --git a/coverage/collector.py b/coverage/collector.py index 07a87e03..e3f4f630 100644 --- a/coverage/collector.py +++ b/coverage/collector.py @@ -89,19 +89,20 @@ class PyTracer(object): self.data_stack.append((self.handler, self.cur_file_data, self.last_line)) filename = frame.f_code.co_filename if filename not in self.should_trace_cache: - tracename, handler = self.should_trace(filename, frame) - self.should_trace_cache[filename] = tracename, handler + disp = self.should_trace(filename, frame) + self.should_trace_cache[filename] = disp else: - tracename, handler = self.should_trace_cache[filename] + disp = self.should_trace_cache[filename] #print("called, stack is %d deep, tracename is %r" % ( # len(self.data_stack), tracename)) - if tracename and handler: - tracename = handler.file_name(frame) + tracename = disp.filename + if tracename and disp.handler: + tracename = disp.handler.file_name(frame) if tracename: if tracename not in self.data: self.data[tracename] = {} self.cur_file_data = self.data[tracename] - self.handler = handler + self.handler = disp.handler else: self.cur_file_data = None # Set the last_line to -1 because the next arc will be entering a -- cgit v1.2.1 From f346f85e04e44294e4c26f876e8dc75b17c4f8d7 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 4 Jul 2014 22:15:20 -0400 Subject: Crazy-ugly start to extensions for Django and Mako --HG-- branch : django --- coverage/collector.py | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) (limited to 'coverage/collector.py') diff --git a/coverage/collector.py b/coverage/collector.py index e3f4f630..1c530c7a 100644 --- a/coverage/collector.py +++ b/coverage/collector.py @@ -41,18 +41,21 @@ class PyTracer(object): # used to force the use of this tracer. def __init__(self): + # Attributes set from the collector: self.data = None + self.arcs = False self.should_trace = None self.should_trace_cache = None self.warn = None - self.handler = None + self.extensions = None + + self.extension = None self.cur_file_data = None self.last_line = 0 self.data_stack = [] self.data_stacks = collections.defaultdict(list) self.last_exc_back = None self.last_exc_firstlineno = 0 - self.arcs = False self.thread = None self.stopped = False self.coroutine_id_func = None @@ -86,23 +89,24 @@ class PyTracer(object): if self.coroutine_id_func: self.data_stack = self.data_stacks[self.coroutine_id_func()] self.last_coroutine = self.coroutine_id_func() - self.data_stack.append((self.handler, self.cur_file_data, self.last_line)) + self.data_stack.append((self.extension, self.cur_file_data, self.last_line)) filename = frame.f_code.co_filename - if filename not in self.should_trace_cache: + disp = self.should_trace_cache.get(filename) + if disp is None: disp = self.should_trace(filename, frame) self.should_trace_cache[filename] = disp - else: - disp = self.should_trace_cache[filename] #print("called, stack is %d deep, tracename is %r" % ( # len(self.data_stack), tracename)) tracename = disp.filename - if tracename and disp.handler: - tracename = disp.handler.file_name(frame) + if tracename and disp.extension: + tracename = disp.extension.file_name(frame) if tracename: if tracename not in self.data: self.data[tracename] = {} + if disp.extension: + self.extensions[tracename] = disp.extension.__name__ self.cur_file_data = self.data[tracename] - self.handler = disp.handler + self.extension = disp.extension else: self.cur_file_data = None # Set the last_line to -1 because the next arc will be entering a @@ -112,8 +116,8 @@ class PyTracer(object): # Record an executed line. #if self.coroutine_id_func: # assert self.last_coroutine == self.coroutine_id_func() - if self.handler: - lineno_from, lineno_to = self.handler.line_number_range(frame) + if self.extension: + lineno_from, lineno_to = self.extension.line_number_range(frame) else: lineno_from, lineno_to = frame.f_lineno, frame.f_lineno if lineno_from != -1: @@ -134,7 +138,7 @@ class PyTracer(object): if self.coroutine_id_func: self.data_stack = self.data_stacks[self.coroutine_id_func()] self.last_coroutine = self.coroutine_id_func() - self.handler, self.cur_file_data, self.last_line = self.data_stack.pop() + self.extension, self.cur_file_data, self.last_line = self.data_stack.pop() #print("returned, stack is %d deep" % (len(self.data_stack))) elif event == 'exception': #print("exc", self.last_line, frame.f_lineno) @@ -251,6 +255,8 @@ class Collector(object): # or mapping filenames to dicts with linenumber pairs as keys. self.data = {} + self.extensions = {} + # A cache of the results from should_trace, the decision about whether # to trace execution in a file. A dict of filename to (filename or # None). @@ -269,6 +275,8 @@ class Collector(object): tracer.warn = self.warn if hasattr(tracer, 'coroutine_id_func'): tracer.coroutine_id_func = self.coroutine_id_func + if hasattr(tracer, 'extensions'): + tracer.extensions = self.extensions fn = tracer.start() self.tracers.append(tracer) return fn @@ -367,10 +375,7 @@ class Collector(object): # to show line data. line_data = {} for f, arcs in self.data.items(): - line_data[f] = ldf = {} - for l1, _ in list(arcs.keys()): - if l1: - ldf[l1] = None + line_data[f] = dict((l1, None) for l1, _ in arcs.keys() if l1) return line_data else: return self.data @@ -388,3 +393,6 @@ class Collector(object): return self.data else: return {} + + def get_extension_data(self): + return self.extensions -- cgit v1.2.1