#extends phd_site #implements respond #attr $Title = "init.py" #attr $Copyright = 2003 #attr $First = "init.py.html" #attr $Next = "pdbrc.html" #attr $Last = "pdbrc.py.html" #attr $alternates = (("Plain text version", "text/plain", "init.py.txt"),) #def body_html #raw
# This is startup file for interactive python.
# It is not automatically loaded by python interpreter.
# To instruct the interpreter to load it insert the following commands
# into your .profile (use whatever syntax and initialization file
# is appropriate for your shell):
#
# PYTHONSTARTUP=$HOME/init.py # or where you have really put it
# export PYTHONSTARTUP
#
# Due to nested_scopes and pydoc.help(*args, **kwds) this file only works with
# Python 2.1 or higher.
#
# Text version here
#
# Generated by gvim :runtime syntax/2html.vim
#

# This is startup file for interactive python.
# It is not automatically loaded by python interpreter.
# To instruct the interpreter to load it insert the following commands
# into your .profile (use whatever syntax and initialization file
# is appropriate for your shell):
#
# PYTHONSTARTUP=$HOME/init.py  # or where you really put it
# export PYTHONSTARTUP


def init():
    try:
        import __builtin__ as builtins
    except ImportError:
        import builtins
    import os
    import sys

    # readline/pyreadline

    pyreadlinew32_startup = os.path.join(
        sys.prefix, 'lib', 'site-packages',
        'pyreadline', 'configuration', 'startup.py')

    if os.path.exists(pyreadlinew32_startup):
        execfile(pyreadlinew32_startup)

    else:
        # From Bruce Edge:
        # https://mail.python.org/pipermail/python-list/2001-March/062888.html

        try:
            import rlcompleter  # noqa: need for completion
            import readline
            initfile = os.environ.get('INPUTRC') \
                or os.path.expanduser('~/.inputrc')
            readline.read_init_file(initfile)

            # if 'libedit' in readline.__doc__:
            #     readline.parse_and_bind("bind ^I rl_complete")
            # else:
            #     readline.parse_and_bind("tab: complete")

            histfiles = ['~/.python_history']
            # if 'VIRTUAL_ENV' in os.environ:
            #     histfiles.append('$VIRTUAL_ENV/.python_history')
            for histfile in histfiles:
                try:
                    histfile = os.path.expandvars(histfile)
                    histfile = os.path.expanduser(histfile)
                    readline.read_history_file(histfile)
                except IOError:
                    pass  # No such file

            def savehist():
                histsize = os.environ.get('HISTSIZE')
                if histsize:
                    try:
                        histsize = int(histsize)
                    except ValueError:
                        pass
                    else:
                        readline.set_history_length(histsize)
                histfile = histfiles[-1]
                histfile = os.path.expandvars(histfile)
                histfile = os.path.expanduser(histfile)
                try:
                    readline.write_history_file(histfile)
                except IOError:
                    pass

            import atexit
            atexit.register(savehist)

        except (ImportError, AttributeError):
            # no readline or atexit, or readline doesn't have
            # {read,write}_history_file - ignore the error
            pass

    # terminal

    term = os.environ.get('TERM', '')
    for _term in ['cygwin', 'linux', 'putty']:
        if _term in term:
            background = 'dark'
            break
    else:
        background = os.environ.get('BACKGROUND', 'light').lower()

    # From Randall Hopper:
    # https://mail.python.org/pipermail/python-list/2001-March/112696.html

    _term_found = False
    for _term in ['cygwin', 'linux', 'putty', 'rxvt',
                  'screen', 'term', 'vt100']:
        if _term in term:
            _term_found = True
            break

    if _term_found:
        if background == 'dark':
            ps1_color = '3'  # yellow
            stdout_color = '7'  # bold white
        else:
            ps1_color = '4'  # blue
            stdout_color = '0'  # bold black

        sys.ps1 = '\001\033[3%sm\002>>>\001\033[0m\002 ' % ps1_color
        sys.ps2 = '\001\033[1;32m\002...\001\033[0m\002 '  # bold green

        # From Denis Otkidach

        class ColoredFile:
            def __init__(self, fp, begin,
                         end='\033[0m'):  # reset all attributes
                self.__fp = fp
                self.__begin = begin
                self.__end = end

            def write(self, s):
                self.__fp.write(self.__begin+s+self.__end)

            def writelines(self, lines):
                map(self.write, lines)

            def __getattr__(self, attr):
                return getattr(self.__fp, attr)

        sys.stdout = ColoredFile(sys.stdout, '\033[1;3%sm' % stdout_color)
        sys.stderr = ColoredFile(sys.stderr, '\033[31m')  # red

        def myinput(prompt=None):
            save_stdout = sys.stdout
            sys.stdout = sys.__stdout__
            result = builtin_input(prompt)
            sys.stdout = save_stdout
            return result

        try:
            builtins.raw_input
        except AttributeError:  # PY3
            builtin_input = builtins.input
            builtins.input = myinput
        else:
            builtin_input = builtins.raw_input
            builtins.raw_input = myinput

    try:
        import locale
    except ImportError:
        pass  # locale was not compiled
    else:
        try:
            locale.setlocale(locale.LC_ALL, '')
        except (ImportError, locale.Error):
            pass  # no locale support or unsupported locale

    # set displayhook and excepthook

    from pprint import pprint
    from traceback import format_exception, print_exc

    pager = os.environ.get("PAGER") or 'more'

    # if your pager is 'less', options '-F' and '-R' must be passed to it,
    # and option '-X' is very much recommended
    if pager == 'less':
        less = os.environ.get("LESS") or ''
        for opt in 'X', 'R', 'F':
            if opt not in less:
                less = opt + less
        os.environ["LESS"] = less

    class BasePager:
        def write(self, value):
            self.stdout.write(value)

        if _term_found:
            def pprint(self, value):
                pprint(value,
                       stream=ColoredFile(self.stdout,
                                          '\033[1;3%sm' % stdout_color))

        def close(self):
            self.stdout.close()

    try:
        from subprocess import Popen, PIPE
    except ImportError:
        class Pager(BasePager):
            def __init__(self):
                self.stdout = os.popen(pager, 'w')
    else:
        class Pager(BasePager):
            def __init__(self):
                self.pipe = Popen(pager, shell=True, stdin=PIPE,
                                  universal_newlines=True)
                self.stdout = self.pipe.stdin

            def close(self):
                BasePager.close(self)
                self.pipe.wait()

    def displayhook(value):
        if value is not None:
            builtins._ = value
        pager = Pager()
        try:
            pager.pprint(value)
        except:  # noqa
            if _term_found:
                pager.stdout = ColoredFile(pager.stdout, '\033[31m')  # red
            print_exc(file=pager)
        pager.close()

    sys.displayhook = displayhook

    def excepthook(etype, evalue, etraceback):
        lines = format_exception(etype, evalue, etraceback)
        pager = Pager()
        if _term_found:
            pager.stdout = ColoredFile(pager.stdout, '\033[31m')  # red
        for line in lines:
            pager.write(line)
        pager.close()

    sys.excepthook = excepthook

    # try:
    #     import cgitb
    # except ImportError:
    #     pass
    # else:
    #     # cgitb.enable() overrides sys.excepthook
    #     cgitb.enable(format='text')

    # From Thomas Heller:
    # https://mail.python.org/pipermail/python-list/2001-April/099020.html

    # import pdb
    #
    # def info(*args):
    #    pdb.pm()
    # sys.excepthook = info

    # utilities

    # From: Paul Magwene:
    # https://mail.python.org/pipermail/python-list/2001-March/086191.html
    # With a lot of my fixes:

    class DirLister:
        def __getitem__(self, key):
            s = os.listdir(os.curdir)
            return s[key]

        def __getslice__(self, i, j):
            s = os.listdir(os.curdir)
            return s[i:j]

        def __repr__(self):
            return str(os.listdir(os.curdir))

        def __call__(self, path=None):
            if path:
                path = os.path.expanduser(os.path.expandvars(path))
            else:
                path = os.curdir
            return os.listdir(path)

    class DirChanger:
        def __repr__(self):
            self()
            return os.getcwd()

        def __call__(self, path=None):
            path = os.path.expanduser(os.path.expandvars(path or '~'))
            os.chdir(path)

    builtins.ls = DirLister()
    builtins.cd = DirChanger()

    # print working directory

    class Pwd:
        def __repr__(self):
            return os.getcwd()

        def __call__(self):
            return repr(self)

    builtins.pwd = Pwd()

    # exit REPL with 'exit', 'quit' or simple 'x'

    class _Exit:
        def __repr__(self):
            sys.exit()

        def __call__(self, msg=None):
            sys.exit(msg)

    builtins.x = _Exit()

    # print conten of a file

    class _Cat:
        def __repr__(self):
            return "Usage: cat('filename')"

        def __call__(self, filename):
            fp = open(filename, 'rU')
            text = fp.read()
            fp.close()
            print(text)

    builtins.cat = _Cat()

    # call shell

    class _Sh:
        def __repr__(self):
            os.system(os.environ["SHELL"])
            return ''

        def __call__(self, cmdline):
            os.system(cmdline)

    builtins.sh = _Sh()

    # paginate a file

    class _Pager:
        def __repr__(self):
            return "Usage: pager('filename')"

        def __call__(self, filename):
            os.system("%s '%s'" % (pager, filename.replace("'", '"\'"')))

    builtins.pager = _Pager()

    # edit a file

    class _Editor:
        def __repr__(self):
            return "Usage: edit('filename')"

        def __call__(self, filename):
            editor = os.environ.get("VISUAL") \
                or os.environ.get("EDITOR") or 'vi'
            os.system("%s '%s'" % (editor, filename.replace("'", '"\'"')))

    builtins.edit = builtins.editor = _Editor()


init()
del init
#end raw #end def $phd_site.respond(self)