]> granicus.if.org Git - python/commitdiff
Issue #21088: Bugfix for curses.window.addch() regression in 3.4.0.
authorLarry Hastings <larry@hastings.org>
Sun, 4 May 2014 11:41:18 +0000 (04:41 -0700)
committerLarry Hastings <larry@hastings.org>
Sun, 4 May 2014 11:41:18 +0000 (04:41 -0700)
In porting to Argument Clinic, the first two arguments were reversed.

Lib/test/test_curses.py
Misc/NEWS
Modules/_cursesmodule.c

index ce8f254bbbd32305499269f5f23c46b271c500c5..ad10f620b3605464ce82147ef4c203bf0ec4f1bd 100644 (file)
@@ -17,6 +17,7 @@ import sys, tempfile, os
 
 import unittest
 from test.support import requires, import_module
+import inspect
 requires('curses')
 
 # If either of these don't exist, skip the tests.
@@ -331,6 +332,34 @@ def test_encoding(stdscr):
     else:
         raise AssertionError("TypeError not raised")
 
+def test_issue21088(stdscr):
+    #
+    # http://bugs.python.org/issue21088
+    #
+    # the bug:
+    # when converting curses.window.addch to Argument Clinic
+    # the first two parameters were switched.
+
+    # if someday we can represent the signature of addch
+    # we will need to rewrite this test.
+    try:
+        signature = inspect.signature(stdscr.addch)
+        self.assertFalse(signature)
+    except ValueError:
+        # not generating a signature is fine.
+        pass
+
+    # So.  No signature for addch.
+    # But Argument Clinic gave us a human-readable equivalent
+    # as the first line of the docstring.  So we parse that,
+    # and ensure that the parameters appear in the correct order.
+    # Since this is parsing output from Argument Clinic, we can
+    # be reasonably certain the generated parsing code will be
+    # correct too.
+    human_readable_signature = stdscr.addch.__doc__.split("\n")[0]
+    offset = human_readable_signature.find("[y, x,]")
+    assert offset >= 0, ""
+
 def main(stdscr):
     curses.savetty()
     try:
@@ -344,6 +373,7 @@ def main(stdscr):
         test_unget_wch(stdscr)
         test_issue10570()
         test_encoding(stdscr)
+        test_issue21088(stdscr)
     finally:
         curses.resetty()
 
index 9034371462bcb5cb054c87d8fca7359788677a29..2b79789beef601d31760e91f035ca3b708359f33 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -39,6 +39,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #21088: Bugfix for curses.window.addch() regression in 3.4.0.
+  In porting to Argument Clinic, the first two arguments were reversed.
+
 - Issue #21321: itertools.islice() now releases the reference to the source
   iterator when the slice is exhausted.  Patch by Anton Afanasyev.
 
index 494f02e194a58890dc99c9b5b90cb6c4ff68c934..5ffce2f9541a2d0f8ad325ed468997d35b5251c3 100644 (file)
@@ -560,10 +560,10 @@ PyCursesWindow_Dealloc(PyCursesWindowObject *wo)
 curses.window.addch
 
     [
-    x: int
-      X-coordinate.
     y: int
       Y-coordinate.
+    x: int
+      X-coordinate.
     ]
 
     ch: object
@@ -584,13 +584,13 @@ current settings for the window object.
 [clinic start generated code]*/
 
 PyDoc_STRVAR(curses_window_addch__doc__,
-"addch([x, y,] ch, [attr])\n"
+"addch([y, x,] ch, [attr])\n"
 "Paint character ch at (y, x) with attributes attr.\n"
 "\n"
-"  x\n"
-"    X-coordinate.\n"
 "  y\n"
 "    Y-coordinate.\n"
+"  x\n"
+"    X-coordinate.\n"
 "  ch\n"
 "    Character to add.\n"
 "  attr\n"
@@ -605,15 +605,15 @@ PyDoc_STRVAR(curses_window_addch__doc__,
     {"addch", (PyCFunction)curses_window_addch, METH_VARARGS, curses_window_addch__doc__},
 
 static PyObject *
-curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr);
+curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y, int x, PyObject *ch, int group_right_1, long attr);
 
 static PyObject *
 curses_window_addch(PyCursesWindowObject *self, PyObject *args)
 {
     PyObject *return_value = NULL;
     int group_left_1 = 0;
-    int x = 0;
     int y = 0;
+    int x = 0;
     PyObject *ch;
     int group_right_1 = 0;
     long attr = 0;
@@ -629,12 +629,12 @@ curses_window_addch(PyCursesWindowObject *self, PyObject *args)
             group_right_1 = 1;
             break;
         case 3:
-            if (!PyArg_ParseTuple(args, "iiO:addch", &x, &y, &ch))
+            if (!PyArg_ParseTuple(args, "iiO:addch", &y, &x, &ch))
                 goto exit;
             group_left_1 = 1;
             break;
         case 4:
-            if (!PyArg_ParseTuple(args, "iiOl:addch", &x, &y, &ch, &attr))
+            if (!PyArg_ParseTuple(args, "iiOl:addch", &y, &x, &ch, &attr))
                 goto exit;
             group_right_1 = 1;
             group_left_1 = 1;
@@ -643,15 +643,15 @@ curses_window_addch(PyCursesWindowObject *self, PyObject *args)
             PyErr_SetString(PyExc_TypeError, "curses.window.addch requires 1 to 4 arguments");
             goto exit;
     }
-    return_value = curses_window_addch_impl(self, group_left_1, x, y, ch, group_right_1, attr);
+    return_value = curses_window_addch_impl(self, group_left_1, y, x, ch, group_right_1, attr);
 
 exit:
     return return_value;
 }
 
 static PyObject *
-curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr)
-/*[clinic end generated code: output=43acb91a5c98f615 input=fe7e3711d5bbf1f6]*/
+curses_window_addch_impl(PyCursesWindowObject *self, int group_left_1, int y, int x, PyObject *ch, int group_right_1, long attr)
+/*[clinic end generated code: output=d4b97cc287010c54 input=5a41efb34a2de338]*/
 {
     PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
     int coordinates_group = group_left_1;