Skip to content

Commit 13803a7

Browse files
committed
Support docutils-0.18: Consume iterator of Element.traverse()
Since 0.18, Element.traverse() returns an iterator instead of intermediate object. As a result, the return value is always considered as truthy value. And it becomes fragile when the caller modifies the doctree on the loop.
1 parent 2be9d6b commit 13803a7

File tree

15 files changed

+27
-27
lines changed

15 files changed

+27
-27
lines changed

sphinx/builders/_epub_base.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -323,14 +323,14 @@ def footnote_spot(tree: nodes.document) -> Tuple[Element, int]:
323323
# a) place them after the last existing footnote
324324
# b) place them after an (empty) Footnotes rubric
325325
# c) create an empty Footnotes rubric at the end of the document
326-
fns = tree.traverse(nodes.footnote)
326+
fns = list(tree.traverse(nodes.footnote))
327327
if fns:
328328
fn = fns[-1]
329329
return fn.parent, fn.parent.index(fn) + 1
330330
for node in tree.traverse(nodes.rubric):
331331
if len(node) == 1 and node.astext() == FOOTNOTES_RUBRIC_NAME:
332332
return node.parent, node.parent.index(node) + 1
333-
doc = tree.traverse(nodes.document)[0]
333+
doc = list(tree.traverse(nodes.document))[0]
334334
rub = nodes.rubric()
335335
rub.append(nodes.Text(FOOTNOTES_RUBRIC_NAME))
336336
doc.append(rub)
@@ -339,10 +339,10 @@ def footnote_spot(tree: nodes.document) -> Tuple[Element, int]:
339339
if show_urls == 'no':
340340
return
341341
if show_urls == 'footnote':
342-
doc = tree.traverse(nodes.document)[0]
342+
doc = list(tree.traverse(nodes.document))[0]
343343
fn_spot, fn_idx = footnote_spot(tree)
344344
nr = 1
345-
for node in tree.traverse(nodes.reference):
345+
for node in list(tree.traverse(nodes.reference)):
346346
uri = node.get('refuri', '')
347347
if (uri.startswith('http:') or uri.startswith('https:') or
348348
uri.startswith('ftp:')) and uri not in node.astext():

sphinx/builders/latex/transforms.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class SubstitutionDefinitionsRemover(SphinxPostTransform):
4545
formats = ('latex',)
4646

4747
def run(self, **kwargs: Any) -> None:
48-
for node in self.document.traverse(nodes.substitution_definition):
48+
for node in list(self.document.traverse(nodes.substitution_definition)):
4949
node.parent.remove(node)
5050

5151

@@ -81,7 +81,7 @@ def expand_show_urls(self) -> None:
8181
if show_urls is False or show_urls == 'no':
8282
return
8383

84-
for node in self.document.traverse(nodes.reference):
84+
for node in list(self.document.traverse(nodes.reference)):
8585
uri = node.get('refuri', '')
8686
if uri.startswith(URI_SCHEMES):
8787
if uri.startswith('mailto:'):
@@ -501,7 +501,7 @@ class BibliographyTransform(SphinxPostTransform):
501501

502502
def run(self, **kwargs: Any) -> None:
503503
citations = thebibliography()
504-
for node in self.document.traverse(nodes.citation):
504+
for node in list(self.document.traverse(nodes.citation)):
505505
node.parent.remove(node)
506506
citations += node
507507

@@ -602,9 +602,9 @@ class IndexInSectionTitleTransform(SphinxPostTransform):
602602
formats = ('latex',)
603603

604604
def run(self, **kwargs: Any) -> None:
605-
for node in self.document.traverse(nodes.title):
605+
for node in list(self.document.traverse(nodes.title)):
606606
if isinstance(node.parent, nodes.section):
607-
for i, index in enumerate(node.traverse(addnodes.index)):
607+
for i, index in enumerate(list(node.traverse(addnodes.index))):
608608
# move the index node next to the section title
609609
node.remove(index)
610610
node.parent.insert(i + 1, index)

sphinx/domains/index.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def merge_domaindata(self, docnames: Iterable[str], otherdata: Dict) -> None:
4848
def process_doc(self, env: BuildEnvironment, docname: str, document: Node) -> None:
4949
"""Process a document after it is read by the environment."""
5050
entries = self.entries.setdefault(env.docname, [])
51-
for node in document.traverse(addnodes.index):
51+
for node in list(document.traverse(addnodes.index)):
5252
try:
5353
for entry in node['entries']:
5454
split_index_msg(entry[0], entry[1])

