]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Drop the excruciating newline requirements on arguments to
authorTim Peters <tim.peters@gmail.com>
Mon, 9 Aug 2004 03:51:46 +0000 (03:51 +0000)
committerTim Peters <tim.peters@gmail.com>
Mon, 9 Aug 2004 03:51:46 +0000 (03:51 +0000)
Example.__init__.  The constructor now adds trailing newlines when
needed, and no longer distinguishes between multi- and single-line
cases for source.

Lib/doctest.py
Lib/test/test_doctest.py

index bcda8a3ee1295d3ddbd5fc308ed8a2a2ebbb4f75..054ba91e7503412836b0e0a5a5016dd656293396 100644 (file)
@@ -493,24 +493,24 @@ class Example:
     A single doctest example, consisting of source code and expected
     output.  Example defines the following attributes:
 
-      - source: A single python statement, ending in a newline iff the
-        statement spans more than one line.
+      - source:  A single Python statement, always ending with a newline.
+        The constructor adds a newline if needed.
 
-      - want: The expected output from running the source code (either
-        from stdout, or a traceback in case of exception).  `want`
-        should always end with a newline, unless no output is expected,
+      - want:  The expected output from running the source code (either
+        from stdout, or a traceback in case of exception).  `want` ends
+        with a newline unless it's empty, in which case it's an empty
+        string.  The constructor adds a newline if needed.
 
-      - lineno: The line number within the DocTest string containing
+      - lineno:  The line number within the DocTest string containing
         this Example where the Example begins.  This line number is
         zero-based, with respect to the beginning of the DocTest.
     """
     def __init__(self, source, want, lineno):
-        # Check invariants.
-        if (source[-1:] == '\n') != ('\n' in source[:-1]):
-            raise AssertionError("source must end with newline iff "
-                                 "source contains more than one line")
-        if  want and want[-1] != '\n':
-            raise AssertionError("non-empty want must end with newline")
+        # Normalize inputs.
+        if not source.endswith('\n'):
+            source += '\n'
+        if want and not want.endswith('\n'):
+            want += '\n'
         # Store properties.
         self.source = source
         self.want = want
@@ -625,9 +625,9 @@ class Parser:
         ...        '''
         >>> for x in Parser('<string>', text).get_examples():
         ...     print (x.source, x.want, x.lineno)
-        ('x, y = 2, 3  # no output expected', '', 1)
+        ('x, y = 2, 3  # no output expected\\n', '', 1)
         ('if 1:\\n    print x\\n    print y\\n', '2\\n3\\n', 2)
-        ('x+y', '5\\n', 9)
+        ('x+y\\n', '5\\n', 9)
         """
         examples = []
         charno, lineno = 0, 0
@@ -1283,7 +1283,7 @@ class DocTestRunner:
                 # like "if 1: print 2", then compile() requires a
                 # trailing newline.  Rather than analyze that, always
                 # append one (it never hurts).
-                exec compile(example.source + '\n', "<string>", "single",
+                exec compile(example.source, "<string>", "single",
                              compileflags, 1) in test.globs
                 exception = None
             except KeyboardInterrupt:
index d9d0674d889aff23fefe9f719561afc5c54af1b6..27c3e9224ec7d47d21749b3f2f1557d818062466 100644 (file)
@@ -127,31 +127,41 @@ an expected output string, and a line number (within the docstring):
 
     >>> example = doctest.Example('print 1', '1\n', 0)
     >>> (example.source, example.want, example.lineno)
-    ('print 1', '1\n', 0)
+    ('print 1\n', '1\n', 0)
 
-The `source` string should end in a newline iff the source spans more
-than one line:
+The `source` string ends in a newline:
 
-    >>> # Source spans a single line: no terminating newline.
+    Source spans a single line: no terminating newline.
     >>> e = doctest.Example('print 1', '1\n', 0)
+    >>> e.source, e.want
+    ('print 1\n', '1\n')
+
     >>> e = doctest.Example('print 1\n', '1\n', 0)
-    Traceback (most recent call last):
-    AssertionError: source must end with newline iff source contains more than one line
+    >>> e.source, e.want
+    ('print 1\n', '1\n')
 
-    >>> # Source spans multiple lines: require terminating newline.
+    Source spans multiple lines: require terminating newline.
     >>> e = doctest.Example('print 1;\nprint 2\n', '1\n2\n', 0)
+    >>> e.source, e.want
+    ('print 1;\nprint 2\n', '1\n2\n')
+
     >>> e = doctest.Example('print 1;\nprint 2', '1\n2\n', 0)
-    Traceback (most recent call last):
-    AssertionError: source must end with newline iff source contains more than one line
+    >>> e.source, e.want
+    ('print 1;\nprint 2\n', '1\n2\n')
 
-The `want` string should be terminated by a newline, unless it's the
-empty string:
+The `want` string ends with a newline, unless it's the empty string:
 
     >>> e = doctest.Example('print 1', '1\n', 0)
+    >>> e.source, e.want
+    ('print 1\n', '1\n')
+
     >>> e = doctest.Example('print 1', '1', 0)
-    Traceback (most recent call last):
-    AssertionError: non-empty want must end with newline
+    >>> e.source, e.want
+    ('print 1\n', '1\n')
+
     >>> e = doctest.Example('print', '', 0)
+    >>> e.source, e.want
+    ('print\n', '')
 """
 
 def test_DocTest(): r"""
@@ -180,9 +190,9 @@ constructor:
     2
     >>> e1, e2 = test.examples
     >>> (e1.source, e1.want, e1.lineno)
-    ('print 12', '12\n', 1)
+    ('print 12\n', '12\n', 1)
     >>> (e2.source, e2.want, e2.lineno)
-    ("print 'another\\example'", 'another\nexample\n', 6)
+    ("print 'another\\example'\n", 'another\nexample\n', 6)
 
 Source information (name, filename, and line number) is available as
 attributes on the doctest object:
@@ -264,8 +274,8 @@ will return a single test (for that function's docstring):
     >>> print tests
     [<DocTest sample_func from ...:12 (1 example)>]
     >>> e = tests[0].examples[0]
-    >>> print (e.source, e.want, e.lineno)
-    ('print sample_func(22)', '44\n', 3)
+    >>> (e.source, e.want, e.lineno)
+    ('print sample_func(22)\n', '44\n', 3)
 
     >>> doctest: -ELLIPSIS # Turn ellipsis back off