Commit 58f15b66 authored by R. David Murray's avatar R. David Murray

Merged revisions 83380 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r83380 | r.david.murray | 2010-07-31 23:31:09 -0400 (Sat, 31 Jul 2010) | 17 lines

  #8620: Cmd no longer truncates last character if stdin ends without newline

  Cmd used to blindly chop off the last character of every input line.  If
  the input reached EOF and there was no final new line, it would truncate
  the last character of the last command.  This fix instead strips trailing
  \r\n from the input lines.  While this is a small behavior change, it
  should not break any working code, since feeding a '\r\n' terminated
  file to Cmd would previously leave the \r's on the lines, resulting
  in failed command execution.

  I wrote the unit test in preparation for a PyOhio TeachMe session
  run by Catherine Devlin, and we can thank Catherine and the PyOhio
  session attendees for the fix.  I've added Catherine to the Acks file
  for organizing and leading the TeachMe session, out of which we will
  hopefully get some new contributors.
........
parent a491727d
...@@ -137,7 +137,7 @@ class Cmd: ...@@ -137,7 +137,7 @@ class Cmd:
if not len(line): if not len(line):
line = 'EOF' line = 'EOF'
else: else:
line = line[:-1] # chop \n line = line.rstrip('\r\n')
line = self.precmd(line) line = self.precmd(line)
stop = self.onecmd(line) stop = self.onecmd(line)
stop = self.postcmd(stop, line) stop = self.postcmd(stop, line)
......
...@@ -8,6 +8,9 @@ Original by Michael Schneider ...@@ -8,6 +8,9 @@ Original by Michael Schneider
import cmd import cmd
import sys import sys
from test import test_support from test import test_support
import re
import unittest
import StringIO
class samplecmdclass(cmd.Cmd): class samplecmdclass(cmd.Cmd):
""" """
...@@ -168,9 +171,33 @@ class samplecmdclass(cmd.Cmd): ...@@ -168,9 +171,33 @@ class samplecmdclass(cmd.Cmd):
def do_exit(self, arg): def do_exit(self, arg):
return True return True
class TestAlternateInput(unittest.TestCase):
class simplecmd(cmd.Cmd):
def do_print(self, args):
print >>self.stdout, args
def do_EOF(self, args):
return True
def test_file_with_missing_final_nl(self):
input = StringIO.StringIO("print test\nprint test2")
output = StringIO.StringIO()
cmd = self.simplecmd(stdin=input, stdout=output)
cmd.use_rawinput = False
cmd.cmdloop()
self.assertMultiLineEqual(output.getvalue(),
("(Cmd) test\n"
"(Cmd) test2\n"
"(Cmd) "))
def test_main(verbose=None): def test_main(verbose=None):
from test import test_cmd from test import test_cmd
test_support.run_doctest(test_cmd, verbose) test_support.run_doctest(test_cmd, verbose)
test_support.run_unittest(TestAlternateInput)
def test_coverage(coverdir): def test_coverage(coverdir):
trace = test_support.import_module('trace') trace = test_support.import_module('trace')
......
...@@ -188,6 +188,7 @@ Vincent Delft ...@@ -188,6 +188,7 @@ Vincent Delft
Arnaud Delobelle Arnaud Delobelle
Erik Demaine Erik Demaine
Roger Dev Roger Dev
Catherine Devlin
Raghuram Devarakonda Raghuram Devarakonda
Scott Dial Scott Dial
Toby Dickenson Toby Dickenson
......
...@@ -18,6 +18,9 @@ Core and Builtins ...@@ -18,6 +18,9 @@ Core and Builtins
Library Library
------- -------
- Issue #8620: when a Cmd is fed input that reaches EOF without a final
newline, it no longer truncates the last character of the last command line.
- Issue #6213: Implement getstate() and setstate() methods of utf-8-sig and - Issue #6213: Implement getstate() and setstate() methods of utf-8-sig and
utf-16 incremental encoders. utf-16 incremental encoders.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment