##// END OF EJS Templates
Backport PR #10489: Prefer execution when there's only a single line entered...
Backport PR #10489: Prefer execution when there's only a single line entered Closes gh-10425 The heuristic here is to treat a single line specially, and always evaluate it as if the cursor was at the end. An alternative heuristic could be to do this if the cursor is on the last line of the input. This could also cause some weird effects if you e.g. type `for a in range(5):`, move the cursor back a few places and press enter - you'll get a newline inserted in the text, but it will indent as if it were after the colon. I'm still trying to think if there's a better way to approach it.

File last commit:

r22132:5ddb9d5f
r23583:13833706
Show More
test_embed.py
135 lines | 4.7 KiB | text/x-python | PythonLexer
Paul Ivanov
initial test for the embedding
r14184 """Test embedding of IPython"""
#-----------------------------------------------------------------------------
# Copyright (C) 2013 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
#-----------------------------------------------------------------------------
Thomas Kluyver
Skip failing test part on Windows...
r14840 import os
Thomas Kluyver
Use simplified prompt in test_embed...
r22132 import subprocess
Paul Ivanov
initial test for the embedding
r14184 import sys
import nose.tools as nt
Paul Ivanov
updated test for IPython.embed()
r14707 from IPython.utils.tempdir import NamedFileInTemporaryDirectory
Jason Newton
add test_nest_embed...
r18764 from IPython.testing.decorators import skip_win32
Paul Ivanov
initial test for the embedding
r14184
#-----------------------------------------------------------------------------
# Tests
#-----------------------------------------------------------------------------
Jason Newton
add test_nest_embed...
r18764
Paul Ivanov
cleaner string/bytes solution, closes #4759...
r14731 _sample_embed = b"""
Paul Ivanov
initial test for the embedding
r14184 from __future__ import print_function
import IPython
a = 3
b = 14
print(a, '.', b)
IPython.embed()
Paul Ivanov
updated test for IPython.embed()
r14707 print('bye!')
Paul Ivanov
initial test for the embedding
r14184 """
Paul Ivanov
cleaner string/bytes solution, closes #4759...
r14731 _exit = b"exit\r"
Paul Ivanov
3 at last, 3 at last, thank Guido BDFL......
r14712
Paul Ivanov
initial test for the embedding
r14184 def test_ipython_embed():
Paul Ivanov
updated test for IPython.embed()
r14707 """test that `IPython.embed()` works"""
with NamedFileInTemporaryDirectory('file_with_embed.py') as f:
Paul Ivanov
cleaner string/bytes solution, closes #4759...
r14731 f.write(_sample_embed)
Paul Ivanov
updated test for IPython.embed()
r14707 f.flush()
Paul Ivanov
fix test for windows, just in case
r14802 f.close() # otherwise msft won't be able to read the file
Paul Ivanov
updated test for IPython.embed()
r14707
# run `python file_with_embed.py`
cmd = [sys.executable, f.name]
Thomas Kluyver
Use simplified prompt in test_embed...
r22132 env = os.environ.copy()
env['IPY_TEST_SIMPLE_PROMPT'] = '1'
p = subprocess.Popen(cmd, env=env, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate(_exit)
std = out.decode('UTF-8')
Paul Ivanov
updated test for IPython.embed()
r14707
nt.assert_equal(p.returncode, 0)
Paul Ivanov
3 at last, 3 at last, thank Guido BDFL......
r14712 nt.assert_in('3 . 14', std)
Thomas Kluyver
Skip failing test part on Windows...
r14840 if os.name != 'nt':
# TODO: Fix up our different stdout references, see issue gh-14
nt.assert_in('IPython', std)
Paul Ivanov
3 at last, 3 at last, thank Guido BDFL......
r14712 nt.assert_in('bye!', std)
Paul Ivanov
initial test for the embedding
r14184
Jason Newton
add test_nest_embed...
r18764 @skip_win32
def test_nest_embed():
"""test that `IPython.embed()` is nestable"""
MinRK
remove pexpect from external...
r20815 import pexpect
Jason Newton
add test_nest_embed...
r18764 ipy_prompt = r']:' #ansi color codes give problems matching beyond this
Thomas Kluyver
Use simplified prompt in test_embed...
r22132 env = os.environ.copy()
env['IPY_TEST_SIMPLE_PROMPT'] = '1'
Jason Newton
add test_nest_embed...
r18764
Thomas Kluyver
Use simplified prompt in test_embed...
r22132 child = pexpect.spawn(sys.executable, ['-m', 'IPython', '--colors=nocolor'],
env=env)
Jason Newton
add test_nest_embed...
r18764 child.expect(ipy_prompt)
child.sendline("from __future__ import print_function")
child.expect(ipy_prompt)
child.sendline("import IPython")
child.expect(ipy_prompt)
child.sendline("ip0 = get_ipython()")
#enter first nested embed
child.sendline("IPython.embed()")
#skip the banner until we get to a prompt
try:
prompted = -1
while prompted != 0:
prompted = child.expect([ipy_prompt, '\r\n'])
except pexpect.TIMEOUT as e:
print(e)
#child.interact()
child.sendline("embed1 = get_ipython()"); child.expect(ipy_prompt)
child.sendline("print('true' if embed1 is not ip0 else 'false')")
assert(child.expect(['true\r\n', 'false\r\n']) == 0)
child.expect(ipy_prompt)
child.sendline("print('true' if IPython.get_ipython() is embed1 else 'false')")
assert(child.expect(['true\r\n', 'false\r\n']) == 0)
child.expect(ipy_prompt)
#enter second nested embed
child.sendline("IPython.embed()")
#skip the banner until we get to a prompt
try:
prompted = -1
while prompted != 0:
prompted = child.expect([ipy_prompt, '\r\n'])
except pexpect.TIMEOUT as e:
print(e)
#child.interact()
child.sendline("embed2 = get_ipython()"); child.expect(ipy_prompt)
child.sendline("print('true' if embed2 is not embed1 else 'false')")
assert(child.expect(['true\r\n', 'false\r\n']) == 0)
child.expect(ipy_prompt)
child.sendline("print('true' if embed2 is IPython.get_ipython() else 'false')")
assert(child.expect(['true\r\n', 'false\r\n']) == 0)
child.expect(ipy_prompt)
child.sendline('exit')
#back at first embed
child.expect(ipy_prompt)
child.sendline("print('true' if get_ipython() is embed1 else 'false')")
assert(child.expect(['true\r\n', 'false\r\n']) == 0)
child.expect(ipy_prompt)
child.sendline("print('true' if IPython.get_ipython() is embed1 else 'false')")
assert(child.expect(['true\r\n', 'false\r\n']) == 0)
child.expect(ipy_prompt)
child.sendline('exit')
#back at launching scope
child.expect(ipy_prompt)
child.sendline("print('true' if get_ipython() is ip0 else 'false')")
assert(child.expect(['true\r\n', 'false\r\n']) == 0)
child.expect(ipy_prompt)
child.sendline("print('true' if IPython.get_ipython() is ip0 else 'false')")
assert(child.expect(['true\r\n', 'false\r\n']) == 0)
child.expect(ipy_prompt)
Matthias Bussonnier
Force nocolor in some cases....
r22081 child.sendline('exit')
child.close()