From e2b47d0dfa4a1924f840b0526a5b33297bbecaea Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 29 Aug 2023 15:41:23 +0200 Subject: [PATCH] gh-108638: Fix tests when _stat extension is missing Fix test_inspect and test_pydoc when the _stat extension is missing. Skip tests relying on _stat when _stat is missing. --- Lib/test/test_inspect.py | 28 ++++++++++++++++++++++------ Lib/test/test_pydoc.py | 8 +++++++- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index 9cb92c02d3e7d8..78ef817906b2aa 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -1186,7 +1186,7 @@ def test_getfullargspec_builtin_func_no_signature(self): cls = _testcapi.DocStringNoSignatureTest obj = _testcapi.DocStringNoSignatureTest() - for builtin, template in [ + tests = [ (_testcapi.docstring_no_signature_noargs, meth_noargs), (_testcapi.docstring_no_signature_o, meth_o), (cls.meth_noargs, meth_self_noargs), @@ -1201,7 +1201,6 @@ def test_getfullargspec_builtin_func_no_signature(self): (cls.meth_o_coexist, meth_self_o), (time.time, meth_noargs), - (stat.S_IMODE, meth_o), (str.lower, meth_self_noargs), (''.lower, meth_self_noargs), (set.add, meth_self_o), @@ -1212,7 +1211,16 @@ def test_getfullargspec_builtin_func_no_signature(self): (datetime.datetime.utcnow, meth_type_noargs), (dict.__dict__['__class_getitem__'], meth_type_o), (dict.__class_getitem__, meth_type_o), - ]: + ] + try: + import _stat + except ImportError: + # if the _stat extension is not available, stat.S_IMODE() is + # implemented in Python, not in C + pass + else: + tests.append((stat.S_IMODE, meth_o)) + for builtin, template in tests: with self.subTest(builtin): self.assertEqual(inspect.getfullargspec(builtin), inspect.getfullargspec(template)) @@ -2934,7 +2942,7 @@ def test_signature_on_builtins_no_signature(self): cls = _testcapi.DocStringNoSignatureTest obj = _testcapi.DocStringNoSignatureTest() - for builtin, template in [ + tests = [ (_testcapi.docstring_no_signature_noargs, meth_noargs), (_testcapi.docstring_no_signature_o, meth_o), (cls.meth_noargs, meth_self_noargs), @@ -2949,7 +2957,6 @@ def test_signature_on_builtins_no_signature(self): (cls.meth_o_coexist, meth_self_o), (time.time, meth_noargs), - (stat.S_IMODE, meth_o), (str.lower, meth_self_noargs), (''.lower, meth_noargs), (set.add, meth_self_o), @@ -2960,7 +2967,16 @@ def test_signature_on_builtins_no_signature(self): (datetime.datetime.utcnow, meth_noargs), (dict.__dict__['__class_getitem__'], meth_type_o), (dict.__class_getitem__, meth_o), - ]: + ] + try: + import _stat + except ImportError: + # if the _stat extension is not available, stat.S_IMODE() is + # implemented in Python, not in C + pass + else: + tests.append((stat.S_IMODE, meth_o)) + for builtin, template in tests: with self.subTest(builtin): self.assertEqual(inspect.signature(builtin), inspect.signature(template)) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py index 9b5c11bf853fd9..499eeb98ad6138 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -1187,7 +1187,13 @@ def test_module_level_callable_noargs(self): "time()") def test_module_level_callable_o(self): - self.assertEqual(self._get_summary_line(stat.S_IMODE), + try: + import _stat + except ImportError: + # stat.S_IMODE() and _stat.S_IMODE() have a different signature + self.skipTest('_stat extension is missing') + + self.assertEqual(self._get_summary_line(_stat.S_IMODE), "S_IMODE(object, /)") def test_unbound_builtin_method_noargs(self):