diff --git a/docs/css/mkdocstrings.css b/docs/css/mkdocstrings.css index 03c39d33..7d66153a 100644 --- a/docs/css/mkdocstrings.css +++ b/docs/css/mkdocstrings.css @@ -25,3 +25,48 @@ a.external:hover::after, a.autorefs-external:hover::after { background-color: var(--md-accent-fg-color); } + +/* Tree-like output for backlinks. */ +.doc-backlink-list { + --tree-clr: var(--md-default-fg-color); + --tree-font-size: 1rem; + --tree-item-height: 1; + --tree-offset: 1rem; + --tree-thickness: 1px; + --tree-style: solid; + display: grid; + list-style: none !important; +} + +.doc-backlink-list li > span:first-child { + text-indent: .3rem; +} +.doc-backlink-list li { + padding-inline-start: var(--tree-offset); + border-left: var(--tree-thickness) var(--tree-style) var(--tree-clr); + position: relative; + margin-left: 0 !important; + + &:last-child { + border-color: transparent; + } + &::before{ + content: ''; + position: absolute; + top: calc(var(--tree-item-height) / 2 * -1 * var(--tree-font-size) + var(--tree-thickness)); + left: calc(var(--tree-thickness) * -1); + width: calc(var(--tree-offset) + var(--tree-thickness) * 2); + height: calc(var(--tree-item-height) * var(--tree-font-size)); + border-left: var(--tree-thickness) var(--tree-style) var(--tree-clr); + border-bottom: var(--tree-thickness) var(--tree-style) var(--tree-clr); + } + &::after{ + content: ''; + position: absolute; + border-radius: 50%; + background-color: var(--tree-clr); + top: calc(var(--tree-item-height) / 2 * 1rem); + left: var(--tree-offset) ; + translate: calc(var(--tree-thickness) * -1) calc(var(--tree-thickness) * -1); + } +} diff --git a/docs/insiders/changelog.md b/docs/insiders/changelog.md index a6c7b907..25562a7d 100644 --- a/docs/insiders/changelog.md +++ b/docs/insiders/changelog.md @@ -2,6 +2,10 @@ ## mkdocstrings-python Insiders +### 1.10.0 <small>March 10, 2025</small> { id="1.10.0" } + +- [Backlinks][backlinks] + ### 1.9.0 <small>September 03, 2024</small> { id="1.9.0" } - [Relative cross-references][relative_crossrefs] diff --git a/docs/insiders/goals.yml b/docs/insiders/goals.yml index 16d1d507..2153312d 100644 --- a/docs/insiders/goals.yml +++ b/docs/insiders/goals.yml @@ -42,3 +42,6 @@ goals: - name: Scoped cross-references ref: /usage/configuration/docstrings/#scoped_crossrefs since: 2024/09/03 + - name: Backlinks + ref: /usage/configuration/general/#backlinks + since: 2025/03/10 diff --git a/docs/usage/configuration/general.md b/docs/usage/configuration/general.md index 3983a616..77b3f3f9 100644 --- a/docs/usage/configuration/general.md +++ b/docs/usage/configuration/general.md @@ -60,6 +60,38 @@ plugins: //// /// +[](){#option-backlinks} +## `backlinks` + +[:octicons-heart-fill-24:{ .pulse } Sponsors only](../../insiders/index.md){ .insiders } — +[:octicons-tag-24: Insiders 1.10.0](../../insiders/changelog.md#1.10.0) + +- **:octicons-package-24: Type <code><autoref identifier="typing.Literal" optional>Literal</autoref>["flat", "tree", False]</code> :material-equal: `False`{ title="default value" }** + +The `backlinks` option enables rendering of backlinks within your API documentation. + +When an arbitrary section of your documentation links to an API symbol, this link will be collected as a backlink, and rendered below your API symbol. In short, the API symbol will link back to the section that links to it. Such backlinks will help your users navigate the documentation, as they will immediately which functions return a specific symbol, or where a specific symbol is accepted as parameter, etc.. + +Each backlink is a list of breadcrumbs that represent the navigation, from the root page down to the given section. + +The available styles for rendering backlinks are **`flat`** and **`tree`**. + +- **`flat`** will render backlinks as a single-layer list. This can lead to repetition of breadcrumbs. +- **`tree`** will combine backlinks into a tree, to remove repetition of breadcrumbs. + +WARNING: **Global-only option.** For now, the option only works when set globally in `mkdocs.yml`. + +```yaml title="in mkdocs.yml (global configuration)" +plugins: +- mkdocstrings: + handlers: + python: + options: + backlinks: tree +``` + +<!-- TODO: Add screenshots! --> + [](){#option-extensions} ## `extensions` diff --git a/mkdocs.yml b/mkdocs.yml index 396f738f..ae518a4c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -160,6 +160,7 @@ plugins: - https://mkdocstrings.github.io/griffe/objects.inv - https://python-markdown.github.io/objects.inv options: + backlinks: tree docstring_options: ignore_init_summary: true docstring_section_style: list diff --git a/src/mkdocstrings_handlers/python/config.py b/src/mkdocstrings_handlers/python/config.py index a1ecdcd8..af2ac7f7 100644 --- a/src/mkdocstrings_handlers/python/config.py +++ b/src/mkdocstrings_handlers/python/config.py @@ -386,6 +386,14 @@ class PythonInputOptions: ), ] = "brief" + backlinks: Annotated[ + Literal["flat", "tree", False], + Field( + group="general", + description="Whether to render backlinks, and how.", + ), + ] = False + docstring_options: Annotated[ GoogleStyleOptions | NumpyStyleOptions | SphinxStyleOptions | AutoStyleOptions | None, Field( diff --git a/src/mkdocstrings_handlers/python/handler.py b/src/mkdocstrings_handlers/python/handler.py index d9db6669..69f228f1 100644 --- a/src/mkdocstrings_handlers/python/handler.py +++ b/src/mkdocstrings_handlers/python/handler.py @@ -301,6 +301,7 @@ def update_env(self, config: Any) -> None: # noqa: ARG002 self.env.filters["as_functions_section"] = rendering.do_as_functions_section self.env.filters["as_classes_section"] = rendering.do_as_classes_section self.env.filters["as_modules_section"] = rendering.do_as_modules_section + self.env.filters["backlink_tree"] = rendering.do_backlink_tree self.env.globals["AutorefsHook"] = rendering.AutorefsHook self.env.tests["existing_template"] = lambda template_name: template_name in self.env.list_templates() diff --git a/src/mkdocstrings_handlers/python/rendering.py b/src/mkdocstrings_handlers/python/rendering.py index 4b8a8ee4..0a670b90 100644 --- a/src/mkdocstrings_handlers/python/rendering.py +++ b/src/mkdocstrings_handlers/python/rendering.py @@ -8,11 +8,12 @@ import subprocess import sys import warnings +from collections import defaultdict from dataclasses import replace from functools import lru_cache from pathlib import Path from re import Match, Pattern -from typing import TYPE_CHECKING, Any, Callable, ClassVar, Literal +from typing import TYPE_CHECKING, Any, Callable, ClassVar, Literal, TypeVar from griffe import ( Alias, @@ -28,11 +29,11 @@ ) from jinja2 import TemplateNotFound, pass_context, pass_environment from markupsafe import Markup -from mkdocs_autorefs import AutorefsHookInterface +from mkdocs_autorefs import AutorefsHookInterface, Backlink, BacklinkCrumb from mkdocstrings import get_logger if TYPE_CHECKING: - from collections.abc import Iterator, Sequence + from collections.abc import Iterable, Iterator, Sequence from griffe import Attribute, Class, Function, Module from jinja2 import Environment, Template @@ -210,10 +211,15 @@ def do_format_attribute( signature = str(attribute_path).strip() if annotations and attribute.annotation: - annotation = template.render(context.parent, expression=attribute.annotation, signature=True) + annotation = template.render( + context.parent, + expression=attribute.annotation, + signature=True, + backlink_type="returned-by", + ) signature += f": {annotation}" if attribute.value: - value = template.render(context.parent, expression=attribute.value, signature=True) + value = template.render(context.parent, expression=attribute.value, signature=True, backlink_type="used-by") signature += f" = {value}" signature = do_format_code(signature, line_length) @@ -725,3 +731,45 @@ def get_context(self) -> AutorefsHookInterface.Context: filepath=str(filepath), lineno=lineno, ) + + +T = TypeVar("T") +Tree = dict[T, "Tree"] +CompactTree = dict[tuple[T, ...], "CompactTree"] +_rtree = lambda: defaultdict(_rtree) # type: ignore[has-type,var-annotated] # noqa: E731 + + +def _tree(data: Iterable[tuple[T, ...]]) -> Tree: + new_tree = _rtree() + for nav in data: + *path, leaf = nav + node = new_tree + for key in path: + node = node[key] + node[leaf] = _rtree() + return new_tree + + +def _compact_tree(tree: Tree) -> CompactTree: + new_tree = _rtree() + for key, value in tree.items(): + child = _compact_tree(value) + if len(child) == 1: + child_key, child_value = next(iter(child.items())) + new_key = (key, *child_key) + new_tree[new_key] = child_value + else: + new_tree[(key,)] = child + return new_tree + + +def do_backlink_tree(backlinks: list[Backlink]) -> CompactTree[BacklinkCrumb]: + """Build a tree of backlinks. + + Parameters: + backlinks: The list of backlinks. + + Returns: + A tree of backlinks. + """ + return _compact_tree(_tree(backlink.crumbs for backlink in backlinks)) diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/attribute.html.jinja b/src/mkdocstrings_handlers/python/templates/material/_base/attribute.html.jinja index c13bb641..3217b4f6 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/attribute.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/material/_base/attribute.html.jinja @@ -113,6 +113,10 @@ Context: {% include "docstring"|get_template with context %} {% endwith %} {% endblock docstring %} + + {% if config.backlinks %} + <backlinks identifier="{{ html_id }}" handler="python" /> + {% endif %} {% endblock contents %} </div> diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/backlinks.html.jinja b/src/mkdocstrings_handlers/python/templates/material/_base/backlinks.html.jinja new file mode 100644 index 00000000..2ab16038 --- /dev/null +++ b/src/mkdocstrings_handlers/python/templates/material/_base/backlinks.html.jinja @@ -0,0 +1,17 @@ +{#- Template for backlinks. + +This template renders backlinks. + +Context: + backlinks (Mapping[str, Iterable[str]]): The backlinks to render. + config (dict): The configuration options. + verbose_type (Mapping[str, str]): The verbose backlink types. + default_crumb (BacklinkCrumb): A default, empty crumb. +-#} + +{% block logs scoped %} + {#- Logging block. + + This block can be used to log debug messages, deprecation messages, warnings, etc. + -#} +{% endblock logs %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/class.html.jinja b/src/mkdocstrings_handlers/python/templates/material/_base/class.html.jinja index e8f89fa3..a07a36be 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/class.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/material/_base/class.html.jinja @@ -130,7 +130,11 @@ Context: {% if config.show_bases and class.bases %} <p class="doc doc-class-bases"> Bases: {% for expression in class.bases -%} - <code>{% include "expression"|get_template with context %}</code>{% if not loop.last %}, {% endif %} + <code> + {%- with backlink_type = "subclassed-by" -%} + {%- include "expression"|get_template with context -%} + {%- endwith -%} + </code>{% if not loop.last %}, {% endif %} {% endfor -%} </p> {% endif %} @@ -159,6 +163,10 @@ Context: {% endif %} {% endblock docstring %} + {% if config.backlinks %} + <backlinks identifier="{{ html_id }}" handler="python" /> + {% endif %} + {% block summary scoped %} {#- Summary block. diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html.jinja b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html.jinja index 1689dcb8..8b64af1b 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html.jinja @@ -36,7 +36,7 @@ Context: <td><code>{{ parameter.name }}</code></td> <td> {% if parameter.annotation %} - {% with expression = parameter.annotation %} + {% with expression = parameter.annotation, backlink_type = "used-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} {% endif %} @@ -60,7 +60,7 @@ Context: <li class="doc-section-item field-body"> <b><code>{{ parameter.name }}</code></b> {% if parameter.annotation %} - {% with expression = parameter.annotation %} + {% with expression = parameter.annotation, backlink_type = "used-by" %} (<code>{% include "expression"|get_template with context %}</code>) {% endwith %} {% endif %} @@ -94,7 +94,7 @@ Context: {% if parameter.annotation %} <span class="doc-param-annotation"> <b>{{ lang.t("TYPE:") }}</b> - {% with expression = parameter.annotation %} + {% with expression = parameter.annotation, backlink_type = "used-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} </span> diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html.jinja b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html.jinja index d4e9acb8..ae8fb7a3 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html.jinja @@ -51,7 +51,7 @@ Context: </td> <td> {% if parameter.annotation %} - {% with expression = parameter.annotation %} + {% with expression = parameter.annotation, backlink_type = "used-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} {% endif %} @@ -63,7 +63,7 @@ Context: </td> <td> {% if parameter.default %} - {% with expression = parameter.default %} + {% with expression = parameter.default, backlink_type = "used-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} {% else %} @@ -96,10 +96,10 @@ Context: <b><code>{{ parameter.name }}</code></b> {% endif %} {% if parameter.annotation %} - {% with expression = parameter.annotation %} + {% with expression = parameter.annotation, backlink_type = "used-by" %} (<code>{% include "expression"|get_template with context %}</code> {%- if parameter.default %}, {{ lang.t("default:") }} - {% with expression = parameter.default %} + {% with expression = parameter.default, backlink_type = "used-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} {% endif %}) @@ -149,7 +149,7 @@ Context: {% if parameter.annotation %} <span class="doc-param-annotation"> <b>{{ lang.t("TYPE:") }}</b> - {% with expression = parameter.annotation %} + {% with expression = parameter.annotation, backlink_type = "used-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} </span> @@ -157,7 +157,7 @@ Context: {% if parameter.default %} <span class="doc-param-default"> <b>{{ lang.t("DEFAULT:") }}</b> - {% with expression = parameter.default %} + {% with expression = parameter.default, backlink_type = "used-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} </span> diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html.jinja b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html.jinja index d734e94a..1e1d5006 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html.jinja @@ -34,7 +34,7 @@ Context: <tr class="doc-section-item"> <td> {% if raises.annotation %} - {% with expression = raises.annotation %} + {% with expression = raises.annotation, backlink_type = "raised-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} {% endif %} @@ -57,7 +57,7 @@ Context: {% for raises in section.value %} <li class="doc-section-item field-body"> {% if raises.annotation %} - {% with expression = raises.annotation %} + {% with expression = raises.annotation, backlink_type = "raised-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} – @@ -84,7 +84,7 @@ Context: <tr class="doc-section-item"> <td> <span class="doc-raises-annotation"> - {% with expression = raises.annotation %} + {% with expression = raises.annotation, backlink_type = "raised-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} </span> diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html.jinja b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html.jinja index 3b618c66..a447b216 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html.jinja @@ -37,7 +37,7 @@ Context: {% if name_column %}<td>{% if receives.name %}<code>{{ receives.name }}</code>{% endif %}</td>{% endif %} <td> {% if receives.annotation %} - {% with expression = receives.annotation %} + {% with expression = receives.annotation, backlink_type = "received-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} {% endif %} @@ -61,7 +61,7 @@ Context: <li class="doc-section-item field-body"> {% if receives.name %}<b><code>{{ receives.name }}</code></b>{% endif %} {% if receives.annotation %} - {% with expression = receives.annotation %} + {% with expression = receives.annotation, backlink_type = "received-by" %} {% if receives.name %} ({% endif %} <code>{% include "expression"|get_template with context %}</code> {% if receives.name %}){% endif %} @@ -93,7 +93,7 @@ Context: <code>{{ receives.name }}</code> {% elif receives.annotation %} <span class="doc-receives-annotation"> - {% with expression = receives.annotation %} + {% with expression = receives.annotation, backlink_type = "received-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} </span> @@ -107,7 +107,7 @@ Context: <p> <span class="doc-receives-annotation"> <b>{{ lang.t("TYPE:") }}</b> - {% with expression = receives.annotation %} + {% with expression = receives.annotation, backlink_type = "received-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} </span> diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html.jinja b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html.jinja index af61fce5..30540e66 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html.jinja @@ -37,7 +37,7 @@ Context: {% if name_column %}<td>{% if returns.name %}<code>{{ returns.name }}</code>{% endif %}</td>{% endif %} <td> {% if returns.annotation %} - {% with expression = returns.annotation %} + {% with expression = returns.annotation, backlink_type = "returned-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} {% endif %} @@ -61,7 +61,7 @@ Context: <li class="doc-section-item field-body"> {% if returns.name %}<b><code>{{ returns.name }}</code></b>{% endif %} {% if returns.annotation %} - {% with expression = returns.annotation %} + {% with expression = returns.annotation, backlink_type = "returned-by" %} {% if returns.name %} ({% endif %} <code>{% include "expression"|get_template with context %}</code> {% if returns.name %}){% endif %} @@ -93,7 +93,7 @@ Context: <code>{{ returns.name }}</code> {% elif returns.annotation %} <span class="doc-returns-annotation"> - {% with expression = returns.annotation %} + {% with expression = returns.annotation, backlink_type = "returned-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} </span> @@ -107,7 +107,7 @@ Context: <p> <span class="doc-returns-annotation"> <b>{{ lang.t("TYPE:") }}</b> - {% with expression = returns.annotation %} + {% with expression = returns.annotation, backlink_type = "returned-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} </span> diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html.jinja b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html.jinja index 782c0cdf..814e3020 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html.jinja @@ -34,7 +34,7 @@ Context: <tr class="doc-section-item"> <td> {% if warns.annotation %} - {% with expression = warns.annotation %} + {% with expression = warns.annotation, backlink_type = "emitted-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} {% endif %} @@ -57,7 +57,7 @@ Context: {% for warns in section.value %} <li class="doc-section-item field-body"> {% if warns.annotation %} - {% with expression = warns.annotation %} + {% with expression = warns.annotation, backlink_type = "emitted-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} – @@ -84,7 +84,7 @@ Context: <tr class="doc-section-item"> <td> <span class="doc-warns-annotation"> - {% with expression = warns.annotation %} + {% with expression = warns.annotation, backlink_type = "emitted-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} </span> diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html.jinja b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html.jinja index 6d3cfa14..01b8b9e5 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html.jinja @@ -37,7 +37,7 @@ Context: {% if name_column %}<td>{% if yields.name %}<code>{{ yields.name }}</code>{% endif %}</td>{% endif %} <td> {% if yields.annotation %} - {% with expression = yields.annotation %} + {% with expression = yields.annotation, backlink_type = "yielded-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} {% endif %} @@ -61,7 +61,7 @@ Context: <li class="doc-section-item field-body"> {% if yields.name %}<b><code>{{ yields.name }}</code></b>{% endif %} {% if yields.annotation %} - {% with expression = yields.annotation %} + {% with expression = yields.annotation, backlink_type = "yielded-by" %} {% if yields.name %} ({% endif %} <code>{% include "expression"|get_template with context %}</code> {% if yields.name %}){% endif %} @@ -93,7 +93,7 @@ Context: <code>{{ yields.name }}</code> {% elif yields.annotation %} <span class="doc-yields-annotation"> - {% with expression = yields.annotation %} + {% with expression = yields.annotation, backlink_type = "yielded-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} </span> @@ -107,7 +107,7 @@ Context: <p> <span class="doc-yields-annotation"> <b>{{ lang.t("TYPE:") }}:</b> - {% with expression = yields.annotation %} + {% with expression = yields.annotation, backlink_type = "yielded-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} </span> diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/expression.html.jinja b/src/mkdocstrings_handlers/python/templates/material/_base/expression.html.jinja index 781d46c7..d49e43be 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/expression.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/material/_base/expression.html.jinja @@ -11,7 +11,7 @@ which is a tree-like structure representing a Python expression. -#} {% endblock logs %} -{%- macro crossref(name, annotation_path) -%} +{%- macro crossref(name, annotation_path, backlink_type="") -%} {#- Output a cross-reference. This macro outputs a cross-reference to the given name. @@ -35,11 +35,11 @@ which is a tree-like structure representing a Python expression. {{ prefix }} {%- if not signature -%} {#- Always render cross-references outside of signatures. We don't need to stash them. -#} - <autoref identifier="{{ path }}" optional{% if title != path %} hover{% endif %}>{{ title }}</autoref> + <autoref identifier="{{ path }}"{% if backlink_type %} backlink-type="{{ backlink_type }}" backlink-anchor="{{ html_id }}"{% endif %} optional{% if title != path %} hover{% endif %}>{{ title }}</autoref> {%- elif config.signature_crossrefs -%} {#- We're in a signature and cross-references are enabled, we must render one and stash it. -#} {%- filter stash_crossref(length=title|length) -%} - <autoref identifier="{{ path }}" optional{% if title != path %} hover{% endif %}>{{ title }}</autoref> + <autoref identifier="{{ path }}"{% if backlink_type %} backlink-type="{{ backlink_type }}" backlink-anchor="{{ html_id }}"{% endif %} optional{% if title != path %} hover{% endif %}>{{ title }}</autoref> {%- endfilter -%} {%- else -%} {#- We're in a signature but cross-references are disabled, we just render the title. -#} @@ -72,7 +72,7 @@ which is a tree-like structure representing a Python expression. {%- endif -%} {%- endmacro -%} -{%- macro render(expression, annotations_path) -%} +{%- macro render(expression, annotations_path, backlink_type="") -%} {#- Render an expression. Parameters: @@ -85,13 +85,13 @@ which is a tree-like structure representing a Python expression. {%- if expression is string -%} {%- if signature -%}{{ expression|safe }}{%- else -%}{{ expression }}{%- endif -%} {%- elif expression.classname == "ExprName" -%} - {{ crossref(expression, annotations_path) }} + {{ crossref(expression, annotations_path, backlink_type) }} {%- elif config.unwrap_annotated and expression.classname == "ExprSubscript" and expression.canonical_path in ("typing.Annotated", "typing_extensions.Annotated") -%} {{ render(expression.slice.elements[0], annotations_path) }} {%- elif expression.classname == "ExprAttribute" -%} {%- if annotations_path == "brief" -%} {%- if expression.last.is_enum_value -%} - {{ crossref(expression.last.parent, "brief") }}.value + {{ crossref(expression.last.parent, "brief", backlink_type) }}.value {%- else -%} {{ render(expression.last, "brief") }} {%- endif -%} @@ -116,4 +116,4 @@ which is a tree-like structure representing a Python expression. {%- endif -%} {%- endmacro -%} -{{ render(expression, config.annotations_path) }} +{{ render(expression, config.annotations_path, backlink_type|default("")) }} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/function.html.jinja b/src/mkdocstrings_handlers/python/templates/material/_base/function.html.jinja index b475cf1b..4adcf3bd 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/function.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/material/_base/function.html.jinja @@ -129,6 +129,10 @@ Context: {% endwith %} {% endblock docstring %} + {% if config.backlinks %} + <backlinks identifier="{{ html_id }}" handler="python" /> + {% endif %} + {% block source scoped %} {#- Source block. diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/module.html.jinja b/src/mkdocstrings_handlers/python/templates/material/_base/module.html.jinja index fa2d2e6a..d49dc76d 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/module.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/material/_base/module.html.jinja @@ -97,6 +97,10 @@ Context: {% endwith %} {% endblock docstring %} + {% if config.backlinks %} + <backlinks identifier="{{ html_id }}" handler="python" /> + {% endif %} + {% block summary scoped %} {#- Summary block. diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/signature.html.jinja b/src/mkdocstrings_handlers/python/templates/material/_base/signature.html.jinja index ce5c3f04..e414fbe3 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/signature.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/material/_base/signature.html.jinja @@ -49,7 +49,9 @@ Context: {%- set ns.equal = " = " -%} {%- if config.separate_signature -%} {%- with expression = parameter.annotation -%} - {%- set ns.annotation -%}: {% include "expression"|get_template with context %}{%- endset -%} + {%- set ns.annotation -%}: {% with backlink_type = "used-by" -%} + {%- include "expression"|get_template with context -%} + {%- endwith -%}{%- endset -%} {%- endwith -%} {%- else -%} {%- set ns.annotation = ": " + parameter.annotation|safe -%} @@ -102,7 +104,7 @@ Context: {%- if ns.default -%} {{ ns.equal }} {%- if config.signature_crossrefs and config.separate_signature -%} - {%- with expression = parameter.default -%} + {%- with expression = parameter.default, backlink_type = "used-by" -%} {%- include "expression"|get_template with context -%} {%- endwith -%} {%- else -%} @@ -121,7 +123,9 @@ Context: and function.annotation and not (config.merge_init_into_class and function.name == "__init__" ) %} -> {% if config.separate_signature and config.signature_crossrefs -%} - {%- with expression = function.annotation %}{% include "expression"|get_template with context %}{%- endwith -%} + {%- with expression = function.annotation, backlink_type = "returned-by" -%} + {%- include "expression"|get_template with context -%} + {%- endwith -%} {%- else -%} {{ function.annotation|safe }} {%- endif -%} diff --git a/src/mkdocstrings_handlers/python/templates/material/backlinks.html.jinja b/src/mkdocstrings_handlers/python/templates/material/backlinks.html.jinja new file mode 100644 index 00000000..08ba4922 --- /dev/null +++ b/src/mkdocstrings_handlers/python/templates/material/backlinks.html.jinja @@ -0,0 +1 @@ +{% extends "_base/backlinks.html.jinja" %} diff --git a/src/mkdocstrings_handlers/python/templates/material/style.css b/src/mkdocstrings_handlers/python/templates/material/style.css index 7e819d8b..e5e150ec 100644 --- a/src/mkdocstrings_handlers/python/templates/material/style.css +++ b/src/mkdocstrings_handlers/python/templates/material/style.css @@ -41,6 +41,28 @@ font-weight: bold; } +/* Backlinks crumb separator. */ +.doc-backlink-crumb { + display: inline-flex; + gap: .2rem; + white-space: nowrap; + align-items: center; + vertical-align: middle; +} +.doc-backlink-crumb:not(:first-child)::before { + background-color: var(--md-default-fg-color--lighter); + content: ""; + display: inline; + height: 1rem; + --md-path-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6z"/></svg>'); + -webkit-mask-image: var(--md-path-icon); + mask-image: var(--md-path-icon); + width: 1rem; +} +.doc-backlink-crumb.last { + font-weight: bold; +} + /* Symbols in Navigation and ToC. */ :root, :host, [data-md-color-scheme="default"] { @@ -82,7 +104,8 @@ code.doc-symbol { font-weight: bold; } -code.doc-symbol-parameter { +code.doc-symbol-parameter, +a code.doc-symbol-parameter { color: var(--doc-symbol-parameter-fg-color); background-color: var(--doc-symbol-parameter-bg-color); } @@ -91,7 +114,8 @@ code.doc-symbol-parameter::after { content: "param"; } -code.doc-symbol-attribute { +code.doc-symbol-attribute, +a code.doc-symbol-attribute { color: var(--doc-symbol-attribute-fg-color); background-color: var(--doc-symbol-attribute-bg-color); } @@ -100,7 +124,8 @@ code.doc-symbol-attribute::after { content: "attr"; } -code.doc-symbol-function { +code.doc-symbol-function, +a code.doc-symbol-function { color: var(--doc-symbol-function-fg-color); background-color: var(--doc-symbol-function-bg-color); } @@ -109,7 +134,8 @@ code.doc-symbol-function::after { content: "func"; } -code.doc-symbol-method { +code.doc-symbol-method, +a code.doc-symbol-method { color: var(--doc-symbol-method-fg-color); background-color: var(--doc-symbol-method-bg-color); } @@ -118,7 +144,8 @@ code.doc-symbol-method::after { content: "meth"; } -code.doc-symbol-class { +code.doc-symbol-class, +a code.doc-symbol-class { color: var(--doc-symbol-class-fg-color); background-color: var(--doc-symbol-class-bg-color); } @@ -127,7 +154,8 @@ code.doc-symbol-class::after { content: "class"; } -code.doc-symbol-module { +code.doc-symbol-module, +a code.doc-symbol-module { color: var(--doc-symbol-module-fg-color); background-color: var(--doc-symbol-module-bg-color); } diff --git a/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/other_parameters.html.jinja b/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/other_parameters.html.jinja index beb4f678..657b21b4 100644 --- a/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/other_parameters.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/other_parameters.html.jinja @@ -32,7 +32,7 @@ Context: <li> <b><code>{{ parameter.name }}</code></b> {% if parameter.annotation %} - {% with expression = parameter.annotation %} + {% with expression = parameter.annotation, backlink_type = "used-by" %} (<code>{% include "expression"|get_template with context %}</code>) {% endwith %} {% endif %} diff --git a/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/parameters.html.jinja b/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/parameters.html.jinja index 295ab082..6017a8cb 100644 --- a/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/parameters.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/parameters.html.jinja @@ -32,10 +32,10 @@ Context: <li> <b><code>{{ parameter.name }}</code></b> {% if parameter.annotation %} - {% with expression = parameter.annotation %} + {% with expression = parameter.annotation, backlink_type = "used-by" %} (<code>{% include "expression"|get_template with context %}</code> {%- if parameter.default %}, {{ lang.t("default:") }} - {% with expression = parameter.default %} + {% with expression = parameter.default, backlink_type = "used-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} {% endif %}) diff --git a/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/raises.html.jinja b/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/raises.html.jinja index 7fa8cd86..11f695e8 100644 --- a/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/raises.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/raises.html.jinja @@ -31,7 +31,7 @@ Context: {% for raises in section.value %} <li> {% if raises.annotation %} - {% with expression = raises.annotation %} + {% with expression = raises.annotation, backlink_type = "raised-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} {% endif %} diff --git a/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/receives.html.jinja b/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/receives.html.jinja index 9ee189bc..aec9a858 100644 --- a/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/receives.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/receives.html.jinja @@ -32,7 +32,7 @@ Context: <li> {% if receives.name %}<b><code>{{ receives.name }}</code></b>{% endif %} {% if receives.annotation %} - {% with expression = receives.annotation %} + {% with expression = receives.annotation, backlink_type = "received-by" %} {% if receives.name %}({% endif %} <code>{% include "expression"|get_template with context %}</code> {% if receives.name %}){% endif %} diff --git a/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/returns.html.jinja b/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/returns.html.jinja index 2dbd21af..3f8bbba4 100644 --- a/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/returns.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/returns.html.jinja @@ -32,7 +32,7 @@ Context: <li> {% if returns.name %}<b><code>{{ returns.name }}</code></b>{% endif %} {% if returns.annotation %} - {% with expression = returns.annotation %} + {% with expression = returns.annotation, backlink_type = "returned-by" %} {% if returns.name %}({% endif %} <code>{% include "expression"|get_template with context %}</code> {% if returns.name %}){% endif %} diff --git a/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/warns.html.jinja b/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/warns.html.jinja index 61f3c839..1d465ec9 100644 --- a/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/warns.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/warns.html.jinja @@ -31,7 +31,7 @@ Context: {% for warns in section.value %} <li> {% if warns.annotation %} - {% with expression = warns.annotation %} + {% with expression = warns.annotation, backlink_type = "emitted-by" %} <code>{% include "expression"|get_template with context %}</code> {% endwith %} {% endif %} diff --git a/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/yields.html.jinja b/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/yields.html.jinja index 0fa6fcbc..70c782b3 100644 --- a/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/yields.html.jinja +++ b/src/mkdocstrings_handlers/python/templates/readthedocs/_base/docstring/yields.html.jinja @@ -32,7 +32,7 @@ Context: <li> {% if yields.name %}<b></code>{{ yields.name }}</code></b>{% endif %} {% if yields.annotation %} - {% with expression = yields.annotation %} + {% with expression = yields.annotation, backlink_type = "yielded-by" %} {% if yields.name %}({% endif %} <code>{% include "expression"|get_template with context %}</code> {% if yields.name %}){% endif %} diff --git a/tests/snapshots/__init__.py b/tests/snapshots/__init__.py index 4469afed..712cdafe 100644 --- a/tests/snapshots/__init__.py +++ b/tests/snapshots/__init__.py @@ -13,7 +13,7 @@ ("separate_signature", True), ("show_signature_annotations", True), ("signature_crossrefs", True), - ): external("955e5111f426*.html"), + ): external("261a38d7a86b*.html"), ( ("separate_signature", False), ("show_signature_annotations", True), @@ -54,28 +54,20 @@ ("inherited_members", ("method1",)), ("members", False), ): external("ab0ddac637b5*.html"), - (("filters", None), ("inherited_members", True), ("members", True)): external( - "0b1372d7f7c0*.html", - ), - (("filters", ()), ("inherited_members", False), ("members", True)): external( - "59a9e1ffb2f0*.html", - ), + (("filters", None), ("inherited_members", True), ("members", True)): external("c0f102dbd7d4*.html"), + (("filters", ()), ("inherited_members", False), ("members", True)): external("fca72854c849*.html"), ( ("filters", ("!module_attribute",)), ("inherited_members", ()), ("members", ("module_attribute",)), ): external("6d12192d6b4d*.html"), - (("filters", ()), ("inherited_members", ()), ("members", False)): external( - "366b0537fe06*.html", - ), + (("filters", ()), ("inherited_members", ()), ("members", False)): external("366b0537fe06*.html"), ( ("filters", ()), ("inherited_members", ("method1",)), ("members", ("module_attribute",)), ): external("e90c3e0c85dd*.html"), - (("filters", ()), ("inherited_members", True), ("members", True)): external( - "e8be7a9b1410*.html", - ), + (("filters", ()), ("inherited_members", True), ("members", True)): external("722165bce3ad*.html"), ( ("filters", ("module_attribute",)), ("inherited_members", ("method1",)), @@ -85,15 +77,13 @@ ("filters", ()), ("inherited_members", ("method1",)), ("members", True), - ): external("d540895f6bf9*.html"), - (("filters", ()), ("inherited_members", False), ("members", False)): external( - "5cf0130e3b4f*.html", - ), + ): external("cd51e40cc0dd*.html"), + (("filters", ()), ("inherited_members", False), ("members", False)): external("5cf0130e3b4f*.html"), ( ("filters", ("!module_attribute",)), ("inherited_members", True), ("members", True), - ): external("7c988c9e13ef*.html"), + ): external("34b16654e7ba*.html"), ( ("filters", ("!module_attribute",)), ("inherited_members", False), @@ -119,17 +109,13 @@ ("inherited_members", False), ("members", ("module_attribute",)), ): external("5a9c10410801*.html"), - (("filters", ()), ("inherited_members", False), ("members", ())): external( - "fba0d78ae23e*.html", - ), + (("filters", ()), ("inherited_members", False), ("members", ())): external("fba0d78ae23e*.html"), ( ("filters", ("module_attribute",)), ("inherited_members", ("method1",)), ("members", None), ): external("cfcd41685591*.html"), - (("filters", ()), ("inherited_members", False), ("members", None)): external( - "a2c5be9bd5d1*.html", - ), + (("filters", ()), ("inherited_members", False), ("members", None)): external("eac5bee59a9e*.html"), ( ("filters", ("module_attribute",)), ("inherited_members", ()), @@ -145,9 +131,7 @@ ("inherited_members", ("method1",)), ("members", ()), ): external("4f60da13e2d4*.html"), - (("filters", ()), ("inherited_members", True), ("members", ())): external( - "c915eb92fd5d*.html", - ), + (("filters", ()), ("inherited_members", True), ("members", ())): external("c915eb92fd5d*.html"), ( ("filters", ("module_attribute",)), ("inherited_members", ()), @@ -157,21 +141,15 @@ ("filters", ("!module_attribute",)), ("inherited_members", ("method1",)), ("members", None), - ): external("3d072a22b951*.html"), - (("filters", None), ("inherited_members", False), ("members", False)): external( - "9bd282a6f2fe*.html", - ), + ): external("fe1cd23642d4*.html"), + (("filters", None), ("inherited_members", False), ("members", False)): external("9bd282a6f2fe*.html"), ( ("filters", None), ("inherited_members", ()), ("members", ("module_attribute",)), ): external("166b8dfab738*.html"), - (("filters", None), ("inherited_members", ()), ("members", False)): external( - "44e42f27bfe3*.html", - ), - (("filters", None), ("inherited_members", False), ("members", None)): external( - "f7711b8af768*.html", - ), + (("filters", None), ("inherited_members", ()), ("members", False)): external("44e42f27bfe3*.html"), + (("filters", None), ("inherited_members", False), ("members", None)): external("0f046dea611f*.html"), ( ("filters", ("!module_attribute",)), ("inherited_members", True), @@ -182,14 +160,12 @@ ("inherited_members", True), ("members", False), ): external("f3f3acb6b51b*.html"), - (("filters", None), ("inherited_members", ()), ("members", True)): external( - "347d4ffe2cb3*.html", - ), + (("filters", None), ("inherited_members", ()), ("members", True)): external("dcf34c2f7269*.html"), ( ("filters", ("!module_attribute",)), ("inherited_members", True), ("members", None), - ): external("ba51e100acd4*.html"), + ): external("8733f7fb7b6d*.html"), ( ("filters", ("!module_attribute",)), ("inherited_members", False), @@ -215,12 +191,8 @@ ("inherited_members", False), ("members", ()), ): external("d5a6bf59c663*.html"), - (("filters", None), ("inherited_members", ()), ("members", None)): external( - "88855b028417*.html", - ), - (("filters", ()), ("inherited_members", True), ("members", None)): external( - "981438492e38*.html", - ), + (("filters", None), ("inherited_members", ()), ("members", None)): external("fd291f98ca28*.html"), + (("filters", ()), ("inherited_members", True), ("members", None)): external("14bca0e5703b*.html"), ( ("filters", ()), ("inherited_members", False), @@ -230,25 +202,23 @@ ("filters", None), ("inherited_members", ("method1",)), ("members", None), - ): external("ae74b5980f9b*.html"), + ): external("43d819f94dc7*.html"), ( ("filters", ("module_attribute",)), ("inherited_members", True), ("members", ()), ): external("95f8e480937f*.html"), - (("filters", None), ("inherited_members", False), ("members", True)): external( - "831198033381*.html", - ), + (("filters", None), ("inherited_members", False), ("members", True)): external("f4150843096a*.html"), ( ("filters", ("module_attribute",)), ("inherited_members", True), ("members", True), - ): external("052c34f22e4c*.html"), + ): external("3c21330afd65*.html"), ( ("filters", ("!module_attribute",)), ("inherited_members", False), ("members", None), - ): external("cdc8126d78b6*.html"), + ): external("d55652702606*.html"), ( ("filters", ("module_attribute",)), ("inherited_members", ("method1",)), @@ -259,9 +229,7 @@ ("inherited_members", True), ("members", ("module_attribute",)), ): external("96cf94f4822a*.html"), - (("filters", None), ("inherited_members", True), ("members", ())): external( - "ce06da7f07b3*.html", - ), + (("filters", None), ("inherited_members", True), ("members", ())): external("ce06da7f07b3*.html"), ( ("filters", ("!module_attribute",)), ("inherited_members", ()), @@ -271,15 +239,13 @@ ("filters", None), ("inherited_members", ("method1",)), ("members", True), - ): external("7d5fe6653919*.html"), + ): external("75b69b702f3b*.html"), ( ("filters", ("!module_attribute",)), ("inherited_members", True), ("members", False), ): external("d726cb8367d9*.html"), - (("filters", None), ("inherited_members", False), ("members", ())): external( - "fb770e6537bc*.html", - ), + (("filters", None), ("inherited_members", False), ("members", ())): external("fb770e6537bc*.html"), ( ("filters", ("module_attribute",)), ("inherited_members", True), @@ -294,15 +260,13 @@ ("filters", ("module_attribute",)), ("inherited_members", ()), ("members", True), - ): external("46e56f39b10d*.html"), + ): external("13334b5b4fcf*.html"), ( ("filters", ()), ("inherited_members", ()), ("members", ("module_attribute",)), ): external("388a13d71284*.html"), - (("filters", None), ("inherited_members", True), ("members", False)): external( - "3f5d794823a4*.html", - ), + (("filters", None), ("inherited_members", True), ("members", False)): external("3f5d794823a4*.html"), ( ("filters", ()), ("inherited_members", True), @@ -317,7 +281,7 @@ ("filters", ("module_attribute",)), ("inherited_members", False), ("members", True), - ): external("052e71e7e9d5*.html"), + ): external("cd3e45851714*.html"), ( ("filters", None), ("inherited_members", ("method1",)), @@ -327,7 +291,7 @@ ("filters", ("!module_attribute",)), ("inherited_members", ()), ("members", True), - ): external("b4b490164ab1*.html"), + ): external("84193b3c9f5d*.html"), ( ("filters", ("!module_attribute",)), ("inherited_members", ("method1",)), @@ -342,21 +306,15 @@ ("filters", ("!module_attribute",)), ("inherited_members", ()), ("members", None), - ): external("728c13446301*.html"), - (("filters", None), ("inherited_members", ()), ("members", ())): external( - "f77f1c850398*.html", - ), + ): external("3935bcf6d71b*.html"), + (("filters", None), ("inherited_members", ()), ("members", ())): external("f77f1c850398*.html"), ( ("filters", ("!module_attribute",)), ("inherited_members", False), ("members", True), - ): external("0fac4f5e7f45*.html"), - (("filters", None), ("inherited_members", True), ("members", None)): external( - "cc19537fdba4*.html", - ), - (("filters", ()), ("inherited_members", ()), ("members", None)): external( - "e6a9b76f268c*.html", - ), + ): external("fe25ab760039*.html"), + (("filters", None), ("inherited_members", True), ("members", None)): external("ea914f1afa9d*.html"), + (("filters", ()), ("inherited_members", ()), ("members", None)): external("19f98a747c01*.html"), ( ("filters", ("!module_attribute",)), ("inherited_members", ()), @@ -366,36 +324,30 @@ ("filters", ("!module_attribute",)), ("inherited_members", ("method1",)), ("members", True), - ): external("0c2924ff976f*.html"), + ): external("9720526cf5e4*.html"), ( ("filters", ("module_attribute",)), ("inherited_members", ()), ("members", ("module_attribute",)), ): external("f6e292b8358a*.html"), - (("filters", ()), ("inherited_members", True), ("members", False)): external( - "b0a9b08f1f72*.html", - ), - (("filters", ()), ("inherited_members", ()), ("members", True)): external( - "fb65efbbfc3e*.html", - ), + (("filters", ()), ("inherited_members", True), ("members", False)): external("b0a9b08f1f72*.html"), + (("filters", ()), ("inherited_members", ()), ("members", True)): external("027ef7afeffc*.html"), ( ("filters", ("module_attribute",)), ("inherited_members", False), ("members", False), ): external("710706687213*.html"), - (("filters", ()), ("inherited_members", ()), ("members", ())): external( - "11598fec2d07*.html", - ), + (("filters", ()), ("inherited_members", ()), ("members", ())): external("11598fec2d07*.html"), ( ("filters", ("module_attribute",)), ("inherited_members", ("method1",)), ("members", True), - ): external("a1167b14f5a7*.html"), + ): external("e8608b0de174*.html"), ( ("filters", ()), ("inherited_members", ("method1",)), ("members", None), - ): external("f848d4a9e516*.html"), + ): external("e5dc372374af*.html"), ( ("filters", ("module_attribute",)), ("inherited_members", ()), diff --git a/tests/snapshots/external/fb65efbbfc3ef9c2a06e6f539f8a75bec4276e61254539632a1d5f8f2c6c3452.html b/tests/snapshots/external/027ef7afeffc56219a09298c7db30f473c4dfdda12d99a171e9c76098c316067.html similarity index 97% rename from tests/snapshots/external/fb65efbbfc3ef9c2a06e6f539f8a75bec4276e61254539632a1d5f8f2c6c3452.html rename to tests/snapshots/external/027ef7afeffc56219a09298c7db30f473c4dfdda12d99a171e9c76098c316067.html index 3cec9af8..ccfa8d64 100644 --- a/tests/snapshots/external/fb65efbbfc3ef9c2a06e6f539f8a75bec4276e61254539632a1d5f8f2c6c3452.html +++ b/tests/snapshots/external/027ef7afeffc56219a09298c7db30f473c4dfdda12d99a171e9c76098c316067.html @@ -264,7 +264,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/f7711b8af7689b331209f8c034c8cc3a2ec894372644a8eaee597418e9b55b3c.html b/tests/snapshots/external/0f046dea611f6c9e90b8eaed720f22af372394971808e2a5d1b3a12286f1ec76.html similarity index 97% rename from tests/snapshots/external/f7711b8af7689b331209f8c034c8cc3a2ec894372644a8eaee597418e9b55b3c.html rename to tests/snapshots/external/0f046dea611f6c9e90b8eaed720f22af372394971808e2a5d1b3a12286f1ec76.html index 522fd1c1..332a5c53 100644 --- a/tests/snapshots/external/f7711b8af7689b331209f8c034c8cc3a2ec894372644a8eaee597418e9b55b3c.html +++ b/tests/snapshots/external/0f046dea611f6c9e90b8eaed720f22af372394971808e2a5d1b3a12286f1ec76.html @@ -264,7 +264,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/46e56f39b10d1e8ee4017bc11457bf76d169fc80b3d3e465213671b7f6e548eb.html b/tests/snapshots/external/13334b5b4fcf7267539b9eb99ca2ab79c66766ec6f35383f4bfcb6a8d9e2a116.html similarity index 94% rename from tests/snapshots/external/46e56f39b10d1e8ee4017bc11457bf76d169fc80b3d3e465213671b7f6e548eb.html rename to tests/snapshots/external/13334b5b4fcf7267539b9eb99ca2ab79c66766ec6f35383f4bfcb6a8d9e2a116.html index 36f35fb4..a7eb7dce 100644 --- a/tests/snapshots/external/46e56f39b10d1e8ee4017bc11457bf76d169fc80b3d3e465213671b7f6e548eb.html +++ b/tests/snapshots/external/13334b5b4fcf7267539b9eb99ca2ab79c66766ec6f35383f4bfcb6a8d9e2a116.html @@ -78,7 +78,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/981438492e387bc82b23f09e3c5e0b452db5a1ffd88e52479db2b52a170fd8f9.html b/tests/snapshots/external/14bca0e5703be9cab876200d88cccd1d728d1bdfef7cbfac751af212e00a8663.html similarity index 98% rename from tests/snapshots/external/981438492e387bc82b23f09e3c5e0b452db5a1ffd88e52479db2b52a170fd8f9.html rename to tests/snapshots/external/14bca0e5703be9cab876200d88cccd1d728d1bdfef7cbfac751af212e00a8663.html index 574ec87c..b2490df7 100644 --- a/tests/snapshots/external/981438492e387bc82b23f09e3c5e0b452db5a1ffd88e52479db2b52a170fd8f9.html +++ b/tests/snapshots/external/14bca0e5703be9cab876200d88cccd1d728d1bdfef7cbfac751af212e00a8663.html @@ -264,7 +264,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/e6a9b76f268cde81a129e7273038db0ff3fcd73530442a30c48cf01dcbc30aaa.html b/tests/snapshots/external/19f98a747c015a074f3d3362d03ed72f9da9db3aefe969a0d78c4052e7594372.html similarity index 97% rename from tests/snapshots/external/e6a9b76f268cde81a129e7273038db0ff3fcd73530442a30c48cf01dcbc30aaa.html rename to tests/snapshots/external/19f98a747c015a074f3d3362d03ed72f9da9db3aefe969a0d78c4052e7594372.html index dbcf8c57..9058ed13 100644 --- a/tests/snapshots/external/e6a9b76f268cde81a129e7273038db0ff3fcd73530442a30c48cf01dcbc30aaa.html +++ b/tests/snapshots/external/19f98a747c015a074f3d3362d03ed72f9da9db3aefe969a0d78c4052e7594372.html @@ -264,7 +264,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/955e5111f4262f280b0787a22dfa46c9ea93c80bc49e1a1de100349341d93fb9.html b/tests/snapshots/external/261a38d7a86b5e959b6d1c165108301963d0170c2189d5aa18bb7c7eade84ea4.html similarity index 64% rename from tests/snapshots/external/955e5111f4262f280b0787a22dfa46c9ea93c80bc49e1a1de100349341d93fb9.html rename to tests/snapshots/external/261a38d7a86b5e959b6d1c165108301963d0170c2189d5aa18bb7c7eade84ea4.html index ee00ece7..2170787f 100644 --- a/tests/snapshots/external/955e5111f4262f280b0787a22dfa46c9ea93c80bc49e1a1de100349341d93fb9.html +++ b/tests/snapshots/external/261a38d7a86b5e959b6d1c165108301963d0170c2189d5aa18bb7c7eade84ea4.html @@ -36,7 +36,7 @@ <h3 class="doc doc-heading" id="signature_package.Class.__init__"> </span> </h3> <div class="doc-signature highlight"> - <pre><span></span><code><span class="fm">__init__</span><span class="p">(</span><span class="nf">a</span><span class="p">:</span> <span class="n"><autoref identifier="int" optional="">int</autoref></span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n"><autoref identifier="str" optional="">str</autoref></span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span> + <pre><span></span><code><span class="fm">__init__</span><span class="p">(</span><span class="nf">a</span><span class="p">:</span> <span class="n"><autoref backlink-anchor="signature_package.Class.__init__" backlink-type="used-by" identifier="int" optional="">int</autoref></span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n"><autoref backlink-anchor="signature_package.Class.__init__" backlink-type="used-by" identifier="str" optional="">str</autoref></span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span> </code></pre> </div> <div class="doc doc-contents"> @@ -56,7 +56,7 @@ <h3 class="doc doc-heading" id="signature_package.Class.method1"> </span> </h3> <div class="doc-signature highlight"> - <pre><span></span><code><span class="nf">method1</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n"><autoref identifier="int" optional="">int</autoref></span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n"><autoref identifier="str" optional="">str</autoref></span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span> + <pre><span></span><code><span class="nf">method1</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n"><autoref backlink-anchor="signature_package.Class.method1" backlink-type="used-by" identifier="int" optional="">int</autoref></span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n"><autoref backlink-anchor="signature_package.Class.method1" backlink-type="used-by" identifier="str" optional="">str</autoref></span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span> </code></pre> </div> <div class="doc doc-contents"> @@ -79,7 +79,7 @@ <h2 class="doc doc-heading" id="signature_package.module_function"> </span> </h2> <div class="doc-signature highlight"> - <pre><span></span><code><span class="nf">module_function</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n"><autoref identifier="int" optional="">int</autoref></span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n"><autoref identifier="str" optional="">str</autoref></span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span> + <pre><span></span><code><span class="nf">module_function</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n"><autoref backlink-anchor="signature_package.module_function" backlink-type="used-by" identifier="int" optional="">int</autoref></span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n"><autoref backlink-anchor="signature_package.module_function" backlink-type="used-by" identifier="str" optional="">str</autoref></span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span> </code></pre> </div> <div class="doc doc-contents"> diff --git a/tests/snapshots/external/7c988c9e13efeadd20b911a95cc69973b715cceacdadefc540109aad3c274bde.html b/tests/snapshots/external/34b16654e7baa8e16315cef2919f2eafa51ba39ec28c4c970fe7ea8e2c79f9d2.html similarity index 98% rename from tests/snapshots/external/7c988c9e13efeadd20b911a95cc69973b715cceacdadefc540109aad3c274bde.html rename to tests/snapshots/external/34b16654e7baa8e16315cef2919f2eafa51ba39ec28c4c970fe7ea8e2c79f9d2.html index 10b98188..8357168e 100644 --- a/tests/snapshots/external/7c988c9e13efeadd20b911a95cc69973b715cceacdadefc540109aad3c274bde.html +++ b/tests/snapshots/external/34b16654e7baa8e16315cef2919f2eafa51ba39ec28c4c970fe7ea8e2c79f9d2.html @@ -266,7 +266,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/728c1344630190ac84514ebd8e5ae2d95ba8685e16d2c79749f675b5b2a6cea5.html b/tests/snapshots/external/3935bcf6d71b58daa0e4512cbf3f53e19516885fb65d0bd760c12aadd021507f.html similarity index 97% rename from tests/snapshots/external/728c1344630190ac84514ebd8e5ae2d95ba8685e16d2c79749f675b5b2a6cea5.html rename to tests/snapshots/external/3935bcf6d71b58daa0e4512cbf3f53e19516885fb65d0bd760c12aadd021507f.html index d6ac202a..793f43a4 100644 --- a/tests/snapshots/external/728c1344630190ac84514ebd8e5ae2d95ba8685e16d2c79749f675b5b2a6cea5.html +++ b/tests/snapshots/external/3935bcf6d71b58daa0e4512cbf3f53e19516885fb65d0bd760c12aadd021507f.html @@ -235,7 +235,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/052c34f22e4c711b1f13f53085cdd5e8edcfae4bdc1d8cb7f2ff76cd1c46cce5.html b/tests/snapshots/external/3c21330afd6529769164afe388e9385a9fddb3ae628124965e0c7b81932a0c63.html similarity index 94% rename from tests/snapshots/external/052c34f22e4c711b1f13f53085cdd5e8edcfae4bdc1d8cb7f2ff76cd1c46cce5.html rename to tests/snapshots/external/3c21330afd6529769164afe388e9385a9fddb3ae628124965e0c7b81932a0c63.html index e1a7d15c..26cb9e39 100644 --- a/tests/snapshots/external/052c34f22e4c711b1f13f53085cdd5e8edcfae4bdc1d8cb7f2ff76cd1c46cce5.html +++ b/tests/snapshots/external/3c21330afd6529769164afe388e9385a9fddb3ae628124965e0c7b81932a0c63.html @@ -78,7 +78,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/ae74b5980f9b6996ed6e112d53168fde16c32d92bed42fb3193f98e0e3f04602.html b/tests/snapshots/external/43d819f94dc7cafe9ed60ce604bab9a938f42a115dc534cb72d12e15e998e96d.html similarity index 98% rename from tests/snapshots/external/ae74b5980f9b6996ed6e112d53168fde16c32d92bed42fb3193f98e0e3f04602.html rename to tests/snapshots/external/43d819f94dc7cafe9ed60ce604bab9a938f42a115dc534cb72d12e15e998e96d.html index 34123ecf..ddce47f6 100644 --- a/tests/snapshots/external/ae74b5980f9b6996ed6e112d53168fde16c32d92bed42fb3193f98e0e3f04602.html +++ b/tests/snapshots/external/43d819f94dc7cafe9ed60ce604bab9a938f42a115dc534cb72d12e15e998e96d.html @@ -266,7 +266,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/e8be7a9b1410e40dac79fe0ee29d3036e707a177b2ba2bdad25a6998bec570b7.html b/tests/snapshots/external/722165bce3ada19df43b169ea982ab4908d94cd1bf19b777e1e6bc22e8aa02a5.html similarity index 98% rename from tests/snapshots/external/e8be7a9b1410e40dac79fe0ee29d3036e707a177b2ba2bdad25a6998bec570b7.html rename to tests/snapshots/external/722165bce3ada19df43b169ea982ab4908d94cd1bf19b777e1e6bc22e8aa02a5.html index 3dbd9879..7c65c72b 100644 --- a/tests/snapshots/external/e8be7a9b1410e40dac79fe0ee29d3036e707a177b2ba2bdad25a6998bec570b7.html +++ b/tests/snapshots/external/722165bce3ada19df43b169ea982ab4908d94cd1bf19b777e1e6bc22e8aa02a5.html @@ -264,7 +264,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/7d5fe66539191786245991395e77d8ba0bbb22330cb08eaec2e84159bde4159b.html b/tests/snapshots/external/75b69b702f3b5fa3bc0d30091297b0a09a8915eb7f0e1f7be1ce99f5d59d9514.html similarity index 98% rename from tests/snapshots/external/7d5fe66539191786245991395e77d8ba0bbb22330cb08eaec2e84159bde4159b.html rename to tests/snapshots/external/75b69b702f3b5fa3bc0d30091297b0a09a8915eb7f0e1f7be1ce99f5d59d9514.html index 23e38eeb..fa970eca 100644 --- a/tests/snapshots/external/7d5fe66539191786245991395e77d8ba0bbb22330cb08eaec2e84159bde4159b.html +++ b/tests/snapshots/external/75b69b702f3b5fa3bc0d30091297b0a09a8915eb7f0e1f7be1ce99f5d59d9514.html @@ -266,7 +266,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/b4b490164ab1a724cac7aba25bbc69a33e7dd44500e9337718cd96da1bb56325.html b/tests/snapshots/external/84193b3c9f5d84fef33daa61fb61aa9a3e66171d312de8d7f836c69f0bc069b0.html similarity index 97% rename from tests/snapshots/external/b4b490164ab1a724cac7aba25bbc69a33e7dd44500e9337718cd96da1bb56325.html rename to tests/snapshots/external/84193b3c9f5d84fef33daa61fb61aa9a3e66171d312de8d7f836c69f0bc069b0.html index 9f5cbef9..07120341 100644 --- a/tests/snapshots/external/b4b490164ab1a724cac7aba25bbc69a33e7dd44500e9337718cd96da1bb56325.html +++ b/tests/snapshots/external/84193b3c9f5d84fef33daa61fb61aa9a3e66171d312de8d7f836c69f0bc069b0.html @@ -266,7 +266,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/ba51e100acd4f6ad91f1ef484aa5f1bd537e661588b1742d93d0a6543cc3592c.html b/tests/snapshots/external/8733f7fb7b6d28b15bbe736f29c7fd030467c0ccfa2cbc6a68616e06c6dc6a9b.html similarity index 98% rename from tests/snapshots/external/ba51e100acd4f6ad91f1ef484aa5f1bd537e661588b1742d93d0a6543cc3592c.html rename to tests/snapshots/external/8733f7fb7b6d28b15bbe736f29c7fd030467c0ccfa2cbc6a68616e06c6dc6a9b.html index b18eb50e..cb43eee6 100644 --- a/tests/snapshots/external/ba51e100acd4f6ad91f1ef484aa5f1bd537e661588b1742d93d0a6543cc3592c.html +++ b/tests/snapshots/external/8733f7fb7b6d28b15bbe736f29c7fd030467c0ccfa2cbc6a68616e06c6dc6a9b.html @@ -235,7 +235,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/0c2924ff976fa0e32ba66558a4f9e1eff4cd66196506a37977cdb33325a50718.html b/tests/snapshots/external/9720526cf5e4c44f27695c59764bb1e05e428834744442f43527ebf2b8acfb35.html similarity index 98% rename from tests/snapshots/external/0c2924ff976fa0e32ba66558a4f9e1eff4cd66196506a37977cdb33325a50718.html rename to tests/snapshots/external/9720526cf5e4c44f27695c59764bb1e05e428834744442f43527ebf2b8acfb35.html index 5fb3da58..6d460dd2 100644 --- a/tests/snapshots/external/0c2924ff976fa0e32ba66558a4f9e1eff4cd66196506a37977cdb33325a50718.html +++ b/tests/snapshots/external/9720526cf5e4c44f27695c59764bb1e05e428834744442f43527ebf2b8acfb35.html @@ -268,7 +268,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/0b1372d7f7c057905f665ad506f3dd3bee62fb9b1c8b2a39991550e7845c2b02.html b/tests/snapshots/external/c0f102dbd7d4de76de40c06a8205a642465f5fde9a37b4b969aa01f161ef25a4.html similarity index 98% rename from tests/snapshots/external/0b1372d7f7c057905f665ad506f3dd3bee62fb9b1c8b2a39991550e7845c2b02.html rename to tests/snapshots/external/c0f102dbd7d4de76de40c06a8205a642465f5fde9a37b4b969aa01f161ef25a4.html index 89a3ea1e..e9f375b2 100644 --- a/tests/snapshots/external/0b1372d7f7c057905f665ad506f3dd3bee62fb9b1c8b2a39991550e7845c2b02.html +++ b/tests/snapshots/external/c0f102dbd7d4de76de40c06a8205a642465f5fde9a37b4b969aa01f161ef25a4.html @@ -264,7 +264,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/052e71e7e9d5bec710fb2d36b009122c48eca0a19d0611df530e607f5bacdf6f.html b/tests/snapshots/external/cd3e458517147c43c360525140aa1b9a81682634aaf2674ffd4cceb7fc44aba6.html similarity index 94% rename from tests/snapshots/external/052e71e7e9d5bec710fb2d36b009122c48eca0a19d0611df530e607f5bacdf6f.html rename to tests/snapshots/external/cd3e458517147c43c360525140aa1b9a81682634aaf2674ffd4cceb7fc44aba6.html index 6866b45f..e196b599 100644 --- a/tests/snapshots/external/052e71e7e9d5bec710fb2d36b009122c48eca0a19d0611df530e607f5bacdf6f.html +++ b/tests/snapshots/external/cd3e458517147c43c360525140aa1b9a81682634aaf2674ffd4cceb7fc44aba6.html @@ -78,7 +78,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/d540895f6bf91c8c8e4abc02f40529a61c6cec71b18da2e4f02206ec18b901ef.html b/tests/snapshots/external/cd51e40cc0ddf1d42b7c6bf7560ead2501370ee9d67499b74afc83e258caff8e.html similarity index 98% rename from tests/snapshots/external/d540895f6bf91c8c8e4abc02f40529a61c6cec71b18da2e4f02206ec18b901ef.html rename to tests/snapshots/external/cd51e40cc0ddf1d42b7c6bf7560ead2501370ee9d67499b74afc83e258caff8e.html index 2ad1c277..a52964c3 100644 --- a/tests/snapshots/external/d540895f6bf91c8c8e4abc02f40529a61c6cec71b18da2e4f02206ec18b901ef.html +++ b/tests/snapshots/external/cd51e40cc0ddf1d42b7c6bf7560ead2501370ee9d67499b74afc83e258caff8e.html @@ -266,7 +266,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/cdc8126d78b690d11c09e3128df0f8d65379375a6bd390da30f5676bf2289cf2.html b/tests/snapshots/external/d556527026068280df9b77db277472320842cb1ae6099ac3cf558031afda6d2e.html similarity index 97% rename from tests/snapshots/external/cdc8126d78b690d11c09e3128df0f8d65379375a6bd390da30f5676bf2289cf2.html rename to tests/snapshots/external/d556527026068280df9b77db277472320842cb1ae6099ac3cf558031afda6d2e.html index 158c1ca5..5a87832a 100644 --- a/tests/snapshots/external/cdc8126d78b690d11c09e3128df0f8d65379375a6bd390da30f5676bf2289cf2.html +++ b/tests/snapshots/external/d556527026068280df9b77db277472320842cb1ae6099ac3cf558031afda6d2e.html @@ -235,7 +235,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/347d4ffe2cb3f2ca3f0d1f3f09cffa96645eb2af29983e75d807fccff96d8f75.html b/tests/snapshots/external/dcf34c2f72697f7a4700e4a1f048d601f374eab35eea68c9beb8bab8fc269aed.html similarity index 97% rename from tests/snapshots/external/347d4ffe2cb3f2ca3f0d1f3f09cffa96645eb2af29983e75d807fccff96d8f75.html rename to tests/snapshots/external/dcf34c2f72697f7a4700e4a1f048d601f374eab35eea68c9beb8bab8fc269aed.html index 9cd4b2fe..2d79edd5 100644 --- a/tests/snapshots/external/347d4ffe2cb3f2ca3f0d1f3f09cffa96645eb2af29983e75d807fccff96d8f75.html +++ b/tests/snapshots/external/dcf34c2f72697f7a4700e4a1f048d601f374eab35eea68c9beb8bab8fc269aed.html @@ -264,7 +264,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/f848d4a9e516beeb1b1719630e34aa243a093ccd362a63e33dbd6202ae8ab75d.html b/tests/snapshots/external/e5dc372374af6f90a5d456d8683aacdf81104137ce91bd6d4121827f8d989d96.html similarity index 98% rename from tests/snapshots/external/f848d4a9e516beeb1b1719630e34aa243a093ccd362a63e33dbd6202ae8ab75d.html rename to tests/snapshots/external/e5dc372374af6f90a5d456d8683aacdf81104137ce91bd6d4121827f8d989d96.html index 19c29b39..d9ae307d 100644 --- a/tests/snapshots/external/f848d4a9e516beeb1b1719630e34aa243a093ccd362a63e33dbd6202ae8ab75d.html +++ b/tests/snapshots/external/e5dc372374af6f90a5d456d8683aacdf81104137ce91bd6d4121827f8d989d96.html @@ -266,7 +266,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/a1167b14f5a71a283817bf5866d2bb0bd08bf23dc054c6f7938a04f42feab99d.html b/tests/snapshots/external/e8608b0de174402ca18f88ed58849312158c22f5bfdc845d2da02055fe14853c.html similarity index 95% rename from tests/snapshots/external/a1167b14f5a71a283817bf5866d2bb0bd08bf23dc054c6f7938a04f42feab99d.html rename to tests/snapshots/external/e8608b0de174402ca18f88ed58849312158c22f5bfdc845d2da02055fe14853c.html index bb9001d8..795378be 100644 --- a/tests/snapshots/external/a1167b14f5a71a283817bf5866d2bb0bd08bf23dc054c6f7938a04f42feab99d.html +++ b/tests/snapshots/external/e8608b0de174402ca18f88ed58849312158c22f5bfdc845d2da02055fe14853c.html @@ -80,7 +80,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/cc19537fdba4a26b10c60d5586b0eb7ef0264a783a3c47d1114d21fa8cfa3947.html b/tests/snapshots/external/ea914f1afa9de4b5eddc9792c2b6a5d8de367274278976092bb824e99e523ca5.html similarity index 98% rename from tests/snapshots/external/cc19537fdba4a26b10c60d5586b0eb7ef0264a783a3c47d1114d21fa8cfa3947.html rename to tests/snapshots/external/ea914f1afa9de4b5eddc9792c2b6a5d8de367274278976092bb824e99e523ca5.html index f93ae024..68c7d720 100644 --- a/tests/snapshots/external/cc19537fdba4a26b10c60d5586b0eb7ef0264a783a3c47d1114d21fa8cfa3947.html +++ b/tests/snapshots/external/ea914f1afa9de4b5eddc9792c2b6a5d8de367274278976092bb824e99e523ca5.html @@ -264,7 +264,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/a2c5be9bd5d1f0db3ff64b44353c1760f5eb69d7db6401da2f28518d0e8065c4.html b/tests/snapshots/external/eac5bee59a9ee0a64602fd6bb8f4f54cb5f3543aa321169921326288a61f556c.html similarity index 97% rename from tests/snapshots/external/a2c5be9bd5d1f0db3ff64b44353c1760f5eb69d7db6401da2f28518d0e8065c4.html rename to tests/snapshots/external/eac5bee59a9ee0a64602fd6bb8f4f54cb5f3543aa321169921326288a61f556c.html index 4738a584..7c90168c 100644 --- a/tests/snapshots/external/a2c5be9bd5d1f0db3ff64b44353c1760f5eb69d7db6401da2f28518d0e8065c4.html +++ b/tests/snapshots/external/eac5bee59a9ee0a64602fd6bb8f4f54cb5f3543aa321169921326288a61f556c.html @@ -264,7 +264,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/83119803338105f101311992d31947e4fcaf2c5a6c68cad6355d8611c1cc2e3f.html b/tests/snapshots/external/f4150843096a1371b097478f8d67062e3d45ab9f6a8f97e79ae62d32abc5e22a.html similarity index 97% rename from tests/snapshots/external/83119803338105f101311992d31947e4fcaf2c5a6c68cad6355d8611c1cc2e3f.html rename to tests/snapshots/external/f4150843096a1371b097478f8d67062e3d45ab9f6a8f97e79ae62d32abc5e22a.html index c9c637e4..cce2be49 100644 --- a/tests/snapshots/external/83119803338105f101311992d31947e4fcaf2c5a6c68cad6355d8611c1cc2e3f.html +++ b/tests/snapshots/external/f4150843096a1371b097478f8d67062e3d45ab9f6a8f97e79ae62d32abc5e22a.html @@ -264,7 +264,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/59a9e1ffb2f0807b594a933444c78753a06f359527ea4adac85c72a7812b21d3.html b/tests/snapshots/external/fca72854c849dc68c3ad072a41c32f926f95c6e88775f3e2eeaa63138d99837c.html similarity index 97% rename from tests/snapshots/external/59a9e1ffb2f0807b594a933444c78753a06f359527ea4adac85c72a7812b21d3.html rename to tests/snapshots/external/fca72854c849dc68c3ad072a41c32f926f95c6e88775f3e2eeaa63138d99837c.html index ad60041c..d6c51063 100644 --- a/tests/snapshots/external/59a9e1ffb2f0807b594a933444c78753a06f359527ea4adac85c72a7812b21d3.html +++ b/tests/snapshots/external/fca72854c849dc68c3ad072a41c32f926f95c6e88775f3e2eeaa63138d99837c.html @@ -264,7 +264,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/88855b0284174733b57edd2043e0e8cd6a1a0223055f08b80031452eb05d9484.html b/tests/snapshots/external/fd291f98ca28b8f15b5a8ed6a2608bacf5b5322599bcbf0544ef8e9c0a27870b.html similarity index 97% rename from tests/snapshots/external/88855b0284174733b57edd2043e0e8cd6a1a0223055f08b80031452eb05d9484.html rename to tests/snapshots/external/fd291f98ca28b8f15b5a8ed6a2608bacf5b5322599bcbf0544ef8e9c0a27870b.html index 540a2f6a..91614cf0 100644 --- a/tests/snapshots/external/88855b0284174733b57edd2043e0e8cd6a1a0223055f08b80031452eb05d9484.html +++ b/tests/snapshots/external/fd291f98ca28b8f15b5a8ed6a2608bacf5b5322599bcbf0544ef8e9c0a27870b.html @@ -264,7 +264,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/3d072a22b9513eecb51c6a5f39b978c1c1d3ef56a572031a307fe1cad1f17eff.html b/tests/snapshots/external/fe1cd23642d405d0b2a4d29ec4a2125f55b54f90c2440ee2d856540415e77745.html similarity index 97% rename from tests/snapshots/external/3d072a22b9513eecb51c6a5f39b978c1c1d3ef56a572031a307fe1cad1f17eff.html rename to tests/snapshots/external/fe1cd23642d405d0b2a4d29ec4a2125f55b54f90c2440ee2d856540415e77745.html index f950f69b..dce4e148 100644 --- a/tests/snapshots/external/3d072a22b9513eecb51c6a5f39b978c1c1d3ef56a572031a307fe1cad1f17eff.html +++ b/tests/snapshots/external/fe1cd23642d405d0b2a4d29ec4a2125f55b54f90c2440ee2d856540415e77745.html @@ -237,7 +237,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/snapshots/external/0fac4f5e7f455b351c60268567bfcbd0259b652d0534259efea7815aa15b1122.html b/tests/snapshots/external/fe25ab7600392b4fd3a1438fb54337041719faac884123527bab9a92e3a51be5.html similarity index 97% rename from tests/snapshots/external/0fac4f5e7f455b351c60268567bfcbd0259b652d0534259efea7815aa15b1122.html rename to tests/snapshots/external/fe25ab7600392b4fd3a1438fb54337041719faac884123527bab9a92e3a51be5.html index 47cfb56f..40ebfa36 100644 --- a/tests/snapshots/external/0fac4f5e7f455b351c60268567bfcbd0259b652d0534259efea7815aa15b1122.html +++ b/tests/snapshots/external/fe25ab7600392b4fd3a1438fb54337041719faac884123527bab9a92e3a51be5.html @@ -266,7 +266,7 @@ <h2 class="doc doc-heading" id="members_package.Subclass"> <p class="doc doc-class-bases"> Bases: <code> - <autoref hover="" identifier="members_package.Class" optional=""> + <autoref backlink-anchor="members_package.Subclass" backlink-type="subclassed-by" hover="" identifier="members_package.Class" optional=""> Class </autoref> </code> diff --git a/tests/test_handler.py b/tests/test_handler.py index 4d8b4f3d..1a907469 100644 --- a/tests/test_handler.py +++ b/tests/test_handler.py @@ -263,7 +263,7 @@ def test_deduplicate_summary_sections(handler: PythonHandler, section: str, code """Assert summary sections are deduplicated.""" summary_section = section.lower() summary_section = "functions" if summary_section == "methods" else summary_section - with temporary_visited_module(code, docstring_parser="google") as module: # type: ignore[arg-type] + with temporary_visited_module(code, docstring_parser="google") as module: if summary_section == "modules": module.set_member("a", Module("A", docstring=Docstring("A."))) module.set_member("b", Module("B", docstring=Docstring("B.")))