Skip to content

Commit d73d5b1

Browse files
author
daniel.eades
committed
style: improve type annotations with an 'extract_node' test utility
1 parent c043841 commit d73d5b1

17 files changed

+663
-337
lines changed

tests/test_builders/test_build.py

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
from sphinx.errors import SphinxError
1111

12+
from tests.utils import extract_element, extract_node
13+
1214
if TYPE_CHECKING:
1315
from collections.abc import Callable
1416
from pathlib import Path
@@ -68,51 +70,51 @@ def test_image_glob(app: SphinxTestApp) -> None:
6870
doctree = app.env.get_doctree('index')
6971
assert isinstance(doctree[0], nodes.Element)
7072

71-
assert isinstance(doctree[0][1], nodes.image)
72-
assert doctree[0][1]['candidates'] == {'*': 'rimg.png'}
73-
assert doctree[0][1]['uri'] == 'rimg.png'
73+
assert isinstance(extract_node(doctree, 0, 1), nodes.image)
74+
assert extract_element(doctree, 0, 1)['candidates'] == {'*': 'rimg.png'}
75+
assert extract_element(doctree, 0, 1)['uri'] == 'rimg.png'
7476

75-
assert isinstance(doctree[0][2], nodes.figure)
76-
assert isinstance(doctree[0][2][0], nodes.image)
77-
assert doctree[0][2][0]['candidates'] == {'*': 'rimg.png'}
78-
assert doctree[0][2][0]['uri'] == 'rimg.png'
77+
assert isinstance(extract_node(doctree, 0, 2), nodes.figure)
78+
assert isinstance(extract_node(doctree, 0, 2, 0), nodes.image)
79+
assert extract_element(doctree, 0, 2, 0)['candidates'] == {'*': 'rimg.png'}
80+
assert extract_element(doctree, 0, 2, 0)['uri'] == 'rimg.png'
7981

