Skip to content

Commit c4b934f

Browse files
committed
TST: Add ecorators for redirecting stdout/err
1 parent 88f5851 commit c4b934f

File tree

9 files changed

+184
-138
lines changed

9 files changed

+184
-138
lines changed

pandas/tests/frame/test_repr_info.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -191,18 +191,16 @@ def test_latex_repr(self):
191191
# GH 12182
192192
self.assertIsNone(df._repr_latex_())
193193

194+
@tm.capture_stdout
194195
def test_info(self):
195196
io = StringIO()
196197
self.frame.info(buf=io)
197198
self.tsframe.info(buf=io)
198199

199200
frame = DataFrame(np.random.randn(5, 3))
200201

201-
import sys
202-
sys.stdout = StringIO()
203202
frame.info()
204203
frame.info(verbose=False)
205-
sys.stdout = sys.__stdout__
206204

207205
def test_info_wide(self):
208206
from pandas import set_option, reset_option

pandas/tests/io/parser/common.py

+36-45
Original file line numberDiff line numberDiff line change
@@ -1254,6 +1254,7 @@ def test_regex_separator(self):
12541254
columns=['a', 'b', 'c'])
12551255
tm.assert_frame_equal(result, expected)
12561256

1257+
@tm.capture_stdout
12571258
def test_verbose_import(self):
12581259
text = """a,b,c,d
12591260
one,1,2,3
@@ -1265,22 +1266,18 @@ def test_verbose_import(self):
12651266
one,1,2,3
12661267
two,1,2,3"""
12671268

1268-
buf = StringIO()
1269-
sys.stdout = buf
1269+
# Engines are verbose in different ways.
1270+
self.read_csv(StringIO(text), verbose=True)
1271+
output = sys.stdout.getvalue()
12701272

1271-
try: # engines are verbose in different ways
1272-
self.read_csv(StringIO(text), verbose=True)
1273-
if self.engine == 'c':
1274-
self.assertIn('Tokenization took:', buf.getvalue())
1275-
self.assertIn('Parser memory cleanup took:', buf.getvalue())
1276-
else: # Python engine
1277-
self.assertEqual(buf.getvalue(),
1278-
'Filled 3 NA values in column a\n')
1279-
finally:
1280-
sys.stdout = sys.__stdout__
1273+
if self.engine == 'c':
1274+
assert 'Tokenization took:' in output
1275+
assert 'Parser memory cleanup took:' in output
1276+
else: # Python engine
1277+
assert output == 'Filled 3 NA values in column a\n'
12811278

1282-
buf = StringIO()
1283-
sys.stdout = buf
1279+
# Reset the stdout buffer.
1280+
sys.stdout = StringIO()
12841281

12851282
text = """a,b,c,d
12861283
one,1,2,3
@@ -1292,16 +1289,15 @@ def test_verbose_import(self):
12921289
seven,1,2,3
12931290
eight,1,2,3"""
12941291

1295-
try: # engines are verbose in different ways
1296-
self.read_csv(StringIO(text), verbose=True, index_col=0)
1297-
if self.engine == 'c':
1298-
self.assertIn('Tokenization took:', buf.getvalue())
1299-
self.assertIn('Parser memory cleanup took:', buf.getvalue())
1300-
else: # Python engine
1301-
self.assertEqual(buf.getvalue(),
1302-
'Filled 1 NA values in column a\n')
1303-
finally:
1304-
sys.stdout = sys.__stdout__
1292+
self.read_csv(StringIO(text), verbose=True, index_col=0)
1293+
output = sys.stdout.getvalue()
1294+
1295+
# Engines are verbose in different ways.
1296+
if self.engine == 'c':
1297+
assert 'Tokenization took:' in output
1298+
assert 'Parser memory cleanup took:' in output
1299+
else: # Python engine
1300+
assert output == 'Filled 1 NA values in column a\n'
13051301

13061302
def test_iteration_open_handle(self):
13071303
if PY3:
@@ -1696,6 +1692,7 @@ class InvalidBuffer(object):
16961692
with tm.assertRaisesRegexp(ValueError, msg):
16971693
self.read_csv(mock.Mock())
16981694

