summaryrefslogtreecommitdiff
path: root/numpydoc/tests/test_docscrape.py
diff options
context:
space:
mode:
Diffstat (limited to 'numpydoc/tests/test_docscrape.py')
-rw-r--r--numpydoc/tests/test_docscrape.py603
1 files changed, 356 insertions, 247 deletions
diff --git a/numpydoc/tests/test_docscrape.py b/numpydoc/tests/test_docscrape.py
index 9644008..01447a0 100644
--- a/numpydoc/tests/test_docscrape.py
+++ b/numpydoc/tests/test_docscrape.py
@@ -8,20 +8,19 @@ import jinja2
from numpydoc.numpydoc import update_config
from numpydoc.xref import DEFAULT_LINKS
-from numpydoc.docscrape import (
- NumpyDocString,
- FunctionDoc,
- ClassDoc,
- ParseError
+from numpydoc.docscrape import NumpyDocString, FunctionDoc, ClassDoc, ParseError
+from numpydoc.docscrape_sphinx import (
+ SphinxDocString,
+ SphinxClassDoc,
+ SphinxFunctionDoc,
+ get_doc_object,
)
-from numpydoc.docscrape_sphinx import (SphinxDocString, SphinxClassDoc,
- SphinxFunctionDoc, get_doc_object)
import pytest
from pytest import raises as assert_raises
from pytest import warns as assert_warns
-doc_txt = '''\
+doc_txt = """\
numpy.multivariate_normal(mean, cov, shape=None, spam=None)
Draw values from a multivariate normal distribution with specified
@@ -131,11 +130,12 @@ doc_txt = '''\
.. index:: random
:refguide: random;distributions, random;gauss
- '''
+ """
-@pytest.fixture(params=['','\n '], ids=["flush", "newline_indented"])
+
+@pytest.fixture(params=["", "\n "], ids=["flush", "newline_indented"])
def doc(request):
- return NumpyDocString(request.param+doc_txt)
+ return NumpyDocString(request.param + doc_txt)
doc_yields_txt = """
@@ -173,92 +173,92 @@ doc_sent = NumpyDocString(doc_sent_txt)
def test_signature(doc):
- assert doc['Signature'].startswith('numpy.multivariate_normal(')
- assert doc['Signature'].endswith('spam=None)')
+ assert doc["Signature"].startswith("numpy.multivariate_normal(")
+ assert doc["Signature"].endswith("spam=None)")
def test_summary(doc):
- assert doc['Summary'][0].startswith('Draw values')
- assert doc['Summary'][-1].endswith('covariance.')
+ assert doc["Summary"][0].startswith("Draw values")
+ assert doc["Summary"][-1].endswith("covariance.")
def test_extended_summary(doc):
- assert doc['Extended Summary'][0].startswith('The multivariate normal')
+ assert doc["Extended Summary"][0].startswith("The multivariate normal")
def test_parameters(doc):
- assert len(doc['Parameters']) == 4
- names = [n for n, _, _ in doc['Parameters']]
- assert all(a == b for a, b in zip(names, ['mean', 'cov', 'shape']))
+ assert len(doc["Parameters"]) == 4
+ names = [n for n, _, _ in doc["Parameters"]]
+ assert all(a == b for a, b in zip(names, ["mean", "cov", "shape"]))
- arg, arg_type, desc = doc['Parameters'][1]
- assert arg_type == '(N, N) ndarray'
- assert desc[0].startswith('Covariance matrix')
- assert doc['Parameters'][0][-1][-1] == ' (1+2+3)/3'
+ arg, arg_type, desc = doc["Parameters"][1]
+ assert arg_type == "(N, N) ndarray"
+ assert desc[0].startswith("Covariance matrix")
+ assert doc["Parameters"][0][-1][-1] == " (1+2+3)/3"
- arg, arg_type, desc = doc['Parameters'][2]
- assert arg == 'shape'
- assert arg_type == 'tuple of ints'
- assert desc[0].startswith('Given')
- assert doc['Parameters'][0][-1][-1] == ' (1+2+3)/3'
+ arg, arg_type, desc = doc["Parameters"][2]
+ assert arg == "shape"
+ assert arg_type == "tuple of ints"
+ assert desc[0].startswith("Given")
+ assert doc["Parameters"][0][-1][-1] == " (1+2+3)/3"
- arg, arg_type, desc = doc['Parameters'][3]
- assert arg == 'dtype'
- assert arg_type == 'data type object, optional (default : float)'
- assert desc[0].startswith('The type and size')
+ arg, arg_type, desc = doc["Parameters"][3]
+ assert arg == "dtype"
+ assert arg_type == "data type object, optional (default : float)"
+ assert desc[0].startswith("The type and size")
def test_other_parameters(doc):
- assert len(doc['Other Parameters']) == 1
- assert [n for n, _, _ in doc['Other Parameters']] == ['spam']
- arg, arg_type, desc = doc['Other Parameters'][0]
- assert arg_type == 'parrot'
- assert desc[0].startswith('A parrot off its mortal coil')
-
+ assert len(doc["Other Parameters"]) == 1
+ assert [n for n, _, _ in doc["Other Parameters"]] == ["spam"]
+ arg, arg_type, desc = doc["Other Parameters"][0]
+ assert arg_type == "parrot"
+ assert desc[0].startswith("A parrot off its mortal coil")
def test_returns(doc):
- assert len(doc['Returns']) == 3
- arg, arg_type, desc = doc['Returns'][0]
- assert arg == 'out'
- assert arg_type == 'ndarray'
- assert desc[0].startswith('The drawn samples')
- assert desc[-1].endswith('distribution.')
+ assert len(doc["Returns"]) == 3
+ arg, arg_type, desc = doc["Returns"][0]
+ assert arg == "out"
+ assert arg_type == "ndarray"
+ assert desc[0].startswith("The drawn samples")
+ assert desc[-1].endswith("distribution.")
- arg, arg_type, desc = doc['Returns'][1]
- assert arg == ''
- assert arg_type == 'list of str'
- assert desc[0].startswith('This is not a real')
- assert desc[-1].endswith('anonymous return values.')
+ arg, arg_type, desc = doc["Returns"][1]
+ assert arg == ""
+ assert arg_type == "list of str"
+ assert desc[0].startswith("This is not a real")
+ assert desc[-1].endswith("anonymous return values.")
- arg, arg_type, desc = doc['Returns'][2]
- assert arg == ''
- assert arg_type == 'no_description'
- assert not ''.join(desc).strip()
+ arg, arg_type, desc = doc["Returns"][2]
+ assert arg == ""
+ assert arg_type == "no_description"
+ assert not "".join(desc).strip()
def test_yields():
- section = doc_yields['Yields']
+ section = doc_yields["Yields"]
assert len(section) == 3
- truth = [('a', 'int', 'apples.'),
- ('b', 'int', 'bananas.'),
- ('', 'int', 'unknowns.')]
+ truth = [
+ ("a", "int", "apples."),
+ ("b", "int", "bananas."),
+ ("", "int", "unknowns."),
+ ]
for (arg, arg_type, desc), (arg_, arg_type_, end) in zip(section, truth):
assert arg == arg_
assert arg_type == arg_type_
- assert desc[0].startswith('The number of')
+ assert desc[0].startswith("The number of")
assert desc[0].endswith(end)
def test_sent():
- section = doc_sent['Receives']
+ section = doc_sent["Receives"]
assert len(section) == 2
- truth = [('b', 'int', 'bananas.'),
- ('c', 'int', 'oranges.')]
+ truth = [("b", "int", "bananas."), ("c", "int", "oranges.")]
for (arg, arg_type, desc), (arg_, arg_type_, end) in zip(section, truth):
assert arg == arg_
assert arg_type == arg_type_
- assert desc[0].startswith('The number of')
+ assert desc[0].startswith("The number of")
assert desc[0].endswith(end)
@@ -311,6 +311,7 @@ That should break...
Second note.
"""
+
def spam(self, a, b):
"""Spam\n\nSpam spam."""
pass
@@ -340,40 +341,40 @@ That should break...
def test_notes(doc):
- assert doc['Notes'][0].startswith('Instead')
- assert doc['Notes'][-1].endswith('definite.')
- assert len(doc['Notes']) == 17
+ assert doc["Notes"][0].startswith("Instead")
+ assert doc["Notes"][-1].endswith("definite.")
+ assert len(doc["Notes"]) == 17
def test_references(doc):
- assert doc['References'][0].startswith('..')
- assert doc['References'][-1].endswith('2001.')
+ assert doc["References"][0].startswith("..")
+ assert doc["References"][-1].endswith("2001.")
def test_examples(doc):
- assert doc['Examples'][0].startswith('>>>')
- assert doc['Examples'][-1].endswith('True]')
+ assert doc["Examples"][0].startswith(">>>")
+ assert doc["Examples"][-1].endswith("True]")
def test_index(doc):
- assert doc['index']['default'] == 'random'
- assert len(doc['index']) == 2
- assert len(doc['index']['refguide']) == 2
+ assert doc["index"]["default"] == "random"
+ assert len(doc["index"]) == 2
+ assert len(doc["index"]["refguide"]) == 2
def _strip_blank_lines(s):
"Remove leading, trailing and multiple blank lines"
- s = re.sub(r'^\s*\n', '', s)
- s = re.sub(r'\n\s*$', '', s)
- s = re.sub(r'\n\s*\n', r'\n\n', s)
+ s = re.sub(r"^\s*\n", "", s)
+ s = re.sub(r"\n\s*$", "", s)
+ s = re.sub(r"\n\s*\n", r"\n\n", s)
return s
def line_by_line_compare(a, b, n_lines=None):
a = textwrap.dedent(a)
b = textwrap.dedent(b)
- a = [l.rstrip() for l in _strip_blank_lines(a).split('\n')][:n_lines]
- b = [l.rstrip() for l in _strip_blank_lines(b).split('\n')][:n_lines]
+ a = [l.rstrip() for l in _strip_blank_lines(a).split("\n")][:n_lines]
+ b = [l.rstrip() for l in _strip_blank_lines(b).split("\n")][:n_lines]
assert len(a) == len(b)
for ii, (aa, bb) in enumerate(zip(a, b)):
assert aa == bb
@@ -383,8 +384,9 @@ def test_str(doc):
# doc_txt has the order of Notes and See Also sections flipped.
# This should be handled automatically, and so, one thing this test does
# is to make sure that See Also precedes Notes in the output.
- line_by_line_compare(str(doc),
-"""numpy.multivariate_normal(mean, cov, shape=None, spam=None)
+ line_by_line_compare(
+ str(doc),
+ """numpy.multivariate_normal(mean, cov, shape=None, spam=None)
Draw values from a multivariate normal distribution with specified
mean and covariance.
@@ -494,12 +496,14 @@ standard deviation:
[True, True]
.. index:: random
- :refguide: random;distributions, random;gauss""")
+ :refguide: random;distributions, random;gauss""",
+ )
def test_yield_str():
- line_by_line_compare(str(doc_yields),
-"""Test generator
+ line_by_line_compare(
+ str(doc_yields),
+ """Test generator
Yields
------
@@ -509,12 +513,14 @@ b : int
The number of bananas.
int
The number of unknowns.
-""")
+""",
+ )
def test_receives_str():
- line_by_line_compare(str(doc_sent),
-"""Test generator
+ line_by_line_compare(
+ str(doc_sent),
+ """Test generator
Yields
------
@@ -527,29 +533,44 @@ b : int
The number of bananas.
c : int
The number of oranges.
-""")
+""",
+ )
def test_no_index_in_str():
- assert "index" not in str(NumpyDocString("""Test idx
+ assert "index" not in str(
+ NumpyDocString(
+ """Test idx
- """))
+ """
+ )
+ )
- assert "index" in str(NumpyDocString("""Test idx
+ assert "index" in str(
+ NumpyDocString(
+ """Test idx
.. index :: random
- """))
+ """
+ )
+ )
- assert "index" in str(NumpyDocString("""Test idx
+ assert "index" in str(
+ NumpyDocString(
+ """Test idx
.. index ::
foo
- """))
+ """
+ )
+ )
+
def test_sphinx_str():
sphinx_doc = SphinxDocString(doc_txt)
- line_by_line_compare(str(sphinx_doc),
-"""
+ line_by_line_compare(
+ str(sphinx_doc),
+ """
.. index:: random
single: random;distributions, random;gauss
@@ -668,13 +689,15 @@ standard deviation:
>>> print(list((x[0, 0, :] - mean) < 0.6))
[True, True]
-""")
+""",
+ )
def test_sphinx_yields_str():
sphinx_doc = SphinxDocString(doc_yields_txt)
- line_by_line_compare(str(sphinx_doc),
-"""Test generator
+ line_by_line_compare(
+ str(sphinx_doc),
+ """Test generator
:Yields:
@@ -686,10 +709,12 @@ def test_sphinx_yields_str():
int
The number of unknowns.
-""")
+""",
+ )
-doc2 = NumpyDocString("""
+doc2 = NumpyDocString(
+ """
Returns array of indices of the maximum values of along the given axis.
Parameters
@@ -698,39 +723,43 @@ doc2 = NumpyDocString("""
Array to look in.
axis : {None, integer}
If None, the index is into the flattened array, otherwise along
- the specified axis""")
+ the specified axis"""
+)
def test_parameters_without_extended_description():
- assert len(doc2['Parameters']) == 2
+ assert len(doc2["Parameters"]) == 2
-doc3 = NumpyDocString("""
+doc3 = NumpyDocString(
+ """
my_signature(*params, **kwds)
Return this and that.
- """)
+ """
+)
def test_escape_stars():
- signature = str(doc3).split('\n')[0]
- assert signature == r'my_signature(\*params, \*\*kwds)'
+ signature = str(doc3).split("\n")[0]
+ assert signature == r"my_signature(\*params, \*\*kwds)"
def my_func(a, b, **kwargs):
pass
fdoc = FunctionDoc(func=my_func)
- assert fdoc['Signature'] == ''
+ assert fdoc["Signature"] == ""
doc4 = NumpyDocString(
"""a.conj()
- Return an array with all complex-valued elements conjugated.""")
+ Return an array with all complex-valued elements conjugated."""
+)
def test_empty_extended_summary():
- assert doc4['Extended Summary'] == []
+ assert doc4["Extended Summary"] == []
doc5 = NumpyDocString(
@@ -746,34 +775,37 @@ doc5 = NumpyDocString(
-----
SomeWarning
If needed
- """)
+ """
+)
def test_raises():
- assert len(doc5['Raises']) == 1
- param = doc5['Raises'][0]
- assert param.name == ''
- assert param.type == 'LinAlgException'
- assert param.desc == ['If array is singular.']
+ assert len(doc5["Raises"]) == 1
+ param = doc5["Raises"][0]
+ assert param.name == ""
+ assert param.type == "LinAlgException"
+ assert param.desc == ["If array is singular."]
def test_warns():
- assert len(doc5['Warns']) == 1
- param = doc5['Warns'][0]
- assert param.name == ''
- assert param.type == 'SomeWarning'
- assert param.desc == ['If needed']
+ assert len(doc5["Warns"]) == 1
+ param = doc5["Warns"][0]
+ assert param.name == ""
+ assert param.type == "SomeWarning"
+ assert param.desc == ["If needed"]
+
# see numpydoc/numpydoc #281
# we want to correctly parse "See Also" both in docstrings both like
-#"""foo
+# """foo
# and
-#"""
-#foo
-@pytest.mark.parametrize('prefix', ['', '\n '])
+# """
+# foo
+@pytest.mark.parametrize("prefix", ["", "\n "])
def test_see_also(prefix):
doc6 = NumpyDocString(
- prefix + """z(x,theta)
+ prefix
+ + """z(x,theta)
See Also
--------
@@ -789,51 +821,65 @@ def test_see_also(prefix):
:obj:`~baz.obj_r`
:class:`class_j`: fubar
foobar
- """)
+ """
+ )
- assert len(doc6['See Also']) == 10
- for funcs, desc in doc6['See Also']:
+ assert len(doc6["See Also"]) == 10
+ for funcs, desc in doc6["See Also"]:
for func, role in funcs:
- if func in ('func_a', 'func_b', 'func_c', 'func_f',
- 'func_g', 'func_h', 'func_j', 'func_k', 'baz.obj_q',
- 'func_f1', 'func_g1', 'func_h1', 'func_j1',
- '~baz.obj_r'):
+ if func in (
+ "func_a",
+ "func_b",
+ "func_c",
+ "func_f",
+ "func_g",
+ "func_h",
+ "func_j",
+ "func_k",
+ "baz.obj_q",
+ "func_f1",
+ "func_g1",
+ "func_h1",
+ "func_j1",
+ "~baz.obj_r",
+ ):
assert not desc, str([func, desc])
- elif func in ('func_f2', 'func_g2', 'func_h2', 'func_j2'):
+ elif func in ("func_f2", "func_g2", "func_h2", "func_j2"):
assert desc, str([func, desc])
else:
assert desc, str([func, desc])
- if func == 'func_h':
- assert role == 'meth'
- elif func == 'baz.obj_q' or func == '~baz.obj_r':
- assert role == 'obj'
- elif func == 'class_j':
- assert role == 'class'
- elif func in ['func_h1', 'func_h2']:
- assert role == 'meth'
+ if func == "func_h":
+ assert role == "meth"
+ elif func == "baz.obj_q" or func == "~baz.obj_r":
+ assert role == "obj"
+ elif func == "class_j":
+ assert role == "class"
+ elif func in ["func_h1", "func_h2"]:
+ assert role == "meth"
else:
assert role is None, str([func, role])
- if func == 'func_d':
- assert desc == ['some equivalent func']
- elif func == 'foo.func_e':
- assert desc == ['some other func over', 'multiple lines']
- elif func == 'class_j':
- assert desc == ['fubar', 'foobar']
- elif func in ['func_f2', 'func_g2', 'func_h2', 'func_j2']:
- assert desc == ['description of multiple'], str([desc, ['description of multiple']])
+ if func == "func_d":
+ assert desc == ["some equivalent func"]
+ elif func == "foo.func_e":
+ assert desc == ["some other func over", "multiple lines"]
+ elif func == "class_j":
+ assert desc == ["fubar", "foobar"]
+ elif func in ["func_f2", "func_g2", "func_h2", "func_j2"]:
+ assert desc == ["description of multiple"], str(
+ [desc, ["description of multiple"]]
+ )
def test_see_also_parse_error():
- text = (
- """
+ text = """
z(x,theta)
See Also
--------
:func:`~foo`
- """)
+ """
with pytest.raises(ValueError, match="See Also entry ':func:`~foo`'"):
NumpyDocString(text)
@@ -848,17 +894,21 @@ def test_see_also_print():
goes here
func_d
"""
+
pass
- s = str(FunctionDoc(Dummy, role='func'))
- assert(':func:`func_a`, :func:`func_b`' in s)
- assert(' some relationship' in s)
- assert(':func:`func_d`' in s)
+ s = str(FunctionDoc(Dummy, role="func"))
+ assert ":func:`func_a`, :func:`func_b`" in s
+ assert " some relationship" in s
+ assert ":func:`func_d`" in s
def test_see_also_trailing_comma_warning():
- warnings.filterwarnings('error')
- with assert_warns(Warning, match='Unexpected comma or period after function list at index 43 of line .*'):
+ warnings.filterwarnings("error")
+ with assert_warns(
+ Warning,
+ match="Unexpected comma or period after function list at index 43 of line .*",
+ ):
NumpyDocString(
"""
z(x,theta)
@@ -868,7 +918,8 @@ def test_see_also_trailing_comma_warning():
func_f2, func_g2, :meth:`func_h2`, func_j2, : description of multiple
:class:`class_j`: fubar
foobar
- """)
+ """
+ )
def test_unknown_section():
@@ -887,6 +938,7 @@ This should be ignored and warned about
----
This class has a nope section.
"""
+
pass
with pytest.warns(UserWarning, match="Unknown section Mope") as record:
@@ -901,17 +953,21 @@ This should be ignored and warned about
assert len(record) == 1
-doc7 = NumpyDocString("""
+doc7 = NumpyDocString(
+ """
Doc starts on second line.
- """)
+ """
+)
def test_empty_first_line():
- assert doc7['Summary'][0].startswith('Doc starts')
+ assert doc7["Summary"][0].startswith("Doc starts")
-doc8 = NumpyDocString("""
+
+doc8 = NumpyDocString(
+ """
Parameters with colon and no types:
@@ -920,21 +976,27 @@ doc8 = NumpyDocString("""
data :
some stuff, technically invalid
- """)
+ """
+)
def test_trailing_colon():
- assert doc8['Parameters'][0].name == 'data'
+ assert doc8["Parameters"][0].name == "data"
def test_no_summary():
- str(SphinxDocString("""
+ str(
+ SphinxDocString(
+ """
Parameters
- ----------"""))
+ ----------"""
+ )
+ )
def test_unicode():
- doc = SphinxDocString("""
+ doc = SphinxDocString(
+ """
öäöäöäöäöåååå
öäöäöäööäååå
@@ -949,33 +1011,41 @@ def test_unicode():
ååå : ööö
äää
- """)
- assert isinstance(doc['Summary'][0], str)
- assert doc['Summary'][0] == 'öäöäöäöäöåååå'
+ """
+ )
+ assert isinstance(doc["Summary"][0], str)
+ assert doc["Summary"][0] == "öäöäöäöäöåååå"
def test_plot_examples():
cfg = dict(use_plots=True)
- doc = SphinxDocString("""
+ doc = SphinxDocString(
+ """
Examples
--------
>>> import matplotlib.pyplot as plt
>>> plt.plot([1,2,3],[4,5,6])
>>> plt.show()
- """, config=cfg)
- assert 'plot::' in str(doc), str(doc)
+ """,
+ config=cfg,
+ )
+ assert "plot::" in str(doc), str(doc)
- doc = SphinxDocString("""
+ doc = SphinxDocString(
+ """
Examples
--------
>>> from matplotlib import pyplot as plt
>>> plt.plot([1,2,3],[4,5,6])
>>> plt.show()
- """, config=cfg)
- assert 'plot::' in str(doc), str(doc)
+ """,
+ config=cfg,
+ )
+ assert "plot::" in str(doc), str(doc)
- doc = SphinxDocString("""
+ doc = SphinxDocString(
+ """
Examples
--------
.. plot::
@@ -983,13 +1053,16 @@ def test_plot_examples():
import matplotlib.pyplot as plt
plt.plot([1,2,3],[4,5,6])
plt.show()
- """, config=cfg)
- assert str(doc).count('plot::') == 1, str(doc)
+ """,
+ config=cfg,
+ )
+ assert str(doc).count("plot::") == 1, str(doc)
def test_use_blockquotes():
cfg = dict(use_blockquotes=True)
- doc = SphinxDocString("""
+ doc = SphinxDocString(
+ """
Parameters
----------
abc : def
@@ -1003,8 +1076,12 @@ def test_use_blockquotes():
GHI
JKL
MNO
- """, config=cfg)
- line_by_line_compare(str(doc), '''
+ """,
+ config=cfg,
+ )
+ line_by_line_compare(
+ str(doc),
+ """
:Parameters:
**abc** : def
@@ -1024,22 +1101,25 @@ def test_use_blockquotes():
JKL
MNO
- ''')
+ """,
+ )
def test_class_members():
-
class Dummy:
"""
Dummy class.
"""
+
def spam(self, a, b):
"""Spam\n\nSpam spam."""
pass
+
def ham(self, c, d):
"""Cheese\n\nNo cheese."""
pass
+
@property
def spammity(self):
"""Spammity index"""
@@ -1047,32 +1127,34 @@ def test_class_members():
class Ignorable:
"""local class, to be ignored"""
+
pass
for cls in (ClassDoc, SphinxClassDoc):
doc = cls(Dummy, config=dict(show_class_members=False))
- assert 'Methods' not in str(doc), (cls, str(doc))
- assert 'spam' not in str(doc), (cls, str(doc))
- assert 'ham' not in str(doc), (cls, str(doc))
- assert 'spammity' not in str(doc), (cls, str(doc))
- assert 'Spammity index' not in str(doc), (cls, str(doc))
+ assert "Methods" not in str(doc), (cls, str(doc))
+ assert "spam" not in str(doc), (cls, str(doc))
+ assert "ham" not in str(doc), (cls, str(doc))
+ assert "spammity" not in str(doc), (cls, str(doc))
+ assert "Spammity index" not in str(doc), (cls, str(doc))
doc = cls(Dummy, config=dict(show_class_members=True))
- assert 'Methods' in str(doc), (cls, str(doc))
- assert 'spam' in str(doc), (cls, str(doc))
- assert 'ham' in str(doc), (cls, str(doc))
- assert 'spammity' in str(doc), (cls, str(doc))
+ assert "Methods" in str(doc), (cls, str(doc))
+ assert "spam" in str(doc), (cls, str(doc))
+ assert "ham" in str(doc), (cls, str(doc))
+ assert "spammity" in str(doc), (cls, str(doc))
if cls is SphinxClassDoc:
- assert '.. autosummary::' in str(doc), str(doc)
+ assert ".. autosummary::" in str(doc), str(doc)
else:
- assert 'Spammity index' in str(doc), str(doc)
+ assert "Spammity index" in str(doc), str(doc)
class SubDummy(Dummy):
"""
Subclass of Dummy class.
"""
+
def ham(self, c, d):
"""Cheese\n\nNo cheese.\nOverloaded Dummy.ham"""
pass
@@ -1082,31 +1164,35 @@ def test_class_members():
pass
for cls in (ClassDoc, SphinxClassDoc):
- doc = cls(SubDummy, config=dict(show_class_members=True,
- show_inherited_class_members=False))
- assert 'Methods' in str(doc), (cls, str(doc))
- assert 'spam' not in str(doc), (cls, str(doc))
- assert 'ham' in str(doc), (cls, str(doc))
- assert 'bar' in str(doc), (cls, str(doc))
- assert 'spammity' not in str(doc), (cls, str(doc))
+ doc = cls(
+ SubDummy,
+ config=dict(show_class_members=True, show_inherited_class_members=False),
+ )
+ assert "Methods" in str(doc), (cls, str(doc))
+ assert "spam" not in str(doc), (cls, str(doc))
+ assert "ham" in str(doc), (cls, str(doc))
+ assert "bar" in str(doc), (cls, str(doc))
+ assert "spammity" not in str(doc), (cls, str(doc))
if cls is SphinxClassDoc:
- assert '.. autosummary::' in str(doc), str(doc)
+ assert ".. autosummary::" in str(doc), str(doc)
else:
- assert 'Spammity index' not in str(doc), str(doc)
+ assert "Spammity index" not in str(doc), str(doc)
- doc = cls(SubDummy, config=dict(show_class_members=True,
- show_inherited_class_members=True))
- assert 'Methods' in str(doc), (cls, str(doc))
- assert 'spam' in str(doc), (cls, str(doc))
- assert 'ham' in str(doc), (cls, str(doc))
- assert 'bar' in str(doc), (cls, str(doc))
- assert 'spammity' in str(doc), (cls, str(doc))
+ doc = cls(
+ SubDummy,
+ config=dict(show_class_members=True, show_inherited_class_members=True),
+ )
+ assert "Methods" in str(doc), (cls, str(doc))
+ assert "spam" in str(doc), (cls, str(doc))
+ assert "ham" in str(doc), (cls, str(doc))
+ assert "bar" in str(doc), (cls, str(doc))
+ assert "spammity" in str(doc), (cls, str(doc))
if cls is SphinxClassDoc:
- assert '.. autosummary::' in str(doc), str(doc)
+ assert ".. autosummary::" in str(doc), str(doc)
else:
- assert 'Spammity index' in str(doc), str(doc)
+ assert "Spammity index" in str(doc), str(doc)
def test_duplicate_signature():
@@ -1115,13 +1201,14 @@ def test_duplicate_signature():
# docstring itself.
doc = NumpyDocString(
- """
+ """
z(x1, x2)
z(a, theta)
- """)
+ """
+ )
- assert doc['Signature'].strip() == 'z(a, theta)'
+ assert doc["Signature"].strip() == "z(a, theta)"
class_doc_txt = """
@@ -1167,8 +1254,9 @@ class_doc_txt = """
def test_class_members_doc():
doc = ClassDoc(None, class_doc_txt)
- line_by_line_compare(str(doc),
- """
+ line_by_line_compare(
+ str(doc),
+ """
Foo
Parameters
@@ -1206,7 +1294,8 @@ def test_class_members_doc():
b
c
- """)
+ """,
+ )
def test_class_members_doc_sphinx():
@@ -1245,8 +1334,9 @@ def test_class_members_doc_sphinx():
return None
doc = SphinxClassDoc(Foo, class_doc_txt)
- line_by_line_compare(str(doc),
- """
+ line_by_line_compare(
+ str(doc),
+ """
Foo
:Parameters:
@@ -1298,11 +1388,11 @@ def test_class_members_doc_sphinx():
**c**
===== ==========
- """)
+ """,
+ )
def test_class_attributes_as_member_list():
-
class Foo:
"""
Class docstring.
@@ -1313,6 +1403,7 @@ def test_class_attributes_as_member_list():
Another description that is not used.
"""
+
@property
def an_attribute(self):
"""Test attribute"""
@@ -1339,10 +1430,14 @@ def test_class_attributes_as_member_list():
def test_templated_sections():
- doc = SphinxClassDoc(None, class_doc_txt,
- config={'template': jinja2.Template('{{examples}}\n{{parameters}}')})
- line_by_line_compare(str(doc),
- """
+ doc = SphinxClassDoc(
+ None,
+ class_doc_txt,
+ config={"template": jinja2.Template("{{examples}}\n{{parameters}}")},
+ )
+ line_by_line_compare(
+ str(doc),
+ """
.. rubric:: Examples
For usage examples, see `ode`.
@@ -1355,14 +1450,14 @@ def test_templated_sections():
**jac** : callable ``jac(t, y, *jac_args)``
Bbb.
- """)
+ """,
+ )
def test_nonstandard_property():
# test discovery of a property that does not satisfy isinstace(.., property)
class SpecialProperty:
-
def __init__(self, axis=0, doc=""):
self.axis = axis
self.__doc__ = doc
@@ -1387,7 +1482,8 @@ def test_nonstandard_property():
def test_args_and_kwargs():
cfg = dict()
- doc = SphinxDocString("""
+ doc = SphinxDocString(
+ """
Parameters
----------
param1 : int
@@ -1396,8 +1492,12 @@ def test_args_and_kwargs():
Arguments
**kwargs : dict
Keyword arguments
- """, config=cfg)
- line_by_line_compare(str(doc), r"""
+ """,
+ config=cfg,
+ )
+ line_by_line_compare(
+ str(doc),
+ r"""
:Parameters:
**param1** : int
@@ -1408,17 +1508,24 @@ def test_args_and_kwargs():
**\*\*kwargs** : dict
Keyword arguments
- """)
+ """,
+ )
+
def test_autoclass():
- cfg=dict(show_class_members=True,
- show_inherited_class_members=True)
- doc = SphinxClassDoc(str, '''
+ cfg = dict(show_class_members=True, show_inherited_class_members=True)
+ doc = SphinxClassDoc(
+ str,
+ """
A top section before
.. autoclass:: str
- ''', config=cfg)
- line_by_line_compare(str(doc), r'''
+ """,
+ config=cfg,
+ )
+ line_by_line_compare(
+ str(doc),
+ r"""
A top section before
.. autoclass:: str
@@ -1426,7 +1533,9 @@ A top section before
.. rubric:: Methods
- ''', 5)
+ """,
+ 5,
+ )
xref_doc_txt = """
@@ -1489,10 +1598,10 @@ Test xref in Parameters, Other Parameters and Returns
def test_xref():
xref_aliases = {
- 'sequence': ':obj:`python:sequence`',
+ "sequence": ":obj:`python:sequence`",
}
- class Config():
+ class Config:
def __init__(self, a, b):
self.numpydoc_xref_aliases = a
self.numpydoc_xref_aliases_complete = b
@@ -1504,18 +1613,18 @@ def test_xref():
for key in xref_aliases:
xref_aliases_complete[key] = xref_aliases[key]
config = Config(xref_aliases, xref_aliases_complete)
- app = namedtuple('config', 'config')(config)
+ app = namedtuple("config", "config")(config)
update_config(app)
- xref_ignore = {'of', 'default', 'optional'}
+ xref_ignore = {"of", "default", "optional"}
doc = SphinxDocString(
xref_doc_txt,
config=dict(
xref_param_type=True,
xref_aliases=xref_aliases_complete,
- xref_ignore=xref_ignore
- )
+ xref_ignore=xref_ignore,
+ ),
)
line_by_line_compare(str(doc), xref_doc_txt_expected)
@@ -1531,11 +1640,10 @@ def test__error_location_no_name_attr():
from collections.abc import Callable
# Create a Callable that doesn't have a __name__ attribute
- class Foo():
+ class Foo:
def __call__(self):
pass
-
foo = Foo() # foo is a Callable, but no a function instance
assert isinstance(foo, Callable)
@@ -1549,4 +1657,5 @@ def test__error_location_no_name_attr():
if __name__ == "__main__":
import pytest
+
pytest.main()