summaryrefslogtreecommitdiff
path: root/sphinx/ext/autodoc.py
diff options
context:
space:
mode:
authorguibog <guibog@douban.com>2013-10-23 16:36:45 +0800
committerguibog <guibog@douban.com>2013-10-23 16:36:45 +0800
commita8f65e9d3c8b3ffb16b0ad5004b420a60d1c6a60 (patch)
tree635e995e667706102e8fdb039ba2d968f7471f60 /sphinx/ext/autodoc.py
parentbe2f01815079fb97c426fbec80da2d314873b879 (diff)
downloadsphinx-git-a8f65e9d3c8b3ffb16b0ad5004b420a60d1c6a60.tar.gz
autodoc extension: add autodoc_mock_imports config value
Diffstat (limited to 'sphinx/ext/autodoc.py')
-rw-r--r--sphinx/ext/autodoc.py32
1 files changed, 32 insertions, 0 deletions
diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py
index 348c072c4..a556edc8f 100644
--- a/sphinx/ext/autodoc.py
+++ b/sphinx/ext/autodoc.py
@@ -70,6 +70,26 @@ class Options(dict):
return None
+class _MockModule(object):
+ def __init__(self, *args, **kwargs):
+ pass
+
+ def __call__(self, *args, **kwargs):
+ return _MockModule()
+
+ @classmethod
+ def __getattr__(cls, name):
+ if name in ('__file__', '__path__'):
+ return '/dev/null'
+ elif name[0] == name[0].upper():
+ # Not very good, we assume Uppercase names are classes...
+ mocktype = type(name, (), {})
+ mocktype.__module__ = __name__
+ return mocktype
+ else:
+ return _MockModule()
+
+
ALL = object()
INSTANCEATTR = object()
@@ -332,6 +352,8 @@ class Documenter(object):
self.modname, '.'.join(self.objpath))
try:
dbg('[autodoc] import %s', self.modname)
+ for modname in self.env.config.autodoc_mock_imports:
+ self._mock_import(modname)
__import__(self.modname)
parent = None
obj = self.module = sys.modules[self.modname]
@@ -361,6 +383,15 @@ class Documenter(object):
self.env.note_reread()
return False
+ def _mock_import(self, modname):
+ if '.' in modname:
+ pkg, _n, mods = modname.rpartition('.')
+ self._mock_import(pkg)
+ mod = _MockModule()
+ sys.modules[modname] = mod
+ return mod
+
+
def get_real_modname(self):
"""Get the real module name of an object to document.
@@ -1428,6 +1459,7 @@ def setup(app):
app.add_config_value('autodoc_member_order', 'alphabetic', True)
app.add_config_value('autodoc_default_flags', [], True)
app.add_config_value('autodoc_docstring_signature', True, True)
+ app.add_config_value('autodoc_mock_imports', [], True)
app.add_event('autodoc-process-docstring')
app.add_event('autodoc-process-signature')
app.add_event('autodoc-skip-member')