1695+
@tm.capture_stderr
16991696
def test_skip_bad_lines(self):
17001697
# see gh-15925
17011698
data = 'a\n1\n1,2,3\n4\n5,6,7'
@@ -1706,30 +1703,24 @@ def test_skip_bad_lines(self):
17061703
with tm.assertRaises(ParserError):
17071704
self.read_csv(StringIO(data), error_bad_lines=True)
17081705

1709-
stderr = sys.stderr
17101706
expected = DataFrame({'a': [1, 4]})
17111707

1712-
sys.stderr = StringIO()
1713-
try:
1714-
out = self.read_csv(StringIO(data),
1715-
error_bad_lines=False,
1716-
warn_bad_lines=False)
1717-
tm.assert_frame_equal(out, expected)
1708+
out = self.read_csv(StringIO(data),
1709+
error_bad_lines=False,
1710+
warn_bad_lines=False)
1711+
tm.assert_frame_equal(out, expected)
17181712

1719-
val = sys.stderr.getvalue()
1720-
self.assertEqual(val, '')
1721-
finally:
1722-
sys.stderr = stderr
1713+
val = sys.stderr.getvalue()
1714+
assert val == ''
17231715

1716+
# Reset the stderr buffer.
17241717
sys.stderr = StringIO()
1725-
try:
1726-
out = self.read_csv(StringIO(data),
1727-
error_bad_lines=False,
1728-
warn_bad_lines=True)
1729-
tm.assert_frame_equal(out, expected)
17301718

1731-
val = sys.stderr.getvalue()
1732-
self.assertTrue('Skipping line 3' in val)
1733-
self.assertTrue('Skipping line 5' in val)
1734-
finally:
1735-
sys.stderr = stderr
1719+
out = self.read_csv(StringIO(data),
1720+
error_bad_lines=False,
1721+
warn_bad_lines=True)
1722+
tm.assert_frame_equal(out, expected)
1723+
1724+
val = sys.stderr.getvalue()
1725+
assert 'Skipping line 3' in val
1726+
assert 'Skipping line 5' in val

pandas/tests/io/parser/python_parser_only.py

+3-11
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
"""
99

1010
import csv
11-
import sys
1211
import pytest
1312

1413
import pandas.util.testing as tm
@@ -92,16 +91,9 @@ def test_BytesIO_input(self):
9291

9392
def test_single_line(self):
9493
# see gh-6607: sniff separator
95-
96-
buf = StringIO()
97-
sys.stdout = buf
98-
99-
try:
100-
df = self.read_csv(StringIO('1,2'), names=['a', 'b'],
101-
header=None, sep=None)
102-
tm.assert_frame_equal(DataFrame({'a': [1], 'b': [2]}), df)
103-
finally:
104-
sys.stdout = sys.__stdout__
94+
df = self.read_csv(StringIO('1,2'), names=['a', 'b'],
95+
header=None, sep=None)
96+
tm.assert_frame_equal(DataFrame({'a': [1], 'b': [2]}), df)
10597

10698
def test_skipfooter(self):
10799
# see gh-6607

pandas/tests/io/parser/test_textreader.py

+10-13
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ def test_integer_thousands_alt(self):
142142
expected = DataFrame([123456, 12500])
143143
tm.assert_frame_equal(result, expected)
144144

145+
@tm.capture_stderr
145146
def test_skip_bad_lines(self):
146147
# too many lines, see #2430 for why
147148
data = ('a:b:c\n'
@@ -165,19 +166,15 @@ def test_skip_bad_lines(self):
165166
2: ['c', 'f', 'i', 'n']}
166167
assert_array_dicts_equal(result, expected)
167168

168-
stderr = sys.stderr
169-
sys.stderr = StringIO()
170-
try:
171-
reader = TextReader(StringIO(data), delimiter=':',
172-
header=None,
173-
error_bad_lines=False,
174-
warn_bad_lines=True)
175-
reader.read()
176-
val = sys.stderr.getvalue()
177-
self.assertTrue('Skipping line 4' in val)
178-
self.assertTrue('Skipping line 6' in val)
179-
finally:
180-
sys.stderr = stderr
169+
reader = TextReader(StringIO(data), delimiter=':',
170+
header=None,
171+
error_bad_lines=False,
172+
warn_bad_lines=True)
173+
reader.read()
174+
val = sys.stderr.getvalue()
175+
176+
assert 'Skipping line 4' in val
177+
assert 'Skipping line 6' in val
181178

182179
def test_header_not_enough_lines(self):
183180
data = ('skip this\n'

pandas/tests/io/test_sql.py

+15-28
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import sqlite3
2424
import csv
2525
import os
26-
import sys
2726

2827
import warnings
2928
import numpy as np
@@ -36,7 +35,7 @@
3635
from pandas import DataFrame, Series, Index, MultiIndex, isnull, concat
3736
from pandas import date_range, to_datetime, to_timedelta, Timestamp
3837
import pandas.compat as compat
39-
from pandas.compat import StringIO, range, lrange, string_types, PY36
38+
from pandas.compat import range, lrange, string_types, PY36
4039
from pandas.tseries.tools import format as date_format
4140

4241
import pandas.io.sql as sql
@@ -2220,6 +2219,7 @@ def test_schema(self):
22202219
cur = self.conn.cursor()
22212220
cur.execute(create_sql)
22222221

2222+
@tm.capture_stdout
22232223
def test_execute_fail(self):
22242224
create_sql = """
22252225
CREATE TABLE test
@@ -2236,14 +2236,10 @@ def test_execute_fail(self):
22362236
sql.execute('INSERT INTO test VALUES("foo", "bar", 1.234)', self.conn)
22372237
sql.execute('INSERT INTO test VALUES("foo", "baz", 2.567)', self.conn)
22382238

