summaryrefslogtreecommitdiff
path: root/numpydoc/tests
diff options
context:
space:
mode:
Diffstat (limited to 'numpydoc/tests')
-rw-r--r--numpydoc/tests/test_docscrape.py603
-rw-r--r--numpydoc/tests/test_full.py65
-rw-r--r--numpydoc/tests/test_main.py48
-rw-r--r--numpydoc/tests/test_numpydoc.py128
-rw-r--r--numpydoc/tests/test_validate.py32
-rw-r--r--numpydoc/tests/test_xref.py12
-rw-r--r--numpydoc/tests/tinybuild/conf.py22
-rw-r--r--numpydoc/tests/tinybuild/numpydoc_test_module.py2
8 files changed, 523 insertions, 389 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()
diff --git a/numpydoc/tests/test_full.py b/numpydoc/tests/test_full.py
index 16e60e5..e0defe2 100644
--- a/numpydoc/tests/test_full.py
+++ b/numpydoc/tests/test_full.py
@@ -9,27 +9,28 @@ from sphinx.util.docutils import docutils_namespace
# Test framework adapted from sphinx-gallery (BSD 3-clause)
-@pytest.fixture(scope='module')
+@pytest.fixture(scope="module")
def sphinx_app(tmpdir_factory):
- temp_dir = (tmpdir_factory.getbasetemp() / 'root').strpath
- src_dir = op.join(op.dirname(__file__), 'tinybuild')
+ temp_dir = (tmpdir_factory.getbasetemp() / "root").strpath
+ src_dir = op.join(op.dirname(__file__), "tinybuild")
def ignore(src, names):
- return ('_build', 'generated')
+ return ("_build", "generated")
shutil.copytree(src_dir, temp_dir, ignore=ignore)
# For testing iteration, you can get similar behavior just doing `make`
# inside the tinybuild directory
src_dir = temp_dir
conf_dir = temp_dir
- out_dir = op.join(temp_dir, '_build', 'html')
- toctrees_dir = op.join(temp_dir, '_build', 'toctrees')
- kwargs = {'warningiserror': True, 'keep_going': True}
+ out_dir = op.join(temp_dir, "_build", "html")
+ toctrees_dir = op.join(temp_dir, "_build", "toctrees")
+ kwargs = {"warningiserror": True, "keep_going": True}
# Avoid warnings about re-registration, see:
# https://github.com/sphinx-doc/sphinx/issues/5038
with docutils_namespace():
- app = Sphinx(src_dir, conf_dir, out_dir, toctrees_dir,
- buildername='html', **kwargs)
+ app = Sphinx(
+ src_dir, conf_dir, out_dir, toctrees_dir, buildername="html", **kwargs
+ )
# need to build within the context manager
# for automodule and backrefs to work
app.build(False, [])
@@ -39,46 +40,48 @@ def sphinx_app(tmpdir_factory):
def test_MyClass(sphinx_app):
"""Test that class documentation is reasonable."""
src_dir, out_dir = sphinx_app.srcdir, sphinx_app.outdir
- class_rst = op.join(src_dir, 'generated',
- 'numpydoc_test_module.MyClass.rst')
+ class_rst = op.join(src_dir, "generated", "numpydoc_test_module.MyClass.rst")
with open(class_rst) as fid:
rst = fid.read()
- assert r'numpydoc\_test\_module' in rst # properly escaped
- class_html = op.join(out_dir, 'generated',
- 'numpydoc_test_module.MyClass.html')
+ assert r"numpydoc\_test\_module" in rst # properly escaped
+ class_html = op.join(out_dir, "generated", "numpydoc_test_module.MyClass.html")
with open(class_html) as fid:
html = fid.read()
# ensure that no autodoc weirdness ($) occurs
- assert '$self' not in html
- assert '/,' not in html
- assert '__init__' in html # inherited
+ assert "$self" not in html
+ assert "/," not in html
+ assert "__init__" in html # inherited
# escaped * chars should no longer be preceded by \'s,
# if we see a \* in the output we know it's incorrect:
- assert r'\*' not in html
+ assert r"\*" not in html
# "self" should not be in the parameter list for the class:
- assert 'self,' not in html
+ assert "self," not in html
# check xref was embedded properly (dict should link using xref):
- assert 'stdtypes.html#dict' in html
+ assert "stdtypes.html#dict" in html
def test_my_function(sphinx_app):
"""Test that function documentation is reasonable."""
out_dir = sphinx_app.outdir
- function_html = op.join(out_dir, 'generated',
- 'numpydoc_test_module.my_function.html')
+ function_html = op.join(
+ out_dir, "generated", "numpydoc_test_module.my_function.html"
+ )
with open(function_html) as fid:
html = fid.read()
- assert r'\*args' not in html
- assert '*args' in html
+ assert r"\*args" not in html
+ assert "*args" in html
# check xref (iterable should link using xref):
- assert 'glossary.html#term-iterable' in html
+ assert "glossary.html#term-iterable" in html
-@pytest.mark.parametrize(("html_file", "expected_length"), (
- (["index.html"], 1),
- (["generated", "numpydoc_test_module.my_function.html"], 1),
- (["generated", "numpydoc_test_module.MyClass.html"], 1),
-))
+@pytest.mark.parametrize(
+ ("html_file", "expected_length"),
+ (
+ (["index.html"], 1),
+ (["generated", "numpydoc_test_module.my_function.html"], 1),
+ (["generated", "numpydoc_test_module.MyClass.html"], 1),
+ ),
+)
def test_reference(sphinx_app, html_file, expected_length):
"""Test for bad references"""
out_dir = sphinx_app.outdir
@@ -90,4 +93,4 @@ def test_reference(sphinx_app, html_file, expected_length):
assert len(reference_list) == expected_length
for ref in reference_list:
- assert '-' not in ref # Bad reference if it contains "-" e.g. R1896e33633d5-1
+ assert "-" not in ref # Bad reference if it contains "-" e.g. R1896e33633d5-1
diff --git a/numpydoc/tests/test_main.py b/numpydoc/tests/test_main.py
index 1ba2549..1f90b96 100644
--- a/numpydoc/tests/test_main.py
+++ b/numpydoc/tests/test_main.py
@@ -37,7 +37,7 @@ def _capture_stdout(func_name, *args, **kwargs):
sys.stdout, old_stdout = f, sys.stdout
try:
func_name(*args, **kwargs)
- return f.getvalue().strip('\n\r')
+ return f.getvalue().strip("\n\r")
finally:
sys.stdout = old_stdout
@@ -65,49 +65,53 @@ def _invalid_docstring():
def test_renders_package_docstring():
- out = _capture_stdout(numpydoc.__main__.render_object,
- 'numpydoc')
- assert out.startswith('This package provides the numpydoc Sphinx')
+ out = _capture_stdout(numpydoc.__main__.render_object, "numpydoc")
+ assert out.startswith("This package provides the numpydoc Sphinx")
def test_renders_module_docstring():
- out = _capture_stdout(numpydoc.__main__.render_object,
- 'numpydoc.__main__')
- assert out.startswith('Implementing `python -m numpydoc` functionality.')
+ out = _capture_stdout(numpydoc.__main__.render_object, "numpydoc.__main__")
+ assert out.startswith("Implementing `python -m numpydoc` functionality.")
def test_renders_function_docstring():
- out = _capture_stdout(numpydoc.__main__.render_object,
- 'numpydoc.tests.test_main._capture_stdout')
- assert out.startswith('Return stdout of calling')
+ out = _capture_stdout(
+ numpydoc.__main__.render_object, "numpydoc.tests.test_main._capture_stdout"
+ )
+ assert out.startswith("Return stdout of calling")
def test_render_object_returns_correct_exit_status():
exit_status = numpydoc.__main__.render_object(
- 'numpydoc.tests.test_main._capture_stdout')
+ "numpydoc.tests.test_main._capture_stdout"
+ )
assert exit_status == 0
with pytest.raises(ValueError):
- numpydoc.__main__.render_object(
- 'numpydoc.tests.test_main._invalid_docstring')
+ numpydoc.__main__.render_object("numpydoc.tests.test_main._invalid_docstring")
def test_validate_detects_errors():
- out = _capture_stdout(numpydoc.__main__.validate_object,
- 'numpydoc.tests.test_main._docstring_with_errors')
- assert 'SS02' in out
- assert 'Summary does not start with a capital letter' in out
+ out = _capture_stdout(
+ numpydoc.__main__.validate_object,
+ "numpydoc.tests.test_main._docstring_with_errors",
+ )
+ assert "SS02" in out
+ assert "Summary does not start with a capital letter" in out
exit_status = numpydoc.__main__.validate_object(
- 'numpydoc.tests.test_main._docstring_with_errors')
+ "numpydoc.tests.test_main._docstring_with_errors"
+ )
assert exit_status > 0
def test_validate_perfect_docstring():
- out = _capture_stdout(numpydoc.__main__.validate_object,
- 'numpydoc.tests.test_main._capture_stdout')
- assert out == ''
+ out = _capture_stdout(
+ numpydoc.__main__.validate_object, "numpydoc.tests.test_main._capture_stdout"
+ )
+ assert out == ""
exit_status = numpydoc.__main__.validate_object(
- 'numpydoc.tests.test_main._capture_stdout')
+ "numpydoc.tests.test_main._capture_stdout"
+ )
assert exit_status == 0
diff --git a/numpydoc/tests/test_numpydoc.py b/numpydoc/tests/test_numpydoc.py
index 5888d9e..0c8b6d6 100644
--- a/numpydoc/tests/test_numpydoc.py
+++ b/numpydoc/tests/test_numpydoc.py
@@ -1,15 +1,13 @@
import pytest
from io import StringIO
from copy import deepcopy
-from numpydoc.numpydoc import (
- mangle_docstrings, _clean_text_signature, update_config
-)
+from numpydoc.numpydoc import mangle_docstrings, _clean_text_signature, update_config
from numpydoc.xref import DEFAULT_LINKS
from sphinx.ext.autodoc import ALL
from sphinx.util import logging
-class MockConfig():
+class MockConfig:
numpydoc_use_plots = False
numpydoc_use_blockquotes = True
numpydoc_show_class_members = True
@@ -20,17 +18,17 @@ class MockConfig():
numpydoc_xref_aliases_complete = deepcopy(DEFAULT_LINKS)
numpydoc_xref_ignore = set()
templates_path = []
- numpydoc_citation_re = '[a-z0-9_.-]+'
+ numpydoc_citation_re = "[a-z0-9_.-]+"
numpydoc_attributes_as_param_list = True
numpydoc_validation_checks = set()
numpydoc_validation_exclude = set()
-class MockBuilder():
+class MockBuilder:
config = MockConfig()
-class MockApp():
+class MockApp:
config = MockConfig()
builder = MockBuilder()
translator = None
@@ -44,60 +42,65 @@ class MockApp():
def test_mangle_docstrings():
- s = '''
+ s = """
A top section before
.. autoclass:: str
- '''
- lines = s.split('\n')
- mangle_docstrings(MockApp(), 'class', 'str', str, {}, lines)
- assert 'rpartition' in [x.strip() for x in lines]
-
- lines = s.split('\n')
- mangle_docstrings(
- MockApp(), 'class', 'str', str, {'members': ['upper']}, lines)
- assert 'rpartition' not in [x.strip() for x in lines]
- assert 'upper' in [x.strip() for x in lines]
-
- lines = s.split('\n')
+ """
+ lines = s.split("\n")
+ mangle_docstrings(MockApp(), "class", "str", str, {}, lines)
+ assert "rpartition" in [x.strip() for x in lines]
+
+ lines = s.split("\n")
+ mangle_docstrings(MockApp(), "class", "str", str, {"members": ["upper"]}, lines)
+ assert "rpartition" not in [x.strip() for x in lines]
+ assert "upper" in [x.strip() for x in lines]
+
+ lines = s.split("\n")
+ mangle_docstrings(MockApp(), "class", "str", str, {"exclude-members": ALL}, lines)
+ assert "rpartition" not in [x.strip() for x in lines]
+ assert "upper" not in [x.strip() for x in lines]
+
+ lines = s.split("\n")
mangle_docstrings(
- MockApp(), 'class', 'str', str, {'exclude-members': ALL}, lines)
- assert 'rpartition' not in [x.strip() for x in lines]
- assert 'upper' not in [x.strip() for x in lines]
-
- lines = s.split('\n')
- mangle_docstrings(
- MockApp(), 'class', 'str', str, {'exclude-members': ['upper']}, lines)
- assert 'rpartition' in [x.strip() for x in lines]
- assert 'upper' not in [x.strip() for x in lines]
+ MockApp(), "class", "str", str, {"exclude-members": ["upper"]}, lines
+ )
+ assert "rpartition" in [x.strip() for x in lines]
+ assert "upper" not in [x.strip() for x in lines]
def test_clean_text_signature():
assert _clean_text_signature(None) is None
- assert _clean_text_signature('func($self)') == 'func()'
- assert (_clean_text_signature('func($self, *args, **kwargs)')
- == 'func(*args, **kwargs)')
- assert _clean_text_signature('($self)') == '()'
- assert _clean_text_signature('()') == '()'
- assert _clean_text_signature('func()') == 'func()'
- assert (_clean_text_signature('func($self, /, *args, **kwargs)')
- == 'func(*args, **kwargs)')
- assert (_clean_text_signature('func($self, other, /, *args, **kwargs)')
- == 'func(other, *args, **kwargs)')
- assert _clean_text_signature('($module)') == '()'
- assert _clean_text_signature('func($type)') == 'func()'
- assert (_clean_text_signature('func($self, foo="hello world")')
- == 'func(foo="hello world")')
- assert (_clean_text_signature("func($self, foo='hello world')")
- == "func(foo='hello world')")
- assert (_clean_text_signature('func(foo="hello world")')
- == 'func(foo="hello world")')
- assert (_clean_text_signature('func(foo="$self")')
- == 'func(foo="$self")')
- assert (_clean_text_signature('func($self, foo="$self")')
- == 'func(foo="$self")')
- assert _clean_text_signature('func(self, other)') == 'func(self, other)'
- assert _clean_text_signature('func($self, *args)') == 'func(*args)'
+ assert _clean_text_signature("func($self)") == "func()"
+ assert (
+ _clean_text_signature("func($self, *args, **kwargs)") == "func(*args, **kwargs)"
+ )
+ assert _clean_text_signature("($self)") == "()"
+ assert _clean_text_signature("()") == "()"
+ assert _clean_text_signature("func()") == "func()"
+ assert (
+ _clean_text_signature("func($self, /, *args, **kwargs)")
+ == "func(*args, **kwargs)"
+ )
+ assert (
+ _clean_text_signature("func($self, other, /, *args, **kwargs)")
+ == "func(other, *args, **kwargs)"
+ )
+ assert _clean_text_signature("($module)") == "()"
+ assert _clean_text_signature("func($type)") == "func()"
+ assert (
+ _clean_text_signature('func($self, foo="hello world")')
+ == 'func(foo="hello world")'
+ )
+ assert (
+ _clean_text_signature("func($self, foo='hello world')")
+ == "func(foo='hello world')"
+ )
+ assert _clean_text_signature('func(foo="hello world")') == 'func(foo="hello world")'
+ assert _clean_text_signature('func(foo="$self")') == 'func(foo="$self")'
+ assert _clean_text_signature('func($self, foo="$self")') == 'func(foo="$self")'
+ assert _clean_text_signature("func(self, other)") == "func(self, other)"
+ assert _clean_text_signature("func($self, *args)") == "func(*args)"
@pytest.fixture
@@ -109,22 +112,23 @@ def f():
Expect SA01 and EX01 errors if validation enabled.
"""
pass
+
return _function_without_seealso_and_examples
@pytest.mark.parametrize(
(
- 'numpydoc_validation_checks',
- 'expected_warn',
- 'non_warnings',
+ "numpydoc_validation_checks",
+ "expected_warn",
+ "non_warnings",
),
(
# Validation configured off - expect no warnings
(set(), [], []),
# Validation on with expected warnings
- ({'SA01', 'EX01'}, ('SA01', 'EX01'), []),
+ ({"SA01", "EX01"}, ("SA01", "EX01"), []),
# Validation on with only one activated check
- ({'SA01'}, ('SA01',), ('EX01',)),
+ ({"SA01"}, ("SA01",), ("EX01",)),
),
)
def test_mangle_docstring_validation_warnings(
@@ -142,7 +146,7 @@ def test_mangle_docstring_validation_warnings(
status, warning = StringIO(), StringIO()
logging.setup(app, status, warning)
# Run mangle docstrings with the above configuration
- mangle_docstrings(app, 'function', 'f', f, None, f.__doc__.split('\n'))
+ mangle_docstrings(app, "function", "f", f, None, f.__doc__.split("\n"))
# Assert that all (and only) expected warnings are logged
warnings = warning.getvalue()
for w in expected_warn:
@@ -155,6 +159,7 @@ def test_mangle_docstring_validation_exclude():
def function_with_bad_docstring():
"""
This docstring will raise docstring validation warnings."""
+
app = MockApp()
app.config.numpydoc_validation_checks = {"all"}
app.config.numpydoc_validation_exclude = [r"_bad_"]
@@ -166,11 +171,11 @@ def test_mangle_docstring_validation_exclude():
# Run mangle docstrings on function_with_bad_docstring
mangle_docstrings(
app,
- 'function',
+ "function",
function_with_bad_docstring.__name__,
function_with_bad_docstring,
None,
- function_with_bad_docstring.__doc__.split('\n'),
+ function_with_bad_docstring.__doc__.split("\n"),
)
# Validation is skipped due to exclude pattern matching fn name, therefore
# no warnings expected
@@ -195,4 +200,5 @@ def test_update_config_exclude_str():
if __name__ == "__main__":
import pytest
+
pytest.main()
diff --git a/numpydoc/tests/test_validate.py b/numpydoc/tests/test_validate.py
index 3f2d442..97c621e 100644
--- a/numpydoc/tests/test_validate.py
+++ b/numpydoc/tests/test_validate.py
@@ -22,6 +22,7 @@ class GoodDocStrings:
--------
>>> result = 1 + 1
"""
+
def one_liner(self):
"""Allow one liner docstrings (including quotes)."""
# This should fail, but not because of the position of the quotes
@@ -248,7 +249,7 @@ class GoodDocStrings:
"""
return 1
- def contains(self, pat, case=True, na=float('NaN')):
+ def contains(self, pat, case=True, na=float("NaN")):
"""
Return whether each value contains `pat`.
@@ -483,8 +484,7 @@ class GoodDocStrings:
class BadGenericDocStrings:
- """Everything here has a bad docstring
- """
+ """Everything here has a bad docstring"""
def func(self):
@@ -656,6 +656,7 @@ class BadGenericDocStrings:
"""
pass
+
class WarnGenericFormat:
"""
Those contains things that _may_ be incorrect formatting.
@@ -735,6 +736,7 @@ class BadParameters:
"""
Everything here has a problem with its Parameters section.
"""
+
def no_type(self, value):
"""
Lacks the type.
@@ -1083,10 +1085,15 @@ class TestValidator:
return base_path
def test_one_liner(self, capsys):
- result = validate_one(self._import_path(klass="GoodDocStrings", func='one_liner'))
+ result = validate_one(
+ self._import_path(klass="GoodDocStrings", func="one_liner")
+ )
errors = " ".join(err[1] for err in result["errors"])
- assert 'should start in the line immediately after the opening quotes' not in errors
- assert 'should be placed in the line after the last text' not in errors
+ assert (
+ "should start in the line immediately after the opening quotes"
+ not in errors
+ )
+ assert "should be placed in the line after the last text" not in errors
def test_good_class(self, capsys):
errors = validate_one(self._import_path(klass="GoodDocStrings"))["errors"]
@@ -1137,9 +1144,8 @@ class TestValidator:
with pytest.warns(UserWarning):
errors = validate_one(
self._import_path(klass="WarnGenericFormat", func=func) # noqa:F821
- )
- assert 'is too short' in w.msg
-
+ )
+ assert "is too short" in w.msg
@pytest.mark.parametrize(
"func",
@@ -1219,8 +1225,10 @@ class TestValidator:
(
"BadSummaries",
"wrong_line",
- ("should start in the line immediately after the opening quotes",
- "should be placed in the line after the last text"),
+ (
+ "should start in the line immediately after the opening quotes",
+ "should be placed in the line after the last text",
+ ),
),
("BadSummaries", "no_punctuation", ("Summary does not end with a period",)),
(
@@ -1381,7 +1389,7 @@ class TestValidator:
with warnings.catch_warnings(record=True) as w:
result = validate_one(self._import_path(klass=klass, func=func))
if len(w):
- assert all('Unknown section' in str(ww.message) for ww in w)
+ assert all("Unknown section" in str(ww.message) for ww in w)
for msg in msgs:
assert msg in " ".join(err[1] for err in result["errors"])
diff --git a/numpydoc/tests/test_xref.py b/numpydoc/tests/test_xref.py
index 175cb98..b4b3125 100644
--- a/numpydoc/tests/test_xref.py
+++ b/numpydoc/tests/test_xref.py
@@ -196,23 +196,25 @@ dict[tuple(str, str), int]
:class:`python:dict`\[:class:`python:tuple`\(:class:`python:str`, :class:`python:str`), :class:`python:int`]
""" # noqa: E501
-xref_ignore = {'or', 'in', 'of', 'default', 'optional'}
+xref_ignore = {"or", "in", "of", "default", "optional"}
@pytest.mark.parametrize(
- ('param_type', 'expected_result'),
- [tuple(s.split('\n')) for s in data.strip().split('\n\n')]
+ ("param_type", "expected_result"),
+ [tuple(s.split("\n")) for s in data.strip().split("\n\n")],
)
def test_make_xref(param_type, expected_result):
assert make_xref(param_type, xref_aliases, xref_ignore) == expected_result
+
@pytest.mark.parametrize(
- ('param_type', 'expected_result'),
- [tuple(s.split('\n')) for s in data_ignore_obj.strip().split('\n\n')]
+ ("param_type", "expected_result"),
+ [tuple(s.split("\n")) for s in data_ignore_obj.strip().split("\n\n")],
)
def test_make_xref_ignore_unknown(param_type, expected_result):
assert make_xref(param_type, xref_aliases, xref_ignore="all") == expected_result
+
def test_xref_ignore_is_all():
with pytest.raises(TypeError, match="must be a set or 'all'"):
make_xref("array_like", xref_aliases, xref_ignore="foo")
diff --git a/numpydoc/tests/tinybuild/conf.py b/numpydoc/tests/tinybuild/conf.py
index a31380a..fb3b528 100644
--- a/numpydoc/tests/tinybuild/conf.py
+++ b/numpydoc/tests/tinybuild/conf.py
@@ -1,24 +1,26 @@
import os
import sys
+
path = os.path.dirname(__file__)
if path not in sys.path:
sys.path.insert(0, path)
import numpydoc_test_module # noqa
+
extensions = [
- 'sphinx.ext.autodoc',
- 'sphinx.ext.intersphinx',
- 'numpydoc',
+ "sphinx.ext.autodoc",
+ "sphinx.ext.intersphinx",
+ "numpydoc",
]
-project = 'numpydoc_test_module'
+project = "numpydoc_test_module"
autosummary_generate = True
-autodoc_default_options = {'inherited-members': None}
-source_suffix = '.rst'
-master_doc = 'index' # NOTE: will be changed to `root_doc` in sphinx 4
-exclude_patterns = ['_build']
+autodoc_default_options = {"inherited-members": None}
+source_suffix = ".rst"
+master_doc = "index" # NOTE: will be changed to `root_doc` in sphinx 4
+exclude_patterns = ["_build"]
intersphinx_mapping = {
- 'python': ('https://docs.python.org/3', None),
+ "python": ("https://docs.python.org/3", None),
}
nitpicky = True
-highlight_language = 'python3'
+highlight_language = "python3"
numpydoc_class_members_toctree = False
numpydoc_xref_param_type = True
diff --git a/numpydoc/tests/tinybuild/numpydoc_test_module.py b/numpydoc/tests/tinybuild/numpydoc_test_module.py
index bf55979..d303e9e 100644
--- a/numpydoc/tests/tinybuild/numpydoc_test_module.py
+++ b/numpydoc/tests/tinybuild/numpydoc_test_module.py
@@ -15,7 +15,7 @@ References
.. [1] https://numpydoc.readthedocs.io
"""
-__all__ = ['MyClass', 'my_function']
+__all__ = ["MyClass", "my_function"]
class MyClass: