# encoding: utf-8

"""Some formatter objects to extract traceback information by replacing
sys.excepthook()."""

__docformat__ = "restructuredtext en"

#-------------------------------------------------------------------------------
#  Copyright (C) 2008  The IPython Development Team
#
#  Distributed under the terms of the BSD License.  The full license is in
#  the file COPYING, distributed as part of this software.
#-------------------------------------------------------------------------------

#-------------------------------------------------------------------------------
# Imports
#-------------------------------------------------------------------------------

import traceback


class ITracebackFormatter(object):
    """ Objects conforming to this interface will format tracebacks into other
    objects.
    """

    # The kind of formatter.
    kind = 'traceback'

    # The unique identifier for this formatter.
    identifier = None


    def __call__(self, exc_type, exc_value, exc_traceback):
        """ Return a formatted representation of a traceback.
        """

        raise NotImplementedError


class PlainTracebackFormatter(ITracebackFormatter):
    """ Return a string with the regular traceback information.
    """

    # The unique identifier for this formatter.
    identifier = 'plain'


    def __init__(self, limit=None):
        # The maximum number of stack levels to go back.
        # None implies all stack levels are returned.
        self.limit = limit
    
    def __call__(self, exc_type, exc_value, exc_traceback):
        """ Return a string with the regular traceback information.
        """

        lines = traceback.format_tb(exc_traceback, self.limit)
        lines.append('%s: %s' % (exc_type.__name__, exc_value))
        return '\n'.join(lines)