80-
assert isinstance(doctree[0][3], nodes.image)
81-
assert doctree[0][3]['candidates'] == {
82+
assert isinstance(extract_node(doctree, 0, 3), nodes.image)
83+
assert extract_element(doctree, 0, 3)['candidates'] == {
8284
'application/pdf': 'img.pdf',
8385
'image/gif': 'img.gif',
8486
'image/png': 'img.png',
8587
}
86-
assert doctree[0][3]['uri'] == 'img.*'
88+
assert extract_element(doctree, 0, 3)['uri'] == 'img.*'
8789

88-
assert isinstance(doctree[0][4], nodes.figure)
89-
assert isinstance(doctree[0][4][0], nodes.image)
90-
assert doctree[0][4][0]['candidates'] == {
90+
assert isinstance(extract_node(doctree, 0, 4), nodes.figure)
91+
assert isinstance(extract_node(doctree, 0, 4, 0), nodes.image)
92+
assert extract_element(doctree, 0, 4, 0)['candidates'] == {
9193
'application/pdf': 'img.pdf',
9294
'image/gif': 'img.gif',
9395
'image/png': 'img.png',
9496
}
95-
assert doctree[0][4][0]['uri'] == 'img.*'
97+
assert extract_element(doctree, 0, 4, 0)['uri'] == 'img.*'
9698

9799
# subdir/index.rst
98100
doctree = app.env.get_doctree('subdir/index')
99101
assert isinstance(doctree[0], nodes.Element)
100102

101-
assert isinstance(doctree[0][1], nodes.image)
102-
assert doctree[0][1]['candidates'] == {'*': 'subdir/rimg.png'}
103-
assert doctree[0][1]['uri'] == 'subdir/rimg.png'
103+
assert isinstance(extract_node(doctree, 0, 1), nodes.image)
104+
assert extract_element(doctree, 0, 1)['candidates'] == {'*': 'subdir/rimg.png'}
105+
assert extract_element(doctree, 0, 1)['uri'] == 'subdir/rimg.png'
104106

105-
assert isinstance(doctree[0][2], nodes.image)
106-
assert doctree[0][2]['candidates'] == {
107+
assert isinstance(extract_node(doctree, 0, 2), nodes.image)
108+
assert extract_element(doctree, 0, 2)['candidates'] == {
107109
'application/pdf': 'subdir/svgimg.pdf',
108110
'image/svg+xml': 'subdir/svgimg.svg',
109111
}
110-
assert doctree[0][2]['uri'] == 'subdir/svgimg.*'
112+
assert extract_element(doctree, 0, 2)['uri'] == 'subdir/svgimg.*'
111113

112-
assert isinstance(doctree[0][3], nodes.figure)
113-
assert isinstance(doctree[0][3][0], nodes.image)
114-
assert doctree[0][3][0]['candidates'] == {
114+
assert isinstance(extract_node(doctree, 0, 3), nodes.figure)
115+
assert isinstance(extract_node(doctree, 0, 3, 0), nodes.image)
116+
assert extract_element(doctree, 0, 3, 0)['candidates'] == {
115117
'application/pdf': 'subdir/svgimg.pdf',
116118
'image/svg+xml': 'subdir/svgimg.svg',
117119
}
118-
assert doctree[0][3][0]['uri'] == 'subdir/svgimg.*'
120+
assert extract_element(doctree, 0, 3, 0)['uri'] == 'subdir/svgimg.*'

tests/test_config/test_config.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -161,26 +161,26 @@ def test_config_pickle_circular_reference_in_list():
161161
check_is_serializable(actual.b, circular=True)
162162

163163
assert actual.a[0] == 1
164-
assert actual.a[1][0] == 2
165-
assert actual.a[1][1][0] == 1
166-
assert actual.a[1][1][1][0] == 2
164+
assert actual.extract_node(a, 1, 0) == 2
165+
assert actual.extract_node(a, 1, 1, 0) == 1
166+
assert actual.extract_node(a, 1, 1, 1, 0) == 2
167167

168168
assert actual.b[0] == 2
169-
assert actual.b[1][0] == 1
170-
assert actual.b[1][1][0] == 2
171-
assert actual.b[1][1][1][0] == 1
169+
assert actual.extract_node(b, 1, 0) == 1
170+
assert actual.extract_node(b, 1, 1, 0) == 2
171+
assert actual.extract_node(b, 1, 1, 1, 0) == 1
172172

173173
assert len(actual.a) == 2
174174
assert len(actual.a[1]) == 2
175-
assert len(actual.a[1][1]) == 2
176-
assert len(actual.a[1][1][1]) == 2
177-
assert len(actual.a[1][1][1][1]) == 2
175+
assert len(actual.extract_node(a, 1, 1)) == 2
176+
assert len(actual.extract_node(a, 1, 1, 1)) == 2
177+
assert len(actual.extract_node(a, 1, 1, 1, 1)) == 2
178178

179179
assert len(actual.b) == 2
180180
assert len(actual.b[1]) == 2
181-
assert len(actual.b[1][1]) == 2
182-
assert len(actual.b[1][1][1]) == 2
183-
assert len(actual.b[1][1][1][1]) == 2
181+
assert len(actual.extract_node(b, 1, 1)) == 2
182+
assert len(actual.extract_node(b, 1, 1, 1)) == 2
183+
assert len(actual.extract_node(b, 1, 1, 1, 1)) == 2
184184

185185
def check(
186186
u: list[list[object] | int],
@@ -213,10 +213,10 @@ def check(
213213
# check(actual.a[0], a[0]) -> ++counter[dict]
214214
# ++counter[int] (a[0] is an int)
215215
# check(actual.a[1], a[1]) -> ++counter[dict]
216-
# check(actual.a[1][0], a[1][0]) -> ++counter[dict]
217-
# ++counter[int] (a[1][0] is an int)
218-
# check(actual.a[1][1], a[1][1]) -> ++counter[dict]
219-
# recursive guard since a[1][1] == a
216+
# check(actual.extract_node(a, 1, 0), extract_node(a, 1, 0)) -> ++counter[dict]
217+
# ++counter[int] (extract_node(a, 1, 0) is an int)
218+
# check(actual.extract_node(a, 1, 1), extract_node(a, 1, 1)) -> ++counter[dict]
219+
# recursive guard since extract_node(a, 1, 1) == a
220220
assert counter[type(a[0])] == 2
221221
assert counter[type(a[1])] == 4
222222

@@ -529,7 +529,7 @@ def test_conf_warning_message(logger, name, default, annotation, actual, message
529529
config.add(name, default, False, annotation or ())
530530
check_confval_types(None, config)
531531
assert logger.warning.called
532-
assert logger.warning.call_args[0][0] == message
532+
assert logger.warning.extract_node(logger.warning.call_args, 0, 0) == message
533533

534534

535535
@mock.patch('sphinx.config.logger')
@@ -683,7 +683,7 @@ def test_conf_py_language_none_warning(logger, tmp_path):
683683

684684
# Then a warning is raised
685685
assert logger.warning.called
686-
assert logger.warning.call_args[0][0] == (
686+
assert logger.warning.extract_node(logger.warning.call_args, 0, 0) == (
687687
"Invalid configuration value found: 'language = None'. "
688688
'Update your configuration to a valid language code. '
689689
"Falling back to 'en' (English)."

tests/test_directives/test_directive_object_description.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from sphinx.testing import restructuredtext
1313
from sphinx.util.docutils import _parse_str_to_doctree
1414

15+
from tests.utils import extract_node
16+
1517
if TYPE_CHECKING:
1618
from sphinx.application import Sphinx
1719
from sphinx.environment import BuildEnvironment
@@ -58,13 +60,13 @@ def test_object_description_sections(app: SphinxTestApp) -> None:
5860

5961
assert isinstance(doctree[0], addnodes.index)
6062
assert isinstance(doctree[1], addnodes.desc)
61-
assert isinstance(doctree[1][0], addnodes.desc_signature)
62-
assert isinstance(doctree[1][1], addnodes.desc_content)
63-
assert isinstance(doctree[1][1][0], nodes.section)
64-
assert isinstance(doctree[1][1][0][0], nodes.title)
65-
assert doctree[1][1][0][0][0] == 'Overview'
66-
assert isinstance(doctree[1][1][0][1], nodes.paragraph)
67-
assert doctree[1][1][0][1][0] == 'Lorem ipsum dolar sit amet'
63+
assert isinstance(extract_node(doctree, 1, 0), addnodes.desc_signature)
64+
assert isinstance(extract_node(doctree, 1, 1), addnodes.desc_content)
65+
assert isinstance(extract_node(doctree, 1, 1, 0), nodes.section)
66+
assert isinstance(extract_node(doctree, 1, 1, 0, 0), nodes.title)
67+
assert extract_node(doctree, 1, 1, 0, 0, 0) == 'Overview'
68+
assert isinstance(extract_node(doctree, 1, 1, 0, 1), nodes.paragraph)
69+
assert extract_node(doctree, 1, 1, 0, 1, 0) == 'Lorem ipsum dolar sit amet'
6870

6971

7072
@pytest.mark.sphinx('html', testroot='_blank')

tests/test_directives/test_directive_other.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from sphinx.testing import restructuredtext
1313
from sphinx.testing.util import assert_node
1414

15+
from tests.utils import extract_node
16+
1517
if TYPE_CHECKING:
1618
from sphinx.testing.util import SphinxTestApp
1719

@@ -24,7 +26,7 @@ def test_toctree(app):
2426
doctree = restructuredtext.parse(app, text, 'index')
2527
assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
2628
assert_node(
27-
doctree[0][0],
29+
extract_node(doctree, 0, 0),
2830
entries=[(None, 'foo'), (None, 'bar/index'), (None, 'baz')],
2931
includefiles=['foo', 'bar/index', 'baz'],
3032
)
@@ -38,7 +40,7 @@ def test_relative_toctree(app):
3840
doctree = restructuredtext.parse(app, text, 'bar/index')
3941
assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
4042
assert_node(
41-
doctree[0][0],
43+
extract_node(doctree, 0, 0),
4244
entries=[
4345
(None, 'bar/bar_1'),
4446
(None, 'bar/bar_2'),
@@ -63,7 +65,7 @@ def test_toctree_urls_and_titles(app):
6365
doctree = restructuredtext.parse(app, text, 'index')
6466
assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
6567
assert_node(
66-
doctree[0][0],
68+
extract_node(doctree, 0, 0),
6769
entries=[
6870
('Sphinx', 'https://www.sphinx-doc.org/'),
6971
(None, 'https://readthedocs.org/'),
@@ -81,7 +83,7 @@ def test_toctree_glob(app):
8183
doctree = restructuredtext.parse(app, text, 'index')
8284
assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
8385
assert_node(
84-
doctree[0][0],
86+
extract_node(doctree, 0, 0),
8587
entries=[(None, 'baz'), (None, 'foo'), (None, 'quux')],
8688
includefiles=['baz', 'foo', 'quux'],
8789
)
@@ -93,7 +95,7 @@ def test_toctree_glob(app):
9395
doctree = restructuredtext.parse(app, text, 'index')
9496
assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
9597
assert_node(
96-
doctree[0][0],
98+
extract_node(doctree, 0, 0),
9799
entries=[(None, 'foo'), (None, 'baz'), (None, 'quux')],
98100
includefiles=['foo', 'baz', 'quux'],
99101
)
@@ -105,7 +107,7 @@ def test_toctree_glob(app):
105107
doctree = restructuredtext.parse(app, text, 'index')
106108
assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
107109
assert_node(
108-
doctree[0][0],
110+
extract_node(doctree, 0, 0),
109111
entries=[(None, 'baz'), (None, 'foo'), (None, 'quux'), (None, 'foo')],
110112
includefiles=['baz', 'foo', 'quux', 'foo'],
111113
)
@@ -119,7 +121,7 @@ def test_toctree_glob_and_url(app):
119121
doctree = restructuredtext.parse(app, text, 'index')
120122
assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
121123
assert_node(
122-
doctree[0][0],
124+
extract_node(doctree, 0, 0),
123125
entries=[(None, 'https://example.com/?q=sphinx')],
124126
includefiles=[],
125127
)
@@ -133,7 +135,7 @@ def test_reversed_toctree(app):
133135
doctree = restructuredtext.parse(app, text, 'index')
134136
assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
135137
assert_node(
136-
doctree[0][0],
138+
extract_node(doctree, 0, 0),
137139
entries=[(None, 'baz'), (None, 'bar/index'), (None, 'foo')],
138140
includefiles=['baz', 'bar/index', 'foo'],
139141
)
@@ -156,7 +158,7 @@ def test_toctree_twice(app):
156158
doctree = restructuredtext.parse(app, text, 'index')
157159
assert_node(doctree, [nodes.document, nodes.compound, addnodes.toctree])
158160
assert_node(
159-
doctree[0][0],
161+
extract_node(doctree, 0, 0),
160162
entries=[(None, 'foo'), (None, 'foo')],
161163
includefiles=['foo', 'foo'],
162164
)

0 commit comments

Comments
 (0)