def test_exception(self): # SETUP source = """\ try: raise RuntimeError('foo') except: builder.exception()""" expected_report = """\ RuntimeError: foo """ # EXEC builder = ReportBuilder() environment = dict(builder=builder) exec_code(source, environment, environment) report = builder.report() # VERIFY self.assertEqual(expected_report.splitlines(), report.splitlines())
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=True)) code = compile(new_tree, PSEUDO_FILENAME, 'exec') self.environment[CONTEXT_NAME] = builder exec_code(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_turtle(self, source): exec_code(source, self.environment, self.environment) return '\n'.join(self.turtle.report)
def trace_canvas(self, source): exec_code(source, self.environment, self.environment) return '\n'.join(self.turtle.screen.cv.report)