##// END OF EJS Templates
Use AssertPrints in tests for autoreload extension.
Use AssertPrints in tests for autoreload extension.

File last commit:

r3938:ec698f9f
r4904:12c51795
Show More
rlineimpl.py
112 lines | 3.8 KiB | text/x-python | PythonLexer
vivainio
merge all from 0.7.3 branch to trunk
r503 # -*- coding: utf-8 -*-
fperez
Fix bug with 2.3 and readline; clean up.
r644 """ Imports and provides the 'correct' version of readline for the platform.
vivainio
merge all from 0.7.3 branch to trunk
r503
Brian Granger
Work to address the review comments on Fernando's branch....
r2498 Readline is used throughout IPython as::
import IPython.utils.rlineimpl as readline
vivainio
merge all from 0.7.3 branch to trunk
r503
fperez
Fix bug with 2.3 and readline; clean up.
r644 In addition to normal readline stuff, this module provides have_readline
Brian Granger
Work to address the review comments on Fernando's branch....
r2498 boolean and _outputfile variable used in IPython.utils.
Fernando Perez
Remove svn-style $Id marks from docstrings and Release imports....
r1853 """
vivainio
merge all from 0.7.3 branch to trunk
r503
MinRK
fallback on lsof if otool not found in libedit detection...
r3937 import os
MinRK
use Popen instead of getstatusoutput to check for libedit....
r3906 import re
vivainio
merge all from 0.7.3 branch to trunk
r503 import sys
MinRK
use Popen instead of getstatusoutput to check for libedit....
r3906 import time
MinRK
libedit raises descriptive warning instead of simple print
r3475 import warnings
vivainio
merge all from 0.7.3 branch to trunk
r503
MinRK
use Popen instead of getstatusoutput to check for libedit....
r3906 from subprocess import Popen, PIPE
fperez
Fix bug with 2.3 and readline; clean up.
r644 try:
from readline import *
import readline as _rl
have_readline = True
except ImportError:
vivainio
fixed rlineimpl to work properly with py2exed pyreadline
r671 try:
from pyreadline import *
import pyreadline as _rl
have_readline = True
MinRK
let add_history take strings for pyreadline <= 1.5
r3538 except ImportError:
vivainio
fixed rlineimpl to work properly with py2exed pyreadline
r671 have_readline = False
vivainio
merge all from 0.7.3 branch to trunk
r503
MinRK
let add_history take strings for pyreadline <= 1.5
r3538 if have_readline and hasattr(_rl, 'rlmain'):
# patch add_history to allow for strings in pyreadline <= 1.5:
# fix copied from pyreadline 1.6
import pyreadline
if pyreadline.release.version <= '1.5':
def add_history(line):
"""add a line to the history buffer."""
from pyreadline import lineobj
if not isinstance(line, lineobj.TextLine):
line = lineobj.TextLine(line)
return _rl.add_history(line)
fperez
Fix bug with 2.3 and readline; clean up.
r644 if sys.platform == 'win32' and have_readline:
vivainio
merge all from 0.7.3 branch to trunk
r503 try:
fperez
Fix bug with 2.3 and readline; clean up.
r644 _outputfile=_rl.GetOutputFile()
vivainio
fixed rlineimpl to work properly with py2exed pyreadline
r671 except AttributeError:
MinRK
use a bytes regex to check for libedit...
r3938 warnings.warn("Failed GetOutputFile")
fperez
Fix bug with 2.3 and readline; clean up.
r644 have_readline = False
bgranger
Now IPython works with OS X 10.5 (Leopards) libedit based readline module.
r884
# Test to see if libedit is being used instead of GNU readline.
MinRK
use Popen instead of getstatusoutput to check for libedit....
r3906 # Thanks to Boyd Waters for the original patch.
bgranger
Now IPython works with OS X 10.5 (Leopards) libedit based readline module.
r884 uses_libedit = False
if sys.platform == 'darwin' and have_readline:
MinRK
use Popen instead of getstatusoutput to check for libedit....
r3906 # Previously this used commands.getstatusoutput, which uses os.popen.
# Switching to subprocess.Popen, and exponential falloff for EINTR
# seems to make this better behaved in environments such as PyQt and gdb
dt = 1e-3
while dt < 1:
MinRK
fallback on lsof if otool not found in libedit detection...
r3937 try:
p = Popen(['otool', '-L', _rl.__file__], stdout=PIPE, stderr=PIPE)
except OSError:
try:
# otool not available (no XCode), use lsof instead.
# This *could* have a false positive
# if another package that uses libedit explicitly
# has been imported prior to this test.
p = Popen(['lsof', '-p', str(os.getpid())], stdout=PIPE, stderr=PIPE)
except OSError:
# This is highly unlikely, but let's be sure
# we don't crash IPython just because we can't find lsof
p = out = err = None
warnings.warn("libedit detection failed")
break
out,err = p.communicate()
MinRK
use Popen instead of getstatusoutput to check for libedit....
r3906
if p.returncode == 4:
# EINTR
time.sleep(dt)
dt *= 2
continue
MinRK
fallback on lsof if otool not found in libedit detection...
r3937 elif p is None or p.returncode:
MinRK
use Popen instead of getstatusoutput to check for libedit....
r3906 warnings.warn("libedit detection failed: %s"%err)
break
else:
Fernando Perez
Fix readline detection bug in OSX....
r2556 break
MinRK
use a bytes regex to check for libedit...
r3938 if p is not None and p.returncode == 0 and re.search(br'/libedit[\.\d+]*\.dylib\s', out):
bgranger
Changed tabs to spaces. Sorry about that :)
r890 # we are bound to libedit - new in Leopard
_rl.parse_and_bind("bind ^I rl_complete")
MinRK
libedit raises descriptive warning instead of simple print
r3475 warnings.warn("Leopard libedit detected - readline will not be well behaved "
"including some crashes on tab completion, and incorrect history navigation. "
"It is highly recommended that you install readline, "
"which is easy_installable with: 'easy_install readline'",
RuntimeWarning)
bgranger
Changed tabs to spaces. Sorry about that :)
r890 uses_libedit = True
MinRK
fallback on lsof if otool not found in libedit detection...
r3937 # cleanup names
del dt,p,out,err
bgranger
Now IPython works with OS X 10.5 (Leopards) libedit based readline module.
r884
fperez
Fix bug with 2.3 and readline; clean up.
r644 # the clear_history() function was only introduced in Python 2.4 and is
# actually optional in the readline API, so we must explicitly check for its
# existence. Some known platforms actually don't have it. This thread:
# http://mail.python.org/pipermail/python-dev/2003-August/037845.html
# has the original discussion.
if have_readline:
vivainio
merge all from 0.7.3 branch to trunk
r503 try:
vivainio
fixed rlineimpl to work properly with py2exed pyreadline
r671 _rl.clear_history
fperez
Fix bug with 2.3 and readline; clean up.
r644 except AttributeError:
def clear_history(): pass
Fernando Perez
Remove svn-style $Id marks from docstrings and Release imports....
r1853 _rl.clear_history = clear_history