##// END OF EJS Templates
Merge pull request #13213 from Kojoley/fix-bunch-of-doctests...
Merge pull request #13213 from Kojoley/fix-bunch-of-doctests Fix bunch of doctests

File last commit:

r26732:75459394 merge
r26940:32497c8d merge
Show More
ultratb.py
1132 lines | 43.9 KiB | text/x-python | PythonLexer
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 # -*- coding: utf-8 -*-
"""
Thomas Kluyver
Standardise some module docstring first lines
r13888 Verbose and colourful traceback formatting.
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Thomas Kluyver
Miscellaneous docs fixes
r13597 **ColorTB**
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 I've always found it a bit hard to visually parse tracebacks in Python. The
ColorTB class is a solution to that problem. It colors the different parts of a
traceback in a manner similar to what you would expect from a syntax-highlighting
text editor.
Thomas Kluyver
Improvements to docs formatting.
r12553 Installation instructions for ColorTB::
Brian Granger
Merging -r 1177 from lp:ipython with fixes and resolutions....
r2124 import sys,ultratb
sys.excepthook = ultratb.ColorTB()
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Thomas Kluyver
Miscellaneous docs fixes
r13597 **VerboseTB**
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 I've also included a port of Ka-Ping Yee's "cgitb.py" that produces all kinds
of useful info when a traceback occurs. Ping originally had it spit out HTML
and intended it for CGI programmers, but why should they have all the fun? I
altered it to spit out colored text to the terminal. It's a bit overwhelming,
but kind of neat, and maybe useful for long-running programs that you believe
are bug-free. If a crash *does* occur in that type of program you want details.
Give it a shot--you'll love it or you'll hate it.
Thomas Kluyver
Improvements to docs formatting.
r12553 .. note::
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
The Verbose mode prints the variables currently visible where the exception
happened (shortening their strings if too long). This can potentially be
very slow, if you happen to have a huge data structure whose string
representation is complex to compute. Your computer may appear to freeze for
a while with cpu usage at 100%. If this occurs, you can cancel the traceback
with Ctrl-C (maybe hitting it more than once).
If you encounter this kind of situation often, you may want to use the
Verbose_novars mode instead of the regular Verbose, which avoids formatting
variables (but otherwise includes the information and context given by
Verbose).
Bernardo B. Marques
remove all trailling spaces
r4872
Matthias Bussonnier
add docs and cleanup bad code style
r22096 .. note::
The verbose mode print all variables in the stack, which means it can
Min ho Kim
Fix typos
r25146 potentially leak sensitive information like access keys, or unencrypted
Matthias Bussonnier
add docs and cleanup bad code style
r22096 password.
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 Installation instructions for VerboseTB::
Thomas Kluyver
Improvements to docs formatting.
r12553
Brian Granger
Merging -r 1177 from lp:ipython with fixes and resolutions....
r2124 import sys,ultratb
sys.excepthook = ultratb.VerboseTB()
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Note: Much of the code in this module was lifted verbatim from the standard
library module 'traceback.py' and Ka-Ping Yee's 'cgitb.py'.
Thomas Kluyver
Improvements to docs formatting.
r12553 Color schemes
-------------
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 The colors are defined in the class TBTools through the use of the
ColorSchemeTable class. Currently the following exist:
- NoColor: allows all of this module to be used in any terminal (the color
Thomas Kluyver
Improvements to docs formatting.
r12553 escapes are just dummy blank strings).
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
- Linux: is meant to look good in a terminal like the Linux console (black
Thomas Kluyver
Improvements to docs formatting.
r12553 or very dark background).
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
- LightBG: similar to Linux but swaps dark/light colors to be more readable
Thomas Kluyver
Improvements to docs formatting.
r12553 in light background terminals.
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Matthias Bussonnier
Make everyone happy with a neutral colortheme by default.
r22609 - Neutral: a neutral color scheme that should be readable on both light and
dark background
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 You can implement other color schemes easily, the syntax is fairly
self-explanatory. Please send back new schemes you develop to the author for
possible inclusion in future releases.
Thomas Kluyver
Only include inheritance diagram where it's useful.
r8795
Inheritance diagram:
.. inheritance-diagram:: IPython.core.ultratb
:parts: 3
Fernando Perez
Remove svn-style $Id marks from docstrings and Release imports....
r1853 """
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Justyna Ilczuk
i1673 some DRY refactoring
r17158 #*****************************************************************************
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 # Copyright (C) 2001 Nathaniel Gray <n8gray@caltech.edu>
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157 # Copyright (C) 2001-2004 Fernando Perez <fperez@colorado.edu>
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 #
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157 # Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 #*****************************************************************************
Brian Granger
sys.displayhook is now managed dynamically by display_trap.
r2231
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 import inspect
import linecache
import pydoc
import sys
import time
import traceback
Alex Hall
Initial integration of stack_data
r25466 import stack_data
Alex Hall
Check user config to decide whether to use pygments
r25506 from pygments.formatters.terminal256 import Terminal256Formatter
Alex Hall
Highlight the executing node with stack_data
r25548 from pygments.styles import get_style_by_name
Thomas Kluyver
Fixes for UltraTB and PyColorize with Python 3
r4758
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 # IPython's own modules
MinRK
don't use deprecated ipapi.get...
r10581 from IPython import get_ipython
from IPython.core import debugger
Brian Granger
sys.displayhook is now managed dynamically by display_trap.
r2231 from IPython.core.display_trap import DisplayTrap
Brian Granger
excolors.py => core/excolors.py and updated import statements.
r2021 from IPython.core.excolors import exception_colors
Jörgen Stenarson
Quick fix for #1688, traceback-unicode issue...
r8299 from IPython.utils import path as util_path
Thomas Kluyver
Fixes for UltraTB and PyColorize with Python 3
r4758 from IPython.utils import py3compat
Vincent Woo
Use term width to determine header length
r22150 from IPython.utils.terminal import get_terminal_size
Matthias Bussonnier
Some other cleaning of ultratb...
r24336
Matthias Bussonnier
Introduce some classes necessary fro Pygments refactor.
r22109 import IPython.utils.colorable as colorable
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 # Globals
# amount of space to put line numbers before verbose tracebacks
INDENT_SIZE = 8
# Default color scheme. This is used, for example, by the traceback
# formatter. When running in an actual IPython instance, the user's rc.colors
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 # value is used, but having a module global makes this functionality available
Brian Granger
Merging -r 1177 from lp:ipython with fixes and resolutions....
r2124 # to users of ultratb who are NOT running inside ipython.
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 DEFAULT_SCHEME = 'NoColor'
Justyna Ilczuk
i1673 some DRY refactoring
r17158 # ---------------------------------------------------------------------------
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 # Code begins
# Helper function -- largely belongs to VerboseTB, but we need the same
# functionality to produce a pseudo verbose TB for SyntaxErrors, so that they
# can be recognized properly by ipython.el's py-traceback-line-re
# (SyntaxErrors have to be treated specially because they have no traceback)
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156
Alex Hall
Check user config to decide whether to use pygments
r25506 def _format_traceback_lines(lines, Colors, has_colors, lvals):
Matthias Bussonnier
Refactor of coloring and traceback mechanism....
r24334 """
Format tracebacks lines with pointing arrow, leading numbers...
Parameters
Matthias Bussonnier
autoformat docstrings in ultratb
r25951 ----------
lines : list[Line]
Colors
Matthias Bussonnier
Refactor of coloring and traceback mechanism....
r24334 ColorScheme used.
Matthias Bussonnier
autoformat docstrings in ultratb
r25951 lvals : str
Matthias Bussonnier
Refactor of coloring and traceback mechanism....
r24334 Values of local variables, already colored, to inject just after the error line.
"""
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 numbers_width = INDENT_SIZE - 1
res = []
Alex Hall
Initial integration of stack_data
r25466 for stack_line in lines:
Alex Hall
Handle line gaps for truncated pieces
r25468 if stack_line is stack_data.LINE_GAP:
res.append('%s (...)%s\n' % (Colors.linenoEm, Colors.Normal))
continue
Alex Hall
Check user config to decide whether to use pygments
r25506 line = stack_line.render(pygmented=has_colors).rstrip('\n') + '\n'
Alex Hall
Initial integration of stack_data
r25466 lineno = stack_line.lineno
if stack_line.is_current:
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 # This is the line with the error
Alex Hall
Initial integration of stack_data
r25466 pad = numbers_width - len(str(lineno))
num = '%s%s' % (debugger.make_arrow(pad), str(lineno))
Alex Hall
Use Pygments instead of PyColorize to syntax highlight tracebacks
r25492 start_color = Colors.linenoEm
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 else:
Alex Hall
Initial integration of stack_data
r25466 num = '%*s' % (numbers_width, lineno)
Alex Hall
Use Pygments instead of PyColorize to syntax highlight tracebacks
r25492 start_color = Colors.lineno
martinRenou
Improve error tracebacks so that it shows the cell prompts
r26685
Alex Hall
Use Pygments instead of PyColorize to syntax highlight tracebacks
r25492 line = '%s%s%s %s' % (start_color, num, Colors.Normal, line)
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
res.append(line)
Alex Hall
Initial integration of stack_data
r25466 if lvals and stack_line.is_current:
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 res.append(lvals + '\n')
return res
martinRenou
Fix coloring
r26690 def _format_filename(file, ColorFilename, ColorNormal):
martinRenou
Improve traceback formatting for all kinds of tracebacks
r26688 """
martinRenou
Fix coloring
r26690 Format filename lines with `In [n]` if it's the nth code cell or `File *.py` if it's a module.
martinRenou
Improve traceback formatting for all kinds of tracebacks
r26688
Parameters
----------
file : str
martinRenou
Fix coloring
r26690 ColorFilename
ColorScheme's filename coloring to be used.
ColorNormal
martinRenou
Improve traceback formatting for all kinds of tracebacks
r26688 ColorScheme's normal coloring to be used.
"""
ipinst = get_ipython()
if ipinst is not None and file in ipinst.compile._filename_map:
file = "[%s]" % ipinst.compile._filename_map[file]
martinRenou
Fix coloring
r26690 tpl_link = "In %s%%s%s" % (ColorFilename, ColorNormal)
martinRenou
Improve traceback formatting for all kinds of tracebacks
r26688 else:
file = util_path.compress_user(
py3compat.cast_unicode(file, util_path.fs_encoding)
)
martinRenou
Fix coloring
r26690 tpl_link = "File %s%%s%s" % (ColorFilename, ColorNormal)
martinRenou
Improve traceback formatting for all kinds of tracebacks
r26688
return tpl_link % file
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 #---------------------------------------------------------------------------
# Module classes
Matthias Bussonnier
Introduce some classes necessary fro Pygments refactor.
r22109 class TBTools(colorable.Colorable):
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 """Basic tools used by all traceback printer classes."""
Fernando Perez
Fix exception color problems in win32....
r2459
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 # Number of frames to skip when reporting tracebacks
tb_offset = 0
Matthias Bussonnier
Introduce some classes necessary fro Pygments refactor.
r22109 def __init__(self, color_scheme='NoColor', call_pdb=False, ostream=None, parent=None, config=None):
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 # Whether to call the interactive pdb debugger after printing
# tracebacks or not
Matthias Bussonnier
Introduce some classes necessary fro Pygments refactor.
r22109 super(TBTools, self).__init__(parent=parent, config=config)
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 self.call_pdb = call_pdb
Fernando Perez
Simplified output stream management in ultratb....
r2852 # Output stream to write to. Note that we store the original value in
# a private attribute and then make the public ostream a property, so
Min RK
fix some deprecations...
r22742 # that we can delay accessing sys.stdout until runtime. The way
# things are written now, the sys.stdout object is dynamically managed
Fernando Perez
Simplified output stream management in ultratb....
r2852 # so a reference to it should NEVER be stored statically. This
# property approach confines this detail to a single location, and all
# subclasses can simply access self.ostream for writing.
self._ostream = ostream
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 # Create color table
Fernando Perez
Update exception colors API to PEP8, various small fixes in related files....
r1845 self.color_scheme_table = exception_colors()
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
self.set_colors(color_scheme)
self.old_scheme = color_scheme # save initial value for toggles
if call_pdb:
Min RK
fix some deprecations...
r22742 self.pdb = debugger.Pdb()
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 else:
self.pdb = None
Fernando Perez
Simplified output stream management in ultratb....
r2852 def _get_ostream(self):
"""Output stream that exceptions are written to.
Valid values are:
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Simplified output stream management in ultratb....
r2852 - None: the default, which means that IPython will dynamically resolve
Min RK
fix some deprecations...
r22742 to sys.stdout. This ensures compatibility with most tools, including
Thomas Kluyver
Improvements to docs formatting.
r12553 Windows (where plain stdout doesn't recognize ANSI escapes).
Fernando Perez
Simplified output stream management in ultratb....
r2852
- Any object with 'write' and 'flush' attributes.
"""
Thomas Kluyver
Deprecate io.{stdout,stderr} and shell.{write,write_err}...
r22192 return sys.stdout if self._ostream is None else self._ostream
Fernando Perez
Simplified output stream management in ultratb....
r2852
def _set_ostream(self, val):
assert val is None or (hasattr(val, 'write') and hasattr(val, 'flush'))
self._ostream = val
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Simplified output stream management in ultratb....
r2852 ostream = property(_get_ostream, _set_ostream)
Quentin Peter
Add chained exception to 'Plain' mode
r25301 def get_parts_of_chained_exception(self, evalue):
def get_chained_exception(exception_value):
cause = getattr(exception_value, '__cause__', None)
if cause:
return cause
if getattr(exception_value, '__suppress_context__', False):
return None
return getattr(exception_value, '__context__', None)
chained_evalue = get_chained_exception(evalue)
if chained_evalue:
return chained_evalue.__class__, chained_evalue, chained_evalue.__traceback__
def prepare_chained_exception_message(self, cause):
direct_cause = "\nThe above exception was the direct cause of the following exception:\n"
exception_during_handling = "\nDuring handling of the above exception, another exception occurred:\n"
if cause:
message = [[direct_cause]]
else:
message = [[exception_during_handling]]
return message
Alex Hall
Check user config to decide whether to use pygments
r25506 @property
def has_colors(self):
return self.color_scheme_table.active_scheme_name.lower() != "nocolor"
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 def set_colors(self, *args, **kw):
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 """Shorthand access to the color table scheme selector method."""
# Set own color table
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 self.color_scheme_table.set_active_scheme(*args, **kw)
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 # for convenience, set Colors to the active scheme
self.Colors = self.color_scheme_table.active_colors
# Also set colors of debugger
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 if hasattr(self, 'pdb') and self.pdb is not None:
self.pdb.set_colors(*args, **kw)
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
def color_toggle(self):
"""Toggle between the currently active color scheme and NoColor."""
Bernardo B. Marques
remove all trailling spaces
r4872
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 if self.color_scheme_table.active_scheme_name == 'NoColor':
self.color_scheme_table.set_active_scheme(self.old_scheme)
self.Colors = self.color_scheme_table.active_colors
else:
self.old_scheme = self.color_scheme_table.active_scheme_name
self.color_scheme_table.set_active_scheme('NoColor')
self.Colors = self.color_scheme_table.active_colors
Fernando Perez
Multiple improvements to tab completion....
r2839 def stb2text(self, stb):
"""Convert a structured traceback (a list) to a string."""
return '\n'.join(stb)
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 def text(self, etype, value, tb, tb_offset=None, context=5):
"""Return formatted traceback.
Subclasses may override this if they add extra arguments.
"""
tb_list = self.structured_traceback(etype, value, tb,
tb_offset, context)
Fernando Perez
Multiple improvements to tab completion....
r2839 return self.stb2text(tb_list)
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838
def structured_traceback(self, etype, evalue, tb, tb_offset=None,
context=5, mode=None):
"""Return a list of traceback frames.
Must be implemented by each class.
"""
raise NotImplementedError()
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 #---------------------------------------------------------------------------
class ListTB(TBTools):
"""Print traceback information from a traceback list, with optional color.
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Miscellaneous docs fixes
r9244 Calling requires 3 arguments: (etype, evalue, elist)
as would be obtained by::
martinRenou
Improve error tracebacks so that it shows the cell prompts
r26685
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 etype, evalue, tb = sys.exc_info()
if tb:
elist = traceback.extract_tb(tb)
else:
elist = None
It can thus be used by programs which need to process the traceback before
printing (such as console replacements based on the code module from the
standard library).
Because they are meant to be called without a full traceback (only a
list), instances of this class can't call the interactive pdb debugger."""
Matthias Bussonnier
Pass parent to child for configuration to propagate
r22943 def __init__(self, color_scheme='NoColor', call_pdb=False, ostream=None, parent=None, config=None):
Fernando Perez
Simplified output stream management in ultratb....
r2852 TBTools.__init__(self, color_scheme=color_scheme, call_pdb=call_pdb,
Matthias Bussonnier
Pass parent to child for configuration to propagate
r22943 ostream=ostream, parent=parent,config=config)
Bernardo B. Marques
remove all trailling spaces
r4872
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 def __call__(self, etype, value, elist):
Fernando Perez
Clean up small leftover uses of raw streams in exception handling.
r2860 self.ostream.flush()
self.ostream.write(self.text(etype, value, elist))
self.ostream.write('\n')
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Quentin Peter
fix syntax error
r25370 def _extract_tb(self, tb):
if tb:
return traceback.extract_tb(tb)
else:
return None
Quentin Peter
Add chained exception to 'Plain' mode
r25301 def structured_traceback(self, etype, evalue, etb=None, tb_offset=None,
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 context=5):
Fernando Perez
Lots of work on exception handling, including tests for traceback printing....
r2440 """Return a color formatted string with the traceback info.
Parameters
----------
etype : exception type
Matthias Bussonnier
autoformat docstrings in ultratb
r25951 Type of the exception raised.
Quentin Peter
Add chained exception to 'Plain' mode
r25301 evalue : object
Matthias Bussonnier
autoformat docstrings in ultratb
r25951 Data stored in the exception
Quentin Peter
Update docstring
r25307 etb : object
Matthias Bussonnier
autoformat docstrings in ultratb
r25951 If list: List of frames, see class docstring for details.
If Traceback: Traceback of the exception.
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 tb_offset : int, optional
Matthias Bussonnier
autoformat docstrings in ultratb
r25951 Number of frames in the traceback to skip. If not given, the
instance evalue is used (set in constructor).
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 context : int, optional
Matthias Bussonnier
autoformat docstrings in ultratb
r25951 Number of lines of context information to print.
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838
Fernando Perez
Lots of work on exception handling, including tests for traceback printing....
r2440 Returns
-------
String with formatted exception.
"""
Quentin Peter
Update docstring
r25307 # This is a workaround to get chained_exc_ids in recursive calls
# etb should not be a tuple if structured_traceback is not recursive
Quentin Peter
Avoid recursive loop
r25303 if isinstance(etb, tuple):
etb, chained_exc_ids = etb
else:
chained_exc_ids = set()
Quentin Peter
Update docstring
r25307
Quentin Peter
Add chained exception to 'Plain' mode
r25301 if isinstance(etb, list):
elist = etb
elif etb is not None:
elist = self._extract_tb(etb)
else:
elist = []
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 tb_offset = self.tb_offset if tb_offset is None else tb_offset
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 Colors = self.Colors
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 out_list = []
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 if elist:
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838
if tb_offset and len(elist) > tb_offset:
elist = elist[tb_offset:]
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 out_list.append('Traceback %s(most recent call last)%s:' %
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 (Colors.normalEm, Colors.Normal) + '\n')
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 out_list.extend(self._format_list(elist))
# The exception info should be a single entry in the list.
Quentin Peter
Add chained exception to 'Plain' mode
r25301 lines = ''.join(self._format_exception_only(etype, evalue))
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 out_list.append(lines)
Quentin Peter
Add chained exception to 'Plain' mode
r25301 exception = self.get_parts_of_chained_exception(evalue)
if exception and not id(exception[1]) in chained_exc_ids:
Quentin Peter
fix 'direct cause' message
r25306 chained_exception_message = self.prepare_chained_exception_message(
evalue.__cause__)[0]
Quentin Peter
Add chained exception to 'Plain' mode
r25301 etype, evalue, etb = exception
Quentin Peter
fix 'direct cause' message
r25306 # Trace exception to avoid infinite 'cause' loop
chained_exc_ids.add(id(exception[1]))
Quentin Peter
Add chained exception to 'Plain' mode
r25301 chained_exceptions_tb_offset = 0
Quentin Peter
fix 'direct cause' message
r25306 out_list = (
self.structured_traceback(
etype, evalue, (etb, chained_exc_ids),
chained_exceptions_tb_offset, context)
+ chained_exception_message
+ out_list)
Quentin Peter
Add chained exception to 'Plain' mode
r25301
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 return out_list
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
def _format_list(self, extracted_list):
"""Format a list of traceback entry tuples for printing.
Given a list of tuples as returned by extract_tb() or
extract_stack(), return a list of strings ready for printing.
Each string in the resulting list corresponds to the item with the
same index in the argument list. Each string ends in a newline;
the strings may contain internal newlines as well, for those items
whose source text line is not None.
Bernardo B. Marques
remove all trailling spaces
r4872
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 Lifted almost verbatim from traceback.py
"""
Colors = self.Colors
list = []
for filename, lineno, name, line in extracted_list[:-1]:
martinRenou
Linting
r26689 item = " %s, line %s%d%s, in %s%s%s\n" % (
martinRenou
Fix coloring
r26690 _format_filename(filename, Colors.filename, Colors.Normal),
martinRenou
Linting
r26689 Colors.lineno,
lineno,
Colors.Normal,
Colors.name,
name,
Colors.Normal,
)
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 if line:
Thomas Kluyver
Use inplace addition in ultratb.
r5831 item += ' %s\n' % line.strip()
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 list.append(item)
# Emphasize the last entry
filename, lineno, name, line = extracted_list[-1]
martinRenou
Linting
r26689 item = "%s %s, line %s%d%s, in %s%s%s%s\n" % (
Colors.normalEm,
martinRenou
Fix coloring
r26690 _format_filename(filename, Colors.filenameEm, Colors.normalEm),
martinRenou
Linting
r26689 Colors.linenoEm,
lineno,
Colors.normalEm,
Colors.nameEm,
name,
Colors.normalEm,
Colors.Normal,
)
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 if line:
Thomas Kluyver
Use inplace addition in ultratb.
r5831 item += '%s %s%s\n' % (Colors.line, line.strip(),
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 Colors.Normal)
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 list.append(item)
return list
Bernardo B. Marques
remove all trailling spaces
r4872
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 def _format_exception_only(self, etype, value):
"""Format the exception part of a traceback.
The arguments are the exception type and value such as given by
sys.exc_info()[:2]. The return value is a list of strings, each ending
in a newline. Normally, the list contains a single string; however,
for SyntaxError exceptions, it contains several lines that (when
printed) display detailed information about where the syntax error
occurred. The message indicating which exception occurred is the
always last string in the list.
Bernardo B. Marques
remove all trailling spaces
r4872
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 Also lifted nearly verbatim from traceback.py
"""
Fernando Perez
Checkpoint before merging with upstream
r1568 have_filedata = False
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 Colors = self.Colors
list = []
Srinivas Reddy Thatiparthy
Add
r23671 stype = py3compat.cast_unicode(Colors.excName + etype.__name__ + Colors.Normal)
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 if value is None:
Thomas Kluyver
Fix display of SyntaxError in Python 3....
r5827 # Not sure if this can still happen in Python 2.6 and above
Min RK
handle unicode exception messages in xmode plain
r22269 list.append(stype + '\n')
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 else:
Thomas Kluyver
Make IndentationErrors display like other SyntaxErrors...
r8417 if issubclass(etype, SyntaxError):
Thomas Kluyver
Fix display of SyntaxError in Python 3....
r5827 have_filedata = True
if not value.filename: value.filename = "<string>"
Jez Ng
Avoid calling getline() if lineno is None.
r8590 if value.lineno:
lineno = value.lineno
Srinivas Reddy Thatiparthy
remove ulinecache module refs
r23117 textline = linecache.getline(value.filename, value.lineno)
Jez Ng
Avoid calling getline() if lineno is None.
r8590 else:
martinRenou
Linting
r26689 lineno = "unknown"
textline = ""
list.append(
"%s %s, line %s%s%s\n"
% (
Colors.normalEm,
martinRenou
Linting
r26691 _format_filename(
value.filename, Colors.filenameEm, Colors.normalEm
),
martinRenou
Linting
r26689 Colors.linenoEm,
lineno,
Colors.Normal,
)
)
if textline == "":
Srinivas Reddy Thatiparthy
Add
r23671 textline = py3compat.cast_unicode(value.text, "utf-8")
Jörgen Stenarson
Fix unicode problem with SyntaxError traceback
r8328
if textline is not None:
Thomas Kluyver
Fix display of SyntaxError in Python 3....
r5827 i = 0
Jörgen Stenarson
Fix unicode problem with SyntaxError traceback
r8328 while i < len(textline) and textline[i].isspace():
Thomas Kluyver
Use inplace addition in ultratb.
r5831 i += 1
Thomas Kluyver
Fix display of SyntaxError in Python 3....
r5827 list.append('%s %s%s\n' % (Colors.line,
Jörgen Stenarson
Fix unicode problem with SyntaxError traceback
r8328 textline.strip(),
Thomas Kluyver
Fix display of SyntaxError in Python 3....
r5827 Colors.Normal))
if value.offset is not None:
s = ' '
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 for c in textline[i:value.offset - 1]:
Thomas Kluyver
Fix display of SyntaxError in Python 3....
r5827 if c.isspace():
Thomas Kluyver
Use inplace addition in ultratb.
r5831 s += c
Thomas Kluyver
Fix display of SyntaxError in Python 3....
r5827 else:
Thomas Kluyver
Use inplace addition in ultratb.
r5831 s += ' '
Thomas Kluyver
Fix display of SyntaxError in Python 3....
r5827 list.append('%s%s^%s\n' % (Colors.caret, s,
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 Colors.Normal))
Thomas Kluyver
Fix display of SyntaxError in Python 3....
r5827
try:
s = value.msg
except Exception:
s = self._some_str(value)
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 if s:
Min RK
handle unicode exception messages in xmode plain
r22269 list.append('%s%s:%s %s\n' % (stype, Colors.excName,
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 Colors.Normal, s))
else:
Min RK
handle unicode exception messages in xmode plain
r22269 list.append('%s\n' % stype)
Fernando Perez
Merge Vivan De Smedt's branch on editor synchronization.
r1532
Fernando Perez
Lots of work on exception handling, including tests for traceback printing....
r2440 # sync with user hooks
Fernando Perez
Fix https://bugs.launchpad.net/ipython/+bug/362137...
r2088 if have_filedata:
MinRK
don't use deprecated ipapi.get...
r10581 ipinst = get_ipython()
Brian Granger
Merging -r 1177 from lp:ipython with fixes and resolutions....
r2124 if ipinst is not None:
Thomas Kluyver
Fix display of SyntaxError in Python 3....
r5827 ipinst.hooks.synchronize_with_editor(value.filename, value.lineno, 0)
Fernando Perez
Merge Vivan De Smedt's branch on editor synchronization.
r1532
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 return list
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 def get_exception_only(self, etype, value):
"""Only print the exception type and message, without a traceback.
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 Parameters
----------
etype : exception type
Matthias Bussonnier
autoformat docstrings in ultratb
r25951 evalue : exception value
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 """
Quentin Peter
Add chained exception to 'Plain' mode
r25301 return ListTB.structured_traceback(self, etype, value)
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838
Brian Granger
Merge branch 'newkernel' into upstream-newkernel...
r2873 def show_exception_only(self, etype, evalue):
Fernando Perez
Lots of work on exception handling, including tests for traceback printing....
r2440 """Only print the exception type and message, without a traceback.
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Lots of work on exception handling, including tests for traceback printing....
r2440 Parameters
----------
etype : exception type
Matthias Bussonnier
autoformat docstrings in ultratb
r25951 evalue : exception value
Fernando Perez
Lots of work on exception handling, including tests for traceback printing....
r2440 """
# This method needs to use __call__ from *this* class, not the one from
# a subclass whose signature or behavior may be different
Fernando Perez
Simplified output stream management in ultratb....
r2852 ostream = self.ostream
Brian Granger
Changing how IPython.utils.io.Term is handled....
r2775 ostream.flush()
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 ostream.write('\n'.join(self.get_exception_only(etype, evalue)))
Brian Granger
Changing how IPython.utils.io.Term is handled....
r2775 ostream.flush()
Fernando Perez
Lots of work on exception handling, including tests for traceback printing....
r2440
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 def _some_str(self, value):
# Lifted from traceback.py
try:
Srinivas Reddy Thatiparthy
Add
r23671 return py3compat.cast_unicode(str(value))
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 except:
Min RK
handle unicode exception messages in xmode plain
r22269 return u'<unprintable %s object>' % type(value).__name__
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 #----------------------------------------------------------------------------
class VerboseTB(TBTools):
"""A port of Ka-Ping Yee's cgitb.py module that outputs color text instead
of HTML. Requires inspect and pydoc. Crazy, man.
Modified version which optionally strips the topmost entries from the
traceback, to be used with alternate interpreters (because their own code
would appear in the traceback)."""
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 def __init__(self, color_scheme='Linux', call_pdb=False, ostream=None,
Fernando Perez
Complete implementation of interactive traceback support....
r3175 tb_offset=0, long_header=False, include_vars=True,
Matthias Bussonnier
Pass parent to child for configuration to propagate
r22943 check_cache=None, debugger_cls = None,
parent=None, config=None):
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 """Specify traceback offset, headers and color scheme.
Define how many frames to drop from the tracebacks. Calling it with
tb_offset=1 allows use of this handler in interpreters which will have
their own code at the top of the traceback (VerboseTB will first
remove that frame before printing the traceback info)."""
Fernando Perez
Simplified output stream management in ultratb....
r2852 TBTools.__init__(self, color_scheme=color_scheme, call_pdb=call_pdb,
Matthias Bussonnier
Pass parent to child for configuration to propagate
r22943 ostream=ostream, parent=parent, config=config)
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 self.tb_offset = tb_offset
self.long_header = long_header
self.include_vars = include_vars
Fernando Perez
Complete implementation of interactive traceback support....
r3175 # By default we use linecache.checkcache, but the user can provide a
# different check_cache implementation. This is used by the IPython
# kernel to provide tracebacks for interactive code that is cached,
# by a compiler instance that flushes the linecache but preserves its
# own code cache.
if check_cache is None:
check_cache = linecache.checkcache
self.check_cache = check_cache
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Thomas Kluyver
Create separate class for debugger using prompt_toolkit
r22391 self.debugger_cls = debugger_cls or debugger.Pdb
Matthias Bussonnier
Implement understanding on __tracebackhide__...
r25839 self.skip_hidden = True
Thomas Kluyver
Create separate class for debugger using prompt_toolkit
r22391
Alex Hall
Initial integration of stack_data
r25466 def format_record(self, frame_info):
Thomas Kluyver
Truncate tracebacks on recursion error...
r21983 """Format a single stack frame"""
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 Colors = self.Colors # just a shorthand + quicker name lookup
ColorsNormal = Colors.Normal # used a lot
Alex Hall
Handle stackdata.RepeatedFrames
r25467
if isinstance(frame_info, stack_data.RepeatedFrames):
return ' %s[... skipping similar frames: %s]%s\n' % (
Colors.excName, frame_info.description, ColorsNormal)
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 indent = ' ' * INDENT_SIZE
em_normal = '%s\n%s%s' % (Colors.valEm, indent, ColorsNormal)
tpl_call = 'in %s%%s%s%%s%s' % (Colors.vName, Colors.valEm,
ColorsNormal)
tpl_call_fail = 'in %s%%s%s(***failed resolving arguments***)%s' % \
(Colors.vName, Colors.valEm, ColorsNormal)
tpl_name_val = '%%s %s= %%s%s' % (Colors.valEm, ColorsNormal)
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157
martinRenou
Fix coloring
r26690 link = _format_filename(frame_info.filename, Colors.filenameEm, ColorsNormal)
Alex Hall
Initial integration of stack_data
r25466 args, varargs, varkw, locals_ = inspect.getargvalues(frame_info.frame)
Thomas Kluyver
Truncate tracebacks on recursion error...
r21983
Alex Hall
Initial integration of stack_data
r25466 func = frame_info.executing.code_qualname()
if func == '<module>':
Matthias Bussonnier
Traceback printing change `in <module>()` to `in <module>`....
r24335 call = tpl_call % (func, '')
Thomas Kluyver
Truncate tracebacks on recursion error...
r21983 else:
# Decide whether to include variable details or not
Matthias Bussonnier
Some other cleaning of ultratb...
r24336 var_repr = eqrepr if self.include_vars else nullrepr
Thomas Kluyver
Truncate tracebacks on recursion error...
r21983 try:
call = tpl_call % (func, inspect.formatargvalues(args,
varargs, varkw,
Matthias Bussonnier
Refactor of coloring and traceback mechanism....
r24334 locals_, formatvalue=var_repr))
Thomas Kluyver
Truncate tracebacks on recursion error...
r21983 except KeyError:
# This happens in situations like errors inside generator
# expressions, where local variables are listed in the
# line, but can't be extracted from the frame. I'm not
# 100% sure this isn't actually a bug in inspect itself,
# but since there's no info for us to compute with, the
# best we can do is report the failure and move on. Here
# we must *not* call any traceback construction again,
# because that would mess up use of %debug later on. So we
# simply report the failure and move on. The only
# limitation will be that this frame won't have locals
# listed in the call signature. Quite subtle problem...
# I can't think of a good way to validate this in a unit
# test, but running a script consisting of:
# dict( (k,v.strip()) for (k,v) in range(10) )
# will illustrate the error, if this exception catch is
# disabled.
call = tpl_call_fail % func
Matthias Bussonnier
Refactor of coloring and traceback mechanism....
r24334 lvals = ''
lvals_list = []
Thomas Kluyver
Truncate tracebacks on recursion error...
r21983 if self.include_vars:
Matthias Bussonnier
Protect against failure to show local data....
r26712 try:
# we likely want to fix stackdata at some point, but
# still need a workaround.
fibp = frame_info.variables_in_executing_piece
for var in fibp:
lvals_list.append(tpl_name_val % (var.name, repr(var.value)))
except Exception:
lvals_list.append(
"Exception trying to inspect frame. No more locals available."
)
Matthias Bussonnier
Refactor of coloring and traceback mechanism....
r24334 if lvals_list:
lvals = '%s%s' % (indent, em_normal.join(lvals_list))
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
martinRenou
Linting
r26689 result = "%s, %s\n" % (link, call)
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Alex Hall
Check user config to decide whether to use pygments
r25506 result += ''.join(_format_traceback_lines(frame_info.lines, Colors, self.has_colors, lvals))
Alex Hall
Initial integration of stack_data
r25466 return result
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157
def prepare_header(self, etype, long_version=False):
colors = self.Colors # just a shorthand + quicker name lookup
colorsnormal = colors.Normal # used a lot
exc = '%s%s%s' % (colors.excName, etype, colorsnormal)
Vincent Woo
Use term width to determine header length
r22150 width = min(75, get_terminal_size()[0])
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157 if long_version:
# Header with the exception type, python version, and date
pyver = 'Python ' + sys.version.split()[0] + ': ' + sys.executable
date = time.ctime(time.time())
Vincent Woo
Use term width to determine header length
r22150 head = '%s%s%s\n%s%s%s\n%s' % (colors.topline, '-' * width, colorsnormal,
exc, ' ' * (width - len(str(etype)) - len(pyver)),
pyver, date.rjust(width) )
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157 head += "\nA problem occurred executing Python code. Here is the sequence of function" \
"\ncalls leading up to the error, with the most recent (innermost) call last."
else:
# Simplified header
Justyna Ilczuk
i1673 change formatting (dashed line only on top)
r17163 head = '%s%s' % (exc, 'Traceback (most recent call last)'. \
Vincent Woo
Use term width to determine header length
r22150 rjust(width - len(str(etype))) )
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157
return head
def format_exception(self, etype, evalue):
colors = self.Colors # just a shorthand + quicker name lookup
colorsnormal = colors.Normal # used a lot
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 # Get (safely) a string form of the exception info
try:
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 etype_str, evalue_str = map(str, (etype, evalue))
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 except:
# User exception is improperly defined.
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 etype, evalue = str, sys.exc_info()[:2]
etype_str, evalue_str = map(str, (etype, evalue))
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 # ... and format it
Srinivas Reddy Thatiparthy
Add
r23671 return ['%s%s%s: %s' % (colors.excName, etype_str,
colorsnormal, py3compat.cast_unicode(evalue_str))]
Fernando Perez
Merge Vivan De Smedt's branch on editor synchronization.
r1532
Justyna Ilczuk
i1673 some DRY refactoring
r17158 def format_exception_as_a_whole(self, etype, evalue, etb, number_of_lines_of_context, tb_offset):
Thomas Kluyver
Truncate tracebacks on recursion error...
r21983 """Formats the header, traceback and exception message for a single exception.
This may be called multiple times by Python 3 exception chaining
(PEP 3134).
"""
Justyna Ilczuk
i1673 some DRY refactoring
r17158 # some locals
Thomas Kluyver
Truncate tracebacks on recursion error...
r21983 orig_etype = etype
Justyna Ilczuk
i1673 some DRY refactoring
r17158 try:
etype = etype.__name__
except AttributeError:
pass
tb_offset = self.tb_offset if tb_offset is None else tb_offset
head = self.prepare_header(etype, self.long_header)
records = self.get_records(etb, number_of_lines_of_context, tb_offset)
Matthias Bussonnier
Implement understanding on __tracebackhide__...
r25839 frames = []
skipped = 0
Matthias Bussonnier
Always display last frame when show tracebacks with hidden frames....
r26053 lastrecord = len(records) - 1
for i, r in enumerate(records):
Matthias Bussonnier
Implement understanding on __tracebackhide__...
r25839 if not isinstance(r, stack_data.RepeatedFrames) and self.skip_hidden:
Matthias Bussonnier
Always display last frame when show tracebacks with hidden frames....
r26053 if r.frame.f_locals.get("__tracebackhide__", 0) and i != lastrecord:
Matthias Bussonnier
Implement understanding on __tracebackhide__...
r25839 skipped += 1
continue
if skipped:
Colors = self.Colors # just a shorthand + quicker name lookup
ColorsNormal = Colors.Normal # used a lot
frames.append(
" %s[... skipping hidden %s frame]%s\n"
% (Colors.excName, skipped, ColorsNormal)
)
skipped = 0
frames.append(self.format_record(r))
Matthias Bussonnier
Show make sure to flush hidden exception to screen....
r25845 if skipped:
Colors = self.Colors # just a shorthand + quicker name lookup
ColorsNormal = Colors.Normal # used a lot
frames.append(
" %s[... skipping hidden %s frame]%s\n"
% (Colors.excName, skipped, ColorsNormal)
)
Hoyt Koepke
BUGFIX: check for None moved earlier....
r21751
Justyna Ilczuk
i1673 some DRY refactoring
r17158 formatted_exception = self.format_exception(etype, evalue)
if records:
Alex Hall
Initial integration of stack_data
r25466 frame_info = records[-1]
Justyna Ilczuk
i1673 some DRY refactoring
r17158 ipinst = get_ipython()
if ipinst is not None:
Alex Hall
Initial integration of stack_data
r25466 ipinst.hooks.synchronize_with_editor(frame_info.filename, frame_info.lineno, 0)
Justyna Ilczuk
i1673 some DRY refactoring
r17158
return [[head] + frames + [''.join(formatted_exception[0])]]
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157 def get_records(self, etb, number_of_lines_of_context, tb_offset):
Alex Hall
Initial integration of stack_data
r25466 context = number_of_lines_of_context - 1
after = context // 2
before = context - after
Alex Hall
Check user config to decide whether to use pygments
r25506 if self.has_colors:
Alex Hall
Highlight the executing node with stack_data
r25548 style = get_style_by_name('default')
style = stack_data.style_with_executing_node(style, 'bg:#00005f')
formatter = Terminal256Formatter(style=style)
Alex Hall
Check user config to decide whether to use pygments
r25506 else:
formatter = None
options = stack_data.Options(
before=before,
after=after,
pygments_formatter=formatter,
)
Alex Hall
Initial integration of stack_data
r25466 return list(stack_data.FrameInfo.stack_data(etb, options=options))[tb_offset:]
Bernardo B. Marques
remove all trailling spaces
r4872
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157 def structured_traceback(self, etype, evalue, etb, tb_offset=None,
number_of_lines_of_context=5):
"""Return a nice text document describing the traceback."""
Justyna Ilczuk
i1673 remove confusing traceback truncating
r17162
formatted_exception = self.format_exception_as_a_whole(etype, evalue, etb, number_of_lines_of_context,
tb_offset)
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157
Justyna Ilczuk
i1673 change formatting (dashed line only on top)
r17163 colors = self.Colors # just a shorthand + quicker name lookup
colorsnormal = colors.Normal # used a lot
Vincent Woo
Use term width to determine header length
r22150 head = '%s%s%s' % (colors.topline, '-' * min(75, get_terminal_size()[0]), colorsnormal)
Justyna Ilczuk
i1673 change formatting (dashed line only on top)
r17163 structured_traceback_parts = [head]
Hugo
Remove redundant Python 2 code
r24010 chained_exceptions_tb_offset = 0
lines_of_context = 3
formatted_exceptions = formatted_exception
exception = self.get_parts_of_chained_exception(evalue)
if exception:
formatted_exceptions += self.prepare_chained_exception_message(evalue.__cause__)
etype, evalue, etb = exception
else:
evalue = None
chained_exc_ids = set()
while evalue:
formatted_exceptions += self.format_exception_as_a_whole(etype, evalue, etb, lines_of_context,
chained_exceptions_tb_offset)
Justyna Ilczuk
i1673 use __cause__ first in chained exceptions
r17164 exception = self.get_parts_of_chained_exception(evalue)
Hugo
Remove redundant Python 2 code
r24010
if exception and not id(exception[1]) in chained_exc_ids:
chained_exc_ids.add(id(exception[1])) # trace exception to avoid infinite 'cause' loop
Justyna Ilczuk
i1673 remove confusing traceback truncating
r17162 formatted_exceptions += self.prepare_chained_exception_message(evalue.__cause__)
etype, evalue, etb = exception
else:
evalue = None
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157
Hugo
Remove redundant Python 2 code
r24010 # we want to see exceptions in a reversed order:
# the first exception should be on top
for formatted_exception in reversed(formatted_exceptions):
structured_traceback_parts += formatted_exception
Justyna Ilczuk
i1673 remove confusing traceback truncating
r17162
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157 return structured_traceback_parts
Bernardo B. Marques
remove all trailling spaces
r4872
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 def debugger(self, force=False):
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 """Call up the pdb debugger if desired, always clean up the tb
reference.
Keywords:
- force(False): by default, this routine checks the instance call_pdb
Thomas Kluyver
Improvements to docs formatting.
r12553 flag and does not actually invoke the debugger if the flag is false.
The 'force' option forces the debugger to activate even if the flag
is false.
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
If the call_pdb flag is set, the pdb interactive debugger is
invoked. In all cases, the self.tb reference to the current traceback
is deleted to prevent lingering references which hamper memory
management.
Note that each call to pdb() does an 'import readline', so if your app
requires a special setup for the readline completers, you'll have to
fix that by hand after invoking the exception handler."""
if force or self.call_pdb:
if self.pdb is None:
Matthias Bussonnier
Start refactoring handling of color....
r22911 self.pdb = self.debugger_cls()
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 # the system displayhook may have changed, restore the original
# for pdb
Brian Granger
Fixing two minor bugs....
r2816 display_trap = DisplayTrap(hook=sys.__displayhook__)
Brian Granger
sys.displayhook is now managed dynamically by display_trap.
r2231 with display_trap:
self.pdb.reset()
# Find the right frame so we don't pop up inside ipython itself
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 if hasattr(self, 'tb') and self.tb is not None:
Brian Granger
sys.displayhook is now managed dynamically by display_trap.
r2231 etb = self.tb
else:
etb = self.tb = sys.last_traceback
Fernando Perez
Fix minor error that I saw in some odd cases, not sure how to test for it....
r2438 while self.tb is not None and self.tb.tb_next is not None:
Brian Granger
sys.displayhook is now managed dynamically by display_trap.
r2231 self.tb = self.tb.tb_next
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 if etb and etb.tb_next:
etb = etb.tb_next
self.pdb.botframe = etb.tb_frame
Audrey Dutcher
Fix `up` through generators in postmortem debugger...
r24590 self.pdb.interaction(None, etb)
Brian Granger
sys.displayhook is now managed dynamically by display_trap.
r2231
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 if hasattr(self, 'tb'):
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 del self.tb
def handler(self, info=None):
(etype, evalue, etb) = info or sys.exc_info()
self.tb = etb
Fernando Perez
Simplified output stream management in ultratb....
r2852 ostream = self.ostream
ostream.flush()
ostream.write(self.text(etype, evalue, etb))
ostream.write('\n')
ostream.flush()
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
# Changed so an instance can just be called as VerboseTB_inst() and print
# out the right info on its own.
def __call__(self, etype=None, evalue=None, etb=None):
"""This hook can replace sys.excepthook (for Python 2.1 or higher)."""
if etb is None:
self.handler()
else:
self.handler((etype, evalue, etb))
try:
self.debugger()
except KeyboardInterrupt:
Thomas Kluyver
Convert print statements to print function calls...
r13348 print("\nKeyboardInterrupt")
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 #----------------------------------------------------------------------------
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 class FormattedTB(VerboseTB, ListTB):
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 """Subclass ListTB but allow calling with a traceback.
It can thus be used as a sys.excepthook for Python > 2.1.
Also adds 'Context' and 'Verbose' modes, not available in ListTB.
Allows a tb_offset to be specified. This is useful for situations where
one needs to remove a number of topmost frames from the traceback (such as
occurs with python programs that themselves execute other python code,
like Python shells). """
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Simplified output stream management in ultratb....
r2852 def __init__(self, mode='Plain', color_scheme='Linux', call_pdb=False,
Bernardo B. Marques
remove all trailling spaces
r4872 ostream=None,
Fernando Perez
Complete implementation of interactive traceback support....
r3175 tb_offset=0, long_header=False, include_vars=False,
Matthias Bussonnier
Pass parent to child for configuration to propagate
r22943 check_cache=None, debugger_cls=None,
parent=None, config=None):
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
# NEVER change the order of this list. Put new modes at the end:
Dan Allan
ENH: Add a 'Minimal' xmode option....
r24849 self.valid_modes = ['Plain', 'Context', 'Verbose', 'Minimal']
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 self.verbose_modes = self.valid_modes[1:3]
Fernando Perez
Simplified output stream management in ultratb....
r2852 VerboseTB.__init__(self, color_scheme=color_scheme, call_pdb=call_pdb,
ostream=ostream, tb_offset=tb_offset,
Fernando Perez
Complete implementation of interactive traceback support....
r3175 long_header=long_header, include_vars=include_vars,
Matthias Bussonnier
Pass parent to child for configuration to propagate
r22943 check_cache=check_cache, debugger_cls=debugger_cls,
parent=parent, config=config)
Fernando Perez
Multiple improvements to tab completion....
r2839
# Different types of tracebacks are joined with different separators to
# form a single string. They are taken from this dict
Dan Allan
ENH: Add a 'Minimal' xmode option....
r24849 self._join_chars = dict(Plain='', Context='\n', Verbose='\n',
Minimal='')
Fernando Perez
Multiple improvements to tab completion....
r2839 # set_mode also sets the tb_join_char attribute
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 self.set_mode(mode)
Bernardo B. Marques
remove all trailling spaces
r4872
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157 def structured_traceback(self, etype, value, tb, tb_offset=None, number_of_lines_of_context=5):
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 tb_offset = self.tb_offset if tb_offset is None else tb_offset
Fernando Perez
Multiple improvements to tab completion....
r2839 mode = self.mode
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 if mode in self.verbose_modes:
Brian Granger
Initial refactoring to support structured traceback information.
r2792 # Verbose modes need a full traceback
return VerboseTB.structured_traceback(
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157 self, etype, value, tb, tb_offset, number_of_lines_of_context
Brian Granger
Initial refactoring to support structured traceback information.
r2792 )
Dan Allan
ENH: Add a 'Minimal' xmode option....
r24849 elif mode == 'Minimal':
return ListTB.get_exception_only(self, etype, value)
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 else:
# We must check the source cache because otherwise we can print
# out-of-date source code.
Fernando Perez
Complete implementation of interactive traceback support....
r3175 self.check_cache()
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 # Now we can extract and format the exception
Brian Granger
Initial refactoring to support structured traceback information.
r2792 return ListTB.structured_traceback(
Quentin Peter
Add chained exception to 'Plain' mode
r25301 self, etype, value, tb, tb_offset, number_of_lines_of_context
Brian Granger
Initial refactoring to support structured traceback information.
r2792 )
Fernando Perez
Multiple improvements to tab completion....
r2839 def stb2text(self, stb):
"""Convert a structured traceback (a list) to a string."""
return self.tb_join_char.join(stb)
Bernardo B. Marques
remove all trailling spaces
r4872
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 def set_mode(self, mode=None):
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 """Switch to the desired mode.
If mode is not specified, cycles through the available modes."""
if not mode:
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157 new_idx = (self.valid_modes.index(self.mode) + 1 ) % \
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 len(self.valid_modes)
self.mode = self.valid_modes[new_idx]
elif mode not in self.valid_modes:
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 raise ValueError('Unrecognized mode in FormattedTB: <' + mode + '>\n'
'Valid modes: ' + str(self.valid_modes))
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 else:
self.mode = mode
# include variable details only in 'Verbose' mode
self.include_vars = (self.mode == self.valid_modes[2])
Fernando Perez
Multiple improvements to tab completion....
r2839 # Set the join character for generating text tracebacks
Fernando Perez
Fix small bug where %xmode without arguments failed to run....
r3146 self.tb_join_char = self._join_chars[self.mode]
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 # some convenient shortcuts
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 def plain(self):
self.set_mode(self.valid_modes[0])
def context(self):
self.set_mode(self.valid_modes[1])
def verbose(self):
self.set_mode(self.valid_modes[2])
Dan Allan
ENH: Add a 'Minimal' xmode option....
r24849 def minimal(self):
self.set_mode(self.valid_modes[3])
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 #----------------------------------------------------------------------------
class AutoFormattedTB(FormattedTB):
"""A traceback printer which can be called on the fly.
It will find out about exceptions by itself.
Thomas Kluyver
Miscellaneous docs fixes
r9244 A brief example::
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Miscellaneous docs fixes
r9244 AutoTB = AutoFormattedTB(mode = 'Verbose',color_scheme='Linux')
try:
...
except:
AutoTB() # or AutoTB(out=logfile) where logfile is an open file object
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 """
Bernardo B. Marques
remove all trailling spaces
r4872
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 def __call__(self, etype=None, evalue=None, etb=None,
out=None, tb_offset=None):
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 """Print out a formatted exception traceback.
Optional arguments:
- out: an open file-like object to direct output to.
- tb_offset: the number of frames to skip over in the stack, on a
per-call basis (this overrides temporarily the instance's tb_offset
Matthias Bussonnier
autoformat docstrings in ultratb
r25951 given at initialization time."""
Fernando Perez
Lots of work on exception handling, including tests for traceback printing....
r2440
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 if out is None:
Fernando Perez
Simplified output stream management in ultratb....
r2852 out = self.ostream
Brian Granger
Changing how IPython.utils.io.Term is handled....
r2775 out.flush()
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 out.write(self.text(etype, evalue, etb, tb_offset))
out.write('\n')
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 out.flush()
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838 # FIXME: we should remove the auto pdb behavior from here and leave
# that to the clients.
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 try:
self.debugger()
except KeyboardInterrupt:
Thomas Kluyver
Convert print statements to print function calls...
r13348 print("\nKeyboardInterrupt")
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Brian Granger
Initial refactoring to support structured traceback information.
r2792 def structured_traceback(self, etype=None, value=None, tb=None,
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157 tb_offset=None, number_of_lines_of_context=5):
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 if etype is None:
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 etype, value, tb = sys.exc_info()
Quentin Peter
save traceback for chained exception
r25371 if isinstance(tb, tuple):
Quentin Peter
fix syntax error
r25370 # tb is a tuple if this is a chained exception.
Quentin Peter
save traceback for chained exception
r25371 self.tb = tb[0]
else:
Quentin Peter
fix syntax error
r25370 self.tb = tb
Brian Granger
Initial refactoring to support structured traceback information.
r2792 return FormattedTB.structured_traceback(
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157 self, etype, value, tb, tb_offset, number_of_lines_of_context)
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 #---------------------------------------------------------------------------
Brian Granger
Initial refactoring to support structured traceback information.
r2792
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234 # A simple class to preserve Nathan's original functionality.
class ColorTB(FormattedTB):
"""Shorthand to initialize a FormattedTB in Linux colors mode."""
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156
Matthias Bussonnier
Move ultratb test to be run on CI.
r21789 def __init__(self, color_scheme='Linux', call_pdb=0, **kwargs):
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 FormattedTB.__init__(self, color_scheme=color_scheme,
Matthias Bussonnier
Move ultratb test to be run on CI.
r21789 call_pdb=call_pdb, **kwargs)
Brian E Granger
This is a manual merge of certain things in the ipython1-dev branch, revision 46, into the main ...
r1234
Brian Granger
Initial refactoring to support structured traceback information.
r2792
class SyntaxTB(ListTB):
"""Extension which holds some state: the last exception value"""
Matthias Bussonnier
Pass parent to child for configuration to propagate
r22943 def __init__(self, color_scheme='NoColor', parent=None, config=None):
ListTB.__init__(self, color_scheme, parent=parent, config=config)
Brian Granger
Initial refactoring to support structured traceback information.
r2792 self.last_syntax_error = None
def __call__(self, etype, value, elist):
self.last_syntax_error = value
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 ListTB.__call__(self, etype, value, elist)
Brian Granger
Initial refactoring to support structured traceback information.
r2792
Thomas Kluyver
Fix display of SyntaxError when .py file is modified.
r12544 def structured_traceback(self, etype, value, elist, tb_offset=None,
context=5):
# If the source file has been edited, the line in the syntax error can
# be wrong (retrieved from an outdated cache). This replaces it with
# the current value.
Thomas Kluyver
Don't assume that SyntaxTB is always called with a SyntaxError...
r12951 if isinstance(value, SyntaxError) \
Srinivas Reddy Thatiparthy
convert string_types to str
r23037 and isinstance(value.filename, str) \
Thomas Kluyver
Check for string_types instead of str
r12545 and isinstance(value.lineno, int):
Thomas Kluyver
Fix display of SyntaxError when .py file is modified.
r12544 linecache.checkcache(value.filename)
Srinivas Reddy Thatiparthy
remove ulinecache module refs
r23117 newtext = linecache.getline(value.filename, value.lineno)
Thomas Kluyver
Fix display of SyntaxError when .py file is modified.
r12544 if newtext:
value.text = newtext
Thomas Kluyver
Restore option to auto-edit files on syntax error
r22204 self.last_syntax_error = value
Thomas Kluyver
Fix display of SyntaxError when .py file is modified.
r12544 return super(SyntaxTB, self).structured_traceback(etype, value, elist,
Justyna Ilczuk
i1673 PEP8 formatting in `ultratab.py`
r17156 tb_offset=tb_offset, context=context)
Thomas Kluyver
Fix display of SyntaxError when .py file is modified.
r12544
Brian Granger
Initial refactoring to support structured traceback information.
r2792 def clear_err_state(self):
"""Return the current error state and clear it"""
e = self.last_syntax_error
self.last_syntax_error = None
return e
Fernando Perez
Multiple improvements to tab completion....
r2839 def stb2text(self, stb):
"""Convert a structured traceback (a list) to a string."""
return ''.join(stb)
Fernando Perez
Improvements to exception handling to transport structured tracebacks....
r2838
Justyna Ilczuk
i1673 implementation of py3 proper error handling...
r17157 # some internal-use functions
def text_repr(value):
"""Hopefully pretty robust repr equivalent."""
# this is pretty horrible but should always return *something*
try:
return pydoc.text.repr(value)
except KeyboardInterrupt:
raise
except:
try:
return repr(value)
except KeyboardInterrupt:
raise
except:
try:
# all still in an except block so we catch
# getattr raising
name = getattr(value, '__name__', None)
if name:
# ick, recursion
return text_repr(name)
klass = getattr(value, '__class__', None)
if klass:
return '%s instance' % text_repr(klass)
except KeyboardInterrupt:
raise
except:
return 'UNRECOVERABLE REPR FAILURE'
def eqrepr(value, repr=text_repr):
return '=%s' % repr(value)
def nullrepr(value, repr=text_repr):
return ''