mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2026-09-03 20:52:55 -05:00
Closes 1455: Adds better handling of namedtuples in napoleon's skipmember function
This commit is contained in:
@@ -355,13 +355,21 @@ def _skip_member(app, what, name, obj, skip, options):
|
|||||||
qualname = getattr(obj, '__qualname__', '')
|
qualname = getattr(obj, '__qualname__', '')
|
||||||
cls_path, _, _ = qualname.rpartition('.')
|
cls_path, _, _ = qualname.rpartition('.')
|
||||||
if cls_path:
|
if cls_path:
|
||||||
import importlib
|
try:
|
||||||
import functools
|
if '.' in cls_path:
|
||||||
|
import importlib
|
||||||
|
import functools
|
||||||
|
|
||||||
mod = importlib.import_module(obj.__module__)
|
mod = importlib.import_module(obj.__module__)
|
||||||
cls = functools.reduce(getattr, cls_path.split('.'), mod)
|
mod_path = cls_path.split('.')
|
||||||
cls_is_owner = (cls and hasattr(cls, name) and
|
cls = functools.reduce(getattr, mod_path, mod)
|
||||||
name in cls.__dict__)
|
else:
|
||||||
|
cls = obj.__globals__[cls_path]
|
||||||
|
except:
|
||||||
|
cls_is_owner = False
|
||||||
|
else:
|
||||||
|
cls_is_owner = (cls and hasattr(cls, name) and
|
||||||
|
name in cls.__dict__)
|
||||||
else:
|
else:
|
||||||
cls_is_owner = False
|
cls_is_owner = False
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ try:
|
|||||||
from unittest.mock import Mock
|
from unittest.mock import Mock
|
||||||
except ImportError:
|
except ImportError:
|
||||||
from mock import Mock
|
from mock import Mock
|
||||||
|
from collections import namedtuple
|
||||||
from sphinx.application import Sphinx
|
from sphinx.application import Sphinx
|
||||||
from sphinx.ext.napoleon import (_process_docstring, _skip_member, Config,
|
from sphinx.ext.napoleon import (_process_docstring, _skip_member, Config,
|
||||||
setup)
|
setup)
|
||||||
@@ -70,6 +71,8 @@ class SampleError(Exception):
|
|||||||
def __special_undoc__(self):
|
def __special_undoc__(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
SampleNamedTuple = namedtuple('SampleNamedTuple', 'user_id block_type def_id')
|
||||||
|
|
||||||
|
|
||||||
class ProcessDocstringTest(TestCase):
|
class ProcessDocstringTest(TestCase):
|
||||||
def test_modify_in_place(self):
|
def test_modify_in_place(self):
|
||||||
@@ -137,6 +140,11 @@ class SkipMemberTest(TestCase):
|
|||||||
self.assertEqual(skip, _skip_member(app, what, member, obj, skip,
|
self.assertEqual(skip, _skip_member(app, what, member, obj, skip,
|
||||||
Mock()))
|
Mock()))
|
||||||
|
|
||||||
|
def test_namedtuple(self):
|
||||||
|
self.assertSkip('class', '_asdict',
|
||||||
|
SampleNamedTuple._asdict, False,
|
||||||
|
'napoleon_include_private_with_doc')
|
||||||
|
|
||||||
def test_class_private_doc(self):
|
def test_class_private_doc(self):
|
||||||
self.assertSkip('class', '_private_doc',
|
self.assertSkip('class', '_private_doc',
|
||||||
SampleClass._private_doc, False,
|
SampleClass._private_doc, False,
|
||||||
|
|||||||
Reference in New Issue
Block a user