diff --git a/CHANGES b/CHANGES index 34a4c09d9..42b47a7db 100644 --- a/CHANGES +++ b/CHANGES @@ -34,6 +34,9 @@ Dependencies Incompatible changes -------------------- +* #9435: linkcheck: Disable checking automatically generated anchors on + github.com (ex. anchors in reST/Markdown documents) + Deprecated ---------- @@ -43,6 +46,12 @@ Features added Bugs fixed ---------- +* #9489: autodoc: Custom types using ``typing.NewType`` are not displayed well + with the HEAD of 3.10 +* #9490: autodoc: Some objects under ``typing`` module are not displayed well + with the HEAD of 3.10 +* #9435: linkcheck: Failed to check anchors in github.com + Testing -------- diff --git a/sphinx/builders/linkcheck.py b/sphinx/builders/linkcheck.py index 6819bd3df..58e5da94b 100644 --- a/sphinx/builders/linkcheck.py +++ b/sphinx/builders/linkcheck.py @@ -714,7 +714,10 @@ def setup(app: Sphinx) -> Dict[str, Any]: app.add_event('linkcheck-process-uri') app.connect('config-inited', compile_linkcheck_allowed_redirects, priority=800) - app.connect('linkcheck-process-uri', rewrite_github_anchor) + + # FIXME: Disable URL rewrite handler for github.com temporarily. + # ref: https://github.com/sphinx-doc/sphinx/issues/9435 + # app.connect('linkcheck-process-uri', rewrite_github_anchor) return { 'version': 'builtin', diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py index ac5182428..2bb900bd7 100644 --- a/sphinx/util/inspect.py +++ b/sphinx/util/inspect.py @@ -211,12 +211,15 @@ def getslots(obj: Any) -> Optional[Dict]: def isNewType(obj: Any) -> bool: """Check the if object is a kind of NewType.""" - __module__ = safe_getattr(obj, '__module__', None) - __qualname__ = safe_getattr(obj, '__qualname__', None) - if __module__ == 'typing' and __qualname__ == 'NewType..new_type': - return True + if sys.version_info >= (3, 10): + return isinstance(obj, typing.NewType) else: - return False + __module__ = safe_getattr(obj, '__module__', None) + __qualname__ = safe_getattr(obj, '__qualname__', None) + if __module__ == 'typing' and __qualname__ == 'NewType..new_type': + return True + else: + return False def isenumclass(x: Any) -> bool: diff --git a/sphinx/util/typing.py b/sphinx/util/typing.py index 4450d4edb..4b809e835 100644 --- a/sphinx/util/typing.py +++ b/sphinx/util/typing.py @@ -171,17 +171,17 @@ def _restify_py37(cls: Optional[Type]) -> str: text += r"\ [%s]" % ", ".join(restify(a) for a in cls.__args__) return text - elif hasattr(cls, '__qualname__'): - if cls.__module__ == 'typing': - return ':class:`~%s.%s`' % (cls.__module__, cls.__qualname__) - else: - return ':class:`%s.%s`' % (cls.__module__, cls.__qualname__) elif hasattr(cls, '_name'): # SpecialForm if cls.__module__ == 'typing': return ':obj:`~%s.%s`' % (cls.__module__, cls._name) else: return ':obj:`%s.%s`' % (cls.__module__, cls._name) + elif hasattr(cls, '__qualname__'): + if cls.__module__ == 'typing': + return ':class:`~%s.%s`' % (cls.__module__, cls.__qualname__) + else: + return ':class:`%s.%s`' % (cls.__module__, cls.__qualname__) elif isinstance(cls, ForwardRef): return ':class:`%s`' % cls.__forward_arg__ else: @@ -309,7 +309,7 @@ def stringify(annotation: Any) -> str: elif annotation in INVALID_BUILTIN_CLASSES: return INVALID_BUILTIN_CLASSES[annotation] elif (getattr(annotation, '__module__', None) == 'builtins' and - hasattr(annotation, '__qualname__')): + getattr(annotation, '__qualname__', None)): if hasattr(annotation, '__args__'): # PEP 585 generic return repr(annotation) else: diff --git a/tests/roots/test-linkcheck/links.txt b/tests/roots/test-linkcheck/links.txt index c21968250..4ff0c9f52 100644 --- a/tests/roots/test-linkcheck/links.txt +++ b/tests/roots/test-linkcheck/links.txt @@ -13,8 +13,7 @@ Some additional anchors to exercise ignore code * `Complete nonsense `_ * `Example valid local file `_ * `Example invalid local file `_ -* https://github.com/sphinx-doc/sphinx#documentation -* https://github.com/sphinx-doc/sphinx#user-content-testing +* https://github.com/sphinx-doc/sphinx/blob/4.x/sphinx/__init__.py#L2 .. image:: https://www.google.com/image.png .. figure:: https://www.google.com/image2.png diff --git a/tests/test_build_linkcheck.py b/tests/test_build_linkcheck.py index 6db0e7512..2c6244b0a 100644 --- a/tests/test_build_linkcheck.py +++ b/tests/test_build_linkcheck.py @@ -66,8 +66,8 @@ def test_defaults_json(app): "info"]: assert attr in row - assert len(content.splitlines()) == 12 - assert len(rows) == 12 + assert len(content.splitlines()) == 11 + assert len(rows) == 11 # the output order of the rows is not stable # due to possible variance in network latency rowsby = {row["uri"]: row for row in rows} @@ -88,7 +88,7 @@ def test_defaults_json(app): assert dnerow['uri'] == 'https://localhost:7777/doesnotexist' assert rowsby['https://www.google.com/image2.png'] == { 'filename': 'links.txt', - 'lineno': 20, + 'lineno': 19, 'status': 'broken', 'code': 0, 'uri': 'https://www.google.com/image2.png', @@ -102,10 +102,6 @@ def test_defaults_json(app): # images should fail assert "Not Found for url: https://www.google.com/image.png" in \ rowsby["https://www.google.com/image.png"]["info"] - # The anchor of the URI for github.com is automatically modified - assert 'https://github.com/sphinx-doc/sphinx#documentation' not in rowsby - assert 'https://github.com/sphinx-doc/sphinx#user-content-documentation' in rowsby - assert 'https://github.com/sphinx-doc/sphinx#user-content-testing' in rowsby @pytest.mark.sphinx(