From 0d8481873987c4128b486b7f8c8bc47026092383 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sun, 27 Dec 2020 12:04:12 +0900 Subject: [PATCH] Fix #8594: autodoc: empty __all__ attribute is ignored An empty `__all__` should be represented as "there is no public items". But autodoc considers all items on the module are public. This changes the behavior to correct one. --- CHANGES | 1 + sphinx/ext/autodoc/__init__.py | 2 +- .../test-ext-autodoc/target/empty_all.py | 16 +++++++++++ tests/test_ext_autodoc_automodule.py | 27 +++++++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 tests/roots/test-ext-autodoc/target/empty_all.py create mode 100644 tests/test_ext_autodoc_automodule.py diff --git a/CHANGES b/CHANGES index bdf3be3b8..1e62225ef 100644 --- a/CHANGES +++ b/CHANGES @@ -25,6 +25,7 @@ Bugs fixed * #741: autodoc: inherited-members doesn't work for instance attributes on super class * #8592: autodoc: ``:meta public:`` does not effect to variables +* #8594: autodoc: empty __all__ attribute is ignored Testing -------- diff --git a/sphinx/ext/autodoc/__init__.py b/sphinx/ext/autodoc/__init__.py index d85d79617..c9f90acca 100644 --- a/sphinx/ext/autodoc/__init__.py +++ b/sphinx/ext/autodoc/__init__.py @@ -1074,7 +1074,7 @@ class ModuleDocumenter(Documenter): def get_object_members(self, want_all: bool) -> Tuple[bool, ObjectMembers]: members = self.get_module_members() if want_all: - if not self.__all__: + if self.__all__ is None: # for implicit module members, check __module__ to avoid # documenting imported objects return True, list(members.values()) diff --git a/tests/roots/test-ext-autodoc/target/empty_all.py b/tests/roots/test-ext-autodoc/target/empty_all.py new file mode 100644 index 000000000..c094cff70 --- /dev/null +++ b/tests/roots/test-ext-autodoc/target/empty_all.py @@ -0,0 +1,16 @@ +""" +docsting of empty_all module. +""" +__all__ = [] + + +def foo(): + """docstring""" + + +def bar(): + """docstring""" + + +def baz(): + """docstring""" diff --git a/tests/test_ext_autodoc_automodule.py b/tests/test_ext_autodoc_automodule.py new file mode 100644 index 000000000..9b81da21e --- /dev/null +++ b/tests/test_ext_autodoc_automodule.py @@ -0,0 +1,27 @@ +""" + test_ext_autodoc_autocmodule + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Test the autodoc extension. This tests mainly the Documenters; the auto + directives are tested in a test source file translated by test_build. + + :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +import pytest + +from .test_ext_autodoc import do_autodoc + + +@pytest.mark.sphinx('html', testroot='ext-autodoc') +def test_empty_all(app): + options = {'members': True} + actual = do_autodoc(app, 'module', 'target.empty_all', options) + assert list(actual) == [ + '', + '.. py:module:: target.empty_all', + '', + 'docsting of empty_all module.', + '', + ]