From 476deba9bc5b4bc755f0884c8aecc7e515f143f8 Mon Sep 17 00:00:00 2001 From: xtreak Date: Sun, 24 Mar 2019 12:15:17 +0530 Subject: [PATCH 1/5] Handle empty packages in doctest --- Lib/doctest.py | 2 +- Lib/test/test_doctest.py | 5 ++++- .../next/Library/2019-03-24-12-12-27.bpo-36406.mCEkOl.rst | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-03-24-12-12-27.bpo-36406.mCEkOl.rst diff --git a/Lib/doctest.py b/Lib/doctest.py index 79d91a040c2eee..e97555ed2f2e41 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -1060,7 +1060,7 @@ def _get_test(self, obj, name, module, globs, source_lines): filename = None else: filename = getattr(module, '__file__', module.__name__) - if filename[-4:] == ".pyc": + if filename and filename[-4:] == ".pyc": filename = filename[:-1] return self._parser.get_doctest(docstring, globs, name, filename, lineno) diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index f1013f25725964..930ee6b9e481ce 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -698,8 +698,11 @@ def test_empty_namespace_package(self): finally: support.forget(pkg_name) sys.path.pop() - assert doctest.DocTestFinder().find(mod) == [] + empty_doctest_finder = doctest.DocTestFinder(exclude_empty=False) + + self.assertEqual(len(doctest.DocTestFinder().find(mod)), 0) + self.assertEqual(len(empty_doctest_finder.find(mod)), 1) def test_DocTestParser(): r""" Unit tests for the `DocTestParser` class. diff --git a/Misc/NEWS.d/next/Library/2019-03-24-12-12-27.bpo-36406.mCEkOl.rst b/Misc/NEWS.d/next/Library/2019-03-24-12-12-27.bpo-36406.mCEkOl.rst new file mode 100644 index 00000000000000..fa4267757cd7e4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-03-24-12-12-27.bpo-36406.mCEkOl.rst @@ -0,0 +1 @@ +Handle empty packages in :mod:`doctest`. Patch by Karthikeyan Singaravelan. From 4165f9fea4880dfc1830d0e7596333dfaff2243c Mon Sep 17 00:00:00 2001 From: xtreak Date: Tue, 26 Mar 2019 15:06:09 +0530 Subject: [PATCH 2/5] Use module.__name__ when filename is None and refactor tests --- Lib/doctest.py | 6 ++++-- Lib/test/test_doctest.py | 7 ++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Lib/doctest.py b/Lib/doctest.py index e97555ed2f2e41..d932b0cfe90221 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -1059,8 +1059,10 @@ def _get_test(self, obj, name, module, globs, source_lines): if module is None: filename = None else: - filename = getattr(module, '__file__', module.__name__) - if filename and filename[-4:] == ".pyc": + # __file__ can be None for empty packages + filename = (getattr(module, '__file__', module.__name__) or + module.__name__) + if filename[-4:] == ".pyc": filename = filename[:-1] return self._parser.get_doctest(docstring, globs, name, filename, lineno) diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index 930ee6b9e481ce..a5aa39a65c9a32 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -699,10 +699,11 @@ def test_empty_namespace_package(self): support.forget(pkg_name) sys.path.pop() - empty_doctest_finder = doctest.DocTestFinder(exclude_empty=False) + include_empty_finder = doctest.DocTestFinder(exclude_empty=False) + exclude_empty_finder = doctest.DocTestFinder(exclude_empty=True) - self.assertEqual(len(doctest.DocTestFinder().find(mod)), 0) - self.assertEqual(len(empty_doctest_finder.find(mod)), 1) + self.assertEqual(len(include_empty_finder.find(mod)), 1) + self.assertEqual(len(exclude_empty_finder.find(mod)), 0) def test_DocTestParser(): r""" Unit tests for the `DocTestParser` class. From 89a9de8a0343c8f0fb5685d57a368363f1bef018 Mon Sep 17 00:00:00 2001 From: Karthikeyan Singaravelan Date: Mon, 8 Apr 2019 13:22:20 +0530 Subject: [PATCH 3/5] Refactor None check --- Lib/doctest.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Lib/doctest.py b/Lib/doctest.py index d932b0cfe90221..570d9ccad0a93d 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -1060,8 +1060,7 @@ def _get_test(self, obj, name, module, globs, source_lines): filename = None else: # __file__ can be None for empty packages - filename = (getattr(module, '__file__', module.__name__) or - module.__name__) + filename = getattr(module, '__file__', None) or module.__name__ if filename[-4:] == ".pyc": filename = filename[:-1] return self._parser.get_doctest(docstring, globs, name, From d6bf090e16d3cee9ab44056215189e3c46fbd42a Mon Sep 17 00:00:00 2001 From: Xtreak Date: Fri, 31 May 2019 03:56:08 +0530 Subject: [PATCH 4/5] Use period at end of comment. Co-Authored-By: Brett Cannon <54418+brettcannon@users.noreply.github.com> --- Lib/doctest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/doctest.py b/Lib/doctest.py index 570d9ccad0a93d..67250f762059db 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -1059,7 +1059,7 @@ def _get_test(self, obj, name, module, globs, source_lines): if module is None: filename = None else: - # __file__ can be None for empty packages + # __file__ can be None for empty packages. filename = getattr(module, '__file__', None) or module.__name__ if filename[-4:] == ".pyc": filename = filename[:-1] From f0ef6f23250a07edfa86aa916e8965027f3e5cfb Mon Sep 17 00:00:00 2001 From: Xtreak Date: Wed, 11 Sep 2019 11:51:01 +0100 Subject: [PATCH 5/5] Change empty to namespace. --- Lib/doctest.py | 2 +- .../next/Library/2019-03-24-12-12-27.bpo-36406.mCEkOl.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/doctest.py b/Lib/doctest.py index 67250f762059db..2a4b8c7dae0122 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -1059,7 +1059,7 @@ def _get_test(self, obj, name, module, globs, source_lines): if module is None: filename = None else: - # __file__ can be None for empty packages. + # __file__ can be None for namespace packages. filename = getattr(module, '__file__', None) or module.__name__ if filename[-4:] == ".pyc": filename = filename[:-1] diff --git a/Misc/NEWS.d/next/Library/2019-03-24-12-12-27.bpo-36406.mCEkOl.rst b/Misc/NEWS.d/next/Library/2019-03-24-12-12-27.bpo-36406.mCEkOl.rst index fa4267757cd7e4..3d81eb50418b04 100644 --- a/Misc/NEWS.d/next/Library/2019-03-24-12-12-27.bpo-36406.mCEkOl.rst +++ b/Misc/NEWS.d/next/Library/2019-03-24-12-12-27.bpo-36406.mCEkOl.rst @@ -1 +1 @@ -Handle empty packages in :mod:`doctest`. Patch by Karthikeyan Singaravelan. +Handle namespace packages in :mod:`doctest`. Patch by Karthikeyan Singaravelan.