sphinx/domains/python.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ def make_xref(self, rolename: str, domain: str, target: str,
328328
text = target[1:]
329329
elif prefix == '~':
330330
text = target.split('.')[-1]
331-
for node in result.traverse(nodes.Text):
331+
for node in list(result.traverse(nodes.Text)):
332332
node.parent[node.parent.index(node)] = nodes.Text(text)
333333
break
334334
elif isinstance(result, pending_xref) and env.config.python_use_unqualified_type_names:

sphinx/environment/adapters/toctree.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,13 +193,13 @@ def _entries_from_toctree(toctreenode: addnodes.toctree, parents: List[str],
193193
for toplevel in children:
194194
# nodes with length 1 don't have any children anyway
195195
if len(toplevel) > 1:
196-
subtrees = toplevel.traverse(addnodes.toctree)
196+
subtrees = list(toplevel.traverse(addnodes.toctree))
197197
if subtrees:
198198
toplevel[1][:] = subtrees # type: ignore
199199
else:
200200
toplevel.pop(1)
201201
# resolve all sub-toctrees
202-
for subtocnode in toc.traverse(addnodes.toctree):
202+
for subtocnode in list(toc.traverse(addnodes.toctree)):
203203
if not (subtocnode.get('hidden', False) and
204204
not includehidden):
205205
i = subtocnode.parent.index(subtocnode) + 1

sphinx/ext/autosummary/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ def parse(doc: List[str], settings: Any) -> nodes.document:
583583
node = parse(doc, document.settings)
584584
if summary.endswith(WELL_KNOWN_ABBREVIATIONS):
585585
pass
586-
elif not node.traverse(nodes.system_message):
586+
elif not list(node.traverse(nodes.system_message)):
587587
# considered as that splitting by period does not break inline markups
588588
break
589589

sphinx/ext/linkcode.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def doctree_read(app: Sphinx, doctree: Node) -> None:
3939
'js': ['object', 'fullname'],
4040
}
4141

42-
for objnode in doctree.traverse(addnodes.desc):
42+
for objnode in list(doctree.traverse(addnodes.desc)):
4343
domain = objnode.get('domain')
4444
uris: Set[str] = set()
4545
for signode in objnode:

sphinx/ext/todo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def __init__(self, app: Sphinx, doctree: nodes.document, docname: str) -> None:
131131

132132
def process(self, doctree: nodes.document, docname: str) -> None:
133133
todos: List[todo_node] = sum(self.domain.todos.values(), [])
134-
for node in doctree.traverse(todolist):
134+
for node in list(doctree.traverse(todolist)):
135135
if not self.config.todo_include_todos:
136136
node.parent.remove(node)
137137
continue

sphinx/ext/viewcode.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def has_tag(modname: str, fullname: str, docname: str, refname: str) -> bool:
108108

109109
return False
110110

111-
for objnode in doctree.traverse(addnodes.desc):
111+
for objnode in list(doctree.traverse(addnodes.desc)):
112112
if objnode.get('domain') != 'py':
113113
continue
114114
names: Set[str] = set()
@@ -191,7 +191,7 @@ def convert_viewcode_anchors(self) -> None:
191191
node.replace_self(refnode)
192192

193193
def remove_viewcode_anchors(self) -> None:
194-
for node in self.document.traverse(viewcode_anchor):
194+
for node in list(self.document.traverse(viewcode_anchor)):
195195
node.parent.remove(node)
196196

197197

sphinx/transforms/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class MoveModuleTargets(SphinxTransform):
128128
default_priority = 210
129129

130130
def apply(self, **kwargs: Any) -> None:
131-
for node in self.document.traverse(nodes.target):
131+
for node in list(self.document.traverse(nodes.target)):
132132
if not node['ids']:
133133
continue
134134
if ('ismod' in node and
@@ -303,7 +303,7 @@ class FilterSystemMessages(SphinxTransform):
303303

304304
def apply(self, **kwargs: Any) -> None:
305305
filterlevel = 2 if self.config.keep_warnings else 5
306-
for node in self.document.traverse(nodes.system_message):
306+
for node in list(self.document.traverse(nodes.system_message)):
307307
if node['level'] < filterlevel:
308308
logger.debug('%s [filtered system message]', node.astext())
309309
node.parent.remove(node)

0 commit comments

Comments
 (0)