]> granicus.if.org Git - python/commitdiff
Merged revisions 83380 via svnmerge from
authorR. David Murray <rdmurray@bitdance.com>
Sun, 1 Aug 2010 04:14:22 +0000 (04:14 +0000)
committerR. David Murray <rdmurray@bitdance.com>
Sun, 1 Aug 2010 04:14:22 +0000 (04:14 +0000)
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.
........

Lib/cmd.py
Lib/test/test_cmd.py
Misc/ACKS
Misc/NEWS

index 6f34e0472842a6c851fa729d09fcdb794097d0a5..10aa5acf4be27506c16c587251dfc8dd87fd3ed6 100644 (file)
@@ -134,7 +134,7 @@ class Cmd:
                         if not len(line):
                             line = 'EOF'
                         else:
-                            line = line[:-1] # chop \n
+                            line = line.rstrip('\r\n')
                 line = self.precmd(line)
                 stop = self.onecmd(line)
                 stop = self.postcmd(stop, line)
index e2b3022a2a5884ed5bf8478f65ed809c1daa35fb..7a13d27e1518728f1949f0f26631ce49076f2246 100644 (file)
@@ -9,7 +9,8 @@ import cmd
 import sys
 import trace
 import re
-from io import StringIO
+import unittest
+import io
 
 class samplecmdclass(cmd.Cmd):
     """
@@ -166,9 +167,33 @@ class samplecmdclass(cmd.Cmd):
     def do_exit(self, arg):
         return True
 
+
+class TestAlternateInput(unittest.TestCase):
+
+    class simplecmd(cmd.Cmd):
+
+        def do_print(self, args):
+            print(args, file=self.stdout)
+
+        def do_EOF(self, args):
+            return True
+
+    def test_file_with_missing_final_nl(self):
+        input = io.StringIO("print test\nprint test2")
+        output = io.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):
     from test import support, test_cmd
     support.run_doctest(test_cmd, verbose)
+    support.run_unittest(TestAlternateInput)
 
 def test_coverage(coverdir):
     tracer=trace.Trace(ignoredirs=[sys.prefix, sys.exec_prefix,],
index a9f7885b299c93fa44c70346d00f008fc07930c0..519dda488c47690cf2f85bf8fa968e168e367973 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -179,6 +179,7 @@ Vincent Delft
 Arnaud Delobelle
 Erik Demaine
 Roger Dev
+Catherine Devlin
 Raghuram Devarakonda
 Toby Dickenson
 Mark Dickinson
index 95051913b6eebb315588bf302ba5b49c74fd49d2..8d665db90ea2493bd108b1b7d6f772a903de3971 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -78,6 +78,9 @@ C-API
 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 #3704: http.cookiejar was not properly handling URLs with a / in the
   parameters.