def trace_code(self, source, module_name=None): builder = ReportBuilder(self.message_limit) builder.max_width = self.max_width try: tree = parse(source) new_tree = Tracer().visit(tree) fix_missing_locations(new_tree) LineNumberCleaner().visit(new_tree) # from ast import dump # print(dump(new_tree, include_attributes=False)) code = compile(new_tree, PSEUDO_FILENAME, 'exec') self.environment[CONTEXT_NAME] = builder if module_name is None: environment = self.environment else: mod = types.ModuleType(module_name) sys.modules[module_name] = mod # Any reason to set mod.__file__? mod.__dict__.update(self.environment) environment = mod.__dict__ exec(code, environment) for value in environment.values(): if isinstance(value, types.GeneratorType): value.close() except SyntaxError: ex = sys.exc_info()[1] messages = traceback.format_exception_only(type(ex), ex) builder.add_message(messages[-1].strip() + ' ', ex.lineno) except: etype, value, tb = sys.exc_info() is_reported = False builder.message_limit = None # make sure we don't hit limit builder.max_width = None # make sure we don't hit limit messages = traceback.format_exception_only(etype, value) message = messages[-1].strip() + ' ' entries = traceback.extract_tb(tb) for filename, line_number, _, _ in entries: if filename == PSEUDO_FILENAME: builder.add_extra_message(message, line_number) is_reported = True if not is_reported: builder.add_message(message, 1) # print('=== Unexpected Exception in tracing code ===') # traceback.print_exception(etype, value, tb) return builder.report()
def trace_code(self, source): builder = ReportBuilder(self.message_limit) builder.max_width = self.max_width try: tree = parse(source) visitor = TraceAssignments() new_tree = visitor.visit(tree) fix_missing_locations(new_tree) # from ast import dump # print(dump(new_tree, include_attributes=False)) code = compile(new_tree, PSEUDO_FILENAME, 'exec') self.environment[CONTEXT_NAME] = builder exec(code, self.environment, self.environment) except SyntaxError: ex = sys.exc_info()[1] messages = traceback.format_exception_only(type(ex), ex) builder.add_message(messages[-1].strip() + ' ', ex.lineno) except: etype, value, tb = sys.exc_info() is_reported = False builder.message_limit = None # make sure we don't hit limit builder.max_width = None # make sure we don't hit limit messages = traceback.format_exception_only(etype, value) message = messages[-1].strip() + ' ' entries = traceback.extract_tb(tb) for filename, line_number, _, _ in entries: if filename == PSEUDO_FILENAME: builder.add_extra_message(message, line_number) is_reported = True if not is_reported: builder.add_message(message, 1) # print('=== Unexpected Exception in tracing code ===') # traceback.print_exception(etype, value, tb) return builder.report()
def trace_code(self, source): builder = ReportBuilder(self.message_limit) builder.max_width = self.max_width try: tree = parse(source) visitor = TraceAssignments() new_tree = visitor.visit(tree) fix_missing_locations(new_tree) # from ast import dump # print(dump(new_tree, include_attributes=False)) code = compile(new_tree, PSEUDO_FILENAME, 'exec') self.environment[CONTEXT_NAME] = builder exec(code, self.environment, self.environment) except SyntaxError: ex = sys.exc_info()[1] messages = traceback.format_exception_only(type(ex), ex) builder.add_message(messages[-1].strip() + ' ', ex.lineno) except: etype, value, tb = sys.exc_info() is_reported = False builder.message_limit = None # make sure we don't hit limit builder.max_width = None # make sure we don't hit limit messages = traceback.format_exception_only(etype, value) message = messages[-1].strip() + ' ' entries = traceback.extract_tb(tb) for filename, line_number, _, _ in entries: if filename == PSEUDO_FILENAME: builder.add_extra_message(message, line_number) is_reported = True if not is_reported: builder.add_message(message, 1) # print('=== Unexpected Exception in tracing code ===') # traceback.print_exception(etype, value, tb) return builder.report()
def trace_code(self, source, load_as=None, module=None, dump=False, driver=None, filename=None): builder = ReportBuilder(self.message_limit) builder.max_width = self.max_width try: tree = parse(source) new_tree = Tracer().visit(tree) fix_missing_locations(new_tree) LineNumberCleaner().visit(new_tree) # from ast import dump # print(dump(new_tree, include_attributes=False)) code = compile(new_tree, PSEUDO_FILENAME, 'exec') self.environment[CONTEXT_NAME] = builder self.run_instrumented_module(code, load_as or SCOPE_NAME, filename) if driver: try: with self.swallow_output(): if module: self.run_python_module(driver[0], driver) else: self.run_python_file(driver[0], driver) except: if not (builder.message_count or builder.history): raise for value in self.environment.values(): if isinstance(value, types.GeneratorType): value.close() except SyntaxError: ex = sys.exc_info()[1] messages = traceback.format_exception_only(type(ex), ex) builder.add_message(messages[-1].strip() + ' ', ex.lineno) except: etype, value, tb = sys.exc_info() is_reported = False builder.message_limit = None # make sure we don't hit limit builder.max_width = None # make sure we don't hit limit messages = traceback.format_exception_only(etype, value) message = messages[-1].strip() + ' ' entries = traceback.extract_tb(tb) for filename, line_number, _, _ in entries: if filename == PSEUDO_FILENAME: builder.add_extra_message(message, line_number) is_reported = True if not is_reported: builder.add_message(message, 1) # print('=== Unexpected Exception in tracing code ===') # traceback.print_exception(etype, value, tb) report = builder.report() if dump: source_lines = source.splitlines() report_lines = report.splitlines() dump_lines = [] source_width = max(map(len, source_lines)) indent = 4 for source_line, report_line in izip_longest(source_lines, report_lines, fillvalue=''): line = (indent * ' ' + source_line + (source_width-len(source_line))*' ' + ' | ' + report_line) dump_lines.append(line) report = '\n'.join(dump_lines) return report
def trace_code(self, source, load_as=None, module=None, dump=False, driver=None, filename=None): builder = ReportBuilder(self.message_limit) builder.max_width = self.max_width try: tree = parse(source) new_tree = Tracer().visit(tree) fix_missing_locations(new_tree) LineNumberCleaner().visit(new_tree) # from ast import dump # print(dump(new_tree, include_attributes=False)) code = compile(new_tree, PSEUDO_FILENAME, 'exec') self.environment[CONTEXT_NAME] = builder self.run_instrumented_module(code, load_as or SCOPE_NAME, filename) if driver: with self.swallow_output(): if module: module_name = driver[0] try: self.run_python_module(module_name, driver) except SystemExit as ex: if module_name != 'unittest': raise result = (sys.stderr.last_line or ex.code and 'FAIL ' or 'OK') result = 'unittest: ' + result self.report_driver_result(builder, [result]) else: self.run_python_file(driver[0], driver) for value in self.environment.values(): if isinstance(value, types.GeneratorType): value.close() except SyntaxError: ex = sys.exc_info()[1] messages = traceback.format_exception_only(type(ex), ex) builder.add_message(messages[-1].strip() + ' ', ex.lineno) except: etype, value, tb = sys.exc_info() is_reported = False builder.message_limit = None # make sure we don't hit limit builder.max_width = None # make sure we don't hit limit messages = traceback.format_exception_only(etype, value) entries = traceback.extract_tb(tb) for filename, _, _, _ in entries: if filename == PSEUDO_FILENAME: is_reported = True while not is_reported and tb is not None: frame = tb.tb_frame code = frame.f_code filename = code.co_filename if __file__ not in (filename, filename + 'c'): break tb = tb.tb_next if not is_reported: if tb: messages = traceback.format_exception(etype, value, tb) else: messages = traceback.format_exception_only(etype, value) self.report_driver_result(builder, messages) report = builder.report() if dump: source_lines = source.splitlines() report_lines = report.splitlines() dump_lines = [] source_width = max(map(len, source_lines)) indent = 4 for source_line, report_line in izip_longest(source_lines, report_lines, fillvalue=''): line = (indent * ' ' + source_line + (source_width-len(source_line))*' ' + ' | ' + report_line) dump_lines.append(line) report = '\n'.join(dump_lines) return report