curses.complexchar('A', curses.A_BOLD))
self.assertNotEqual(curses.complexchar('A'), curses.complexchar('B'))
# repr() shows only a non-default attr/pair, and is a constructor call.
- ns = {'_curses': sys.modules[type(cc).__module__]}
+ modname = type(cc).__module__
+ ns = {modname: sys.modules[modname]}
self.assertNotIn('attr=', repr(curses.complexchar('z')))
self.assertNotIn('pair=', repr(curses.complexchar('z')))
r = repr(curses.complexchar('A', curses.A_BOLD))
r = curses.has_extended_color_support()
self.assertIsInstance(r, bool)
+ def test_type_names(self):
+ # The curses types report their public module rather than the
+ # underscore extension that implements them.
+ for name in 'window', 'complexchar', 'complexstr', 'screen', 'error':
+ tp = getattr(curses, name)
+ self.assertEqual(tp.__module__, 'curses')
+ self.assertEqual(tp.__qualname__, name)
+ self.assertEqual(tp.__name__, name)
+
+ @requires_curses_func('panel')
+ def test_panel_type_names(self):
+ import curses.panel
+ for name in 'panel', 'error':
+ tp = getattr(curses.panel, name)
+ self.assertEqual(tp.__module__, 'curses.panel')
+ self.assertEqual(tp.__qualname__, name)
+ self.assertEqual(tp.__name__, name)
+
class TestAscii(unittest.TestCase):
--- /dev/null
+The :mod:`curses` types and exceptions now report their public module in
+:attr:`~type.__module__`, :func:`repr` and :func:`help` -- for example
+``curses.window`` instead of ``_curses.window`` and ``curses.panel.error``
+instead of ``_curses_panel.error``.
};
static PyType_Spec PyCursesPanel_Type_spec = {
- .name = "_curses_panel.panel",
+ .name = "curses.panel.panel",
.basicsize = sizeof(PyCursesPanelObject),
.flags = (
Py_TPFLAGS_DEFAULT
return -1;
}
- /* For exception _curses_panel.error */
+ /* For exception curses.panel.error */
state->error = PyErr_NewExceptionWithDoc(
- "_curses_panel.error",
+ "curses.panel.error",
"Exception raised when a curses panel library function returns an error.",
NULL, NULL);
};
static PyType_Spec PyCursesComplexChar_Type_spec = {
- .name = "_curses.complexchar",
+ .name = "curses.complexchar",
.basicsize = sizeof(PyCursesComplexCharObject),
.flags = Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_IMMUTABLETYPE
};
static PyType_Spec PyCursesComplexStr_Type_spec = {
- .name = "_curses.complexstr",
+ .name = "curses.complexstr",
.basicsize = offsetof(PyCursesComplexStrObject, cells),
.itemsize = sizeof(cchar_t),
.flags = Py_TPFLAGS_DEFAULT
};
static PyType_Spec PyCursesWindow_Type_spec = {
- .name = "_curses.window",
+ .name = "curses.window",
.basicsize = sizeof(PyCursesWindowObject),
.flags = Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_DISALLOW_INSTANTIATION
};
static PyType_Spec PyCursesScreen_Type_spec = {
- .name = "_curses.screen",
+ .name = "curses.screen",
.basicsize = sizeof(PyCursesScreenObject),
.flags = Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_DISALLOW_INSTANTIATION
/* For exception curses.error */
state->error = PyErr_NewExceptionWithDoc(
- "_curses.error",
+ "curses.error",
"Exception raised when a curses library function returns an error.",
NULL, NULL);
if (state->error == NULL) {