Skip to content

Commit ca56539

Browse files
committed
Merge send_to_stdout and send_to_stderr; fix newline handling (#744)
1 parent 725c9b7 commit ca56539

File tree

2 files changed

+38
-41
lines changed

2 files changed

+38
-41
lines changed

bpython/curtsiesfrontend/repl.py

Lines changed: 10 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ def readline(self):
229229
value = self.readline_results.pop(0)
230230
else:
231231
value = 'no saved input available'
232-
self.repl.send_to_stdout(value)
232+
self.repl.send_to_stdouterr(value)
233233
return value
234234

235235

@@ -333,7 +333,7 @@ def __init__(self,
333333

334334
if interp is None:
335335
interp = Interp(locals=locals_)
336-
interp.write = self.send_to_stderr
336+
interp.write = self.send_to_stdouterr
337337
if banner is None:
338338
if config.help_key:
339339
banner = (_('Welcome to bpython!') + ' ' +
@@ -393,9 +393,9 @@ def __init__(self,
393393

394394
# filenos match the backing device for libs that expect it,
395395
# but writing to them will do weird things to the display
396-
self.stdout = FakeOutput(self.coderunner, self.send_to_stdout,
396+
self.stdout = FakeOutput(self.coderunner, self.send_to_stdouterr,
397397
fileno=sys.__stdout__.fileno())
398-
self.stderr = FakeOutput(self.coderunner, self.send_to_stderr,
398+
self.stderr = FakeOutput(self.coderunner, self.send_to_stdouterr,
399399
fileno=sys.__stderr__.fileno())
400400
self.stdin = FakeStdin(self.coderunner, self, self.edit_keys)
401401

@@ -1140,27 +1140,16 @@ def clear_current_block(self, remove_from_history=True):
11401140
def get_current_block(self):
11411141
return '\n'.join(self.buffer + [self.current_line])
11421142

1143-
def move_current_stdouterr_line_up(self):
1144-
"""Append self.current_stdouterr_line to self.display_lines
1145-
then clean it."""
1146-
self.display_lines.extend(paint.display_linize(
1147-
self.current_stdouterr_line, self.width))
1148-
self.current_stdouterr_line = ''
1143+
def send_to_stdouterr(self, output):
1144+
"""Send unicode strings or FmtStr to Repl stdout or stderr
11491145
1150-
def send_to_stdout(self, output):
1151-
"""Send unicode string to Repl stdout"""
1146+
Must be able to handle FmtStrs because interpreter pass in
1147+
tracebacks already formatted."""
11521148
if not output:
11531149
return
11541150
lines = output.split('\n')
1155-
if all(not line for line in lines):
1156-
# If the string consist only of newline characters,
1157-
# str.split returns one more empty strings.
1158-
lines = lines[:-1]
11591151
logger.debug('display_lines: %r', self.display_lines)
1160-
if lines[0]:
1161-
self.current_stdouterr_line += lines[0]
1162-
else:
1163-
self.move_current_stdouterr_line_up()
1152+
self.current_stdouterr_line += lines[0]
11641153
if len(lines) > 1:
11651154
self.display_lines.extend(paint.display_linize(
11661155
self.current_stdouterr_line, self.width, blank_line=True))
@@ -1171,26 +1160,6 @@ def send_to_stdout(self, output):
11711160
self.current_stdouterr_line = lines[-1]
11721161
logger.debug('display_lines: %r', self.display_lines)
11731162

1174-
def send_to_stderr(self, error):
1175-
"""Send unicode strings or FmtStr to Repl stderr
1176-
1177-
Must be able to handle FmtStrs because interpreter pass in
1178-
tracebacks already formatted."""
1179-
if not error:
1180-
return
1181-
lines = error.split('\n')
1182-
if all(not line for line in lines):
1183-
# If the string consist only of newline characters,
1184-
# str.split returns one more empty strings.
1185-
lines = lines[:-1]
1186-
if lines[-1]:
1187-
self.current_stdouterr_line += lines[-1]
1188-
else:
1189-
self.move_current_stdouterr_line_up()
1190-
self.display_lines.extend(sum((paint.display_linize(line, self.width,
1191-
blank_line=True)
1192-
for line in lines[:-1]), []))
1193-
11941163
def send_to_stdin(self, line):
11951164
if line.endswith('\n'):
11961165
self.display_lines.extend(
@@ -1653,7 +1622,7 @@ def reevaluate(self, insert_into_history=False):
16531622

16541623
if not self.weak_rewind:
16551624
self.interp = self.interp.__class__()
1656-
self.interp.write = self.send_to_stderr
1625+
self.interp.write = self.send_to_stdouterr
16571626
self.coderunner.interp = self.interp
16581627
self.initialize_interp()
16591628

bpython/test/test_curtsies_repl.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,34 @@ def test_interactive(self):
264264
self.assertEqual(out.getvalue(), '0.5\n0.5\n')
265265

266266

267+
class TestStdOutErr(TestCase):
268+
def setUp(self):
269+
self.repl = create_repl()
270+
271+
def test_newline(self):
272+
self.repl.send_to_stdouterr('\n\n')
273+
self.assertEqual(self.repl.display_lines[-2], '')
274+
self.assertEqual(self.repl.display_lines[-1], '')
275+
self.assertEqual(self.repl.current_stdouterr_line, '')
276+
277+
def test_leading_newline(self):
278+
self.repl.send_to_stdouterr('\nfoo\n')
279+
self.assertEqual(self.repl.display_lines[-2], '')
280+
self.assertEqual(self.repl.display_lines[-1], 'foo')
281+
self.assertEqual(self.repl.current_stdouterr_line, '')
282+
283+
def test_no_trailing_newline(self):
284+
self.repl.send_to_stdouterr('foo')
285+
self.assertEqual(self.repl.current_stdouterr_line, 'foo')
286+
287+
def test_print_without_newline_then_print_with_leading_newline(self):
288+
self.repl.send_to_stdouterr('foo')
289+
self.repl.send_to_stdouterr('\nbar\n')
290+
self.assertEqual(self.repl.display_lines[-2], 'foo')
291+
self.assertEqual(self.repl.display_lines[-1], 'bar')
292+
self.assertEqual(self.repl.current_stdouterr_line, '')
293+
294+
267295
class TestPredictedIndent(TestCase):
268296
def setUp(self):
269297
self.repl = create_repl()

0 commit comments

Comments
 (0)