2010-01-30 08:24:13 +08:00
|
|
|
# encoding: utf-8
|
|
|
|
"""Tests for io.py"""
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
update copyright to 2011/20xx-2011
Closes #1033 (rebased to prevent recursive merge). Closes #2.
459 *.py files in :
39 empty files
176 files without copyright
36 have copyright but don't cite the dev team
208 have copyright and cite the dev team
-----------------------------------------
0 not up to date (cite dev team but not right year)
FYI, list of files that don't have copyright (and are not empty..)
[
'IPython/config/profile/cluster/ipython_config.py',
'IPython/config/profile/math/ipython_config.py',
'IPython/config/profile/pylab/ipython_config.py',
'IPython/config/profile/pysh/ipython_config.py',
'IPython/config/profile/python3/ipython_config.py',
'IPython/config/profile/sympy/ipython_config.py',
'IPython/core/shadowns.py',
'IPython/core/tests/refbug.py',
'IPython/core/tests/simpleerr.py',
'IPython/core/tests/tclass.py',
'IPython/core/tests/test_application.py',
'IPython/core/tests/test_autocall.py',
'IPython/core/tests/test_completer.py',
'IPython/core/tests/test_fakemodule.py',
'IPython/core/tests/test_formatters.py',
'IPython/core/tests/test_handlers.py',
'IPython/core/tests/test_history.py',
'IPython/core/tests/test_imports.py',
'IPython/core/tests/test_iplib.py',
'IPython/core/tests/test_logger.py',
'IPython/core/tests/test_magic.py',
'IPython/core/tests/test_plugin.py',
'IPython/core/tests/test_prefilter.py',
'IPython/core/tests/test_profile.py',
'IPython/core/tests/test_run.py',
'IPython/core/tests/test_splitinput.py',
'IPython/deathrow/astyle.py',
'IPython/deathrow/dtutils.py',
'IPython/deathrow/Gnuplot2.py',
'IPython/deathrow/GnuplotInteractive.py',
'IPython/deathrow/GnuplotRuntime.py',
'IPython/deathrow/gui/wx/ipshell_nonblocking.py',
'IPython/deathrow/gui/wx/ipython_history.py',
'IPython/deathrow/gui/wx/thread_ex.py',
'IPython/deathrow/ibrowse.py',
'IPython/deathrow/igrid.py',
'IPython/deathrow/ipipe.py',
'IPython/deathrow/ipy_defaults.py',
'IPython/deathrow/ipy_kitcfg.py',
'IPython/deathrow/ipy_legacy.py',
'IPython/deathrow/ipy_p4.py',
'IPython/deathrow/ipy_profile_none.py',
'IPython/deathrow/ipy_profile_numpy.py',
'IPython/deathrow/ipy_profile_scipy.py',
'IPython/deathrow/ipy_profile_sh.py',
'IPython/deathrow/ipy_traits_completer.py',
'IPython/deathrow/ipy_vimserver.py',
'IPython/deathrow/numeric_formats.py',
'IPython/deathrow/oldfrontend/process/__init__.py',
'IPython/deathrow/oldfrontend/wx/ipythonx.py',
'IPython/deathrow/scitedirector.py',
'IPython/deathrow/tests/test_prefilter.py',
'IPython/deathrow/twshell.py',
'IPython/extensions/__init__.py',
'IPython/extensions/autoreload.py',
'IPython/extensions/storemagic.py',
'IPython/extensions/tests/test_autoreload.py',
'IPython/external/__init__.py',
'IPython/external/argparse/__init__.py',
'IPython/external/decorator/__init__.py',
'IPython/external/decorators/__init__.py',
'IPython/external/decorators/_decorators.py',
'IPython/external/decorators/_numpy_testing_noseclasses.py',
'IPython/external/decorators/_numpy_testing_utils.py',
'IPython/external/guid/__init__.py',
'IPython/external/Itpl/__init__.py',
'IPython/external/mglob/__init__.py',
'IPython/external/mglob/_mglob.py',
'IPython/external/path/__init__.py',
'IPython/external/path/_path.py',
'IPython/external/pexpect/__init__.py',
'IPython/external/pyparsing/__init__.py',
'IPython/external/qt.py',
'IPython/external/qt_for_kernel.py',
'IPython/external/simplegeneric/__init__.py',
'IPython/external/simplegeneric/_simplegeneric.py',
'IPython/frontend/html/notebook/__init__.py',
'IPython/frontend/html/notebook/tests/test_kernelsession.py',
'IPython/frontend/qt/base_frontend_mixin.py',
'IPython/frontend/qt/console/ansi_code_processor.py',
'IPython/frontend/qt/console/bracket_matcher.py',
'IPython/frontend/qt/console/call_tip_widget.py',
'IPython/frontend/qt/console/completion_lexer.py',
'IPython/frontend/qt/console/completion_widget.py',
'IPython/frontend/qt/console/console_widget.py',
'IPython/frontend/qt/console/history_console_widget.py',
'IPython/frontend/qt/console/ipython_widget.py',
'IPython/frontend/qt/console/kill_ring.py',
'IPython/frontend/qt/console/mainwindow.py',
'IPython/frontend/qt/console/pygments_highlighter.py',
'IPython/frontend/qt/console/qtconsoleapp.py',
'IPython/frontend/qt/console/rich_ipython_widget.py',
'IPython/frontend/qt/console/styles.py',
'IPython/frontend/qt/console/tests/test_ansi_code_processor.py',
'IPython/frontend/qt/console/tests/test_completion_lexer.py',
'IPython/frontend/qt/console/tests/test_kill_ring.py',
'IPython/frontend/qt/kernelmanager.py',
'IPython/frontend/qt/rich_text.py',
'IPython/frontend/qt/svg.py',
'IPython/frontend/qt/util.py',
'IPython/kernel/__init__.py',
'IPython/lib/clipboard.py',
'IPython/lib/display.py',
'IPython/lib/irunner.py',
'IPython/lib/security.py',
'IPython/lib/tests/test_imports.py',
'IPython/lib/tests/test_irunner.py',
'IPython/lib/tests/test_irunner_pylab_magic.py',
'IPython/lib/tests/test_security.py',
'IPython/nbformat/v1/tests/nbexamples.py',
'IPython/nbformat/v1/tests/test_json.py',
'IPython/nbformat/v1/tests/test_nbbase.py',
'IPython/nbformat/v2/tests/nbexamples.py',
'IPython/nbformat/v2/tests/test_json.py',
'IPython/nbformat/v2/tests/test_nbbase.py',
'IPython/nbformat/v2/tests/test_nbpy.py',
'IPython/quarantine/clearcmd.py',
'IPython/quarantine/envpersist.py',
'IPython/quarantine/ext_rescapture.py',
'IPython/quarantine/ipy_app_completers.py',
'IPython/quarantine/ipy_completers.py',
'IPython/quarantine/ipy_editors.py',
'IPython/quarantine/ipy_exportdb.py',
'IPython/quarantine/ipy_extutil.py',
'IPython/quarantine/ipy_fsops.py',
'IPython/quarantine/ipy_gnuglobal.py',
'IPython/quarantine/ipy_jot.py',
'IPython/quarantine/ipy_lookfor.py',
'IPython/quarantine/ipy_profile_doctest.py',
'IPython/quarantine/ipy_pydb.py',
'IPython/quarantine/ipy_rehashdir.py',
'IPython/quarantine/ipy_render.py',
'IPython/quarantine/ipy_server.py',
'IPython/quarantine/ipy_signals.py',
'IPython/quarantine/ipy_synchronize_with.py',
'IPython/quarantine/ipy_system_conf.py',
'IPython/quarantine/ipy_which.py',
'IPython/quarantine/ipy_winpdb.py',
'IPython/quarantine/ipy_workdir.py',
'IPython/quarantine/jobctrl.py',
'IPython/quarantine/ledit.py',
'IPython/quarantine/win32clip.py',
'IPython/testing/mkdoctests.py',
'IPython/testing/plugin/dtexample.py',
'IPython/testing/plugin/ipdoctest.py',
'IPython/testing/plugin/iptest.py',
'IPython/testing/plugin/setup.py',
'IPython/testing/plugin/show_refs.py',
'IPython/testing/plugin/simple.py',
'IPython/testing/plugin/simplevars.py',
'IPython/testing/plugin/test_ipdoctest.py',
'IPython/testing/plugin/test_refs.py',
'IPython/testing/skipdoctest.py',
'IPython/testing/tests/test_decorators.py',
'IPython/utils/autoattr.py',
'IPython/utils/nested_context.py',
'IPython/utils/pickleshare.py',
'IPython/utils/py3compat.py',
'IPython/utils/PyColorize.py',
'IPython/utils/rlineimpl.py',
'IPython/utils/strdispatch.py',
'IPython/utils/tempdir.py',
'IPython/utils/tests/test_imports.py',
'IPython/utils/tests/test_wildcard.py',
'IPython/utils/upgradedir.py',
'IPython/zmq/completer.py',
'IPython/zmq/displayhook.py',
'IPython/zmq/entry_point.py',
'IPython/zmq/frontend.py',
'IPython/zmq/iostream.py',
'IPython/zmq/ipkernel.py',
'IPython/zmq/log.py',
'IPython/zmq/parentpoller.py',
'IPython/zmq/pykernel.py',
'IPython/zmq/pylab/backend_inline.py',
'IPython/zmq/zmqshell.py'
]
2011-11-23 22:26:28 +08:00
|
|
|
# Copyright (C) 2008-2011 The IPython Development Team
|
2010-01-30 08:24:13 +08:00
|
|
|
#
|
|
|
|
# Distributed under the terms of the BSD License. The full license is in
|
|
|
|
# the file COPYING, distributed as part of this software.
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
# Imports
|
|
|
|
#-----------------------------------------------------------------------------
|
2012-07-05 19:40:15 +08:00
|
|
|
from __future__ import print_function
|
2013-11-23 02:59:10 +08:00
|
|
|
from __future__ import absolute_import
|
2010-01-30 08:24:13 +08:00
|
|
|
|
2013-11-23 02:59:10 +08:00
|
|
|
import io as stdlib_io
|
2010-01-30 08:24:13 +08:00
|
|
|
import sys
|
|
|
|
|
2011-04-22 06:55:30 +08:00
|
|
|
from subprocess import Popen, PIPE
|
2013-09-04 01:13:49 +08:00
|
|
|
import unittest
|
2010-01-30 08:24:13 +08:00
|
|
|
|
|
|
|
import nose.tools as nt
|
|
|
|
|
2013-11-23 02:59:10 +08:00
|
|
|
from IPython.testing.decorators import skipif
|
|
|
|
from IPython.utils.io import Tee, capture_output, unicode_std_stream
|
2013-10-25 02:04:49 +08:00
|
|
|
from IPython.utils.py3compat import doctest_refactor_print, PY3
|
|
|
|
|
|
|
|
if PY3:
|
|
|
|
from io import StringIO
|
|
|
|
else:
|
|
|
|
from StringIO import StringIO
|
2010-01-30 08:24:13 +08:00
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
# Tests
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
def test_tee_simple():
|
|
|
|
"Very simple check with stdout only"
|
|
|
|
chan = StringIO()
|
|
|
|
text = 'Hello'
|
|
|
|
tee = Tee(chan, channel='stdout')
|
2012-07-05 19:40:15 +08:00
|
|
|
print(text, file=chan)
|
2011-10-08 20:08:44 +08:00
|
|
|
nt.assert_equal(chan.getvalue(), text+"\n")
|
2010-01-30 08:24:13 +08:00
|
|
|
|
|
|
|
|
2013-09-04 01:13:49 +08:00
|
|
|
class TeeTestCase(unittest.TestCase):
|
2010-01-30 08:24:13 +08:00
|
|
|
|
|
|
|
def tchan(self, channel, check='close'):
|
|
|
|
trap = StringIO()
|
|
|
|
chan = StringIO()
|
|
|
|
text = 'Hello'
|
|
|
|
|
|
|
|
std_ori = getattr(sys, channel)
|
|
|
|
setattr(sys, channel, trap)
|
|
|
|
|
|
|
|
tee = Tee(chan, channel=channel)
|
2012-07-05 19:40:15 +08:00
|
|
|
print(text, end='', file=chan)
|
2010-01-30 08:24:13 +08:00
|
|
|
setattr(sys, channel, std_ori)
|
|
|
|
trap_val = trap.getvalue()
|
2012-07-04 01:29:59 +08:00
|
|
|
nt.assert_equal(chan.getvalue(), text)
|
2010-01-30 08:24:13 +08:00
|
|
|
if check=='close':
|
|
|
|
tee.close()
|
|
|
|
else:
|
|
|
|
del tee
|
|
|
|
|
|
|
|
def test(self):
|
|
|
|
for chan in ['stdout', 'stderr']:
|
|
|
|
for check in ['close', 'del']:
|
2013-09-04 01:13:49 +08:00
|
|
|
self.tchan(chan, check)
|
2011-04-22 06:55:30 +08:00
|
|
|
|
|
|
|
def test_io_init():
|
|
|
|
"""Test that io.stdin/out/err exist at startup"""
|
|
|
|
for name in ('stdin', 'stdout', 'stderr'):
|
2011-10-08 20:08:44 +08:00
|
|
|
cmd = doctest_refactor_print("from IPython.utils import io;print io.%s.__class__"%name)
|
|
|
|
p = Popen([sys.executable, '-c', cmd],
|
2011-04-22 06:55:30 +08:00
|
|
|
stdout=PIPE)
|
|
|
|
p.wait()
|
2011-10-08 20:08:44 +08:00
|
|
|
classname = p.stdout.read().strip().decode('ascii')
|
|
|
|
# __class__ is a reference to the class object in Python 3, so we can't
|
|
|
|
# just test for string equality.
|
|
|
|
assert 'IPython.utils.io.IOStream' in classname, classname
|
2012-06-07 07:35:06 +08:00
|
|
|
|
|
|
|
def test_capture_output():
|
|
|
|
"""capture_output() context works"""
|
|
|
|
|
|
|
|
with capture_output() as io:
|
2012-07-05 19:40:15 +08:00
|
|
|
print('hi, stdout')
|
|
|
|
print('hi, stderr', file=sys.stderr)
|
2012-06-07 07:35:06 +08:00
|
|
|
|
2012-07-04 01:29:59 +08:00
|
|
|
nt.assert_equal(io.stdout, 'hi, stdout\n')
|
|
|
|
nt.assert_equal(io.stderr, 'hi, stderr\n')
|
2013-11-23 02:59:10 +08:00
|
|
|
|
|
|
|
def test_UnicodeStdStream():
|
|
|
|
# Test wrapping a bytes-level stdout
|
|
|
|
if PY3:
|
|
|
|
stdoutb = stdlib_io.BytesIO()
|
|
|
|
stdout = stdlib_io.TextIOWrapper(stdoutb, encoding='ascii')
|
|
|
|
else:
|
|
|
|
stdout = stdoutb = stdlib_io.BytesIO()
|
|
|
|
|
|
|
|
orig_stdout = sys.stdout
|
|
|
|
sys.stdout = stdout
|
|
|
|
try:
|
|
|
|
sample = u"@łe¶ŧ←"
|
|
|
|
unicode_std_stream().write(sample)
|
|
|
|
|
|
|
|
output = stdoutb.getvalue().decode('utf-8')
|
|
|
|
nt.assert_equal(output, sample)
|
|
|
|
assert not stdout.closed
|
|
|
|
finally:
|
|
|
|
sys.stdout = orig_stdout
|
|
|
|
|
|
|
|
@skipif(not PY3, "Not applicable on Python 2")
|
|
|
|
def test_UnicodeStdStream_nowrap():
|
|
|
|
# If we replace stdout with a StringIO, it shouldn't get wrapped.
|
|
|
|
orig_stdout = sys.stdout
|
|
|
|
sys.stdout = StringIO()
|
|
|
|
try:
|
|
|
|
nt.assert_is(unicode_std_stream(), sys.stdout)
|
|
|
|
assert not sys.stdout.closed
|
|
|
|
finally:
|
|
|
|
sys.stdout = orig_stdout
|