Skip to content

Require Sphinx 7 #607

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@ jobs:
matrix:
os: [Ubuntu]
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
sphinx-version:
["sphinx==6.0", "sphinx==6.2", "sphinx==7.0", "sphinx>=7.3"]
sphinx-version: ["sphinx==7.0", "sphinx==7.3", "sphinx>=7.4"]
include:
- os: Windows
python-version: "3.12"
Expand Down
31 changes: 7 additions & 24 deletions numpydoc/numpydoc.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,19 +39,6 @@
HASH_LEN = 12


def _traverse_or_findall(node, condition, **kwargs):
"""Triage node.traverse (docutils <0.18.1) vs node.findall.

TODO: This check can be removed when the minimum supported docutils version
for numpydoc is docutils>=0.18.1
"""
return (
node.findall(condition, **kwargs)
if hasattr(node, "findall")
else node.traverse(condition, **kwargs)
)


def rename_references(app, what, name, obj, options, lines):
# decorate reference numbers so that there are no duplicates
# these are later undecorated in the doctree, in relabel_references
Expand Down Expand Up @@ -92,12 +79,8 @@ def is_docstring_section(node):
return False

sibling_sections = itertools.chain(
_traverse_or_findall(
section_node,
is_docstring_section,
include_self=True,
descend=False,
siblings=True,
section_node.findall(
is_docstring_section, include_self=True, descend=False, siblings=True
)
)
for sibling_section in sibling_sections:
Expand All @@ -116,7 +99,7 @@ def is_docstring_section(node):

def relabel_references(app, doc):
# Change 'hash-ref' to 'ref' in label text
for citation_node in _traverse_or_findall(doc, citation):
for citation_node in doc.findall(citation):
if not _is_cite_in_numpydoc_docstring(citation_node):
continue
label_node = citation_node[0]
Expand All @@ -136,22 +119,22 @@ def matching_pending_xref(node):
and node[0].astext() == f"[{ref_text}]"
)

for xref_node in _traverse_or_findall(ref.parent, matching_pending_xref):
for xref_node in ref.parent.findall(matching_pending_xref):
xref_node.replace(xref_node[0], Text(f"[{new_text}]"))
ref.replace(ref_text, new_text.copy())


def clean_backrefs(app, doc, docname):
# only::latex directive has resulted in citation backrefs without reference
known_ref_ids = set()
for ref in _traverse_or_findall(doc, reference, descend=True):
for ref in doc.findall(reference, descend=True):
for id_ in ref["ids"]:
known_ref_ids.add(id_)
# some extensions produce backrefs to inline elements
for ref in _traverse_or_findall(doc, inline, descend=True):
for ref in doc.findall(inline, descend=True):
for id_ in ref["ids"]:
known_ref_ids.add(id_)
for citation_node in _traverse_or_findall(doc, citation, descend=True):
for citation_node in doc.findall(citation, descend=True):
# remove backrefs to non-existent refs
citation_node["backrefs"] = [
id_ for id_ in citation_node["backrefs"] if id_ in known_ref_ids
Expand Down
11 changes: 2 additions & 9 deletions numpydoc/tests/test_full.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
import shutil

import pytest
from docutils import __version__ as docutils_version
from packaging import version
from sphinx.application import Sphinx
from sphinx.util.docutils import docutils_namespace

Expand Down Expand Up @@ -90,14 +88,9 @@ def test_reference(sphinx_app, html_file, expected_length):
with open(op.join(out_dir, *html_file)) as fid:
html = fid.read()

# TODO: This check can be removed when the minimum supported docutils version
# for numpydoc is docutils>=0.18
pattern = (
'role="doc-backlink"'
if version.parse(docutils_version) >= version.parse("0.18")
else 'class="fn-backref"'
reference_list = re.findall(
r'<a role="doc-backlink" href="\#id\d+">(.*)<\/a>', html
)
reference_list = re.findall(rf'<a {pattern} href="\#id\d+">(.*)<\/a>', html)

assert len(reference_list) == expected_length
for ref in reference_list:
Expand Down
10 changes: 5 additions & 5 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ classifiers = [
'Topic :: Documentation',
]
dependencies = [
'sphinx>=6',
'sphinx>=7',
'tabulate>=0.8.10',
"tomli>=1.1.0;python_version<'3.11'",
"tomli>=2.1.0;python_version<'3.11'",
]

[[project.authors]]
Expand All @@ -50,9 +50,9 @@ developer = [
"tomli; python_version < '3.11'",
]
doc = [
'numpy>=1.22',
'matplotlib>=3.5',
'pydata-sphinx-theme>=0.13.3',
'numpy>=1.26',
'matplotlib>=3.8',
'pydata-sphinx-theme>=0.16.1',
'sphinx>=7',
'intersphinx_registry',
]
Expand Down
4 changes: 2 additions & 2 deletions requirements/default.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Generated via tools/generate_requirements.py and pre-commit hook.
# Do not edit this file; modify pyproject.toml instead.
sphinx>=6
sphinx>=7
tabulate>=0.8.10
tomli>=1.1.0;python_version<'3.11'
tomli>=2.1.0;python_version<'3.11'
6 changes: 3 additions & 3 deletions requirements/doc.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Generated via tools/generate_requirements.py and pre-commit hook.
# Do not edit this file; modify pyproject.toml instead.
numpy>=1.22
matplotlib>=3.5
pydata-sphinx-theme>=0.13.3
numpy>=1.26
matplotlib>=3.8
pydata-sphinx-theme>=0.16.1
sphinx>=7
intersphinx_registry
Loading