Commit 2b5f767e authored by Skip Montanaro's avatar Skip Montanaro

Respect a module's __all__ attribute. Closes #969938.

parent 09d49b45
...@@ -151,14 +151,18 @@ def _split_list(s, predicate): ...@@ -151,14 +151,18 @@ def _split_list(s, predicate):
no.append(x) no.append(x)
return yes, no return yes, no
def visiblename(name): def visiblename(name, all=None):
"""Decide whether to show documentation on a variable.""" """Decide whether to show documentation on a variable."""
# Certain special names are redundant. # Certain special names are redundant.
if name in ['__builtins__', '__doc__', '__file__', '__path__', if name in ['__builtins__', '__doc__', '__file__', '__path__',
'__module__', '__name__']: return 0 '__module__', '__name__']: return 0
# Private names are hidden, but special names are displayed. # Private names are hidden, but special names are displayed.
if name.startswith('__') and name.endswith('__'): return 1 if name.startswith('__') and name.endswith('__'): return 1
return not name.startswith('_') if all is not None:
# only document that which the programmer exported in __all__
return name in all
else:
return not name.startswith('_')
# ----------------------------------------------------- module manipulation # ----------------------------------------------------- module manipulation
...@@ -544,6 +548,10 @@ class HTMLDoc(Doc): ...@@ -544,6 +548,10 @@ class HTMLDoc(Doc):
def docmodule(self, object, name=None, mod=None, *ignored): def docmodule(self, object, name=None, mod=None, *ignored):
"""Produce HTML documentation for a module object.""" """Produce HTML documentation for a module object."""
name = object.__name__ # ignore the passed-in name name = object.__name__ # ignore the passed-in name
try:
all = object.__all__
except AttributeError:
all = None
parts = split(name, '.') parts = split(name, '.')
links = [] links = []
for i in range(len(parts)-1): for i in range(len(parts)-1):
...@@ -585,7 +593,7 @@ class HTMLDoc(Doc): ...@@ -585,7 +593,7 @@ class HTMLDoc(Doc):
classes, cdict = [], {} classes, cdict = [], {}
for key, value in inspect.getmembers(object, inspect.isclass): for key, value in inspect.getmembers(object, inspect.isclass):
if (inspect.getmodule(value) or object) is object: if (inspect.getmodule(value) or object) is object:
if visiblename(key): if visiblename(key, all):
classes.append((key, value)) classes.append((key, value))
cdict[key] = cdict[value] = '#' + key cdict[key] = cdict[value] = '#' + key
for key, value in classes: for key, value in classes:
...@@ -599,13 +607,13 @@ class HTMLDoc(Doc): ...@@ -599,13 +607,13 @@ class HTMLDoc(Doc):
funcs, fdict = [], {} funcs, fdict = [], {}
for key, value in inspect.getmembers(object, inspect.isroutine): for key, value in inspect.getmembers(object, inspect.isroutine):
if inspect.isbuiltin(value) or inspect.getmodule(value) is object: if inspect.isbuiltin(value) or inspect.getmodule(value) is object:
if visiblename(key): if visiblename(key, all):
funcs.append((key, value)) funcs.append((key, value))
fdict[key] = '#-' + key fdict[key] = '#-' + key
if inspect.isfunction(value): fdict[value] = fdict[key] if inspect.isfunction(value): fdict[value] = fdict[key]
data = [] data = []
for key, value in inspect.getmembers(object, isdata): for key, value in inspect.getmembers(object, isdata):
if visiblename(key): if visiblename(key, all):
data.append((key, value)) data.append((key, value))
doc = self.markup(getdoc(object), self.preformat, fdict, cdict) doc = self.markup(getdoc(object), self.preformat, fdict, cdict)
...@@ -987,6 +995,11 @@ class TextDoc(Doc): ...@@ -987,6 +995,11 @@ class TextDoc(Doc):
synop, desc = splitdoc(getdoc(object)) synop, desc = splitdoc(getdoc(object))
result = self.section('NAME', name + (synop and ' - ' + synop)) result = self.section('NAME', name + (synop and ' - ' + synop))
try:
all = object.__all__
except AttributeError:
all = None
try: try:
file = inspect.getabsfile(object) file = inspect.getabsfile(object)
except TypeError: except TypeError:
...@@ -1003,16 +1016,16 @@ class TextDoc(Doc): ...@@ -1003,16 +1016,16 @@ class TextDoc(Doc):
classes = [] classes = []
for key, value in inspect.getmembers(object, inspect.isclass): for key, value in inspect.getmembers(object, inspect.isclass):
if (inspect.getmodule(value) or object) is object: if (inspect.getmodule(value) or object) is object:
if visiblename(key): if visiblename(key, all):
classes.append((key, value)) classes.append((key, value))
funcs = [] funcs = []
for key, value in inspect.getmembers(object, inspect.isroutine): for key, value in inspect.getmembers(object, inspect.isroutine):
if inspect.isbuiltin(value) or inspect.getmodule(value) is object: if inspect.isbuiltin(value) or inspect.getmodule(value) is object:
if visiblename(key): if visiblename(key, all):
funcs.append((key, value)) funcs.append((key, value))
data = [] data = []
for key, value in inspect.getmembers(object, isdata): for key, value in inspect.getmembers(object, isdata):
if visiblename(key): if visiblename(key, all):
data.append((key, value)) data.append((key, value))
if hasattr(object, '__path__'): if hasattr(object, '__path__'):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment