def assert_trace_line_count(self, fn, count, filtering_enabled=True): trace_line_count = -1 if filtering_enabled: traceback_utils.enable_traceback_filtering() else: traceback_utils.disable_traceback_filtering() self.assertEqual( traceback_utils.is_traceback_filtering_enabled(), filtering_enabled) try: fn() except Exception as e: # pylint: disable=broad-except # We must count lines rather than frames because autograph transforms # stack frames into a single large string trace = '\n'.join(traceback.format_tb(e.__traceback__)) trace_line_count = len(trace.split('\n')) self.assertGreater(trace_line_count, 0) if filtering_enabled: self.assertLess(trace_line_count, count) else: self.assertGreater(trace_line_count, count)
def get_message(self): """Returns the message for the underlying exception.""" lines = [] lines.append('in user code:') lines.append('') for frame_info in reversed(self.translated_stack): if (traceback_utils.is_traceback_filtering_enabled() and not traceback_utils.include_frame(frame_info.filename)): continue # Same format with Python traceback. formatted_line = ( f' File "{frame_info.filename}", line ' f'{frame_info.lineno}, in {frame_info.function_name}') if frame_info.is_converted: formatted_line += ' *' elif frame_info.is_allowlisted: formatted_line += ' **' lines.append(formatted_line) if frame_info.code is None: code_snippet = '<source unavailable>' else: code_snippet = frame_info.code.strip() lines.append(' {}'.format(code_snippet)) lines.append('') message_lines = self.cause_message.split('\n') for i in range(len(message_lines)): message_lines[i] = ' ' + message_lines[i] lines.extend(message_lines) lines.append('') return '\n'.join(lines)
def _get_thread_local_configuration_callable(): if traceback_utils.is_traceback_filtering_enabled(): thread_local_callables = {traceback_utils.enable_traceback_filtering} else: thread_local_callables = {traceback_utils.disable_traceback_filtering} return thread_local_callables