From: Takeshi KOMIYA <i.tkomiya@gmail.com>
Date: Sun, 19 Apr 2020 00:25:05 +0900
Subject: autodoc: Skip mocked modules and objects

Call ``inspect.unwrap()`` for Mocked objects and modules causes
deep recursion calls. As a result, it causes slow builds.  This
skips to try documenting mocked objects on filtering members.

(cherry picked from commit 841f1c7e766d623d5c071605650bedc834480fd2)
---
 sphinx/ext/autodoc/__init__.py | 5 ++++-
 sphinx/ext/autodoc/mock.py     | 2 ++
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/sphinx/ext/autodoc/__init__.py b/sphinx/ext/autodoc/__init__.py
index 08e4e53..e329b66 100644
--- a/sphinx/ext/autodoc/__init__.py
+++ b/sphinx/ext/autodoc/__init__.py
@@ -546,7 +546,10 @@ class Documenter:
             has_doc = bool(doc)
 
             keep = False
-            if want_all and membername.startswith('__') and \
+            if safe_getattr(member, '__sphinx_mock__', False):
+                # mocked module or object
+                pass
+            elif want_all and membername.startswith('__') and \
                     membername.endswith('__') and len(membername) > 4:
                 # special __methods__
                 if self.options.special_members is ALL and \
diff --git a/sphinx/ext/autodoc/mock.py b/sphinx/ext/autodoc/mock.py
index 0ee0fdd..26c40e8 100644
--- a/sphinx/ext/autodoc/mock.py
+++ b/sphinx/ext/autodoc/mock.py
@@ -27,6 +27,7 @@ class _MockObject:
     """Used by autodoc_mock_imports."""
 
     __display_name__ = '_MockObject'
+    __sphinx_mock__ = True
 
     def __new__(cls, *args: Any, **kwargs: Any) -> Any:
         if len(args) == 3 and isinstance(args[1], tuple):
@@ -80,6 +81,7 @@ def _make_subclass(name: str, module: str, superclass: Any = _MockObject,
 class _MockModule(ModuleType):
     """Used by autodoc_mock_imports."""
     __file__ = os.devnull
+    __sphinx_mock__ = True
 
     def __init__(self, name: str, loader: "_MockImporter" = None) -> None:
         super().__init__(name)