2239-
try:
2240-
sys.stdout = StringIO()
2241-
self.assertRaises(Exception, sql.execute,
2242-
'INSERT INTO test VALUES("foo", "bar", 7)',
2243-
self.conn)
2244-
finally:
2245-
sys.stdout = sys.__stdout__
2239+
with pytest.raises(Exception):
2240+
sql.execute('INSERT INTO test VALUES("foo", "bar", 7)', self.conn)
22462241

2242+
@tm.capture_stdout
22472243
def test_execute_closed_connection(self):
22482244
create_sql = """
22492245
CREATE TABLE test
@@ -2259,12 +2255,9 @@ def test_execute_closed_connection(self):
22592255

22602256
sql.execute('INSERT INTO test VALUES("foo", "bar", 1.234)', self.conn)
22612257
self.conn.close()
2262-
try:
2263-
sys.stdout = StringIO()
2264-
self.assertRaises(Exception, tquery, "select * from test",
2265-
con=self.conn)
2266-
finally:
2267-
sys.stdout = sys.__stdout__
2258+
2259+
with pytest.raises(Exception):
2260+
tquery("select * from test", con=self.conn)
22682261

22692262
# Initialize connection again (needed for tearDown)
22702263
self.setUp()
@@ -2534,6 +2527,7 @@ def test_schema(self):
25342527
cur.execute(drop_sql)
25352528
cur.execute(create_sql)
25362529

2530+
@tm.capture_stdout
25372531
def test_execute_fail(self):
25382532
_skip_if_no_pymysql()
25392533
drop_sql = "DROP TABLE IF EXISTS test"
@@ -2553,14 +2547,10 @@ def test_execute_fail(self):
25532547
sql.execute('INSERT INTO test VALUES("foo", "bar", 1.234)', self.conn)
25542548
sql.execute('INSERT INTO test VALUES("foo", "baz", 2.567)', self.conn)
25552549

2556-
try:
2557-
sys.stdout = StringIO()
2558-
self.assertRaises(Exception, sql.execute,
2559-
'INSERT INTO test VALUES("foo", "bar", 7)',
2560-
self.conn)
2561-
finally:
2562-
sys.stdout = sys.__stdout__
2550+
with pytest.raises(Exception):
2551+
sql.execute('INSERT INTO test VALUES("foo", "bar", 7)', self.conn)
25632552

2553+
@tm.capture_stdout
25642554
def test_execute_closed_connection(self):
25652555
_skip_if_no_pymysql()
25662556
drop_sql = "DROP TABLE IF EXISTS test"
@@ -2579,12 +2569,9 @@ def test_execute_closed_connection(self):
25792569

25802570
sql.execute('INSERT INTO test VALUES("foo", "bar", 1.234)', self.conn)
25812571
self.conn.close()
2582-
try:
2583-
sys.stdout = StringIO()
2584-
self.assertRaises(Exception, tquery, "select * from test",
2585-
con=self.conn)
2586-
finally:
2587-
sys.stdout = sys.__stdout__
2572+
2573+
with pytest.raises(Exception):
2574+
tquery("select * from test", con=self.conn)
25882575

25892576
# Initialize connection again (needed for tearDown)
25902577
self.setUp()

pandas/tests/plotting/test_frame.py

+9-12
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from pandas import (Series, DataFrame, MultiIndex, PeriodIndex, date_range,
1313
bdate_range)
1414
from pandas.types.api import is_list_like
15-
from pandas.compat import (range, lrange, StringIO, lmap, lzip, u, zip, PY3)
15+
from pandas.compat import range, lrange, lmap, lzip, u, zip, PY3
1616
from pandas.formats.printing import pprint_thing
1717
import pandas.util.testing as tm
1818
from pandas.util.testing import slow
@@ -1558,8 +1558,8 @@ def test_line_label_none(self):
15581558
self.assertEqual(ax.get_legend().get_texts()[0].get_text(), 'None')
15591559

15601560
@slow
1561+
@tm.capture_stdout
15611562
def test_line_colors(self):
1562-
import sys
15631563
from matplotlib import cm
15641564

15651565
custom_colors = 'rgcby'
@@ -1568,16 +1568,13 @@ def test_line_colors(self):
15681568
ax = df.plot(color=custom_colors)
15691569
self._check_colors(ax.get_lines(), linecolors=custom_colors)
15701570

1571-
tmp = sys.stderr
1572-
sys.stderr = StringIO()
1573-
try:
1574-
tm.close()
1575-
ax2 = df.plot(colors=custom_colors)
1576-
lines2 = ax2.get_lines()
1577-
for l1, l2 in zip(ax.get_lines(), lines2):
1578-
self.assertEqual(l1.get_color(), l2.get_color())
1579-
finally:
1580-
sys.stderr = tmp
1571+
tm.close()
1572+
1573+
ax2 = df.plot(colors=custom_colors)
1574+
lines2 = ax2.get_lines()
1575+
1576+
for l1, l2 in zip(ax.get_lines(), lines2):
1577+
self.assertEqual(l1.get_color(), l2.get_color())
15811578

15821579
tm.close()
15831580

pandas/tests/series/test_repr.py

+9-12
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33

44
from datetime import datetime, timedelta
55

6+
import sys
7+
68
import numpy as np
79
import pandas as pd
810

911
from pandas import (Index, Series, DataFrame, date_range)
1012
from pandas.core.index import MultiIndex
1113

12-
from pandas.compat import StringIO, lrange, range, u
14+
from pandas.compat import lrange, range, u
1315
from pandas import compat
1416
import pandas.util.testing as tm
1517

@@ -112,20 +114,15 @@ def test_tidy_repr(self):
112114
a.name = 'title1'
113115
repr(a) # should not raise exception
114116

117+
@tm.capture_stderr
115118
def test_repr_bool_fails(self):
116119
s = Series([DataFrame(np.random.randn(2, 2)) for i in range(5)])
117120

118-
import sys
119-
120-
buf = StringIO()
121-
tmp = sys.stderr
122-
sys.stderr = buf
123-
try:
124-
# it works (with no Cython exception barf)!
125-
repr(s)
126-
finally:
127-
sys.stderr = tmp
128-
self.assertEqual(buf.getvalue(), '')
121+
# It works (with no Cython exception barf)!
122+
repr(s)
123+
124+
output = sys.stderr.getvalue()
125+
assert output == ''
129126

130127
def test_repr_name_iterable_indexable(self):
131128
s = Series([1, 2, 3], name=np.int64(3))

0 commit comments

Comments
 (0)