diff options
Diffstat (limited to 'numpydoc/tests')
-rw-r--r-- | numpydoc/tests/test_docscrape.py | 603 | ||||
-rw-r--r-- | numpydoc/tests/test_full.py | 65 | ||||
-rw-r--r-- | numpydoc/tests/test_main.py | 48 | ||||
-rw-r--r-- | numpydoc/tests/test_numpydoc.py | 128 | ||||
-rw-r--r-- | numpydoc/tests/test_validate.py | 32 | ||||
-rw-r--r-- | numpydoc/tests/test_xref.py | 12 | ||||
-rw-r--r-- | numpydoc/tests/tinybuild/conf.py | 22 | ||||
-rw-r--r-- | numpydoc/tests/tinybuild/numpydoc_test_module.py | 2 |
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: |