summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Ruana <rob@relentlessidiot.com>2014-04-19 03:58:11 -0400
committerRob Ruana <rob@relentlessidiot.com>2014-04-19 03:58:11 -0400
commitbbfd0d058aecf85bd3b711a846c83e2fe00fa136 (patch)
treebedcdd921908edabe9d2c639ff80f720ab7b8158
parent397e3773c1e7190deb8e45e32a69d542d62add3b (diff)
downloadsphinx-git-bbfd0d058aecf85bd3b711a846c83e2fe00fa136.tar.gz
Closes 1455: Adds better handling of namedtuples in napoleon's skipmember function
-rw-r--r--sphinx/ext/napoleon/__init__.py22
-rw-r--r--tests/test_napoleon.py8
2 files changed, 23 insertions, 7 deletions
diff --git a/sphinx/ext/napoleon/__init__.py b/sphinx/ext/napoleon/__init__.py
index bceabd235..96ca81a56 100644
--- a/sphinx/ext/napoleon/__init__.py
+++ b/sphinx/ext/napoleon/__init__.py
@@ -355,13 +355,21 @@ def _skip_member(app, what, name, obj, skip, options):
qualname = getattr(obj, '__qualname__', '')
cls_path, _, _ = qualname.rpartition('.')
if cls_path:
- import importlib
- import functools
-
- mod = importlib.import_module(obj.__module__)
- cls = functools.reduce(getattr, cls_path.split('.'), mod)
- cls_is_owner = (cls and hasattr(cls, name) and
- name in cls.__dict__)
+ try:
+ if '.' in cls_path:
+ import importlib
+ import functools
+
+ mod = importlib.import_module(obj.__module__)
+ mod_path = cls_path.split('.')
+ cls = functools.reduce(getattr, mod_path, mod)
+ 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:
cls_is_owner = False
else:
diff --git a/tests/test_napoleon.py b/tests/test_napoleon.py
index e16c02b63..78d455a0c 100644
--- a/tests/test_napoleon.py
+++ b/tests/test_napoleon.py
@@ -15,6 +15,7 @@ try:
from unittest.mock import Mock
except ImportError:
from mock import Mock
+from collections import namedtuple
from sphinx.application import Sphinx
from sphinx.ext.napoleon import (_process_docstring, _skip_member, Config,
setup)
@@ -70,6 +71,8 @@ class SampleError(Exception):
def __special_undoc__(self):
pass
+SampleNamedTuple = namedtuple('SampleNamedTuple', 'user_id block_type def_id')
+
class ProcessDocstringTest(TestCase):
def test_modify_in_place(self):
@@ -137,6 +140,11 @@ class SkipMemberTest(TestCase):
self.assertEqual(skip, _skip_member(app, what, member, obj, skip,
Mock()))
+ def test_namedtuple(self):
+ self.assertSkip('class', '_asdict',
+ SampleNamedTuple._asdict, False,
+ 'napoleon_include_private_with_doc')
+
def test_class_private_doc(self):
self.assertSkip('class', '_private_doc',
SampleClass._private_doc, False,