From 5035e9269fe11664fd25e438ac8f746721b3de0a Mon Sep 17 00:00:00 2001 From: Waylan Limberg Date: Tue, 31 Oct 2023 15:26:07 -0400 Subject: [PATCH 001/243] fix: Make extension paths relative to config file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #112: https://github.com/mkdocstrings/python/pull/112 Co-authored-by: Timothée Mazzucotelli --- src/mkdocstrings_handlers/python/handler.py | 34 ++++++++++++++++-- tests/test_handler.py | 40 +++++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/mkdocstrings_handlers/python/handler.py b/src/mkdocstrings_handlers/python/handler.py index 056429e8..169546fd 100644 --- a/src/mkdocstrings_handlers/python/handler.py +++ b/src/mkdocstrings_handlers/python/handler.py @@ -9,7 +9,7 @@ import sys from collections import ChainMap from contextlib import suppress -from typing import TYPE_CHECKING, Any, BinaryIO, ClassVar, Iterator, Mapping +from typing import TYPE_CHECKING, Any, BinaryIO, ClassVar, Iterator, Mapping, Sequence from griffe.collections import LinesCollection, ModulesCollection from griffe.docstrings.parsers import Parser @@ -265,8 +265,9 @@ def collect(self, identifier: str, config: Mapping[str, Any]) -> CollectorItem: parser = parser_name and Parser(parser_name) if unknown_module: + extensions = self.normalize_extension_paths(final_config.get("extensions", [])) loader = GriffeLoader( - extensions=load_extensions(final_config.get("extensions", [])), + extensions=load_extensions(extensions), search_paths=self._paths, docstring_parser=parser, docstring_options=parser_options, @@ -369,6 +370,35 @@ def get_anchors(self, data: CollectorItem) -> tuple[str, ...]: # noqa: D102 (ig return tuple(anchors) return tuple(anchors) + def normalize_extension_paths(self, extensions: Sequence) -> Sequence: + """Resolve extension paths relative to config file.""" + if self._config_file_path is None: + return extensions + + base_path = os.path.dirname(self._config_file_path) + normalized = [] + + for ext in extensions: + if isinstance(ext, dict): + pth, options = next(iter(ext.items())) + pth = str(pth) + else: + pth = str(ext) + options = None + + if pth.endswith(".py") or ".py:" in pth or "/" in pth or "\\" in pth: # noqa: SIM102 + # This is a sytem path. Normalize it. + if not os.path.isabs(pth): + # Make path absolute relative to config file path. + pth = os.path.normpath(os.path.join(base_path, pth)) + + if options is not None: + normalized.append({pth: options}) + else: + normalized.append(pth) + + return normalized + def get_handler( *, diff --git a/tests/test_handler.py b/tests/test_handler.py index 4971e132..e1d92c18 100644 --- a/tests/test_handler.py +++ b/tests/test_handler.py @@ -105,3 +105,43 @@ def test_expand_globs_without_changing_directory() -> None: ) for path in list(glob(os.path.abspath(".") + "/*.md")): assert path in handler._paths + + +@pytest.mark.parametrize( + ("expect_change", "extension"), + [ + (True, "extension.py"), + (True, "extension.py:SomeExtension"), + (True, "path/to/extension.py"), + (True, "path/to/extension.py:SomeExtension"), + (True, {"extension.py": {"option": "value"}}), + (True, {"extension.py:SomeExtension": {"option": "value"}}), + (True, {"path/to/extension.py": {"option": "value"}}), + (True, {"path/to/extension.py:SomeExtension": {"option": "value"}}), + (False, "/absolute/path/to/extension.py"), + (False, "/absolute/path/to/extension.py:SomeExtension"), + (False, {"/absolute/path/to/extension.py": {"option": "value"}}), + (False, {"/absolute/path/to/extension.py:SomeExtension": {"option": "value"}}), + (False, "dot.notation.path.to.extension"), + (False, "dot.notation.path.to.pyextension"), + (False, {"dot.notation.path.to.extension": {"option": "value"}}), + (False, {"dot.notation.path.to.pyextension": {"option": "value"}}), + ], +) +def test_extension_paths(tmp_path: Path, expect_change: bool, extension: str | dict) -> None: + """Assert extension paths are resolved relative to config file.""" + handler = get_handler( + theme="material", + config_file_path=str(tmp_path.joinpath("mkdocs.yml")), + ) + normalized = handler.normalize_extension_paths([extension])[0] + if expect_change: + if isinstance(normalized, str) and isinstance(extension, str): + assert normalized == str(tmp_path.joinpath(extension)) + elif isinstance(normalized, dict) and isinstance(extension, dict): + pth, options = next(iter(extension.items())) + assert normalized == {str(tmp_path.joinpath(pth)): options} + else: + raise ValueError("Normalization must not change extension items type") + else: + assert normalized == extension From a9078a020e984f7d94e531644e613c08a5fc35ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Sun, 12 Nov 2023 18:03:31 +0100 Subject: [PATCH 002/243] tests: Modernize test fixtures --- tests/conftest.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 0801ec0b..1c1a1c54 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,12 +7,12 @@ import pytest from markdown.core import Markdown -from mkdocs import config -from mkdocs.config.defaults import get_schema +from mkdocs.config.defaults import MkDocsConfig if TYPE_CHECKING: from pathlib import Path + from mkdocs import config from mkdocstrings.plugin import MkdocstringsPlugin from mkdocstrings_handlers.python.handler import PythonHandler @@ -29,12 +29,11 @@ def fixture_mkdocs_conf(request: pytest.FixtureRequest, tmp_path: Path) -> Itera Yields: MkDocs config. """ - conf = config.Config(schema=get_schema()) # type: ignore[call-arg] + conf = MkDocsConfig() while hasattr(request, "_parent_request") and hasattr(request._parent_request, "_parent_request"): request = request._parent_request conf_dict = { - "config_file_path": "mkdocs.yml", "site_name": "foo", "site_url": "https://example.org/", "site_dir": str(tmp_path), From 574b234ec4d13dfde5ec906b356c71c3fcd63843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Sun, 12 Nov 2023 18:20:12 +0100 Subject: [PATCH 003/243] chore: Template upgrade --- .copier-answers.yml | 4 +- .github/ISSUE_TEMPLATE/bug_report.md | 73 +++++++---- .github/ISSUE_TEMPLATE/config.yml | 5 + .github/ISSUE_TEMPLATE/feature_request.md | 23 ++-- CONTRIBUTING.md | 5 +- Makefile | 3 +- README.md | 2 +- config/git-changelog.toml | 8 ++ config/ruff.toml | 3 + config/vscode/launch.json | 36 ++++++ config/vscode/settings.json | 52 ++++++++ config/vscode/tasks.json | 93 ++++++++++++++ docs/css/insiders.css | 5 +- docs/insiders/index.md | 3 - duties.py | 142 ++++++++++------------ mkdocs.insiders.yml | 4 - mkdocs.yml | 11 +- pyproject.toml | 43 ++++--- scripts/gen_credits.py | 19 ++- scripts/gen_ref_nav.py | 10 +- scripts/insiders.py | 6 +- src/mkdocstrings_handlers/debug.py | 106 ++++++++++++++++ 22 files changed, 496 insertions(+), 160 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 config/git-changelog.toml create mode 100644 config/vscode/launch.json create mode 100644 config/vscode/settings.json create mode 100644 config/vscode/tasks.json delete mode 100644 mkdocs.insiders.yml create mode 100644 src/mkdocstrings_handlers/debug.py diff --git a/.copier-answers.yml b/.copier-answers.yml index da168350..58ab94af 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: 0.16.10 +_commit: 1.1.3 _src_path: gh:pawamoy/copier-pdm author_email: pawamoy@pm.me author_fullname: Timothée Mazzucotelli @@ -9,8 +9,10 @@ copyright_holder: Timothée Mazzucotelli copyright_holder_email: pawamoy@pm.me copyright_license: ISC License insiders: true +insiders_repository_name: mkdocstrings-python project_description: A Python handler for mkdocstrings. project_name: mkdocstrings-python +public_release: true python_package_command_line_name: '' python_package_distribution_name: mkdocstrings-python python_package_import_name: mkdocstrings_handlers diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index ad93416e..ac47315f 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,32 +1,61 @@ --- name: Bug report -about: Create a report to help us improve -title: '' +about: Create a bug report to help us improve. +title: "bug: " labels: unconfirmed -assignees: '' - +assignees: [pawamoy] --- -**Describe the bug** -A clear and concise description of what the bug is. +### Description of the bug + + +### To Reproduce + + +``` +WRITE MRE / INSTRUCTIONS HERE +``` + +### Full traceback + + +
Full traceback + +```python +PASTE TRACEBACK HERE +``` + +
-**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Run command '...' -3. Scroll down to '...' -4. See error +### Expected behavior + -**Expected behavior** -A clear and concise description of what you expected to happen. +### Environment information + -**Screenshots** -If applicable, add screenshots to help explain your problem. +```bash +python -m mkdocstrings_handlers.debug # | xclip -selection clipboard +``` -**System (please complete the following information):** -- `mkdocstrings-python` version: [e.g. 0.2.1] -- Python version: [e.g. 3.8] -- OS: [Windows/Linux] +PASTE OUTPUT HERE -**Additional context** -Add any other context about the problem here. +### Additional context + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..9c9765bc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: +- name: I have a question / I need help + url: https://github.com/mkdocstrings/python/discussions/new?category=q-a + about: Ask and answer questions in the Discussions tab. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 4fe86d5e..2df98fbc 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,20 +1,19 @@ --- name: Feature request -about: Suggest an idea for this project -title: '' +about: Suggest an idea for this project. +title: "feature: " labels: feature -assignees: '' - +assignees: pawamoy --- -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] +### Is your feature request related to a problem? Please describe. + -**Describe the solution you'd like** -A clear and concise description of what you want to happen. +### Describe the solution you'd like + -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. +### Describe alternatives you've considered + -**Additional context** -Add any other context or screenshots about the feature request here. +### Additional context + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0dafa847..dfe5a910 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,8 +44,9 @@ on multiple Python versions, you run the task directly with `pdm run duty TASK`. The Makefile detects if a virtual environment is activated, so `make` will work the same with the virtualenv activated or not. -If you work in VSCode, -[see examples of tasks and run configurations](https://pawamoy.github.io/copier-pdm/work/#vscode-setup). +If you work in VSCode, we provide +[an action to configure VSCode](https://pawamoy.github.io/copier-pdm/work/#vscode-setup) +for the project. ## Development diff --git a/Makefile b/Makefile index 7e8de7cc..437880eb 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,8 @@ BASIC_DUTIES = \ docs \ docs-deploy \ format \ - release + release \ + vscode QUALITY_DUTIES = \ check-quality \ diff --git a/README.md b/README.md index 7535de03..6b3afb5f 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ gitpod - + gitter

diff --git a/config/git-changelog.toml b/config/git-changelog.toml new file mode 100644 index 00000000..44e2b1fb --- /dev/null +++ b/config/git-changelog.toml @@ -0,0 +1,8 @@ +bump = "auto" +convention = "angular" +in-place = true +output = "CHANGELOG.md" +parse-refs = false +parse-trailers = true +sections = ["build", "deps", "feat", "fix", "refactor"] +template = "keepachangelog" diff --git a/config/ruff.toml b/config/ruff.toml index 9925518c..99efa62b 100644 --- a/config/ruff.toml +++ b/config/ruff.toml @@ -77,6 +77,9 @@ ignore = [ "src/*/cli.py" = [ "T201", # Print statement ] +"src/*/debug.py" = [ + "T201", # Print statement +] "scripts/*.py" = [ "INP001", # File is part of an implicit namespace package "T201", # Print statement diff --git a/config/vscode/launch.json b/config/vscode/launch.json new file mode 100644 index 00000000..2e0d651e --- /dev/null +++ b/config/vscode/launch.json @@ -0,0 +1,36 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "python (current file)", + "type": "python", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal", + "justMyCode": false + }, + { + "name": "test", + "type": "python", + "request": "launch", + "module": "pytest", + "justMyCode": false, + "args": [ + "-c=config/pytest.ini", + "-vvv", + "--no-cov", + "--dist=no", + "tests", + "-k=${input:tests_selection}" + ] + } + ], + "inputs": [ + { + "id": "tests_selection", + "type": "promptString", + "description": "Tests selection", + "default": "" + } + ] +} \ No newline at end of file diff --git a/config/vscode/settings.json b/config/vscode/settings.json new file mode 100644 index 00000000..17beee4b --- /dev/null +++ b/config/vscode/settings.json @@ -0,0 +1,52 @@ +{ + "files.watcherExclude": { + "**/__pypackages__/**": true, + "**/.venv*/**": true, + "**/venv*/**": true + }, + "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter" + }, + "python.autoComplete.extraPaths": [ + "__pypackages__/3.8/lib", + "__pypackages__/3.9/lib", + "__pypackages__/3.10/lib", + "__pypackages__/3.11/lib", + "__pypackages__/3.12/lib" + ], + "python.analysis.extraPaths": [ + "__pypackages__/3.8/lib", + "__pypackages__/3.9/lib", + "__pypackages__/3.10/lib", + "__pypackages__/3.11/lib", + "__pypackages__/3.12/lib" + ], + "black-formatter.args": [ + "--config=config/black.toml" + ], + "mypy-type-checker.args": [ + "--config-file=config/mypy.ini" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "python.testing.pytestArgs": [ + "--config-file=config/pytest.ini" + ], + "ruff.format.args": [ + "--config=config/ruff.toml" + ], + "ruff.lint.args": [ + "--config=config/ruff.toml" + ], + "yaml.schemas": { + "https://squidfunk.github.io/mkdocs-material/schema.json": "mkdocs.yml" + }, + "yaml.customTags": [ + "!ENV scalar", + "!ENV sequence", + "!relative scalar", + "tag:yaml.org,2002:python/name:materialx.emoji.to_svg", + "tag:yaml.org,2002:python/name:materialx.emoji.twemoji", + "tag:yaml.org,2002:python/name:pymdownx.superfences.fence_code_format" + ] +} \ No newline at end of file diff --git a/config/vscode/tasks.json b/config/vscode/tasks.json new file mode 100644 index 00000000..80cd13d2 --- /dev/null +++ b/config/vscode/tasks.json @@ -0,0 +1,93 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "changelog", + "type": "shell", + "command": "pdm run duty changelog" + }, + { + "label": "check", + "type": "shell", + "command": "pdm run duty check" + }, + { + "label": "check-quality", + "type": "shell", + "command": "pdm run duty check-quality" + }, + { + "label": "check-types", + "type": "shell", + "command": "pdm run duty check-types" + }, + { + "label": "check-docs", + "type": "shell", + "command": "pdm run duty check-docs" + }, + { + "label": "check-dependencies", + "type": "shell", + "command": "pdm run duty check-dependencies" + }, + { + "label": "check-api", + "type": "shell", + "command": "pdm run duty check-api" + }, + { + "label": "clean", + "type": "shell", + "command": "pdm run duty clean" + }, + { + "label": "docs", + "type": "shell", + "command": "pdm run duty docs" + }, + { + "label": "docs-deploy", + "type": "shell", + "command": "pdm run duty docs-deploy" + }, + { + "label": "format", + "type": "shell", + "command": "pdm run duty format" + }, + { + "label": "lock", + "type": "shell", + "command": "pdm lock -G:all" + }, + { + "label": "release", + "type": "shell", + "command": "pdm run duty release ${input:version}" + }, + { + "label": "setup", + "type": "shell", + "command": "bash scripts/setup.sh" + }, + { + "label": "test", + "type": "shell", + "command": "pdm run duty test coverage", + "group": "test" + }, + { + "label": "vscode", + "type": "shell", + "command": "pdm run duty vscode" + } + ], + "inputs": [ + { + "id": "version", + "type": "promptString", + "description": "Version" + } + ] +} \ No newline at end of file diff --git a/docs/css/insiders.css b/docs/css/insiders.css index b5547bd1..e7b9c74f 100644 --- a/docs/css/insiders.css +++ b/docs/css/insiders.css @@ -53,11 +53,10 @@ a.insiders { } .sponsorship-item { - float: left; border-radius: 100%; - display: block; + display: inline-block; height: 1.6rem; - margin: .2rem; + margin: 0.1rem; overflow: hidden; width: 1.6rem; } diff --git a/docs/insiders/index.md b/docs/insiders/index.md index a6df4a4d..7c69b590 100644 --- a/docs/insiders/index.md +++ b/docs/insiders/index.md @@ -123,9 +123,6 @@ You can cancel your sponsorship anytime.[^5]
-
-
- If you sponsor publicly, you're automatically added here with a link to your profile and avatar to show your support for *mkdocstrings-python*. diff --git a/duties.py b/duties.py index 8e3dbf64..cfdc9376 100644 --- a/duties.py +++ b/duties.py @@ -4,12 +4,13 @@ import os import sys +from contextlib import contextmanager from importlib.metadata import version as pkgversion from pathlib import Path -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Iterator from duty import duty -from duty.callables import black, blacken_docs, coverage, lazy, mkdocs, mypy, pytest, ruff, safety +from duty.callables import black, coverage, lazy, mkdocs, mypy, pytest, ruff, safety if TYPE_CHECKING: from duty.context import Context @@ -31,32 +32,16 @@ def pyprefix(title: str) -> str: # noqa: D103 return title -def merge(d1: Any, d2: Any) -> Any: # noqa: D103 - basic_types = (int, float, str, bool, complex) - if isinstance(d1, dict) and isinstance(d2, dict): - for key, value in d2.items(): - if key in d1: - if isinstance(d1[key], basic_types): - d1[key] = value - else: - d1[key] = merge(d1[key], value) - else: - d1[key] = value - return d1 - if isinstance(d1, list) and isinstance(d2, list): - return d1 + d2 - return d2 - - -def mkdocs_config() -> str: # noqa: D103 - import mergedeep - - # force YAML loader to merge arrays - mergedeep.merge = merge - +@contextmanager +def material_insiders() -> Iterator[bool]: # noqa: D103 if "+insiders" in pkgversion("mkdocs-material"): - return "mkdocs.insiders.yml" - return "mkdocs.yml" + os.environ["MATERIAL_INSIDERS"] = "true" + try: + yield True + finally: + os.environ.pop("MATERIAL_INSIDERS") + else: + yield False @duty @@ -66,23 +51,9 @@ def changelog(ctx: Context) -> None: Parameters: ctx: The context instance (passed automatically). """ - from git_changelog.cli import build_and_render + from git_changelog.cli import main as git_changelog - git_changelog = lazy(build_and_render, name="git_changelog") - ctx.run( - git_changelog( - repository=".", - output="CHANGELOG.md", - convention="angular", - template="keepachangelog", - parse_trailers=True, - parse_refs=False, - sections=["build", "deps", "feat", "fix", "refactor"], - bump_latest=True, - in_place=True, - ), - title="Updating changelog", - ) + ctx.run(git_changelog, args=[[]], title="Updating changelog") @duty(pre=["check_quality", "check_types", "check_docs", "check_dependencies", "check-api"]) @@ -139,12 +110,12 @@ def check_docs(ctx: Context) -> None: """ Path("htmlcov").mkdir(parents=True, exist_ok=True) Path("htmlcov/index.html").touch(exist_ok=True) - config = mkdocs_config() - ctx.run( - mkdocs.build(strict=True, config_file=config, verbose=True), - title=pyprefix("Building documentation"), - command=f"mkdocs build -vsf {config}", - ) + with material_insiders(): + ctx.run( + mkdocs.build(strict=True, verbose=True), + title=pyprefix("Building documentation"), + command="mkdocs build -vs", + ) @duty @@ -209,11 +180,12 @@ def docs(ctx: Context, host: str = "127.0.0.1", port: int = 8000) -> None: host: The host to serve the docs from. port: The port to serve the docs on. """ - ctx.run( - mkdocs.serve(dev_addr=f"{host}:{port}", config_file=mkdocs_config()), - title="Serving documentation", - capture=False, - ) + with material_insiders(): + ctx.run( + mkdocs.serve(dev_addr=f"{host}:{port}"), + title="Serving documentation", + capture=False, + ) @duty @@ -224,22 +196,22 @@ def docs_deploy(ctx: Context) -> None: ctx: The context instance (passed automatically). """ os.environ["DEPLOY"] = "true" - config_file = mkdocs_config() - if config_file == "mkdocs.yml": - ctx.run(lambda: False, title="Not deploying docs without Material for MkDocs Insiders!") - origin = ctx.run("git config --get remote.origin.url", silent=True) - if "pawamoy-insiders/mkdocstrings-python" in origin: - ctx.run("git remote add upstream git@github.com:mkdocstrings/python", silent=True, nofail=True) - ctx.run( - mkdocs.gh_deploy(config_file=config_file, remote_name="upstream", force=True), - title="Deploying documentation", - ) - else: - ctx.run( - lambda: False, - title="Not deploying docs from public repository (do that from insiders instead!)", - nofail=True, - ) + with material_insiders() as insiders: + if not insiders: + ctx.run(lambda: False, title="Not deploying docs without Material for MkDocs Insiders!") + origin = ctx.run("git config --get remote.origin.url", silent=True) + if "pawamoy-insiders/mkdocstrings-python" in origin: + ctx.run("git remote add upstream git@github.com:mkdocstrings/python", silent=True, nofail=True) + ctx.run( + mkdocs.gh_deploy(remote_name="upstream", force=True), + title="Deploying documentation", + ) + else: + ctx.run( + lambda: False, + title="Not deploying docs from public repository (do that from insiders instead!)", + nofail=True, + ) @duty @@ -254,11 +226,6 @@ def format(ctx: Context) -> None: title="Auto-fixing code", ) ctx.run(black.run(*PY_SRC_LIST, config="config/black.toml"), title="Formatting code") - ctx.run( - blacken_docs.run(*PY_SRC_LIST, "docs", exts=["py", "md"], line_length=120, skip_errors=True), - title="Formatting docs", - nofail=True, - ) @duty(post=["docs-deploy"]) @@ -311,3 +278,28 @@ def test(ctx: Context, match: str = "") -> None: title=pyprefix("Running tests"), command=f"pytest -c config/pytest.ini -n auto -k{match!r} --color=yes tests", ) + + +@duty +def vscode(ctx: Context) -> None: + """Configure VSCode. + + This task will overwrite the following files, + so make sure to back them up: + + - `.vscode/launch.json` + - `.vscode/settings.json` + - `.vscode/tasks.json` + + Parameters: + ctx: The context instance (passed automatically). + """ + + def update_config(filename: str) -> None: + source_file = Path("config", "vscode", filename) + target_file = Path(".vscode", filename) + target_file.parent.mkdir(exist_ok=True) + target_file.write_text(source_file.read_text()) + + for filename in ("launch.json", "settings.json", "tasks.json"): + ctx.run(update_config, args=[filename], title=f"Update .vscode/{filename}") diff --git a/mkdocs.insiders.yml b/mkdocs.insiders.yml deleted file mode 100644 index 9afba9aa..00000000 --- a/mkdocs.insiders.yml +++ /dev/null @@ -1,4 +0,0 @@ -INHERIT: mkdocs.yml - -plugins: -- typeset diff --git a/mkdocs.yml b/mkdocs.yml index 17b92494..6c069795 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -109,11 +109,12 @@ markdown_extensions: kwds: case: lower - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg - pymdownx.magiclink - pymdownx.snippets: auto_append: [docs/.glossary.md] + base_path: [!relative $config_dir] check_paths: true - pymdownx.superfences - pymdownx.tabbed: @@ -134,7 +135,7 @@ plugins: scripts: - scripts/gen_ref_nav.py - literate-nav: - nav_file: SUMMARY.txt + nav_file: SUMMARY.md - coverage - mkdocstrings: handlers: @@ -167,6 +168,10 @@ plugins: repository: mkdocstrings/python - minify: minify_html: !ENV [DEPLOY, false] +- group: + enabled: !ENV [MATERIAL_INSIDERS, false] + plugins: + - typeset extra: social: diff --git a/pyproject.toml b/pyproject.toml index d7f58317..29927bde 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,38 +59,37 @@ duty = ["duty>=0.10"] ci-quality = ["mkdocstrings-python[duty,docs,quality,typing,security]"] ci-tests = ["mkdocstrings-python[duty,docs,tests]"] docs = [ - "black>=23.1", - "markdown-callouts>=0.2", - "markdown-exec>=0.5", + "black>=23.9", + "markdown-callouts>=0.3", + "markdown-exec>=1.7", "mkdocs>=1.5", - "mkdocs-coverage>=0.2", - "mkdocs-gen-files>=0.3", - "mkdocs-git-committers-plugin-2>=1.1", - "mkdocs-literate-nav>=0.4", - "mkdocs-material>=7.3", - "mkdocs-minify-plugin>=0.6.4", - "toml>=0.10", + "mkdocs-coverage>=1.0", + "mkdocs-gen-files>=0.5", + "mkdocs-git-committers-plugin-2>=1.2", + "mkdocs-literate-nav>=0.6", + "mkdocs-material>=9.4", + "mkdocs-minify-plugin>=0.7", + "tomli>=2.0; python_version < '3.11'", ] maintain = [ - "black>=23.1", - "blacken-docs>=1.13", - "git-changelog>=1.0", + "black>=23.9", + "blacken-docs>=1.16", + "git-changelog>=2.3", ] quality = [ - "ruff>=0.0.246", + "ruff>=0.0", ] tests = [ - "pytest>=6.2", - "pytest-cov>=3.0", - "pytest-randomly>=3.10", - "pytest-xdist>=2.4", + "pytest>=7.4", + "pytest-cov>=4.1", + "pytest-randomly>=3.15", + "pytest-xdist>=3.3", ] typing = [ - "mypy>=0.911", - "types-markdown>=3.3", + "mypy>=1.5", + "types-markdown>=3.5", "types-pyyaml>=6.0", - "types-toml>=0.10", ] security = [ - "safety>=2", + "safety>=2.3", ] diff --git a/scripts/gen_credits.py b/scripts/gen_credits.py index 459f2939..bf35f0da 100644 --- a/scripts/gen_credits.py +++ b/scripts/gen_credits.py @@ -2,22 +2,31 @@ from __future__ import annotations +import os import re +import sys from importlib.metadata import PackageNotFoundError, metadata from itertools import chain from pathlib import Path from textwrap import dedent from typing import Mapping, cast -import toml from jinja2 import StrictUndefined from jinja2.sandbox import SandboxedEnvironment -project_dir = Path(".") -pyproject = toml.load(project_dir / "pyproject.toml") +# TODO: Remove once support for Python 3.10 is dropped. +if sys.version_info >= (3, 11): + import tomllib +else: + import tomli as tomllib + +project_dir = Path(os.getenv("MKDOCS_CONFIG_DIR", ".")) +with project_dir.joinpath("pyproject.toml").open("rb") as pyproject_file: + pyproject = tomllib.load(pyproject_file) project = pyproject["project"] pdm = pyproject["tool"]["pdm"] -lock_data = toml.load(project_dir / "pdm.lock") +with project_dir.joinpath("pdm.lock").open("rb") as lock_file: + lock_data = tomllib.load(lock_file) lock_pkgs = {pkg["name"].lower(): pkg for pkg in lock_data["package"]} project_name = project["name"] regex = re.compile(r"(?P[\w.-]+)(?P.*)$") @@ -30,7 +39,7 @@ def _get_license(pkg_name: str) -> str: return "?" license_name = cast(dict, data).get("License", "").strip() multiple_lines = bool(license_name.count("\n")) - # TODO: remove author logic once all my packages licenses are fixed + # TODO: Remove author logic once all my packages licenses are fixed. author = "" if multiple_lines or not license_name or license_name == "UNKNOWN": for header, value in cast(dict, data).items(): diff --git a/scripts/gen_ref_nav.py b/scripts/gen_ref_nav.py index 713522be..7285ac1c 100644 --- a/scripts/gen_ref_nav.py +++ b/scripts/gen_ref_nav.py @@ -7,9 +7,11 @@ nav = mkdocs_gen_files.Nav() mod_symbol = '' -for path in sorted(Path("src").rglob("*.py")): - module_path = path.relative_to("src").with_suffix("") - doc_path = path.relative_to("src").with_suffix(".md") +src = Path(__file__).parent.parent / "src" + +for path in sorted(src.rglob("*.py")): + module_path = path.relative_to(src).with_suffix("") + doc_path = path.relative_to(src).with_suffix(".md") full_doc_path = Path("reference", doc_path) parts = tuple(module_path.parts) @@ -30,5 +32,5 @@ mkdocs_gen_files.set_edit_path(full_doc_path, ".." / path) -with mkdocs_gen_files.open("reference/SUMMARY.txt", "w") as nav_file: +with mkdocs_gen_files.open("reference/SUMMARY.md", "w") as nav_file: nav_file.writelines(nav.build_literate_nav()) diff --git a/scripts/insiders.py b/scripts/insiders.py index 28ca1c87..8f5e215e 100644 --- a/scripts/insiders.py +++ b/scripts/insiders.py @@ -4,6 +4,7 @@ import json import logging +import os import posixpath from dataclasses import dataclass from datetime import date, datetime, timedelta @@ -115,8 +116,9 @@ def load_goals(data: str, funding: int = 0, project: Project | None = None) -> d def _load_goals_from_disk(path: str, funding: int = 0) -> dict[int, Goal]: + project_dir = os.getenv("MKDOCS_CONFIG_DIR", ".") try: - data = Path(path).read_text() + data = Path(project_dir, path).read_text() except OSError as error: raise RuntimeError(f"Could not load data from disk: {path}") from error return load_goals(data, funding) @@ -159,7 +161,7 @@ def funding_goals(source: str | list[str | tuple[str, str, str]], funding: int = goals[amount] = goal else: goals[amount].features.extend(goal.features) - return goals + return {amount: goals[amount] for amount in sorted(goals)} def feature_list(goals: Iterable[Goal]) -> list[Feature]: diff --git a/src/mkdocstrings_handlers/debug.py b/src/mkdocstrings_handlers/debug.py new file mode 100644 index 00000000..ffebc12e --- /dev/null +++ b/src/mkdocstrings_handlers/debug.py @@ -0,0 +1,106 @@ +"""Debugging utilities.""" + +from __future__ import annotations + +import os +import platform +import sys +from dataclasses import dataclass +from importlib import metadata + + +@dataclass +class Variable: + """Dataclass describing an environment variable.""" + + name: str + """Variable name.""" + value: str + """Variable value.""" + + +@dataclass +class Package: + """Dataclass describing a Python package.""" + + name: str + """Package name.""" + version: str + """Package version.""" + + +@dataclass +class Environment: + """Dataclass to store environment information.""" + + interpreter_name: str + """Python interpreter name.""" + interpreter_version: str + """Python interpreter version.""" + platform: str + """Operating System.""" + packages: list[Package] + """Installed packages.""" + variables: list[Variable] + """Environment variables.""" + + +def _interpreter_name_version() -> tuple[str, str]: + if hasattr(sys, "implementation"): + impl = sys.implementation.version + version = f"{impl.major}.{impl.minor}.{impl.micro}" + kind = impl.releaselevel + if kind != "final": + version += kind[0] + str(impl.serial) + return sys.implementation.name, version + return "", "0.0.0" + + +def get_version(dist: str = "mkdocstrings-python") -> str: + """Get version of the given distribution. + + Parameters: + dist: A distribution name. + + Returns: + A version number. + """ + try: + return metadata.version(dist) + except metadata.PackageNotFoundError: + return "0.0.0" + + +def get_debug_info() -> Environment: + """Get debug/environment information. + + Returns: + Environment information. + """ + py_name, py_version = _interpreter_name_version() + packages = ["mkdocstrings-python"] + variables = ["PYTHONPATH", *[var for var in os.environ if var.startswith("MKDOCSTRINGS_PYTHON")]] + return Environment( + interpreter_name=py_name, + interpreter_version=py_version, + platform=platform.platform(), + variables=[Variable(var, val) for var in variables if (val := os.getenv(var))], + packages=[Package(pkg, get_version(pkg)) for pkg in packages], + ) + + +def print_debug_info() -> None: + """Print debug/environment information.""" + info = get_debug_info() + print(f"- __System__: {info.platform}") + print(f"- __Python__: {info.interpreter_name} {info.interpreter_version}") + print("- __Environment variables__:") + for var in info.variables: + print(f" - `{var.name}`: `{var.value}`") + print("- __Installed packages__:") + for pkg in info.packages: + print(f" - `{pkg.name}` v{pkg.version}") + + +if __name__ == "__main__": + print_debug_info() From b5bb8a982e7a2ec97c73335e453d0033bf4987b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Sun, 12 Nov 2023 18:28:45 +0100 Subject: [PATCH 004/243] refactor: Prepare for Griffe 0.37 --- pyproject.toml | 2 +- src/mkdocstrings_handlers/python/handler.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 29927bde..853cdf9e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ classifiers = [ ] dependencies = [ "mkdocstrings>=0.20", - "griffe>=0.35", + "griffe>=0.37", ] [project.urls] diff --git a/src/mkdocstrings_handlers/python/handler.py b/src/mkdocstrings_handlers/python/handler.py index 169546fd..6fc2804f 100644 --- a/src/mkdocstrings_handlers/python/handler.py +++ b/src/mkdocstrings_handlers/python/handler.py @@ -278,8 +278,8 @@ def collect(self, identifier: str, config: Mapping[str, Any]) -> CollectorItem: try: for pre_loaded_module in final_config.get("preload_modules") or []: if pre_loaded_module not in self._modules_collection: - loader.load_module(pre_loaded_module) - loader.load_module(module_name) + loader.load(pre_loaded_module) + loader.load(module_name) except ImportError as error: raise CollectionError(str(error)) from error unresolved, iterations = loader.resolve_aliases( From 3a100406445c2e431cee9683f845fd9d8d2e6736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Sun, 12 Nov 2023 18:36:13 +0100 Subject: [PATCH 005/243] chore: Fix debug module location, add packages to debug info --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- src/mkdocstrings_handlers/{ => python}/debug.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/mkdocstrings_handlers/{ => python}/debug.py (97%) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index ac47315f..ca545c26 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -50,7 +50,7 @@ PASTE TRACEBACK HERE redacting sensitive information. --> ```bash -python -m mkdocstrings_handlers.debug # | xclip -selection clipboard +python -m mkdocstrings_handlers.python.debug # | xclip -selection clipboard ``` PASTE OUTPUT HERE diff --git a/src/mkdocstrings_handlers/debug.py b/src/mkdocstrings_handlers/python/debug.py similarity index 97% rename from src/mkdocstrings_handlers/debug.py rename to src/mkdocstrings_handlers/python/debug.py index ffebc12e..7a4e8791 100644 --- a/src/mkdocstrings_handlers/debug.py +++ b/src/mkdocstrings_handlers/python/debug.py @@ -78,7 +78,7 @@ def get_debug_info() -> Environment: Environment information. """ py_name, py_version = _interpreter_name_version() - packages = ["mkdocstrings-python"] + packages = ["mkdocs", "mkdocstrings", "mkdocstrings-python", "griffe"] variables = ["PYTHONPATH", *[var for var in os.environ if var.startswith("MKDOCSTRINGS_PYTHON")]] return Environment( interpreter_name=py_name, From dde658e77ef79e92ed380431f35c478ec0b27d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Sun, 12 Nov 2023 18:52:36 +0100 Subject: [PATCH 006/243] chore: Prepare release 1.7.4 --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab570436..db7fefc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,18 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [1.7.4](https://github.com/mkdocstrings/python/releases/tag/1.7.4) - 2023-11-12 + +[Compare with 1.7.3](https://github.com/mkdocstrings/python/compare/1.7.3...1.7.4) + +### Bug Fixes + +- Make extension paths relative to config file ([5035e92](https://github.com/mkdocstrings/python/commit/5035e9269fe11664fd25e438ac8f746721b3de0a) by Waylan Limberg). [PR #112](https://github.com/mkdocstrings/python/pull/112), Co-authored-by: Timothée Mazzucotelli + +### Code Refactoring + +- Prepare for Griffe 0.37 ([b5bb8a9](https://github.com/mkdocstrings/python/commit/b5bb8a982e7a2ec97c73335e453d0033bf4987b6) by Timothée Mazzucotelli). + ## [1.7.3](https://github.com/mkdocstrings/python/releases/tag/1.7.3) - 2023-10-09 [Compare with 1.7.2](https://github.com/mkdocstrings/python/compare/1.7.2...1.7.3) From 2fb651304d0a80fa9d6a8c77c16b3004bda22972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Tue, 21 Nov 2023 14:46:38 +0100 Subject: [PATCH 007/243] fix: Add missing translations (fallback theme) for ReadTheDocs Issue #115: https://github.com/mkdocstrings/python/issues/115 --- .../templates/readthedocs/languages/en.html | 45 ++++++++++++++----- .../templates/readthedocs/languages/ja.html | 45 ++++++++++++++----- .../templates/readthedocs/languages/zh.html | 45 ++++++++++++++----- 3 files changed, 105 insertions(+), 30 deletions(-) diff --git a/src/mkdocstrings_handlers/python/templates/readthedocs/languages/en.html b/src/mkdocstrings_handlers/python/templates/readthedocs/languages/en.html index 9c59b431..1f76e059 100644 --- a/src/mkdocstrings_handlers/python/templates/readthedocs/languages/en.html +++ b/src/mkdocstrings_handlers/python/templates/readthedocs/languages/en.html @@ -1,12 +1,37 @@ {% macro t(key) %}{{ { - "Attributes:": "Attributes:", - "Other parameters:": "Other parameters:", - "Parameters:": "Parameters:", - "default:": "default:", - "Raises:" : "Raises:", - "Receives:": "Receives:", - "Returns:": "Returns:", - "Warns:": "Warns:", - "Yields:": "Yields:", - }[key] }}{% endmacro %} \ No newline at end of file + "ATTRIBUTE": "ATTRIBUTE", + "Attributes:": "Attributes:", + "Classes:": "Classes:", + "CLASS": "CLASS", + "DEFAULT:": "DEFAULT:", + "Default": "Default", + "default:": "default:", + "DESCRIPTION": "DESCRIPTION", + "Description": "Description", + "Examples:": "Examples:", + "Functions:": "Functions:", + "FUNCTION": "FUNCTION", + "Methods:": "Methods:", + "METHOD": "METHOD", + "Modules:": "Modules:", + "MODULE": "MODULE", + "Name": "Name", + "Other Parameters:": "Other Parameters:", + "PARAMETER": "PARAMETER", + "Parameters:": "Parameters:", + "RAISES": "RAISES", + "Raises:" : "Raises:", + "RECEIVES": "RECEIVES", + "Receives:": "Receives:", + "required": "required", + "RETURNS": "RETURNS", + "Returns:": "Returns:", + "Source code in": "Source code in", + "TYPE:": "TYPE:", + "Type": "Type", + "WARNS": "WARNS", + "Warns:": "Warns:", + "YIELDS": "YIELDS", + "Yields:": "Yields:", +}[key] }}{% endmacro %} \ No newline at end of file diff --git a/src/mkdocstrings_handlers/python/templates/readthedocs/languages/ja.html b/src/mkdocstrings_handlers/python/templates/readthedocs/languages/ja.html index 41b079dc..456e1170 100644 --- a/src/mkdocstrings_handlers/python/templates/readthedocs/languages/ja.html +++ b/src/mkdocstrings_handlers/python/templates/readthedocs/languages/ja.html @@ -1,12 +1,37 @@ {% macro t(key) %}{{ { - "Attributes:": "属性:", - "Other Parameters:": "他の引数:", - "Parameters:": "引数:", - "default:": "デフォルト:", - "Raises:" : "発生:", - "Receives:": "取得:", - "Returns:": "戻り値:", - "Warns:": "警告:", - "Yields:": "返す:", - }[key] }}{% endmacro %} \ No newline at end of file + "ATTRIBUTE": "属性", + "Attributes:": "属性:", + "Classes:": "", + "CLASS": "", + "DEFAULT:": "デフォルト:", + "Default": "デフォルト", + "default:": "デフォルト:", + "DESCRIPTION": "デスクリプション", + "Description": "デスクリプション", + "Examples:": "例:", + "Functions:": "", + "FUNCTION": "", + "Methods:": "", + "METHOD": "", + "Modules:": "", + "MODULE": "", + "Name": "名前", + "Other Parameters:": "他の引数:", + "PARAMETER": "引数", + "Parameters:": "引数:", + "RAISES": "発生", + "Raises:" : "発生:", + "RECEIVES": "取得", + "Receives:": "取得:", + "required": "必須", + "RETURNS": "戻り値", + "Returns:": "戻り値:", + "Source code in": "ソースコード位置:", + "TYPE:": "タイプ:", + "Type": "タイプ", + "WARNS": "警告", + "Warns:": "警告:", + "YIELDS": "返す", + "Yields:": "返す:", +}[key] }}{% endmacro %} \ No newline at end of file diff --git a/src/mkdocstrings_handlers/python/templates/readthedocs/languages/zh.html b/src/mkdocstrings_handlers/python/templates/readthedocs/languages/zh.html index 3cd7b9dc..9c018f27 100644 --- a/src/mkdocstrings_handlers/python/templates/readthedocs/languages/zh.html +++ b/src/mkdocstrings_handlers/python/templates/readthedocs/languages/zh.html @@ -1,12 +1,37 @@ {% macro t(key) %}{{ { - "Attributes:": "属性:", - "Other Parameters:": "其他参数:", - "Parameters:": "参数:", - "default:": "默认:", - "Raises:" : "引发:", - "Receives:": "接收:", - "Returns:": "返回:", - "Warns:": "警告:", - "Yields:": "产生:", - }[key] }}{% endmacro %} \ No newline at end of file + "ATTRIBUTE": "属性", + "Attributes:": "属性:", + "Classes:": "", + "CLASS": "", + "DEFAULT:": "默认:", + "Default": "默认", + "default:": "默认:", + "DESCRIPTION": "描述", + "Description": "描述", + "Examples:": "示例:", + "Functions:": "", + "FUNCTION": "", + "Methods:": "", + "METHOD": "", + "Modules:": "", + "MODULE": "", + "Name": "名称", + "Other Parameters:": "其他参数:", + "PARAMETER": "参数", + "Parameters:": "参数:", + "RAISES": "引发", + "Raises:" : "引发:", + "Receives:": "接收:", + "RECEIVES": "接收", + "required": "必需", + "RETURNS": "返回", + "Returns:": "返回:", + "Source code in": "源代码位于:", + "TYPE:": "类型:", + "Type": "类型", + "Warns:": "警告:", + "WARNS": "警告", + "YIELDS": "产生", + "Yields:": "产生:", +}[key] }}{% endmacro %} \ No newline at end of file From ff7e8c59f186e6890082ff95bf40f174e3d2da9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Tue, 21 Nov 2023 14:49:55 +0100 Subject: [PATCH 008/243] chore: Prepare release 1.7.5 --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index db7fefc1..4e4449d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [1.7.5](https://github.com/mkdocstrings/python/releases/tag/1.7.5) - 2023-11-21 + +[Compare with 1.7.4](https://github.com/mkdocstrings/python/compare/1.7.4...1.7.5) + +### Bug Fixes + +- Add missing translations (fallback theme) for ReadTheDocs ([2fb6513](https://github.com/mkdocstrings/python/commit/2fb651304d0a80fa9d6a8c77c16b3004bda22972) by Timothée Mazzucotelli). [Issue #115](https://github.com/mkdocstrings/python/issues/115) + ## [1.7.4](https://github.com/mkdocstrings/python/releases/tag/1.7.4) - 2023-11-12 [Compare with 1.7.3](https://github.com/mkdocstrings/python/compare/1.7.3...1.7.4) From 2a11b408d2e3e50905f59203be025ce9c8192f33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Mon, 8 Jan 2024 16:58:16 +0100 Subject: [PATCH 009/243] feat: Release Insiders features of the $500/month funding goal The features and projects related to *mkdocstrings* are: - Cross-references for type annotations in signatures - Symbol types in headings and table of contents - `griffe-inherited-docstrings`, a Griffe extension for inheriting docstrings - `griffe2md`, a tool to output API docs to Markdown using Griffe See the complete list of features and projects here: https://pawamoy.github.io/insiders/#500-plasmavac-user-guide. --- docs/insiders/changelog.md | 48 +++++ docs/insiders/goals.yml | 19 +- docs/insiders/index.md | 15 +- docs/insiders/installation.md | 10 +- docs/schema.json | 12 ++ docs/usage/configuration/headings.md | 128 +++++++++++++ docs/usage/configuration/members.md | 96 +++++++++- docs/usage/configuration/signatures.md | 46 +++++ docs/usage/customization.md | 173 +++++++++++++++++ duties.py | 2 +- mkdocs.yml | 5 +- src/mkdocstrings_handlers/python/handler.py | 53 ++++-- src/mkdocstrings_handlers/python/rendering.py | 175 ++++++++++++++++-- .../templates/material/_base/attribute.html | 14 +- .../templates/material/_base/class.html | 14 +- .../material/_base/docstring/attributes.html | 6 +- .../material/_base/docstring/classes.html | 6 +- .../material/_base/docstring/functions.html | 6 +- .../material/_base/docstring/modules.html | 6 +- .../templates/material/_base/function.html | 18 +- .../templates/material/_base/module.html | 13 +- .../templates/material/_base/summary.html | 0 .../material/_base/summary/attributes.html | 0 .../material/_base/summary/classes.html | 0 .../material/_base/summary/functions.html | 0 .../material/_base/summary/modules.html | 0 .../python/templates/material/style.css | 91 ++++++--- .../python/templates/material/summary.html | 1 + .../material/summary/attributes.html | 1 + .../templates/material/summary/classes.html | 1 + .../templates/material/summary/functions.html | 1 + .../templates/material/summary/modules.html | 1 + 32 files changed, 862 insertions(+), 99 deletions(-) create mode 100644 src/mkdocstrings_handlers/python/templates/material/_base/summary.html create mode 100644 src/mkdocstrings_handlers/python/templates/material/_base/summary/attributes.html create mode 100644 src/mkdocstrings_handlers/python/templates/material/_base/summary/classes.html create mode 100644 src/mkdocstrings_handlers/python/templates/material/_base/summary/functions.html create mode 100644 src/mkdocstrings_handlers/python/templates/material/_base/summary/modules.html create mode 100644 src/mkdocstrings_handlers/python/templates/material/summary.html create mode 100644 src/mkdocstrings_handlers/python/templates/material/summary/attributes.html create mode 100644 src/mkdocstrings_handlers/python/templates/material/summary/classes.html create mode 100644 src/mkdocstrings_handlers/python/templates/material/summary/functions.html create mode 100644 src/mkdocstrings_handlers/python/templates/material/summary/modules.html diff --git a/docs/insiders/changelog.md b/docs/insiders/changelog.md index eead3a6a..3c8ac843 100644 --- a/docs/insiders/changelog.md +++ b/docs/insiders/changelog.md @@ -1,3 +1,51 @@ # Changelog ## mkdocstrings-python Insiders + +### 1.5.1 September 12, 2023 { id="1.5.1" } + +- Prevent empty auto-summarized Methods section. + +### 1.5.0 September 05, 2023 { id="1.5.0" } + +- Render function signature overloads. + +### 1.4.0 August 27, 2023 { id="1.4.0" } + +- Render cross-references in attribute signatures. + +### 1.3.0 August 24, 2023 { id="1.3.0" } + +- Add "method" symbol type. + +### 1.2.0 August 20, 2023 { id="1.2.0" } + +- Add [member auto-summaries](../usage/configuration/members.md#summary). + +### 1.1.4 July 17, 2023 { id="1.1.4" } + +- Fix heading level increment for class members. + +### 1.1.3 July 17, 2023 { id="1.1.3" } + +- Fix heading level (avoid with clause preventing to decrease it). + +### 1.1.2 July 15, 2023 { id="1.1.2" } + +- Use non-breaking spaces after symbol types. + +### 1.1.1 June 27, 2023 { id="1.1.1" } + +- Correctly escape expressions in signatures and other rendered types. + +### 1.1.0 June 4, 2023 { id="1.1.0" } + +- Add [Symbol types in headings and table of contents](../usage/configuration/headings.md#show_symbol_type_toc). + +### 1.0.0 May 10, 2023 { id="1.0.0" } + +- Add [cross-references for type annotations in signatures](../usage/configuration/signatures.md#signature_crossrefs). + Make sure to update your local templates as the signature of the + [`format_signature` filter][mkdocstrings_handlers.python.rendering.do_format_signature] + has changed. The templates that must be updated: + `class.html`, `expression.html`, `function.html` and `signature.html`. diff --git a/docs/insiders/goals.yml b/docs/insiders/goals.yml index a96ac51b..8b6cb2b0 100644 --- a/docs/insiders/goals.yml +++ b/docs/insiders/goals.yml @@ -1 +1,18 @@ -goals: {} \ No newline at end of file +goals: + 500: + name: PlasmaVac User Guide + features: + - name: Cross-references for type annotations in signatures + ref: /usage/configuration/signatures/#signature_crossrefs + since: 2023/05/10 + - name: Symbol types in headings and table of contents + ref: /usage/configuration/headings/#show_symbol_type_toc + since: 2023/06/04 + 1000: + name: GraviFridge User Manual + features: + - name: Auto-summary of object members + ref: /usage/configuration/members/#summary + since: 2023/08/20 + - name: Automatic rendering of function signature overloads + since: 2023/09/05 diff --git a/docs/insiders/index.md b/docs/insiders/index.md index 7c69b590..ceb3c59c 100644 --- a/docs/insiders/index.md +++ b/docs/insiders/index.md @@ -33,7 +33,6 @@ Sponsorships start as low as [**$10 a month**][sponsors].[^2] technical reasons. Such contributions are still very much welcome as they help ensuring the project's sustainability. - ## What sponsorships achieve Sponsorships make this project sustainable, as they buy the maintainers of this @@ -48,15 +47,21 @@ The biggest bottleneck in Open Source is time.[^3] you can be sure that bugs are fixed quickly and new features are added regularly. - +were developed with the help of sponsorships. + ## What's in it for me? ```python exec="1" session="insiders" -data_source = "docs/insiders/goals.yml" +data_source = [ + "docs/insiders/goals.yml", + ("griffe-inherited-docstrings", "https://mkdocstrings.github.io/griffe-inherited-docstrings/", "insiders/goals.yml"), + ("griffe-pydantic", "https://mkdocstrings.github.io/griffe-pydantic/", "insiders/goals.yml"), + ("griffe-typing-deprecated", "https://mkdocstrings.github.io/griffe-typing-deprecated/", "insiders/goals.yml"), +] ``` diff --git a/docs/insiders/installation.md b/docs/insiders/installation.md index bb387d99..3d9d75d8 100644 --- a/docs/insiders/installation.md +++ b/docs/insiders/installation.md @@ -28,7 +28,7 @@ and [how to use it](https://pawamoy.github.io/pypi-insiders/#usage). *mkdocstrings-python Insiders* can be installed with `pip` [using SSH][using ssh]: ```bash -pip install git+ssh://git@github.com/pawamoy-insiders/python.git +pip install git+ssh://git@github.com/pawamoy-insiders/mkdocstrings-python.git ``` [using ssh]: https://docs.github.com/en/authentication/connecting-to-github-with-ssh @@ -36,7 +36,7 @@ pip install git+ssh://git@github.com/pawamoy-insiders/python.git Or using HTTPS: ```bash -pip install git+https://${GH_TOKEN}@github.com/pawamoy-insiders/python.git +pip install git+https://${GH_TOKEN}@github.com/pawamoy-insiders/mkdocstrings-python.git ``` >? NOTE: **How to get a GitHub personal access token** @@ -82,7 +82,7 @@ with [Twine]: [Artifactory]: https://jfrog.com/help/r/jfrog-artifactory-documentation/pypi-repositories [Google Cloud]: https://cloud.google.com/artifact-registry/docs/python [pypiserver]: https://pypi.org/project/pypiserver/ - [Github Releases]: https://github.com/pawamoy-insiders/python/releases + [Github Releases]: https://github.com/pawamoy-insiders/mkdocstrings-python/releases [Twine]: https://pypi.org/project/twine/ ```bash @@ -142,7 +142,7 @@ as it is against our [Terms of use](index.md#terms).** > > ```bash > # clone the repository -> git clone git@github.com:pawamoy-insiders/python +> git clone git@github.com:pawamoy-insiders/mkdocstrings-python > cd python > > # install build @@ -178,7 +178,7 @@ as it is against our [Terms of use](index.md#terms).** Of course, you can use *mkdocstrings-python Insiders* directly from `git`: ``` -git clone git@github.com:pawamoy-insiders/python +git clone git@github.com:pawamoy-insiders/mkdocstrings-python ``` When cloning from `git`, the package must be installed: diff --git a/docs/schema.json b/docs/schema.json index a34dc090..b4eca004 100644 --- a/docs/schema.json +++ b/docs/schema.json @@ -108,6 +108,18 @@ "type": "boolean", "default": false }, + "show_symbol_type_heading": { + "title": "Show the symbol type in headings (e.g. mod, class, func and attr).", + "markdownDescription": "https://mkdocstrings.github.io/python/usage/configuration/headings/#show_symbol_type_heading", + "type": "boolean", + "default": false + }, + "show_symbol_type_toc": { + "title": "Show the symbol type in the Table of Contents (e.g. mod, class, func and attr).", + "markdownDescription": "https://mkdocstrings.github.io/python/usage/configuration/headings/#show_symbol_type_toc", + "type": "boolean", + "default": false + }, "show_category_heading": { "title": "When grouped by categories, show a heading for each category.", "markdownDescription": "https://mkdocstrings.github.io/python/usage/configuration/headings/#show_category_heading", diff --git a/docs/usage/configuration/headings.md b/docs/usage/configuration/headings.md index e1c2e63a..a9b75e6d 100644 --- a/docs/usage/configuration/headings.md +++ b/docs/usage/configuration/headings.md @@ -387,3 +387,131 @@ plugins:

Docstring of the method.

//// /// + +## `show_symbol_type_heading` + +[:octicons-tag-24: Insiders 1.1.0](../../insiders/changelog.md#1.1.0) + +- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** + + +Show the symbol type in headings. + +This option will prefix headings with +, +, +, + or + types. +See also [`show_symbol_type_toc`][show_symbol_type_toc]. + +To customize symbols, see [Customizing symbol types](../customization.md/#symbol-types). + +```yaml title="in mkdocs.yml (global configuration)" +plugins: +- mkdocstrings: + handlers: + python: + options: + show_symbol_type_heading: true +``` + +```md title="or in docs/some_page.md (local configuration)" +::: package.module + options: + show_symbol_type_heading: false +``` + +/// admonition | Preview + type: preview + +//// tab | With symbol type in headings +

module

+

Docstring of the module.

+

attribute

+

Docstring of the module attribute.

+

function

+

Docstring of the function.

+

Class

+

Docstring of the class.

+

method

+

Docstring of the method.

+//// + +//// tab | Without symbol type in headings +

module

+

Docstring of the module.

+

attribute

+

Docstring of the module attribute.

+

function

+

Docstring of the function.

+

Class

+

Docstring of the class.

+

method

+

Docstring of the method.

+//// +/// + +## `show_symbol_type_toc` + +[:octicons-tag-24: Insiders 1.1.0](../../insiders/changelog.md#1.1.0) + +- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** + + +Show the symbol type in the Table of Contents. + +This option will prefix items in the ToC with +, +, +, + or + types. +See also [`show_symbol_type_heading`][show_symbol_type_heading]. + +To customize symbols, see [Customizing symbol types](../customization.md/#symbol-types). + +```yaml title="in mkdocs.yml (global configuration)" +plugins: +- mkdocstrings: + handlers: + python: + options: + show_symbol_type_toc: true +``` + +```md title="or in docs/some_page.md (local configuration)" +::: package.module + options: + show_symbol_type_toc: false +``` + +/// admonition | Preview + type: preview + +//// tab | With symbol type in ToC +
    +
  • module
  • +
  • attribute
  • +
  • function
  • +
  • Class +
      +
    • method
    • +
    +
  • +
+//// + +//// tab | Without symbol type in ToC +
    +
  • module
  • +
  • attribute
  • +
  • function
  • +
  • Class +
      +
    • method
    • +
    +
  • +
+//// +/// diff --git a/docs/usage/configuration/members.md b/docs/usage/configuration/members.md index 16c707d0..0b6d27e5 100644 --- a/docs/usage/configuration/members.md +++ b/docs/usage/configuration/members.md @@ -544,4 +544,98 @@ package

subpackage_member

Member docstring.

//// -/// \ No newline at end of file +/// + +## `summary` + +[:octicons-heart-fill-24:{ .pulse } Sponsors only](../../insiders/index.md){ .insiders } — +[:octicons-tag-24: Insiders 1.2.0](../../insiders/changelog.md#1.2.0) + +- **:octicons-package-24: Type bool | dict[str, bool] :material-equal: `False`{ title="default value" }** + + +Whether to render summaries of modules, classes, functions (methods) and attributes. + +This option accepts a boolean (`yes`, `true`, `no`, `false` in YAML) +or a dictionary with one or more of the following keys: `attributes`, `functions`, `classes`, `modules`, +with booleans as values. Class methods summary is (de)activated with the `functions` key. +By default, `summary` is false, and by extension all values are false. + +Examples: + +```yaml +summary: true +``` + +```yaml +summary: false +``` + +```yaml +summary: + attributes: false + functions: true + modules: false +``` + +Summaries will be rendered as the corresponding docstring sections. +For example, the summary for attributes will be rendered as an Attributes docstring section. +The section will be rendered in accordance with the [`docstring_section_style`][] option. +If the objects appearing in the summary are also rendered on the page +(or somewhere else on the site), their name will automatically link to their rendered documentation. + +```yaml title="in mkdocs.yml (global configuration)" +plugins: +- mkdocstrings: + handlers: + python: + options: + summary: true +``` + +```md title="or in docs/some_page.md (local configuration)" +::: path.to.module + options: + summary: false +``` + +/// admonition | Preview + type: preview + +//// tab | With all summaries +``` +::: path.to.module.MyClass + options: + summary: true +``` +

MyClass

+

Class docstring.

+

Methods:

+
    +
  • my_method1: Summary of the method (first docstring line).
  • +
  • my_method2: Summary of the method (first docstring line).
  • +
+

Attributes:

+
    +
  • attr1: Summary of the attribute (first docstring line).
  • +
  • attr2: Summary of the attribute (first docstring line).
  • +
+//// + +//// tab | With methods summary only +``` +::: path.to.module.MyClass + options: + summary: + functions: true +``` + +

MyClass

+

Class docstring.

+

Methods:

+
    +
  • my_method1: Summary of the method (first docstring line).
  • +
  • my_method2: Summary of the method (first docstring line).
  • +
+//// +/// diff --git a/docs/usage/configuration/signatures.md b/docs/usage/configuration/signatures.md index 6b2e8880..da96dc5b 100644 --- a/docs/usage/configuration/signatures.md +++ b/docs/usage/configuration/signatures.md @@ -332,6 +332,52 @@ function(param1, param2=None) //// /// +## `signature_crossrefs` + +[:octicons-tag-24: Insiders 1.0.0](../../insiders/changelog.md#1.0.0) + +Whether to render cross-references for type annotations in signatures. + +When signatures are separated from headings with the [`separate_signature`][] option +and type annotations are shown with the [`show_signature_annotations`][] option, +this option will render a cross-reference (link) for each type annotation in the signature. + +```yaml title="in mkdocs.yml (global configuration)" +plugins: +- mkdocstrings: + handlers: + python: + options: + separate_signature: true + show_signature_annotations: true + signature_crossrefs: false +``` + +```md title="or in docs/some_page.md (local configuration)" +::: path.to.module + options: + separate_signature: true + show_signature_annotations: true + signature_crossrefs: true +``` + +/// admonition | Preview + type: preview + +//// tab | With signature cross-references +

do_format_code

+
do_format_code(code: str, line_length: int) -> str
+
+

Function docstring.

+//// + +//// tab | Without signature cross-references +

do_format_code

+
do_format_code(code: str, line_length: int) -> str
+
+

Function docstring.

+//// +/// ## `unwrap_annotated` diff --git a/docs/usage/customization.md b/docs/usage/customization.md index 7bbed955..9dedbf20 100644 --- a/docs/usage/customization.md +++ b/docs/usage/customization.md @@ -23,6 +23,10 @@ The following CSS classes are used in the generated HTML: - `doc-label`: on `small` elements containing a label - `doc-label-LABEL`: same, where `LABEL` is replaced by the actual label - `doc-md-description`: on `div`s containing HTML descriptions converted from Markdown docstrings +- `doc-symbol`: on `code` tags of symbol types + - `doc-symbol-heading`: on symbol types in headings + - `doc-symbol-toc`: on symbol types in the ToC + - `doc-symbol-KIND`: specific to the kind of object (`module`, `class`, `function`, `method`, `attribute`) /// admonition | Example with colorful labels type: example @@ -53,6 +57,173 @@ The following CSS classes are used in the generated HTML: /// +## Symbol types + +### Colors + +You can customize the colors of the symbol types +(see [`show_symbol_type_heading`][show_symbol_type_heading] and [`show_symbol_type_toc`][show_symbol_type_toc]) +by overriding the values of our CSS variables, for example: + +```css title="docs/css/mkdocstrings.css" +[data-md-color-scheme="default"] { + --doc-symbol-attribute-fg-color: #0079ff; + --doc-symbol-function-fg-color: #00dfa2; + --doc-symbol-method-fg-color: #00dfa2; + --doc-symbol-class-fg-color: #d1b619; + --doc-symbol-module-fg-color: #ff0060; + + --doc-symbol-attribute-bg-color: #0079ff1a; + --doc-symbol-function-bg-color: #00dfa21a; + --doc-symbol-method-bg-color: #00dfa21a; + --doc-symbol-class-bg-color: #d1b6191a; + --doc-symbol-module-bg-color: #ff00601a; +} + +[data-md-color-scheme="slate"] { + --doc-symbol-attribute-fg-color: #963fb8; + --doc-symbol-function-fg-color: #6d67e4; + --doc-symbol-method-fg-color: #6d67e4; + --doc-symbol-class-fg-color: #46c2cb; + --doc-symbol-module-fg-color: #f2f7a1; + + --doc-symbol-attribute-bg-color: #963fb81a; + --doc-symbol-function-bg-color: #6d67e41a; + --doc-symbol-method-bg-color: #6d67e41a; + --doc-symbol-class-bg-color: #46c2cb1a; + --doc-symbol-module-bg-color: #f2f7a11a; +} +``` + +The `[data-md-color-scheme="*"]` selectors work with the [Material for MkDocs] theme. +If you are using another theme, adapt the selectors to this theme +if it supports light and dark themes, +otherwise just override the variables at root level: + +```css title="docs/css/mkdocstrings.css" +:root { + --doc-symbol-attribute-fg-color: #0079ff; + --doc-symbol-function-fg-color: #00dfa2; + --doc-symbol-method-fg-color: #00dfa2; + --doc-symbol-class-fg-color: #d1b619; + --doc-symbol-module-fg-color: #ff0060; + + --doc-symbol-attribute-bg-color: #0079ff1a; + --doc-symbol-function-bg-color: #00dfa21a; + --doc-symbol-method-bg-color: #00dfa21a; + --doc-symbol-class-bg-color: #d1b6191a; + --doc-symbol-module-bg-color: #ff00601a; +} +``` + +/// admonition | Preview + type: preview + +
+ +

+ Try cycling through the themes to see the colors for each theme: + + + + + +

+
+ +/// + +### Names + +You can also change the actual symbol names. +For example, to use single letters instead of truncated types: + +```css title="docs/css/mkdocstrings.css" +.doc-symbol-attribute::after { + content: "A"; +} + +.doc-symbol-function::after { + content: "F"; +} + +.doc-symbol-method::after { + content: "M"; +} + +.doc-symbol-class::after { + content: "C"; +} + +.doc-symbol-module::after { + content: "M"; +} +``` + +/// admonition | Preview + type: preview + +
+ +
    +
  • Attribute:
  • +
  • Function:
  • +
  • Method:
  • +
  • Class:
  • +
  • Module:
  • +
+
+ +/// + ## Templates Templates are organized into the following tree: @@ -103,6 +274,7 @@ and the Jinja context available in their scope. - `labels`: The module labels. - `contents`: The module contents: docstring and children blocks. - `docstring`: The module docstring. +- `summary`: The automatic summaries of members. - `children`: The module children. Available context: @@ -118,6 +290,7 @@ Available context: - `contents`: The class contents: bases, docstring, source and children blocks. - `bases`: The class bases. - `docstring`: The class docstring. +- `summary`: The automatic summaries of members. - `source`: The class source code. - `children`: The class children. diff --git a/duties.py b/duties.py index cfdc9376..30fb2221 100644 --- a/duties.py +++ b/duties.py @@ -237,7 +237,7 @@ def release(ctx: Context, version: str) -> None: version: The new version number to use. """ origin = ctx.run("git config --get remote.origin.url", silent=True) - if "pawamoy-insiders/python" in origin: + if "pawamoy-insiders/mkdocstrings-python" in origin: ctx.run( lambda: False, title="Not releasing from insiders repository (do that from public repo instead!)", diff --git a/mkdocs.yml b/mkdocs.yml index 6c069795..3d21de72 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -40,7 +40,7 @@ nav: - Development: - Contributing: contributing.md - Code of Conduct: code_of_conduct.md - - Coverage report: coverage.md + # - Coverage report: coverage.md - Insiders: - insiders/index.md - Getting started: @@ -136,7 +136,7 @@ plugins: - scripts/gen_ref_nav.py - literate-nav: nav_file: SUMMARY.md -- coverage +# - coverage - mkdocstrings: handlers: python: @@ -158,6 +158,7 @@ plugins: show_root_heading: true show_root_full_path: false show_signature_annotations: true + show_source: false show_symbol_type_heading: true show_symbol_type_toc: true signature_crossrefs: true diff --git a/src/mkdocstrings_handlers/python/handler.py b/src/mkdocstrings_handlers/python/handler.py index 6fc2804f..9f6cae4b 100644 --- a/src/mkdocstrings_handlers/python/handler.py +++ b/src/mkdocstrings_handlers/python/handler.py @@ -50,25 +50,21 @@ def chdir(path: str) -> Iterator[None]: # noqa: D103 class PythonHandler(BaseHandler): - """The Python handler class. - - Attributes: - domain: The cross-documentation domain/language for this handler. - enable_inventory: Whether this handler is interested in enabling the creation - of the `objects.inv` Sphinx inventory file. - fallback_theme: The fallback theme. - fallback_config: The configuration used to collect item during autorefs fallback. - default_config: The default rendering options, - see [`default_config`][mkdocstrings_handlers.python.handler.PythonHandler.default_config]. - """ + """The Python handler class.""" domain: str = "py" # to match Sphinx's default domain + """The cross-documentation domain/language for this handler.""" enable_inventory: bool = True + """Whether this handler is interested in enabling the creation of the `objects.inv` Sphinx inventory file.""" fallback_theme = "material" + """The fallback theme.""" fallback_config: ClassVar[dict] = {"fallback": True} + """The configuration used to collect item during autorefs fallback.""" default_config: ClassVar[dict] = { "docstring_style": "google", "docstring_options": {}, + "show_symbol_type_heading": False, + "show_symbol_type_toc": False, "show_root_heading": False, "show_root_toc_entry": True, "show_root_full_path": True, @@ -108,9 +104,11 @@ class PythonHandler(BaseHandler): "annotations_path": "brief", "preload_modules": None, "allow_inspection": True, + "summary": False, "unwrap_annotated": False, } - """ + """Default handler configuration. + Attributes: General options: allow_inspection (bool): Whether to allow inspecting modules when visiting them is not possible. Default: `True`. show_bases (bool): Show the base classes of a class. Default: `True`. @@ -134,6 +132,8 @@ class PythonHandler(BaseHandler): show_root_members_full_path (bool): Show the full Python path of the root members. Default: `False`. show_object_full_path (bool): Show the full Python path of every object. Default: `False`. show_category_heading (bool): When grouped by categories, show a heading for each category. Default: `False`. + show_symbol_type_heading (bool): Show the symbol type in headings (e.g. mod, class, meth, func and attr). Default: `False`. + show_symbol_type_toc (bool): Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr). Default: `False`. Attributes: Members options: inherited_members (list[str] | bool | None): A boolean, or an explicit list of inherited members to render. @@ -151,6 +151,7 @@ class PythonHandler(BaseHandler): to lower members in the hierarchy). Default: `["!^_[^_]"]`. group_by_category (bool): Group the object's children by categories: attributes, classes, functions, and modules. Default: `True`. show_submodules (bool): When rendering a module, show its submodules recursively. Default: `False`. + summary (bool | dict[str, bool]): Whether to render summaries of modules, classes, functions (methods) and attributes. Attributes: Docstrings options: docstring_style (str): The docstring style to use: `google`, `numpy`, `sphinx`, or `None`. Default: `"google"`. @@ -328,8 +329,28 @@ def render(self, data: CollectorItem, config: Mapping[str, Any]) -> str: # noqa (re.compile(filtr.lstrip("!")), filtr.startswith("!")) for filtr in final_config["filters"] ] - # TODO: goal reached: remove once `signature_crossrefs` feature becomes public - final_config["signature_crossrefs"] = False + summary = final_config["summary"] + if summary is True: + final_config["summary"] = { + "attributes": True, + "functions": True, + "classes": True, + "modules": True, + } + elif summary is False: + final_config["summary"] = { + "attributes": False, + "functions": False, + "classes": False, + "modules": False, + } + else: + final_config["summary"] = { + "attributes": summary.get("attributes", False), + "functions": summary.get("functions", False), + "classes": summary.get("classes", False), + "modules": summary.get("modules", False), + } return template.render( **{ @@ -356,6 +377,10 @@ def update_env(self, md: Markdown, config: dict) -> None: # noqa: D102 (ignore self.env.filters["filter_objects"] = rendering.do_filter_objects self.env.filters["stash_crossref"] = lambda ref, length: ref self.env.filters["get_template"] = rendering.do_get_template + self.env.filters["as_attributes_section"] = rendering.do_as_attributes_section + 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.tests["existing_template"] = lambda template_name: template_name in self.env.list_templates() def get_anchors(self, data: CollectorItem) -> tuple[str, ...]: # noqa: D102 (ignore missing docstring) diff --git a/src/mkdocstrings_handlers/python/rendering.py b/src/mkdocstrings_handlers/python/rendering.py index c54eb2cd..b1cb7ffc 100644 --- a/src/mkdocstrings_handlers/python/rendering.py +++ b/src/mkdocstrings_handlers/python/rendering.py @@ -3,18 +3,26 @@ from __future__ import annotations import enum +import random import re +import string import sys import warnings -from functools import lru_cache +from functools import lru_cache, partial from typing import TYPE_CHECKING, Any, Callable, Match, Pattern, Sequence +from griffe.docstrings.dataclasses import ( + DocstringSectionAttributes, + DocstringSectionClasses, + DocstringSectionFunctions, + DocstringSectionModules, +) from jinja2 import pass_context from markupsafe import Markup from mkdocstrings.loggers import get_logger if TYPE_CHECKING: - from griffe.dataclasses import Alias, Attribute, Function, Object + from griffe.dataclasses import Alias, Attribute, Class, Function, Module, Object from jinja2.runtime import Context from mkdocstrings.handlers.base import CollectorItem @@ -25,7 +33,9 @@ class Order(enum.Enum): """Enumeration for the possible members ordering.""" alphabetical = "alphabetical" + """Alphabetical order.""" source = "source" + """Source code order.""" def _sort_key_alphabetical(item: CollectorItem) -> Any: @@ -65,6 +75,26 @@ def do_format_code(code: str, line_length: int) -> str: return formatter(code, line_length) +_stash_key_alphabet = string.ascii_letters + string.digits + + +def _gen_key(length: int) -> str: + return "_" + "".join(random.choice(_stash_key_alphabet) for _ in range(max(1, length - 1))) # noqa: S311 + + +def _gen_stash_key(stash: dict[str, str], length: int) -> str: + key = _gen_key(length) + while key in stash: + key = _gen_key(length) + return key + + +def _stash_crossref(stash: dict[str, str], crossref: str, *, length: int) -> str: + key = _gen_stash_key(stash, length) + stash[key] = crossref + return key + + def _format_signature(name: Markup, signature: str, line_length: int) -> str: name = str(name).strip() # type: ignore[assignment] signature = signature.strip() @@ -90,8 +120,8 @@ def do_format_signature( function: Function, line_length: int, *, - annotations: bool | None = None, # noqa: ARG001 - crossrefs: bool = False, # noqa: ARG001 + annotations: bool | None = None, + crossrefs: bool = False, ) -> str: """Format a signature using Black. @@ -108,17 +138,40 @@ def do_format_signature( """ env = context.environment template = env.get_template("signature.html") - signature = template.render(context.parent, function=function) + config_annotations = context.parent["config"]["show_signature_annotations"] + old_stash_ref_filter = env.filters["stash_crossref"] + + stash: dict[str, str] = {} + if (annotations or config_annotations) and crossrefs: + env.filters["stash_crossref"] = partial(_stash_crossref, stash) + + if annotations is None: + new_context = context.parent + else: + new_context = dict(context.parent) + new_context["config"] = dict(new_context["config"]) + new_context["config"]["show_signature_annotations"] = annotations + try: + signature = template.render(new_context, function=function, signature=True) + finally: + env.filters["stash_crossref"] = old_stash_ref_filter + signature = _format_signature(callable_path, signature, line_length) - return str( + signature = str( env.filters["highlight"]( - signature, + Markup.escape(signature), language="python", inline=False, classes=["doc-signature"], ), ) + if stash: + for key, value in stash.items(): + signature = re.sub(rf"\b{key}\b", value, signature) + + return signature + @pass_context def do_format_attribute( @@ -127,7 +180,7 @@ def do_format_attribute( attribute: Attribute, line_length: int, *, - crossrefs: bool = False, # noqa: ARG001 + crossrefs: bool = False, ) -> str: """Format an attribute using Black. @@ -142,16 +195,28 @@ def do_format_attribute( The same code, formatted. """ env = context.environment + template = env.get_template("expression.html") annotations = context.parent["config"]["show_signature_annotations"] + separate_signature = context.parent["config"]["separate_signature"] + old_stash_ref_filter = env.filters["stash_crossref"] - signature = str(attribute_path).strip() - if annotations and attribute.annotation: - signature += f": {attribute.annotation}" - if attribute.value: - signature += f" = {attribute.value}" + stash: dict[str, str] = {} + if separate_signature and crossrefs: + env.filters["stash_crossref"] = partial(_stash_crossref, stash) + + try: + signature = str(attribute_path).strip() + if annotations and attribute.annotation: + annotation = template.render(context.parent, expression=attribute.annotation, signature=True) + signature += f": {annotation}" + if attribute.value: + value = template.render(context.parent, expression=attribute.value, signature=True) + signature += f" = {value}" + finally: + env.filters["stash_crossref"] = old_stash_ref_filter signature = do_format_code(signature, line_length) - return str( + signature = str( env.filters["highlight"]( Markup.escape(signature), language="python", @@ -160,6 +225,12 @@ def do_format_attribute( ), ) + if stash: + for key, value in stash.items(): + signature = re.sub(rf"\b{key}\b", value, signature) + + return signature + def do_order_members( members: Sequence[Object | Alias], @@ -379,3 +450,79 @@ def do_get_template(obj: Object) -> str: """ extra_data = getattr(obj, "extra", {}).get("mkdocstrings", {}) return extra_data.get("template", "") or f"{obj.kind.value}.html" + + +@pass_context +def do_as_attributes_section( + context: Context, # noqa: ARG001 + attributes: Sequence[Attribute], # noqa: ARG001 + *, + check_public: bool = True, # noqa: ARG001 +) -> DocstringSectionAttributes: + """Build an attributes section from a list of attributes. + + Parameters: + attributes: The attributes to build the section from. + check_public: Whether to check if the attribute is public. + + Returns: + An attributes docstring section. + """ + return DocstringSectionAttributes([]) + + +@pass_context +def do_as_functions_section( + context: Context, # noqa: ARG001 + functions: Sequence[Function], # noqa: ARG001 + *, + check_public: bool = True, # noqa: ARG001 +) -> DocstringSectionFunctions: + """Build a functions section from a list of functions. + + Parameters: + functions: The functions to build the section from. + check_public: Whether to check if the function is public. + + Returns: + A functions docstring section. + """ + return DocstringSectionFunctions([]) + + +@pass_context +def do_as_classes_section( + context: Context, # noqa: ARG001 + classes: Sequence[Class], # noqa: ARG001 + *, + check_public: bool = True, # noqa: ARG001 +) -> DocstringSectionClasses: + """Build a classes section from a list of classes. + + Parameters: + classes: The classes to build the section from. + check_public: Whether to check if the class is public. + + Returns: + A classes docstring section. + """ + return DocstringSectionClasses([]) + + +@pass_context +def do_as_modules_section( + context: Context, # noqa: ARG001 + modules: Sequence[Module], # noqa: ARG001 + *, + check_public: bool = True, # noqa: ARG001 +) -> DocstringSectionModules: + """Build a modules section from a list of modules. + + Parameters: + modules: The modules to build the section from. + check_public: Whether to check if the module is public. + + Returns: + A modules docstring section. + """ + return DocstringSectionModules([]) diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/attribute.html b/src/mkdocstrings_handlers/python/templates/material/_base/attribute.html index 764e9a7d..3f1d887e 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/attribute.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/attribute.html @@ -16,14 +16,16 @@ {% set attribute_name = attribute.path if show_full_path else attribute.name %} {% if not root or config.show_root_heading %} - - {% filter heading(heading_level, + {% filter heading( + heading_level, role="data" if attribute.parent.kind.value == "module" else "attr", id=html_id, class="doc doc-heading", - toc_label=attribute.name) %} + toc_label=(' '|safe if config.show_symbol_type_toc else '') + attribute.name, + ) %} {% block heading scoped %} + {% if config.show_symbol_type_heading %}{% endif %} {% if config.separate_signature %} {{ attribute_name }} {% else %} @@ -51,12 +53,14 @@ {% endblock signature %} {% else %} + {% if config.show_root_toc_entry %} {% filter heading(heading_level, role="data" if attribute.parent.kind.value == "module" else "attr", id=html_id, - toc_label=attribute.name, - hidden=True) %} + toc_label=(' '|safe if config.show_symbol_type_toc else '') + attribute.name, + hidden=True, + ) %} {% endfilter %} {% endif %} {% set heading_level = heading_level - 1 %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/class.html b/src/mkdocstrings_handlers/python/templates/material/_base/class.html index ae8a2774..fb7ca764 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/class.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/class.html @@ -16,14 +16,16 @@ {% set class_name = class.path if show_full_path else class.name %} {% if not root or config.show_root_heading %} - - {% filter heading(heading_level, + {% filter heading( + heading_level, role="class", id=html_id, class="doc doc-heading", - toc_label=class.name) %} + toc_label=(' '|safe if config.show_symbol_type_toc else '') + class.name, + ) %} {% block heading scoped %} + {% if config.show_symbol_type_heading %}{% endif %} {% if config.separate_signature %} {{ class_name }} {% elif config.merge_init_into_class and "__init__" in class.all_members %} @@ -62,8 +64,9 @@ {% filter heading(heading_level, role="class", id=html_id, - toc_label=class.name, - hidden=True) %} + toc_label=(' '|safe if config.show_symbol_type_toc else '') + class.name, + hidden=True, + ) %} {% endfilter %} {% endif %} {% set heading_level = heading_level - 1 %} @@ -135,4 +138,5 @@ {% endwith %} + diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html index 6dc82d66..0b291574 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html @@ -16,7 +16,7 @@ {% for attribute in section.value %} - {{ attribute.name }} + {{ attribute.name }} {% if attribute.annotation %} {% with expression = attribute.annotation %} @@ -40,7 +40,7 @@
    {% for attribute in section.value %}
  • - {{ attribute.name }} + {{ attribute.name }} {% if attribute.annotation %} {% with expression = attribute.annotation %} ({% include "expression.html" with context %}) @@ -66,7 +66,7 @@ {% for attribute in section.value %} - {{ attribute.name }} + {{ attribute.name }}
    {{ attribute.description|convert_markdown(heading_level, html_id) }} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html index 62e0b3be..42531649 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html @@ -15,7 +15,7 @@ {% for class in section.value %} - {{ class.name }} + {{ class.name }}
    {{ class.description|convert_markdown(heading_level, html_id) }} @@ -32,7 +32,7 @@
      {% for class in section.value %}
    • - {{ class.name }} + {{ class.name }}
      {{ class.description|convert_markdown(heading_level, html_id) }} @@ -53,7 +53,7 @@ {% for class in section.value %} - {{ class.name }} + {{ class.name }}
      {{ class.description|convert_markdown(heading_level, html_id) }} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html index 61b51a04..f93a2e4b 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html @@ -16,7 +16,7 @@ {% for function in section.value %} {% if not function.name == "__init__" or not config.merge_init_into_class %} - {{ function.name }} + {{ function.name }}
      {{ function.description|convert_markdown(heading_level, html_id) }} @@ -35,7 +35,7 @@ {% for function in section.value %} {% if not function.name == "__init__" or not config.merge_init_into_class %}
    • - {{ function.name }} + {{ function.name }}
      {{ function.description|convert_markdown(heading_level, html_id) }} @@ -58,7 +58,7 @@ {% for function in section.value %} {% if not function.name == "__init__" or not config.merge_init_into_class %} - {{ function.name }} + {{ function.name }}
      {{ function.description|convert_markdown(heading_level, html_id) }} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html index b9e79d11..3bae2a83 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html @@ -15,7 +15,7 @@ {% for module in section.value %} - {{ module.name }} + {{ module.name }}
      {{ module.description|convert_markdown(heading_level, html_id) }} @@ -32,7 +32,7 @@
        {% for module in section.value %}
      • - {{ module.name }} + {{ module.name }}
        {{ module.description|convert_markdown(heading_level, html_id) }} @@ -53,7 +53,7 @@ {% for module in section.value %} - {{ module.name }} + {{ module.name }}
        {{ module.description|convert_markdown(heading_level, html_id) }} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/function.html b/src/mkdocstrings_handlers/python/templates/material/_base/function.html index 341b0825..5c2ac29e 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/function.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/function.html @@ -16,16 +16,19 @@ {% endif %} {% set function_name = function.path if show_full_path else function.name %} + {% set symbol_type = "method" if function.parent.is_class else "function" %} {% if not root or config.show_root_heading %} - - {% filter heading(heading_level, + {% filter heading( + heading_level, role="function", id=html_id, class="doc doc-heading", - toc_label=function.name ~ "()") %} + toc_label=((' ')|safe if config.show_symbol_type_toc else '') + function.name, + ) %} {% block heading scoped %} + {% if config.show_symbol_type_heading %}{% endif %} {% if config.separate_signature %} {{ function_name }} {% else %} @@ -52,12 +55,15 @@ {% endblock signature %} {% else %} + {% if config.show_root_toc_entry %} - {% filter heading(heading_level, + {% filter heading( + heading_level, role="function", id=html_id, - toc_label=function.name, - hidden=True) %} + toc_label=((' ')|safe if config.show_symbol_type_toc else '') + function.name, + hidden=True, + ) %} {% endfilter %} {% endif %} {% set heading_level = heading_level - 1 %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/module.html b/src/mkdocstrings_handlers/python/templates/material/_base/module.html index dc44142b..7d45e321 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/module.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/module.html @@ -16,14 +16,16 @@ {% set module_name = module.path if show_full_path else module.name %} {% if not root or config.show_root_heading %} - - {% filter heading(heading_level, + {% filter heading( + heading_level, role="module", id=html_id, class="doc doc-heading", - toc_label=module.name) %} + toc_label=(' '|safe if config.show_symbol_type_toc else '') + module.name, + ) %} {% block heading scoped %} + {% if config.show_symbol_type_heading %}{% endif %} {% if config.separate_signature %} {{ module_name }} {% else %} @@ -44,8 +46,9 @@ {% filter heading(heading_level, role="module", id=html_id, - toc_label=module.name, - hidden=True) %} + toc_label=(' '|safe if config.show_symbol_type_toc else '') + module.name, + hidden=True, + ) %} {% endfilter %} {% endif %} {% set heading_level = heading_level - 1 %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/summary.html b/src/mkdocstrings_handlers/python/templates/material/_base/summary.html new file mode 100644 index 00000000..e69de29b diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/summary/attributes.html b/src/mkdocstrings_handlers/python/templates/material/_base/summary/attributes.html new file mode 100644 index 00000000..e69de29b diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/summary/classes.html b/src/mkdocstrings_handlers/python/templates/material/_base/summary/classes.html new file mode 100644 index 00000000..e69de29b diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/summary/functions.html b/src/mkdocstrings_handlers/python/templates/material/_base/summary/functions.html new file mode 100644 index 00000000..e69de29b diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/summary/modules.html b/src/mkdocstrings_handlers/python/templates/material/_base/summary/modules.html new file mode 100644 index 00000000..e69de29b diff --git a/src/mkdocstrings_handlers/python/templates/material/style.css b/src/mkdocstrings_handlers/python/templates/material/style.css index f1da921a..82086b8f 100644 --- a/src/mkdocstrings_handlers/python/templates/material/style.css +++ b/src/mkdocstrings_handlers/python/templates/material/style.css @@ -25,39 +25,84 @@ float: right; } -/* Keep headings consistent. */ -h1.doc-heading, -h2.doc-heading, -h3.doc-heading, -h4.doc-heading, -h5.doc-heading, -h6.doc-heading { - font-weight: 400; - line-height: 1.5; - color: inherit; - text-transform: none; +/* Symbols in Navigation and ToC. */ +:root, +[data-md-color-scheme="default"] { + --doc-symbol-attribute-fg-color: #953800; + --doc-symbol-function-fg-color: #8250df; + --doc-symbol-method-fg-color: #8250df; + --doc-symbol-class-fg-color: #0550ae; + --doc-symbol-module-fg-color: #5cad0f; + + --doc-symbol-attribute-bg-color: #9538001a; + --doc-symbol-function-bg-color: #8250df1a; + --doc-symbol-method-bg-color: #8250df1a; + --doc-symbol-class-bg-color: #0550ae1a; + --doc-symbol-module-bg-color: #5cad0f1a; +} + +[data-md-color-scheme="slate"] { + --doc-symbol-attribute-fg-color: #ffa657; + --doc-symbol-function-fg-color: #d2a8ff; + --doc-symbol-method-fg-color: #d2a8ff; + --doc-symbol-class-fg-color: #79c0ff; + --doc-symbol-module-fg-color: #baff79; + + --doc-symbol-attribute-bg-color: #ffa6571a; + --doc-symbol-function-bg-color: #d2a8ff1a; + --doc-symbol-method-bg-color: #d2a8ff1a; + --doc-symbol-class-bg-color: #79c0ff1a; + --doc-symbol-module-bg-color: #baff791a; +} + +code.doc-symbol { + border-radius: .1rem; + font-size: .85em; + padding: 0 .3em; + font-weight: bold; +} + +code.doc-symbol-attribute { + color: var(--doc-symbol-attribute-fg-color); + background-color: var(--doc-symbol-attribute-bg-color); +} + +code.doc-symbol-attribute::after { + content: "attr"; +} + +code.doc-symbol-function { + color: var(--doc-symbol-function-fg-color); + background-color: var(--doc-symbol-function-bg-color); +} + +code.doc-symbol-function::after { + content: "func"; } -h1.doc-heading { - font-size: 1.6rem; +code.doc-symbol-method { + color: var(--doc-symbol-method-fg-color); + background-color: var(--doc-symbol-method-bg-color); } -h2.doc-heading { - font-size: 1.2rem; +code.doc-symbol-method::after { + content: "meth"; } -h3.doc-heading { - font-size: 1.15rem; +code.doc-symbol-class { + color: var(--doc-symbol-class-fg-color); + background-color: var(--doc-symbol-class-bg-color); } -h4.doc-heading { - font-size: 1.10rem; +code.doc-symbol-class::after { + content: "class"; } -h5.doc-heading { - font-size: 1.05rem; +code.doc-symbol-module { + color: var(--doc-symbol-module-fg-color); + background-color: var(--doc-symbol-module-bg-color); } -h6.doc-heading { - font-size: 1rem; +code.doc-symbol-module::after { + content: "mod"; } \ No newline at end of file diff --git a/src/mkdocstrings_handlers/python/templates/material/summary.html b/src/mkdocstrings_handlers/python/templates/material/summary.html new file mode 100644 index 00000000..6fccfa90 --- /dev/null +++ b/src/mkdocstrings_handlers/python/templates/material/summary.html @@ -0,0 +1 @@ +{% extends "_base/summary.html" %} diff --git a/src/mkdocstrings_handlers/python/templates/material/summary/attributes.html b/src/mkdocstrings_handlers/python/templates/material/summary/attributes.html new file mode 100644 index 00000000..e088b5fc --- /dev/null +++ b/src/mkdocstrings_handlers/python/templates/material/summary/attributes.html @@ -0,0 +1 @@ +{% extends "_base/summary/attributes.html" %} diff --git a/src/mkdocstrings_handlers/python/templates/material/summary/classes.html b/src/mkdocstrings_handlers/python/templates/material/summary/classes.html new file mode 100644 index 00000000..ab845ed5 --- /dev/null +++ b/src/mkdocstrings_handlers/python/templates/material/summary/classes.html @@ -0,0 +1 @@ +{% extends "_base/summary/classes.html" %} diff --git a/src/mkdocstrings_handlers/python/templates/material/summary/functions.html b/src/mkdocstrings_handlers/python/templates/material/summary/functions.html new file mode 100644 index 00000000..d5c6231b --- /dev/null +++ b/src/mkdocstrings_handlers/python/templates/material/summary/functions.html @@ -0,0 +1 @@ +{% extends "_base/summary/functions.html" %} diff --git a/src/mkdocstrings_handlers/python/templates/material/summary/modules.html b/src/mkdocstrings_handlers/python/templates/material/summary/modules.html new file mode 100644 index 00000000..4765400f --- /dev/null +++ b/src/mkdocstrings_handlers/python/templates/material/summary/modules.html @@ -0,0 +1 @@ +{% extends "_base/summary/modules.html" %} From 36499eb87db7314c267861ecc7aeaac2a21cf656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Mon, 8 Jan 2024 17:14:58 +0100 Subject: [PATCH 010/243] chore: Prepare release 1.8.0 --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e4449d1..2c5647dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,23 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [1.8.0](https://github.com/mkdocstrings/python/releases/tag/1.8.0) - 2024-01-08 + +[Compare with 1.7.5](https://github.com/mkdocstrings/python/compare/1.7.5...1.8.0) + +### Features + +- Release Insiders features of the $500/month funding goal ([bd30106](https://github.com/mkdocstrings/python/commit/bd301061fe9c647f9b91c2c9b4baa784c304eca7) by Timothée Mazzucotelli). + The features and projects related to *mkdocstrings-python* are: + + - [Cross-references for type annotations in signatures](https://mkdocstrings.github.io/python/usage/configuration/signatures/#signature_crossrefs) + - [Symbol types in headings and table of contents](https://mkdocstrings.github.io/python/usage/configuration/headings/#show_symbol_type_toc) + - [`griffe-inherited-docstrings`](https://mkdocstrings.github.io/griffe-inherited-docstrings/), a Griffe extension for inheriting docstrings + - [`griffe2md`](https://mkdocstrings.github.io/griffe2md/), a tool to output API docs to Markdown using Griffe + + See the complete list of features and projects here: + https://pawamoy.github.io/insiders/#500-plasmavac-user-guide. + ## [1.7.5](https://github.com/mkdocstrings/python/releases/tag/1.7.5) - 2023-11-21 [Compare with 1.7.4](https://github.com/mkdocstrings/python/compare/1.7.4...1.7.5) From 4fe186f1002395d398cb386bb6914fdb497d7c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Mon, 8 Jan 2024 17:47:05 +0100 Subject: [PATCH 011/243] chore: Template upgrade --- .copier-answers.yml | 2 +- Makefile | 1 + scripts/insiders.py | 2 +- scripts/setup.sh | 7 +++++++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index 58ab94af..d8a0fef0 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: 1.1.3 +_commit: 1.2.0 _src_path: gh:pawamoy/copier-pdm author_email: pawamoy@pm.me author_fullname: Timothée Mazzucotelli diff --git a/Makefile b/Makefile index 437880eb..8ad5209e 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,7 @@ SHELL := bash DUTY := $(if $(VIRTUAL_ENV),,pdm run) duty export PDM_MULTIRUN_VERSIONS ?= 3.8 3.9 3.10 3.11 3.12 +export PDM_MULTIRUN_USE_VENVS ?= $(if $(shell pdm config python.use_venv | grep True),1,0) args = $(foreach a,$($(subst -,_,$1)_args),$(if $(value $a),$a="$($a)")) check_quality_args = files diff --git a/scripts/insiders.py b/scripts/insiders.py index 8f5e215e..85ecbd0e 100644 --- a/scripts/insiders.py +++ b/scripts/insiders.py @@ -155,7 +155,7 @@ def funding_goals(source: str | list[str | tuple[str, str, str]], funding: int = return _load_goals_from_disk(source, funding) goals = {} for src in source: - source_goals = _load_goals(src) + source_goals = _load_goals(src, funding) for amount, goal in source_goals.items(): if amount not in goals: goals[amount] = goal diff --git a/scripts/setup.sh b/scripts/setup.sh index bbf0d11d..eef38433 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -12,6 +12,13 @@ if ! pdm self list 2>/dev/null | grep -q pdm-multirun; then fi if [ -n "${PDM_MULTIRUN_VERSIONS}" ]; then + if [ "${PDM_MULTIRUN_USE_VENVS}" -eq "1" ]; then + for version in ${PDM_MULTIRUN_VERSIONS}; do + if ! pdm venv --path "${version}" &>/dev/null; then + pdm venv create --name "${version}" "${version}" + fi + done + fi pdm multirun -v pdm install -G:all else pdm install -G:all From 03e53e3964908d77068ed7d8538a046222b56d55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Tue, 9 Jan 2024 15:56:45 +0100 Subject: [PATCH 012/243] docs: Tell that members are still grouped by category when specifying members or members order options Issue #119: https://github.com/mkdocstrings/python/issues/119 --- docs/usage/configuration/members.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/usage/configuration/members.md b/docs/usage/configuration/members.md index 0b6d27e5..f558040f 100644 --- a/docs/usage/configuration/members.md +++ b/docs/usage/configuration/members.md @@ -14,6 +14,8 @@ even if [`show_if_no_docstring`][] is set to false. The members will be rendered in the specified order, regardless of the value of [`members_order`][]. +**Note that members will still be grouped by category, +according to the [`group_by_category`][] option.** Passing a falsy value (`no`, `false` in YAML) or an empty list (`[]`) will tell the Python handler not to render any member. @@ -269,6 +271,8 @@ The members ordering to use. Possible values: The order applies for all members, recursively. The order will be ignored for members that are explicitely sorted using the [`members`][] option. +**Note that members will still be grouped by category, +according to the [`group_by_category`][] option.** ```yaml title="in mkdocs.yml (global configuration)" plugins: From d70cd9d6e592e545b2c4e1d6964a927df0fcb7d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Wed, 31 Jan 2024 12:32:16 +0100 Subject: [PATCH 013/243] docs: Fix typo --- docs/usage/customization.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage/customization.md b/docs/usage/customization.md index 9dedbf20..14721092 100644 --- a/docs/usage/customization.md +++ b/docs/usage/customization.md @@ -324,7 +324,7 @@ Available context: Available context: - `config`: The handler configuration (dictionary). -- `function`: The [Attribute][griffe.dataclasses.Attribute] instance. +- `attribute`: The [Attribute][griffe.dataclasses.Attribute] instance. #### Docstring sections From 548bdaddd66ffc99b3b9a5a62228a2ff4ff0dd00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Wed, 31 Jan 2024 12:32:37 +0100 Subject: [PATCH 014/243] refactor: Mark all Jinja blocks as scoped --- .../templates/material/_base/docstring/attributes.html | 6 +++--- .../python/templates/material/_base/docstring/classes.html | 6 +++--- .../templates/material/_base/docstring/functions.html | 6 +++--- .../python/templates/material/_base/docstring/modules.html | 6 +++--- .../material/_base/docstring/other_parameters.html | 6 +++--- .../templates/material/_base/docstring/parameters.html | 6 +++--- .../python/templates/material/_base/docstring/raises.html | 6 +++--- .../python/templates/material/_base/docstring/receives.html | 6 +++--- .../python/templates/material/_base/docstring/returns.html | 6 +++--- .../python/templates/material/_base/docstring/warns.html | 6 +++--- .../python/templates/material/_base/docstring/yields.html | 6 +++--- 11 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html index 0b291574..88c5990d 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html @@ -3,7 +3,7 @@ {% import "language.html" as lang with context %} {% if config.docstring_section_style == "table" %} - {% block table_style %} + {% block table_style scoped %}

        {{ section.title or lang.t("Attributes:") }}

        @@ -35,7 +35,7 @@
        {% endblock table_style %} {% elif config.docstring_section_style == "list" %} - {% block list_style %} + {% block list_style scoped %}

        {{ section.title or lang.t("Attributes:") }}

          {% for attribute in section.value %} @@ -55,7 +55,7 @@
        {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} - {% block spacy_style %} + {% block spacy_style scoped %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html index 42531649..b8ad2e0f 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html @@ -3,7 +3,7 @@ {% import "language.html" as lang with context %} {% if config.docstring_section_style == "table" %} - {% block table_style %} + {% block table_style scoped %}

        {{ section.title or lang.t("Classes:") }}

        @@ -27,7 +27,7 @@
        {% endblock table_style %} {% elif config.docstring_section_style == "list" %} - {% block list_style %} + {% block list_style scoped %}

        {{ section.title or lang.t("Classes:") }}

          {% for class in section.value %} @@ -42,7 +42,7 @@
        {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} - {% block spacy_style %} + {% block spacy_style scoped %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html index f93a2e4b..ab1939f5 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html @@ -3,7 +3,7 @@ {% import "language.html" as lang with context %} {% if config.docstring_section_style == "table" %} - {% block table_style %} + {% block table_style scoped %}

        {{ section.title or lang.t("Methods:") if obj.is_class else lang.t("Functions:") }}

        @@ -29,7 +29,7 @@
        {% endblock table_style %} {% elif config.docstring_section_style == "list" %} - {% block list_style %} + {% block list_style scoped %}

        {{ section.title or lang.t("Methods:") if obj.is_class else lang.t("Functions:") }}

          {% for function in section.value %} @@ -46,7 +46,7 @@
        {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} - {% block spacy_style %} + {% block spacy_style scoped %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html index 3bae2a83..f771f20b 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html @@ -3,7 +3,7 @@ {% import "language.html" as lang with context %} {% if config.docstring_section_style == "table" %} - {% block table_style %} + {% block table_style scoped %}

        {{ section.title or lang.t("Modules:") }}

        @@ -27,7 +27,7 @@
        {% endblock table_style %} {% elif config.docstring_section_style == "list" %} - {% block list_style %} + {% block list_style scoped %}

        {{ section.title or lang.t("Modules:") }}

          {% for module in section.value %} @@ -42,7 +42,7 @@
        {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} - {% block spacy_style %} + {% block spacy_style scoped %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html index 8315381d..7ede6715 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html @@ -3,7 +3,7 @@ {% import "language.html" as lang with context %} {% if config.docstring_section_style == "table" %} - {% block table_style %} + {% block table_style scoped %}

        {{ section.title or lang.t("Other Parameters:") }}

        @@ -35,7 +35,7 @@
        {% endblock table_style %} {% elif config.docstring_section_style == "list" %} - {% block list_style %} + {% block list_style scoped %}

        {{ section.title or lang.t("Other Parameters:") }}

          {% for parameter in section.value %} @@ -55,7 +55,7 @@
        {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} - {% block spacy_style %} + {% block spacy_style scoped %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html index 9483e8af..7b4788ca 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html @@ -3,7 +3,7 @@ {% import "language.html" as lang with context %} {% if config.docstring_section_style == "table" %} - {% block table_style %} + {% block table_style scoped %}

        {{ section.title or lang.t("Parameters:") }}

        @@ -45,7 +45,7 @@
        {% endblock table_style %} {% elif config.docstring_section_style == "list" %} - {% block list_style %} + {% block list_style scoped %}

        {{ section.title or lang.t("Parameters:") }}

          {% for parameter in section.value %} @@ -70,7 +70,7 @@
        {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} - {% block spacy_style %} + {% block spacy_style scoped %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html index e4edc66a..396ccc73 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html @@ -3,7 +3,7 @@ {% import "language.html" as lang with context %} {% if config.docstring_section_style == "table" %} - {% block table_style %} + {% block table_style scoped %}

        {{ section.title or lang.t("Raises:") }}

        @@ -33,7 +33,7 @@
        {% endblock table_style %} {% elif config.docstring_section_style == "list" %} - {% block list_style %} + {% block list_style scoped %}

        {{ lang.t(section.title) or lang.t("Raises:") }}

          {% for raises in section.value %} @@ -52,7 +52,7 @@
        {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} - {% block spacy_style %} + {% block spacy_style scoped %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html index d58fb684..77d83c0b 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html @@ -3,7 +3,7 @@ {% import "language.html" as lang with context %} {% if config.docstring_section_style == "table" %} - {% block table_style %} + {% block table_style scoped %} {% set name_column = section.value|selectattr("name")|any %}

        {{ section.title or lang.t("Receives:") }}

        @@ -36,7 +36,7 @@
        {% endblock table_style %} {% elif config.docstring_section_style == "list" %} - {% block list_style %} + {% block list_style scoped %}

        {{ section.title or lang.t("Receives:") }}

          {% for receives in section.value %} @@ -58,7 +58,7 @@
        {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} - {% block spacy_style %} + {% block spacy_style scoped %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html index a8e3b776..b19917a3 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html @@ -3,7 +3,7 @@ {% import "language.html" as lang with context %} {% if config.docstring_section_style == "table" %} - {% block table_style %} + {% block table_style scoped %} {% set name_column = section.value|selectattr("name")|any %}

        {{ section.title or lang.t("Returns:") }}

        @@ -36,7 +36,7 @@
        {% endblock table_style %} {% elif config.docstring_section_style == "list" %} - {% block list_style %} + {% block list_style scoped %}

        {{ section.title or lang.t("Returns:") }}

          {% for returns in section.value %} @@ -58,7 +58,7 @@
        {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} - {% block spacy_style %} + {% block spacy_style scoped %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html index cf1cc4a6..8377669f 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html @@ -3,7 +3,7 @@ {% import "language.html" as lang with context %} {% if config.docstring_section_style == "table" %} - {% block table_style %} + {% block table_style scoped %}

        {{ section.title or lang.t("Warns:") }}

        @@ -33,7 +33,7 @@
        {% endblock table_style %} {% elif config.docstring_section_style == "list" %} - {% block list_style %} + {% block list_style scoped %}

        {{ section.title or lang.t("Warns:") }}

          {% for warns in section.value %} @@ -52,7 +52,7 @@
        {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} - {% block spacy_style %} + {% block spacy_style scoped %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html index 63824c0c..c69135ea 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html @@ -3,7 +3,7 @@ {% import "language.html" as lang with context %} {% if config.docstring_section_style == "table" %} - {% block table_style %} + {% block table_style scoped %} {% set name_column = section.value|selectattr("name")|any %}

        {{ section.title or lang.t("Yields:") }}

        @@ -36,7 +36,7 @@
        {% endblock table_style %} {% elif config.docstring_section_style == "list" %} - {% block list_style %} + {% block list_style scoped %}

        {{ section.title or lang.t("Yields:") }}

          {% for yields in section.value %} @@ -58,7 +58,7 @@
        {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} - {% block spacy_style %} + {% block spacy_style scoped %} From 0c6aa323c9e57b8348765a5daa11c79d0c5edb07 Mon Sep 17 00:00:00 2001 From: Romain Date: Sat, 3 Feb 2024 05:40:36 -0800 Subject: [PATCH 015/243] feat: Add option to search for stubs packages This allows using the feature in Griffe that searches for stubs packages. PR #128: https://github.com/mkdocstrings/python/pull/128 PR griffe#221: : https://github.com/mkdocstrings/griffe/pull/221 --- docs/usage/configuration/general.md | 57 +++++++++++++++++++++ src/mkdocstrings_handlers/python/handler.py | 6 ++- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/docs/usage/configuration/general.md b/docs/usage/configuration/general.md index 320d0074..e4ddaec1 100644 --- a/docs/usage/configuration/general.md +++ b/docs/usage/configuration/general.md @@ -191,3 +191,60 @@ __all__ = ["their_object"]

        Docstring of your module.

        //// /// + +## `find_stubs_package` + +- **:octicons-package-24: Type [`bool`][] :material-equal: `False`{ title="default value" }** + + +When looking for documentation specified in [autodoc instructions][autodoc syntax] (`::: identifier`), also look for +the stubs package as defined in [PEP 561](https://peps.python.org/pep-0561/) if it exists. This is useful when +most of your documentation is separately provided by such a package and not inline in your main package. + +```yaml title="in mkdocs.yml (global configuration)" +plugins: +- mkdocstrings: + handlers: + python: + options: + find_stubs_package: true +``` + +```md title="or in docs/some_page.md (local configuration)" +::: your_package.your_module.your_func + options: + find_stubs_package: true +``` + +```python title="your_package/your_module.py" + +def your_func(a, b): + # Function code + ... + +# rest of your code +``` + +```python title="your_package-stubs/your_module.pyi" + +def your_func(a: int, b: str): + """ + + """ + ... + +# rest of your code +``` + +/// admonition | Preview + type: preview + +//// tab | With find_stubs_package +

        your_func

        +

        Function docstring

        +//// + +//// tab | Without find_stubs_package +

        your_func

        +//// +/// diff --git a/src/mkdocstrings_handlers/python/handler.py b/src/mkdocstrings_handlers/python/handler.py index 9f6cae4b..7b33e30c 100644 --- a/src/mkdocstrings_handlers/python/handler.py +++ b/src/mkdocstrings_handlers/python/handler.py @@ -61,6 +61,7 @@ class PythonHandler(BaseHandler): fallback_config: ClassVar[dict] = {"fallback": True} """The configuration used to collect item during autorefs fallback.""" default_config: ClassVar[dict] = { + "find_stubs_package": False, "docstring_style": "google", "docstring_options": {}, "show_symbol_type_heading": False, @@ -110,6 +111,7 @@ class PythonHandler(BaseHandler): """Default handler configuration. Attributes: General options: + find_stubs_package (bool): Whether to load stubs package (package-stubs) when extracting docstrings. allow_inspection (bool): Whether to allow inspecting modules when visiting them is not possible. Default: `True`. show_bases (bool): Show the base classes of a class. Default: `True`. show_source (bool): Show the source code of this object. Default: `True`. @@ -279,8 +281,8 @@ def collect(self, identifier: str, config: Mapping[str, Any]) -> CollectorItem: try: for pre_loaded_module in final_config.get("preload_modules") or []: if pre_loaded_module not in self._modules_collection: - loader.load(pre_loaded_module) - loader.load(module_name) + loader.load(pre_loaded_module, find_stubs_package=final_config["find_stubs_package"]) + loader.load(module_name, find_stubs_package=final_config["find_stubs_package"]) except ImportError as error: raise CollectionError(str(error)) from error unresolved, iterations = loader.resolve_aliases( From 8e867785574536cf085496ef32647b5ad2b1b517 Mon Sep 17 00:00:00 2001 From: Romain Date: Sun, 4 Feb 2024 02:35:40 -0800 Subject: [PATCH 016/243] docs: Add default value for `find_stubs_package` docs --- src/mkdocstrings_handlers/python/handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mkdocstrings_handlers/python/handler.py b/src/mkdocstrings_handlers/python/handler.py index 7b33e30c..7ffdaf6b 100644 --- a/src/mkdocstrings_handlers/python/handler.py +++ b/src/mkdocstrings_handlers/python/handler.py @@ -111,7 +111,7 @@ class PythonHandler(BaseHandler): """Default handler configuration. Attributes: General options: - find_stubs_package (bool): Whether to load stubs package (package-stubs) when extracting docstrings. + find_stubs_package (bool): Whether to load stubs package (package-stubs) when extracting docstrings. Default `False`. allow_inspection (bool): Whether to allow inspecting modules when visiting them is not possible. Default: `True`. show_bases (bool): Show the base classes of a class. Default: `True`. show_source (bool): Show the source code of this object. Default: `True`. From eaf9b8240069f7369f401fe048892043c8b173d3 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Mon, 5 Feb 2024 13:47:05 +0100 Subject: [PATCH 017/243] feat: Add `show_labels` option to show/hide labels Issue #120: https://github.com/mkdocstrings/python/issues/120 PR #130: https://github.com/mkdocstrings/python/pull/130 --- docs/usage/configuration/members.md | 46 +++++++++++++++++++ src/mkdocstrings_handlers/python/handler.py | 2 + .../templates/material/_base/labels.html | 2 +- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/docs/usage/configuration/members.md b/docs/usage/configuration/members.md index f558040f..1e5ff771 100644 --- a/docs/usage/configuration/members.md +++ b/docs/usage/configuration/members.md @@ -643,3 +643,49 @@ plugins: //// /// + +## `show_labels` + +- **:octicons-package-24: Type [`bool`][] :material-equal: `True`{ title="default value" }** + + +Whether to show labels of the members. + +```yaml title="in mkdocs.yml (global configuration)" +plugins: +- mkdocstrings: + handlers: + python: + options: + show_labels: true +``` + +```md title="or in docs/some_page.md (local configuration)" +::: package.module + options: + show_labels: false +``` + +```python title="package/module.py" +class SomeClass: + some_attr: int +``` + +/// admonition | Preview + type: preview + +//// tab | With labels + + some_attr: + int + +instance-attribute +//// + +//// tab | Without labels + + some_attr: + int + +//// +/// diff --git a/src/mkdocstrings_handlers/python/handler.py b/src/mkdocstrings_handlers/python/handler.py index 7ffdaf6b..c5217e98 100644 --- a/src/mkdocstrings_handlers/python/handler.py +++ b/src/mkdocstrings_handlers/python/handler.py @@ -106,6 +106,7 @@ class PythonHandler(BaseHandler): "preload_modules": None, "allow_inspection": True, "summary": False, + "show_labels": True, "unwrap_annotated": False, } """Default handler configuration. @@ -154,6 +155,7 @@ class PythonHandler(BaseHandler): group_by_category (bool): Group the object's children by categories: attributes, classes, functions, and modules. Default: `True`. show_submodules (bool): When rendering a module, show its submodules recursively. Default: `False`. summary (bool | dict[str, bool]): Whether to render summaries of modules, classes, functions (methods) and attributes. + show_labels (bool): Whether to show labels of the members. Default: `True`. Attributes: Docstrings options: docstring_style (str): The docstring style to use: `google`, `numpy`, `sphinx`, or `None`. Default: `"google"`. diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/labels.html b/src/mkdocstrings_handlers/python/templates/material/_base/labels.html index 0c84067a..a35bffbb 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/labels.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/labels.html @@ -1,4 +1,4 @@ -{% if labels %} +{% if config.show_labels and labels %} {{ log.debug("Rendering labels") }} {% for label in labels|sort %} From 6364fbcd4012d2026aa9efe4501b697f08b8c6ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Wed, 13 Mar 2024 19:34:04 +0100 Subject: [PATCH 018/243] chore: Template upgrade --- .copier-answers.yml | 7 +++--- .github/workflows/ci.yml | 8 +++---- .github/workflows/release.yml | 4 ++-- .gitignore | 1 + CODE_OF_CONDUCT.md | 2 +- config/ruff.toml | 6 ++++- config/vscode/launch.json | 4 ++-- docs/insiders/index.md | 44 +++++++++++++++++++++++------------ docs/insiders/installation.md | 4 ++-- docs/js/insiders.js | 39 ++++++++++++++++++------------- duties.py | 4 ++-- pyproject.toml | 2 +- scripts/gen_ref_nav.py | 5 ++-- 13 files changed, 79 insertions(+), 51 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index d8a0fef0..dd37bf57 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,14 +1,15 @@ # Changes here will be overwritten by Copier -_commit: 1.2.0 +_commit: 1.2.6 _src_path: gh:pawamoy/copier-pdm -author_email: pawamoy@pm.me +author_email: dev@pawamoy.fr author_fullname: Timothée Mazzucotelli author_username: pawamoy copyright_date: '2021' copyright_holder: Timothée Mazzucotelli -copyright_holder_email: pawamoy@pm.me +copyright_holder_email: dev@pawamoy.fr copyright_license: ISC License insiders: true +insiders_email: insiders@pawamoy.fr insiders_repository_name: mkdocstrings-python project_description: A Python handler for mkdocstrings. project_name: mkdocstrings-python diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a1d63df6..be76a509 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,13 +23,13 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Fetch all tags run: git fetch --depth=1 --tags - name: Set up PDM - uses: pdm-project/setup-pdm@v3 + uses: pdm-project/setup-pdm@v4 with: python-version: "3.8" @@ -96,10 +96,10 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up PDM - uses: pdm-project/setup-pdm@v3 + uses: pdm-project/setup-pdm@v4 with: python-version: ${{ matrix.python-version }} allow-python-prereleases: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3dcc3fe4..d82736f7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,7 +10,7 @@ jobs: if: startsWith(github.ref, 'refs/tags/') steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Fetch all tags run: git fetch --depth=1 --tags - name: Setup Python @@ -22,7 +22,7 @@ jobs: if: github.repository_owner == 'pawamoy-insiders' run: python -m build - name: Upload dists artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: github.repository_owner == 'pawamoy-insiders' with: name: python-insiders diff --git a/.gitignore b/.gitignore index ae47b28b..588e34e0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea/ +.vscode/ __pycache__/ *.py[cod] dist/ diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index fe3eefbf..255e0eed 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -60,7 +60,7 @@ representative at an online or offline event. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at -pawamoy@pm.me. +dev@pawamoy.fr. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the diff --git a/config/ruff.toml b/config/ruff.toml index 99efa62b..a16c92b6 100644 --- a/config/ruff.toml +++ b/config/ruff.toml @@ -1,5 +1,5 @@ target-version = "py38" -line-length = 132 +line-length = 120 exclude = [ "fixtures", "site", @@ -102,3 +102,7 @@ known-first-party = ["mkdocstrings_handlers"] [pydocstyle] convention = "google" + +[format] +docstring-code-format = true +docstring-code-line-length = 80 diff --git a/config/vscode/launch.json b/config/vscode/launch.json index 2e0d651e..d056ccee 100644 --- a/config/vscode/launch.json +++ b/config/vscode/launch.json @@ -3,7 +3,7 @@ "configurations": [ { "name": "python (current file)", - "type": "python", + "type": "debugpy", "request": "launch", "program": "${file}", "console": "integratedTerminal", @@ -11,7 +11,7 @@ }, { "name": "test", - "type": "python", + "type": "debugpy", "request": "launch", "module": "pytest", "justMyCode": false, diff --git a/docs/insiders/index.md b/docs/insiders/index.md index ceb3c59c..a6642ede 100644 --- a/docs/insiders/index.md +++ b/docs/insiders/index.md @@ -65,17 +65,31 @@ data_source = [ ``` -```python exec="1" session="insiders" +```python exec="1" session="insiders" idprefix="" --8<-- "scripts/insiders.py" -print( - f"""The moment you become a sponsor, you'll get **immediate - access to {len(unreleased_features)} additional features** that you can start using right away, and - which are currently exclusively available to sponsors:\n""" -) - -for feature in unreleased_features: - feature.render(badge=True) +if unreleased_features: + print( + "The moment you [become a sponsor](#how-to-become-a-sponsor), you'll get **immediate " + f"access to {len(unreleased_features)} additional features** that you can start using right away, and " + "which are currently exclusively available to sponsors:\n" + ) + + for feature in unreleased_features: + feature.render(badge=True) + + print( + "\n\nThese are just the features related to this project. " + "[See the complete feature list on the author's main Insiders page](https://pawamoy.github.io/insiders/#whats-in-it-for-me)." + ) +else: + print( + "The moment you [become a sponsor](#how-to-become-a-sponsor), you'll get immediate " + "access to all released features that you can start using right away, and " + "which are exclusively available to sponsors. At this moment, there are no " + "Insiders features for this project, but checkout the [next funding goals](#goals) " + "to see what's coming, as well as **[the feature list for all Insiders projects](https://pawamoy.github.io/insiders/#whats-in-it-for-me).**" + ) ``` @@ -88,7 +102,7 @@ You can use your individual or organization GitHub account for sponsoring. **Important**: If you're sponsoring **[@pawamoy][github sponsor profile]** through a GitHub organization, please send a short email -to pawamoy@pm.me with the name of your +to insiders@pawamoy.fr with the name of your organization and the GitHub account of the individual that should be added as a collaborator.[^4] @@ -97,7 +111,7 @@ You can cancel your sponsorship anytime.[^5] [^4]: It's currently not possible to grant access to each member of an organization, as GitHub only allows for adding users. Thus, after - sponsoring, please send an email to pawamoy@pm.me, stating which + sponsoring, please send an email to insiders@pawamoy.fr, stating which account should become a collaborator of the Insiders repository. We're working on a solution which will make access to organizations much simpler. To ensure that access is not tied to a particular individual GitHub account, @@ -120,10 +134,10 @@ You can cancel your sponsorship anytime.[^5]
        - -
        +
        +
        +
        -
        @@ -188,7 +202,7 @@ yearly billing cycle][billing cycle]. If for some reason you cannot do that, you could also create a dedicated GitHub account with a yearly billing cycle, which you only use for sponsoring (some sponsors already do that). -If you have any problems or further questions, please reach out to pawamoy@pm.me. +If you have any problems or further questions, please reach out to insiders@pawamoy.fr. ### Terms diff --git a/docs/insiders/installation.md b/docs/insiders/installation.md index 3d9d75d8..3ebe5dfd 100644 --- a/docs/insiders/installation.md +++ b/docs/insiders/installation.md @@ -143,7 +143,7 @@ as it is against our [Terms of use](index.md#terms).** > ```bash > # clone the repository > git clone git@github.com:pawamoy-insiders/mkdocstrings-python -> cd python +> cd mkdocstrings-python > > # install build > pip install --user build @@ -184,7 +184,7 @@ git clone git@github.com:pawamoy-insiders/mkdocstrings-python When cloning from `git`, the package must be installed: ``` -pip install -e python +pip install -e mkdocstrings-python ``` ## Upgrading diff --git a/docs/js/insiders.js b/docs/js/insiders.js index 03bcb404..8bb68485 100644 --- a/docs/js/insiders.js +++ b/docs/js/insiders.js @@ -21,6 +21,26 @@ function getJSON(url, callback) { xhr.send(); } +function updatePremiumSponsors(dataURL, rank) { + let capRank = rank.charAt(0).toUpperCase() + rank.slice(1); + getJSON(dataURL + `/sponsors${capRank}.json`, function (err, sponsors) { + const sponsorsDiv = document.getElementById(`${rank}-sponsors`); + if (sponsors.length > 0) { + let html = ''; + html += `${capRank} sponsors

        ` + sponsors.forEach(function (sponsor) { + html += ` + + ${sponsor.name} + + ` + }); + html += '

        ' + sponsorsDiv.innerHTML = html; + } + }); +} + function updateInsidersPage(author_username) { const sponsorURL = `https://github.com/sponsors/${author_username}` const dataURL = `https://raw.githubusercontent.com/${author_username}/sponsors/main`; @@ -48,20 +68,7 @@ function updateInsidersPage(author_username) { } }); }); - getJSON(dataURL + '/sponsorsBronze.json', function (err, sponsors) { - const bronzeSponsors = document.getElementById("bronze-sponsors"); - if (sponsors) { - let html = ''; - html += 'Bronze sponsors

        ' - sponsors.forEach(function (sponsor) { - html += ` - - ${sponsor.name} - - ` - }); - html += '

        ' - bronzeSponsors.innerHTML = html; - } - }); + updatePremiumSponsors(dataURL, "gold"); + updatePremiumSponsors(dataURL, "silver"); + updatePremiumSponsors(dataURL, "bronze"); } diff --git a/duties.py b/duties.py index 30fb2221..55fcf6a2 100644 --- a/duties.py +++ b/duties.py @@ -10,7 +10,7 @@ from typing import TYPE_CHECKING, Iterator from duty import duty -from duty.callables import black, coverage, lazy, mkdocs, mypy, pytest, ruff, safety +from duty.callables import coverage, lazy, mkdocs, mypy, pytest, ruff, safety if TYPE_CHECKING: from duty.context import Context @@ -225,7 +225,7 @@ def format(ctx: Context) -> None: ruff.check(*PY_SRC_LIST, config="config/ruff.toml", fix_only=True, exit_zero=True), title="Auto-fixing code", ) - ctx.run(black.run(*PY_SRC_LIST, config="config/black.toml"), title="Formatting code") + ctx.run(ruff.format(*PY_SRC_LIST, config="config/ruff.toml"), title="Formatting code") @duty(post=["docs-deploy"]) diff --git a/pyproject.toml b/pyproject.toml index 853cdf9e..75643e9a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "pdm.backend" [project] name = "mkdocstrings-python" description = "A Python handler for mkdocstrings." -authors = [{name = "Timothée Mazzucotelli", email = "pawamoy@pm.me"}] +authors = [{name = "Timothée Mazzucotelli", email = "dev@pawamoy.fr"}] license = {text = "ISC"} readme = "README.md" requires-python = ">=3.8" diff --git a/scripts/gen_ref_nav.py b/scripts/gen_ref_nav.py index 7285ac1c..b369536c 100644 --- a/scripts/gen_ref_nav.py +++ b/scripts/gen_ref_nav.py @@ -7,7 +7,8 @@ nav = mkdocs_gen_files.Nav() mod_symbol = '' -src = Path(__file__).parent.parent / "src" +root = Path(__file__).parent.parent +src = root / "src" for path in sorted(src.rglob("*.py")): module_path = path.relative_to(src).with_suffix("") @@ -30,7 +31,7 @@ ident = ".".join(parts) fd.write(f"::: {ident}") - mkdocs_gen_files.set_edit_path(full_doc_path, ".." / path) + mkdocs_gen_files.set_edit_path(full_doc_path, ".." / path.relative_to(root)) with mkdocs_gen_files.open("reference/SUMMARY.md", "w") as nav_file: nav_file.writelines(nav.build_literate_nav()) From 0dd0b7956bc2db2e492404cb5a445ad49f126a9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Wed, 13 Mar 2024 19:35:36 +0100 Subject: [PATCH 019/243] chore: Use mkdocstrings' handler-template --- .copier-answers.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.copier-answers.yml b/.copier-answers.yml index dd37bf57..65d4018a 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,6 +1,6 @@ # Changes here will be overwritten by Copier -_commit: 1.2.6 -_src_path: gh:pawamoy/copier-pdm +_commit: 0.1.0 +_src_path: gh:mkdocstrings/handler-template author_email: dev@pawamoy.fr author_fullname: Timothée Mazzucotelli author_username: pawamoy @@ -20,4 +20,4 @@ python_package_import_name: mkdocstrings_handlers repository_name: python repository_namespace: mkdocstrings repository_provider: github.com - +language: Python \ No newline at end of file From 20623257d0b98d843b68f8bd168e551a8c98b10d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Wed, 13 Mar 2024 19:49:01 +0100 Subject: [PATCH 020/243] chore: Template upgrade --- .copier-answers.yml | 8 +- .envrc | 1 + .github/workflows/ci.yml | 61 +++++-- .gitignore | 7 +- .gitpod.dockerfile | 2 +- CONTRIBUTING.md | 10 +- Makefile | 57 ++----- README.md | 22 +-- config/coverage.ini | 3 +- config/pytest.ini | 6 - config/ruff.toml | 64 +++----- config/vscode/launch.json | 11 ++ config/vscode/settings.json | 23 +-- config/vscode/tasks.json | 80 +++++---- devdeps.txt | 27 +++ docs/insiders/goals.yml | 8 +- docs/insiders/index.md | 7 +- duties.py | 21 ++- pyproject.toml | 44 ----- scripts/gen_credits.py | 150 +++++++++++------ scripts/insiders.py | 16 +- scripts/make | 155 ++++++++++++++++++ scripts/setup.sh | 25 --- src/mkdocstrings_handlers/python/__init__.py | 6 +- .../{ => python}/py.typed | 0 tests/conftest.py | 6 +- tests/test_themes.py | 13 +- 27 files changed, 483 insertions(+), 350 deletions(-) create mode 100644 .envrc create mode 100644 devdeps.txt create mode 100755 scripts/make delete mode 100755 scripts/setup.sh rename src/mkdocstrings_handlers/{ => python}/py.typed (100%) diff --git a/.copier-answers.yml b/.copier-answers.yml index 65d4018a..0e3a987e 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,5 +1,5 @@ # Changes here will be overwritten by Copier -_commit: 0.1.0 +_commit: 0.3.1 _src_path: gh:mkdocstrings/handler-template author_email: dev@pawamoy.fr author_fullname: Timothée Mazzucotelli @@ -11,13 +11,13 @@ copyright_license: ISC License insiders: true insiders_email: insiders@pawamoy.fr insiders_repository_name: mkdocstrings-python +language: Python project_description: A Python handler for mkdocstrings. project_name: mkdocstrings-python public_release: true -python_package_command_line_name: '' python_package_distribution_name: mkdocstrings-python -python_package_import_name: mkdocstrings_handlers +python_package_import_name: python repository_name: python repository_namespace: mkdocstrings repository_provider: github.com -language: Python \ No newline at end of file + diff --git a/.envrc b/.envrc new file mode 100644 index 00000000..f9d77ee3 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +PATH_add scripts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index be76a509..f3b59817 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,6 +14,7 @@ env: LANG: en_US.utf-8 LC_ALL: en_US.utf-8 PYTHONIOENCODING: UTF-8 + PYTHON_VERSIONS: "" jobs: @@ -28,28 +29,51 @@ jobs: - name: Fetch all tags run: git fetch --depth=1 --tags - - name: Set up PDM - uses: pdm-project/setup-pdm@v4 + - name: Set up Python + uses: actions/setup-python@v5 with: - python-version: "3.8" + python-version: "3.11" - - name: Resolving dependencies - run: pdm lock -v --no-cross-platform -G ci-quality + - name: Install uv + run: pip install uv - name: Install dependencies - run: pdm install -G ci-quality + run: make setup - name: Check if the documentation builds correctly - run: pdm run duty check-docs + run: make check-docs - name: Check the code quality - run: pdm run duty check-quality + run: make check-quality - name: Check if the code is correctly typed - run: pdm run duty check-types + run: make check-types - name: Check for vulnerabilities in dependencies - run: pdm run duty check-dependencies + run: make check-dependencies + + - name: Check for breaking changes in the API + run: make check-api + + exclude-test-jobs: + runs-on: ubuntu-latest + outputs: + jobs: ${{ steps.exclude-jobs.outputs.jobs }} + steps: + - id: exclude-jobs + run: | + if ${{ github.repository_owner == 'pawamoy-insiders' }}; then + echo 'jobs=[ + {"os": "macos-latest"}, + {"os": "windows-latest"}, + {"python-version": "3.9"}, + {"python-version": "3.10"}, + {"python-version": "3.11"}, + {"python-version": "3.12"} + ]' | tr -d '[:space:]' >> $GITHUB_OUTPUT + else + echo 'jobs=[]' >> $GITHUB_OUTPUT + fi - name: Check for breaking changes in the API run: pdm run duty check-api @@ -98,17 +122,20 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Set up PDM - uses: pdm-project/setup-pdm@v4 + - name: Set up Python + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - allow-python-prereleases: true + allow-prereleases: true - - name: Resolving dependencies - run: pdm lock -v --no-cross-platform -G ci-tests + - name: Install uv + run: pip install uv - name: Install dependencies - run: pdm install --no-editable -G ci-tests + run: | + uv venv + uv pip install -r devdeps.txt + uv pip install "mkdocstrings-python @ ." - name: Run the test suite - run: pdm run duty test + run: make test diff --git a/.gitignore b/.gitignore index 588e34e0..246951cc 100644 --- a/.gitignore +++ b/.gitignore @@ -10,11 +10,8 @@ htmlcov/ pip-wheel-metadata/ .pytest_cache/ .mypy_cache/ +.ruff_cache/ site/ -pdm.lock -pdm.toml -.pdm-plugins/ -.pdm-python -__pypackages__/ .venv/ +.venvs/ .cache/ diff --git a/.gitpod.dockerfile b/.gitpod.dockerfile index 0e6d9d35..1590b415 100644 --- a/.gitpod.dockerfile +++ b/.gitpod.dockerfile @@ -2,5 +2,5 @@ FROM gitpod/workspace-full USER gitpod ENV PIP_USER=no RUN pip3 install pipx; \ - pipx install pdm; \ + pipx install uv; \ pipx ensurepath diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dfe5a910..6af01962 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,18 +17,18 @@ make setup > NOTE: > If it fails for some reason, > you'll need to install -> [PDM](https://github.com/pdm-project/pdm) +> [uv](https://github.com/astral-sh/uv) > manually. > > You can install it with: > > ```bash > python3 -m pip install --user pipx -> pipx install pdm +> pipx install uv > ``` > > Now you can try running `make setup` again, -> or simply `pdm install`. +> or simply `uv install`. You now have the dependencies installed. @@ -39,13 +39,13 @@ Run `make help` to see all the available actions! This project uses [duty](https://github.com/pawamoy/duty) to run tasks. A Makefile is also provided. The Makefile will try to run certain tasks on multiple Python versions. If for some reason you don't want to run the task -on multiple Python versions, you run the task directly with `pdm run duty TASK`. +on multiple Python versions, you run the task directly with `make run duty TASK`. The Makefile detects if a virtual environment is activated, so `make` will work the same with the virtualenv activated or not. If you work in VSCode, we provide -[an action to configure VSCode](https://pawamoy.github.io/copier-pdm/work/#vscode-setup) +[an action to configure VSCode](https://pawamoy.github.io/copier-uv/work/#vscode-setup) for the project. ## Development diff --git a/Makefile b/Makefile index 8ad5209e..771b333c 100644 --- a/Makefile +++ b/Makefile @@ -1,54 +1,27 @@ -.DEFAULT_GOAL := help -SHELL := bash -DUTY := $(if $(VIRTUAL_ENV),,pdm run) duty -export PDM_MULTIRUN_VERSIONS ?= 3.8 3.9 3.10 3.11 3.12 -export PDM_MULTIRUN_USE_VENVS ?= $(if $(shell pdm config python.use_venv | grep True),1,0) +# If you have `direnv` loaded in your shell, and allow it in the repository, +# the `make` command will point at the `scripts/make` shell script. +# This Makefile is just here to allow auto-completion in the terminal. -args = $(foreach a,$($(subst -,_,$1)_args),$(if $(value $a),$a="$($a)")) -check_quality_args = files -docs_args = host port -release_args = version -test_args = match - -BASIC_DUTIES = \ +actions = \ changelog \ + check \ check-api \ check-dependencies \ + check-docs \ + check-quality \ + check-types \ clean \ coverage \ docs \ docs-deploy \ format \ + help \ release \ + run \ + setup \ + test \ vscode -QUALITY_DUTIES = \ - check-quality \ - check-docs \ - check-types \ - test - -.PHONY: help -help: - @$(DUTY) --list - -.PHONY: lock -lock: - @pdm lock -G:all - -.PHONY: setup -setup: - @bash scripts/setup.sh - -.PHONY: check -check: - @pdm multirun duty check-quality check-types check-docs - @$(DUTY) check-dependencies check-api - -.PHONY: $(BASIC_DUTIES) -$(BASIC_DUTIES): - @$(DUTY) $@ $(call args,$@) - -.PHONY: $(QUALITY_DUTIES) -$(QUALITY_DUTIES): - @pdm multirun duty $@ $(call args,$@) +.PHONY: $(actions) +$(actions): + @bash scripts/make "$@" diff --git a/README.md b/README.md index 6b3afb5f..23b6e809 100644 --- a/README.md +++ b/README.md @@ -2,23 +2,11 @@

        A Python handler for mkdocstrings.

        -

        - - ci - - - documentation - - - pypi version - - - gitpod - - - gitter - -

        +[![ci](https://github.com/mkdocstrings/python/workflows/ci/badge.svg)](https://github.com/mkdocstrings/python/actions?query=workflow%3Aci) +[![documentation](https://img.shields.io/badge/docs-mkdocs%20material-blue.svg?style=flat)](https://mkdocstrings.github.io/python/) +[![pypi version](https://img.shields.io/pypi/v/mkdocstrings-python.svg)](https://pypi.org/project/mkdocstrings-python/) +[![gitpod](https://img.shields.io/badge/gitpod-workspace-blue.svg?style=flat)](https://gitpod.io/#https://github.com/mkdocstrings/python) +[![gitter](https://badges.gitter.im/join%20chat.svg)](https://app.gitter.im/#/room/#python:gitter.im) --- diff --git a/config/coverage.ini b/config/coverage.ini index 19b34d9b..71d12074 100644 --- a/config/coverage.ini +++ b/config/coverage.ini @@ -8,7 +8,8 @@ source = [coverage:paths] equivalent = src/ - __pypackages__/ + .venv/lib/*/site-packages/ + .venvs/*/lib/*/site-packages/ [coverage:report] include_namespace_packages = true diff --git a/config/pytest.ini b/config/pytest.ini index 5a493959..ebdeb484 100644 --- a/config/pytest.ini +++ b/config/pytest.ini @@ -1,10 +1,4 @@ [pytest] -norecursedirs = - .git - .tox - .env - dist - build python_files = test_*.py *_test.py diff --git a/config/ruff.toml b/config/ruff.toml index a16c92b6..751bf595 100644 --- a/config/ruff.toml +++ b/config/ruff.toml @@ -1,53 +1,27 @@ target-version = "py38" line-length = 120 + +[lint] exclude = [ "fixtures", "site", ] select = [ - "A", - "ANN", - "ARG", - "B", - "BLE", - "C", - "C4", + "A", "ANN", "ARG", + "B", "BLE", + "C", "C4", "COM", - "D", - "DTZ", - "E", - "ERA", - "EXE", - "F", - "FBT", + "D", "DTZ", + "E", "ERA", "EXE", + "F", "FBT", "G", - "I", - "ICN", - "INP", - "ISC", + "I", "ICN", "INP", "ISC", "N", - "PGH", - "PIE", - "PL", - "PLC", - "PLE", - "PLR", - "PLW", - "PT", - "PYI", + "PGH", "PIE", "PL", "PLC", "PLE", "PLR", "PLW", "PT", "PYI", "Q", - "RUF", - "RSE", - "RET", - "S", - "SIM", - "SLF", - "T", - "T10", - "T20", - "TCH", - "TID", - "TRY", + "RUF", "RSE", "RET", + "S", "SIM", "SLF", + "T", "T10", "T20", "TCH", "TID", "TRY", "UP", "W", "YTT", @@ -73,7 +47,7 @@ ignore = [ "TRY003", # Avoid specifying long messages outside the exception class ] -[per-file-ignores] +[lint.per-file-ignores] "src/*/cli.py" = [ "T201", # Print statement ] @@ -91,16 +65,16 @@ ignore = [ "S101", # Use of assert detected ] -[flake8-quotes] +[lint.flake8-quotes] docstring-quotes = "double" -[flake8-tidy-imports] +[lint.flake8-tidy-imports] ban-relative-imports = "all" -[isort] -known-first-party = ["mkdocstrings_handlers"] +[lint.isort] +known-first-party = ["mkdocstrings_handlers.python"] -[pydocstyle] +[lint.pydocstyle] convention = "google" [format] diff --git a/config/vscode/launch.json b/config/vscode/launch.json index d056ccee..e3288388 100644 --- a/config/vscode/launch.json +++ b/config/vscode/launch.json @@ -9,6 +9,17 @@ "console": "integratedTerminal", "justMyCode": false }, + { + "name": "docs", + "type": "debugpy", + "request": "launch", + "module": "mkdocs", + "justMyCode": false, + "args": [ + "serve", + "-v" + ] + }, { "name": "test", "type": "debugpy", diff --git a/config/vscode/settings.json b/config/vscode/settings.json index 17beee4b..949856d1 100644 --- a/config/vscode/settings.json +++ b/config/vscode/settings.json @@ -1,29 +1,9 @@ { "files.watcherExclude": { - "**/__pypackages__/**": true, "**/.venv*/**": true, + "**/.venvs*/**": true, "**/venv*/**": true }, - "[python]": { - "editor.defaultFormatter": "ms-python.black-formatter" - }, - "python.autoComplete.extraPaths": [ - "__pypackages__/3.8/lib", - "__pypackages__/3.9/lib", - "__pypackages__/3.10/lib", - "__pypackages__/3.11/lib", - "__pypackages__/3.12/lib" - ], - "python.analysis.extraPaths": [ - "__pypackages__/3.8/lib", - "__pypackages__/3.9/lib", - "__pypackages__/3.10/lib", - "__pypackages__/3.11/lib", - "__pypackages__/3.12/lib" - ], - "black-formatter.args": [ - "--config=config/black.toml" - ], "mypy-type-checker.args": [ "--config-file=config/mypy.ini" ], @@ -32,6 +12,7 @@ "python.testing.pytestArgs": [ "--config-file=config/pytest.ini" ], + "ruff.enable": true, "ruff.format.args": [ "--config=config/ruff.toml" ], diff --git a/config/vscode/tasks.json b/config/vscode/tasks.json index 80cd13d2..30008cf2 100644 --- a/config/vscode/tasks.json +++ b/config/vscode/tasks.json @@ -3,84 +3,94 @@ "tasks": [ { "label": "changelog", - "type": "shell", - "command": "pdm run duty changelog" + "type": "process", + "command": "scripts/make", + "args": ["changelog"] }, { "label": "check", - "type": "shell", - "command": "pdm run duty check" + "type": "process", + "command": "scripts/make", + "args": ["check"] }, { "label": "check-quality", - "type": "shell", - "command": "pdm run duty check-quality" + "type": "process", + "command": "scripts/make", + "args": ["check-quality"] }, { "label": "check-types", - "type": "shell", - "command": "pdm run duty check-types" + "type": "process", + "command": "scripts/make", + "args": ["check-types"] }, { "label": "check-docs", - "type": "shell", - "command": "pdm run duty check-docs" + "type": "process", + "command": "scripts/make", + "args": ["check-docs"] }, { "label": "check-dependencies", - "type": "shell", - "command": "pdm run duty check-dependencies" + "type": "process", + "command": "scripts/make", + "args": ["check-dependencies"] }, { "label": "check-api", - "type": "shell", - "command": "pdm run duty check-api" + "type": "process", + "command": "scripts/make", + "args": ["check-api"] }, { "label": "clean", - "type": "shell", - "command": "pdm run duty clean" + "type": "process", + "command": "scripts/make", + "args": ["clean"] }, { "label": "docs", - "type": "shell", - "command": "pdm run duty docs" + "type": "process", + "command": "scripts/make", + "args": ["docs"] }, { "label": "docs-deploy", - "type": "shell", - "command": "pdm run duty docs-deploy" + "type": "process", + "command": "scripts/make", + "args": ["docs-deploy"] }, { "label": "format", - "type": "shell", - "command": "pdm run duty format" - }, - { - "label": "lock", - "type": "shell", - "command": "pdm lock -G:all" + "type": "process", + "command": "scripts/make", + "args": ["format"] }, { "label": "release", - "type": "shell", - "command": "pdm run duty release ${input:version}" + "type": "process", + "command": "scripts/make", + "args": ["release", "${input:version}"] }, { "label": "setup", - "type": "shell", - "command": "bash scripts/setup.sh" + "type": "process", + "command": "scripts/make", + "args": ["setup"] }, { "label": "test", - "type": "shell", - "command": "pdm run duty test coverage", + "type": "process", + "command": "scripts/make", + "args": ["test", "coverage"], "group": "test" }, { "label": "vscode", - "type": "shell", - "command": "pdm run duty vscode" + "type": "process", + "command": "scripts/make", + "args": ["vscode"] } ], "inputs": [ diff --git a/devdeps.txt b/devdeps.txt new file mode 100644 index 00000000..4fe97996 --- /dev/null +++ b/devdeps.txt @@ -0,0 +1,27 @@ +build>=1.0 +duty>=0.10 +black>=23.9 +markdown-callouts>=0.3 +markdown-exec>=1.7 +mkdocs>=1.5 +mkdocs-coverage>=1.0 +mkdocs-gen-files>=0.5 +mkdocs-git-committers-plugin-2>=1.2 +mkdocs-literate-nav>=0.6 +mkdocs-material>=9.4 +mkdocs-minify-plugin>=0.7 +mkdocstrings[python]>=0.23 +tomli>=2.0; python_version < '3.11' +black>=23.9 +blacken-docs>=1.16 +git-changelog>=2.3 +ruff>=0.0 +pytest>=7.4 +pytest-cov>=4.1 +pytest-randomly>=3.15 +pytest-xdist>=3.3 +mypy>=1.5 +types-markdown>=3.5 +types-pyyaml>=6.0 +safety>=2.3 +twine>=5.0 diff --git a/docs/insiders/goals.yml b/docs/insiders/goals.yml index 8b6cb2b0..381e5029 100644 --- a/docs/insiders/goals.yml +++ b/docs/insiders/goals.yml @@ -9,10 +9,16 @@ goals: ref: /usage/configuration/headings/#show_symbol_type_toc since: 2023/06/04 1000: - name: GraviFridge User Manual + name: GraviFridge Fluid Renewal features: - name: Auto-summary of object members ref: /usage/configuration/members/#summary since: 2023/08/20 - name: Automatic rendering of function signature overloads since: 2023/09/05 + 1500: + name: HyperLamp Navigation Tips + features: [] + 2000: + name: FusionDrive Ejection Configuration + features: [] diff --git a/docs/insiders/index.md b/docs/insiders/index.md index a6642ede..9a0ae309 100644 --- a/docs/insiders/index.md +++ b/docs/insiders/index.md @@ -49,9 +49,8 @@ The biggest bottleneck in Open Source is time.[^3] If you're unsure if you should sponsor this project, check out the list of [completed funding goals][goals completed] to learn whether you're already using features that -were developed with the help of sponsorships. - +were developed with the help of sponsorships. You're most likely using at least +a handful of them, [thanks to our awesome sponsors][sponsors]! ## What's in it for me? @@ -173,7 +172,7 @@ This section lists all funding goals that were previously completed, which means that those features were part of Insiders, but are now generally available and can be used by all users. -```python exec="1" session="insiders" +```python exec="1" session="insiders" idprefix="" for goal in goals.values(): if goal.complete: goal.render() diff --git a/duties.py b/duties.py index 55fcf6a2..1c3f6b79 100644 --- a/duties.py +++ b/duties.py @@ -22,7 +22,7 @@ CI = os.environ.get("CI", "0") in {"1", "true", "yes", ""} WINDOWS = os.name == "nt" PTY = not WINDOWS and not CI -MULTIRUN = os.environ.get("PDM_MULTIRUN", "0") == "1" +MULTIRUN = os.environ.get("MULTIRUN", "0") == "1" def pyprefix(title: str) -> str: # noqa: D103 @@ -72,7 +72,6 @@ def check_quality(ctx: Context) -> None: Parameters: ctx: The context instance (passed automatically). """ - os.environ["MYPYPATH"] = "src" ctx.run( ruff.check(*PY_SRC_LIST, config="config/ruff.toml"), title=pyprefix("Checking code quality"), @@ -89,15 +88,15 @@ def check_dependencies(ctx: Context) -> None: """ # retrieve the list of dependencies requirements = ctx.run( - ["pdm", "export", "-f", "requirements", "--without-hashes"], - title="Exporting dependencies as requirements", + ["uv", "pip", "freeze"], + silent=True, allow_overrides=False, ) ctx.run( safety.check(requirements), title="Checking dependencies", - command="pdm export -f requirements --without-hashes | safety check --stdin", + command="uv pip freeze | safety check --stdin", ) @@ -144,9 +143,9 @@ def check_api(ctx: Context) -> None: griffe_check = lazy(g_check, name="griffe.check") ctx.run( - griffe_check("mkdocstrings_handlers", search_paths=["src"], color=True), + griffe_check("mkdocstrings_handlers.python", search_paths=["src"], color=True), title="Checking for API breaking changes", - command="griffe check -ssrc mkdocstrings_handlers", + command="griffe check -ssrc mkdocstrings_handlers.python", nofail=True, ) @@ -201,7 +200,11 @@ def docs_deploy(ctx: Context) -> None: ctx.run(lambda: False, title="Not deploying docs without Material for MkDocs Insiders!") origin = ctx.run("git config --get remote.origin.url", silent=True) if "pawamoy-insiders/mkdocstrings-python" in origin: - ctx.run("git remote add upstream git@github.com:mkdocstrings/python", silent=True, nofail=True) + ctx.run( + "git remote add upstream git@github.com:mkdocstrings/python", + silent=True, + nofail=True, + ) ctx.run( mkdocs.gh_deploy(remote_name="upstream", force=True), title="Deploying documentation", @@ -247,7 +250,7 @@ def release(ctx: Context, version: str) -> None: ctx.run(f"git tag {version}", title="Tagging commit", pty=PTY) ctx.run("git push", title="Pushing commits", pty=False) ctx.run("git push --tags", title="Pushing tags", pty=False) - ctx.run("pdm build", title="Building dist/wheel", pty=PTY) + ctx.run("pyproject-build", title="Building dist/wheel", pty=PTY) ctx.run("twine upload --skip-existing dist/*", title="Publishing version", pty=PTY) diff --git a/pyproject.toml b/pyproject.toml index 75643e9a..222a7400 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,6 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Topic :: Documentation", "Topic :: Software Development", - "Topic :: Software Development :: Documentation", "Topic :: Utilities", "Typing :: Typed", ] @@ -45,51 +44,8 @@ Funding = "https://github.com/sponsors/pawamoy" [tool.pdm] version = {source = "scm"} -plugins = [ - "pdm-multirun", -] [tool.pdm.build] package-dir = "src" includes = ["src/mkdocstrings_handlers"] editable-backend = "editables" - -[tool.pdm.dev-dependencies] -duty = ["duty>=0.10"] -ci-quality = ["mkdocstrings-python[duty,docs,quality,typing,security]"] -ci-tests = ["mkdocstrings-python[duty,docs,tests]"] -docs = [ - "black>=23.9", - "markdown-callouts>=0.3", - "markdown-exec>=1.7", - "mkdocs>=1.5", - "mkdocs-coverage>=1.0", - "mkdocs-gen-files>=0.5", - "mkdocs-git-committers-plugin-2>=1.2", - "mkdocs-literate-nav>=0.6", - "mkdocs-material>=9.4", - "mkdocs-minify-plugin>=0.7", - "tomli>=2.0; python_version < '3.11'", -] -maintain = [ - "black>=23.9", - "blacken-docs>=1.16", - "git-changelog>=2.3", -] -quality = [ - "ruff>=0.0", -] -tests = [ - "pytest>=7.4", - "pytest-cov>=4.1", - "pytest-randomly>=3.15", - "pytest-xdist>=3.3", -] -typing = [ - "mypy>=1.5", - "types-markdown>=3.5", - "types-pyyaml>=6.0", -] -security = [ - "safety>=2.3", -] diff --git a/scripts/gen_credits.py b/scripts/gen_credits.py index bf35f0da..a1115f55 100644 --- a/scripts/gen_credits.py +++ b/scripts/gen_credits.py @@ -3,16 +3,17 @@ from __future__ import annotations import os -import re import sys -from importlib.metadata import PackageNotFoundError, metadata +from collections import defaultdict +from importlib.metadata import distributions from itertools import chain from pathlib import Path from textwrap import dedent -from typing import Mapping, cast +from typing import Dict, Iterable, Union from jinja2 import StrictUndefined from jinja2.sandbox import SandboxedEnvironment +from packaging.requirements import Requirement # TODO: Remove once support for Python 3.10 is dropped. if sys.version_info >= (3, 11): @@ -24,71 +25,120 @@ with project_dir.joinpath("pyproject.toml").open("rb") as pyproject_file: pyproject = tomllib.load(pyproject_file) project = pyproject["project"] -pdm = pyproject["tool"]["pdm"] -with project_dir.joinpath("pdm.lock").open("rb") as lock_file: - lock_data = tomllib.load(lock_file) -lock_pkgs = {pkg["name"].lower(): pkg for pkg in lock_data["package"]} project_name = project["name"] -regex = re.compile(r"(?P[\w.-]+)(?P.*)$") +with open("devdeps.txt") as devdeps_file: + devdeps = [line.strip() for line in devdeps_file if not line.startswith("-e")] +PackageMetadata = Dict[str, Union[str, Iterable[str]]] +Metadata = Dict[str, PackageMetadata] -def _get_license(pkg_name: str) -> str: + +def _merge_fields(metadata: dict) -> PackageMetadata: + fields = defaultdict(list) + for header, value in metadata.items(): + fields[header.lower()].append(value.strip()) + return { + field: value if len(value) > 1 or field in ("classifier", "requires-dist") else value[0] + for field, value in fields.items() + } + + +def _norm_name(name: str) -> str: + return name.replace("_", "-").replace(".", "-").lower() + + +def _norm_spec(spec: str) -> set[str]: + clean_spec = spec.split("]", 1)[-1].split(";", 1)[0].replace("(", "").replace(")", "").replace(" ", "").strip() + if clean_spec: + return set(clean_spec.split(",")) + return set() + + +def _requirements(deps: list[str]) -> dict[str, Requirement]: + return {_norm_name((req := Requirement(dep)).name): req for dep in deps} + + +def _extra_marker(req: Requirement) -> str | None: + if not req.marker: + return None try: - data = metadata(pkg_name) - except PackageNotFoundError: - return "?" - license_name = cast(dict, data).get("License", "").strip() - multiple_lines = bool(license_name.count("\n")) - # TODO: Remove author logic once all my packages licenses are fixed. - author = "" - if multiple_lines or not license_name or license_name == "UNKNOWN": - for header, value in cast(dict, data).items(): - if header == "Classifier" and value.startswith("License ::"): - license_name = value.rsplit("::", 1)[1].strip() - elif header == "Author-email": - author = value - if license_name == "Other/Proprietary License" and "pawamoy" in author: - license_name = "ISC" - return license_name or "?" - - -def _get_deps(base_deps: Mapping[str, Mapping[str, str]]) -> dict[str, dict[str, str]]: + return next(marker[2].value for marker in req.marker._markers if getattr(marker[0], "value", None) == "extra") + except StopIteration: + return None + + +def _get_metadata() -> Metadata: + metadata = {} + for pkg in distributions(): + name = _norm_name(pkg.name) # type: ignore[attr-defined,unused-ignore] + metadata[name] = _merge_fields(pkg.metadata) # type: ignore[arg-type] + metadata[name]["spec"] = set() + metadata[name]["extras"] = set() + _set_license(metadata[name]) + return metadata + + +def _set_license(metadata: PackageMetadata) -> None: + license_field = metadata.get("license-expression", metadata.get("license", "")) + license_name = license_field if isinstance(license_field, str) else " + ".join(license_field) + check_classifiers = license_name in ("UNKNOWN", "Dual License", "") or license_name.count("\n") + if check_classifiers: + license_names = [] + for classifier in metadata["classifier"]: + if classifier.startswith("License ::"): + license_names.append(classifier.rsplit("::", 1)[1].strip()) + license_name = " + ".join(license_names) + metadata["license"] = license_name or "?" + + +def _get_deps(base_deps: dict[str, Requirement], metadata: Metadata) -> Metadata: deps = {} - for dep in base_deps: - parsed = regex.match(dep).groupdict() # type: ignore[union-attr] - dep_name = parsed["dist"].lower() - if dep_name not in lock_pkgs: + for dep_name, dep_req in base_deps.items(): + if dep_name not in metadata: continue - deps[dep_name] = {"license": _get_license(dep_name), **parsed, **lock_pkgs[dep_name]} + metadata[dep_name]["spec"] |= {str(spec) for spec in dep_req.specifier} # type: ignore[operator] + metadata[dep_name]["extras"] |= dep_req.extras # type: ignore[operator] + deps[dep_name] = metadata[dep_name] again = True while again: again = False - for pkg_name in lock_pkgs: + for pkg_name in metadata: if pkg_name in deps: - for pkg_dependency in lock_pkgs[pkg_name].get("dependencies", []): - parsed = regex.match(pkg_dependency).groupdict() # type: ignore[union-attr] - dep_name = parsed["dist"].lower() - if dep_name in lock_pkgs and dep_name not in deps and dep_name != project["name"]: - deps[dep_name] = {"license": _get_license(dep_name), **parsed, **lock_pkgs[dep_name]} + for pkg_dependency in metadata[pkg_name].get("requires-dist", []): + requirement = Requirement(pkg_dependency) + dep_name = _norm_name(requirement.name) + extra_marker = _extra_marker(requirement) + if ( + dep_name in metadata + and dep_name not in deps + and dep_name != project["name"] + and (not extra_marker or extra_marker in deps[pkg_name]["extras"]) + ): + metadata[dep_name]["spec"] |= {str(spec) for spec in requirement.specifier} # type: ignore[operator] + deps[dep_name] = metadata[dep_name] again = True return deps def _render_credits() -> str: - dev_dependencies = _get_deps(chain(*pdm.get("dev-dependencies", {}).values())) # type: ignore[arg-type] + metadata = _get_metadata() + dev_dependencies = _get_deps(_requirements(devdeps), metadata) prod_dependencies = _get_deps( - chain( # type: ignore[arg-type] - project.get("dependencies", []), - chain(*project.get("optional-dependencies", {}).values()), + _requirements( + chain( # type: ignore[arg-type] + project.get("dependencies", []), + chain(*project.get("optional-dependencies", {}).values()), + ), ), + metadata, ) template_data = { "project_name": project_name, - "prod_dependencies": sorted(prod_dependencies.values(), key=lambda dep: dep["name"]), - "dev_dependencies": sorted(dev_dependencies.values(), key=lambda dep: dep["name"]), + "prod_dependencies": sorted(prod_dependencies.values(), key=lambda dep: str(dep["name"])), + "dev_dependencies": sorted(dev_dependencies.values(), key=lambda dep: str(dep["name"])), "more_credits": "http://pawamoy.github.io/credits/", } template_text = dedent( @@ -98,13 +148,14 @@ def _render_credits() -> str: These projects were used to build *{{ project_name }}*. **Thank you!** [`python`](https://www.python.org/) | - [`pdm`](https://pdm.fming.dev/) | - [`copier-pdm`](https://github.com/pawamoy/copier-pdm) + [`uv`](https://github.com/astral-sh/uv) | + [`copier-uv`](https://github.com/pawamoy/copier-uv) {% macro dep_line(dep) -%} - [`{{ dep.name }}`](https://pypi.org/project/{{ dep.name }}/) | {{ dep.summary }} | {{ ("`" ~ dep.spec ~ "`") if dep.spec else "" }} | `{{ dep.version }}` | {{ dep.license }} + [`{{ dep.name }}`](https://pypi.org/project/{{ dep.name }}/) | {{ dep.summary }} | {{ ("`" ~ dep.spec|sort(reverse=True)|join(", ") ~ "`") if dep.spec else "" }} | `{{ dep.version }}` | {{ dep.license }} {%- endmacro %} + {% if prod_dependencies -%} ### Runtime dependencies Project | Summary | Version (accepted) | Version (last resolved) | License @@ -113,6 +164,8 @@ def _render_credits() -> str: {{ dep_line(dep) }} {% endfor %} + {% endif -%} + {% if dev_dependencies -%} ### Development dependencies Project | Summary | Version (accepted) | Version (last resolved) | License @@ -121,6 +174,7 @@ def _render_credits() -> str: {{ dep_line(dep) }} {% endfor %} + {% endif -%} {% if more_credits %}**[More credits from the author]({{ more_credits }})**{% endif %} """, ) diff --git a/scripts/insiders.py b/scripts/insiders.py index 85ecbd0e..15212486 100644 --- a/scripts/insiders.py +++ b/scripts/insiders.py @@ -78,9 +78,16 @@ def human_readable_amount(self) -> str: # noqa: D102 def render(self, rel_base: str = "..") -> None: # noqa: D102 print(f"#### $ {self.human_readable_amount} — {self.name}\n") - for feature in self.features: - feature.render(rel_base) - print("") + if self.features: + for feature in self.features: + feature.render(rel_base) + print("") + else: + print("There are no features in this goal for this project. ") + print( + "[See the features in this goal **for all Insiders projects.**]" + f"(https://pawamoy.github.io/insiders/#{self.amount}-{self.name.lower().replace(' ', '-')})", + ) def load_goals(data: str, funding: int = 0, project: Project | None = None) -> dict[int, Goal]: @@ -104,8 +111,7 @@ def load_goals(data: str, funding: int = 0, project: Project | None = None) -> d Feature( name=feature_data["name"], ref=feature_data.get("ref"), - since=feature_data.get("since") - and datetime.strptime(feature_data["since"], "%Y/%m/%d").date(), # noqa: DTZ007 + since=feature_data.get("since") and datetime.strptime(feature_data["since"], "%Y/%m/%d").date(), # noqa: DTZ007 project=project, ) for feature_data in goal_data["features"] diff --git a/scripts/make b/scripts/make new file mode 100755 index 00000000..4190622e --- /dev/null +++ b/scripts/make @@ -0,0 +1,155 @@ +#!/usr/bin/env bash + +set -e +export PYTHON_VERSIONS=${PYTHON_VERSIONS-3.8 3.9 3.10 3.11 3.12} + +exe="" +prefix="" + + +# Install runtime and development dependencies, +# as well as current project in editable mode. +uv_install() { + uv pip compile pyproject.toml devdeps.txt | uv pip install -r - + uv pip install -e . +} + + +# Setup the development environment by installing dependencies +# in multiple Python virtual environments with uv: +# one venv per Python version in `.venvs/$py`, +# and an additional default venv in `.venv`. +setup() { + if ! command -v uv &>/dev/null; then + echo "make: setup: uv must be installed, see https://github.com/astral-sh/uv" >&2 + return 1 + fi + + if [ -n "${PYTHON_VERSIONS}" ]; then + for version in ${PYTHON_VERSIONS}; do + if [ ! -d ".venvs/${version}" ]; then + uv venv --seed --python "${version}" ".venvs/${version}" + fi + VIRTUAL_ENV="${PWD}/.venvs/${version}" uv_install + done + fi + + if [ ! -d .venv ]; then uv venv --seed --python python; fi + uv_install +} + + +# Activate a Python virtual environments. +# The annoying operating system also requires +# that we set some global variables to help it find commands... +activate() { + local path + if [ -f "$1/bin/activate" ]; then + source "$1/bin/activate" + return 0 + fi + if [ -f "$1/Scripts/activate.bat" ]; then + "$1/Scripts/activate.bat" + exe=".exe" + prefix="$1/Scripts/" + return 0 + fi + echo "run: Cannot activate venv $1" >&2 + return 1 +} + + +# Run a command in all configured Python virtual environments. +# We handle the case when the `PYTHON_VERSIONS` environment variable +# is unset or empty, for robustness. +multirun() { + local cmd="$1" + shift + + if [ -n "${PYTHON_VERSIONS}" ]; then + for version in ${PYTHON_VERSIONS}; do + (activate ".venvs/${version}" && MULTIRUN=1 "${prefix}${cmd}${exe}" "$@") + done + else + (activate .venv && "${prefix}${cmd}${exe}" "$@") + fi +} + + +# Run a command in the default Python virtual environment. +# We rely on `multirun`'s handling of empty `PYTHON_VERSIONS`. +singlerun() { + PYTHON_VERSIONS= multirun "$@" +} + + +# Record options following a command name, +# until a non-option argument is met or there are no more arguments. +# Output each option on a new line, so the parent caller can store them in an array. +# Return the number of times the parent caller must shift arguments. +options() { + local shift_count=0 + for arg in "$@"; do + if [[ "${arg}" =~ ^- || "${arg}" =~ ^.+= ]]; then + echo "${arg}" + ((shift_count++)) + else + break + fi + done + return ${shift_count} +} + + +# Main function. +main() { + local cmd + while [ $# -ne 0 ]; do + cmd="$1" + shift + + # Handle `run` early to simplify `case` below. + if [ "${cmd}" = "run" ]; then + singlerun "$@" + exit $? + fi + + # Handle `multirun` early to simplify `case` below. + if [ "${cmd}" = "multirun" ]; then + multirun "$@" + exit $? + fi + + # All commands except `run` and `multirun` can be chained on a single line. + # Some of them accept options in two formats: `-f`, `--flag` and `param=value`. + # Some of them don't, and will print warnings/errors if options were given. + opts=($(options "$@")) || shift $? + + case "${cmd}" in + # The following commands require special handling. + help|"") + singlerun duty --list ;; + setup) + setup ;; + check) + multirun duty check-quality check-types check-docs + singlerun duty check-dependencies check-api + ;; + + # The following commands run in all venvs. + check-quality|\ + check-docs|\ + check-types|\ + test) + multirun duty "${cmd}" "${opts[@]}" ;; + + # The following commands run in the default venv only. + *) + singlerun duty "${cmd}" "${opts[@]}" ;; + esac + done +} + + +# Execute the main function. +main "$@" diff --git a/scripts/setup.sh b/scripts/setup.sh deleted file mode 100755 index eef38433..00000000 --- a/scripts/setup.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash -set -e - -if ! command -v pdm &>/dev/null; then - if ! command -v pipx &>/dev/null; then - python3 -m pip install --user pipx - fi - pipx install pdm -fi -if ! pdm self list 2>/dev/null | grep -q pdm-multirun; then - pdm install --plugins -fi - -if [ -n "${PDM_MULTIRUN_VERSIONS}" ]; then - if [ "${PDM_MULTIRUN_USE_VENVS}" -eq "1" ]; then - for version in ${PDM_MULTIRUN_VERSIONS}; do - if ! pdm venv --path "${version}" &>/dev/null; then - pdm venv create --name "${version}" "${version}" - fi - done - fi - pdm multirun -v pdm install -G:all -else - pdm install -G:all -fi diff --git a/src/mkdocstrings_handlers/python/__init__.py b/src/mkdocstrings_handlers/python/__init__.py index f93ab20e..0432a90d 100644 --- a/src/mkdocstrings_handlers/python/__init__.py +++ b/src/mkdocstrings_handlers/python/__init__.py @@ -1,9 +1,5 @@ -"""This package implements a handler for the Python language.""" +"""Python handler for mkdocstrings.""" from mkdocstrings_handlers.python.handler import get_handler __all__ = ["get_handler"] - -# TODO: CSS classes everywhere in templates -# TODO: name normalization (filenames, Jinja2 variables, HTML tags, CSS classes) -# TODO: Jinja2 blocks everywhere in templates diff --git a/src/mkdocstrings_handlers/py.typed b/src/mkdocstrings_handlers/python/py.typed similarity index 100% rename from src/mkdocstrings_handlers/py.typed rename to src/mkdocstrings_handlers/python/py.typed diff --git a/tests/conftest.py b/tests/conftest.py index 1c1a1c54..f7b28105 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -60,7 +60,7 @@ def fixture_plugin(mkdocs_conf: config.Config) -> MkdocstringsPlugin: """Return a plugin instance. Parameters: - mkdocs_conf: Pytest fixture: [tests.conftest.fixture_mkdocs_conf][]. + mkdocs_conf: Pytest fixture (see conftest.py). Returns: mkdocstrings plugin instance. @@ -73,7 +73,7 @@ def fixture_ext_markdown(mkdocs_conf: config.Config) -> Markdown: """Return a Markdown instance with MkdocstringsExtension. Parameters: - mkdocs_conf: Pytest fixture: [tests.conftest.fixture_mkdocs_conf][]. + mkdocs_conf: Pytest fixture (see conftest.py). Returns: A Markdown instance. @@ -86,7 +86,7 @@ def fixture_handler(plugin: MkdocstringsPlugin, ext_markdown: Markdown) -> Pytho """Return a handler instance. Parameters: - plugin: Pytest fixture: [tests.conftest.fixture_plugin][]. + plugin: Pytest fixture (see conftest.py). Returns: A handler instance. diff --git a/tests/test_themes.py b/tests/test_themes.py index bedcc806..a4ad0d59 100644 --- a/tests/test_themes.py +++ b/tests/test_themes.py @@ -2,7 +2,6 @@ from __future__ import annotations -import sys from typing import TYPE_CHECKING import pytest @@ -22,7 +21,7 @@ indirect=["plugin"], ) @pytest.mark.parametrize( - "module", + "identifier", [ "mkdocstrings.extension", "mkdocstrings.inventory", @@ -33,15 +32,15 @@ "mkdocstrings_handlers.python", ], ) -@pytest.mark.skipif(sys.version_info < (3, 7), reason="material is not installed on Python 3.6") -def test_render_themes_templates_python(module: str, plugin: MkdocstringsPlugin, ext_markdown: Markdown) -> None: +def test_render_themes_templates_python(identifier: str, plugin: MkdocstringsPlugin, ext_markdown: Markdown) -> None: """Test rendering of a given theme's templates. Parameters: - module: Parametrized argument. - plugin: Pytest fixture: [tests.conftest.fixture_plugin][]. + identifier: Parametrized identifier. + plugin: Pytest fixture (see conftest.py). + ext_markdown: Pytest fixture (see conftest.py). """ handler = plugin.handlers.get_handler("python") handler._update_env(ext_markdown, plugin.handlers._config) - data = handler.collect(module, {}) + data = handler.collect(identifier, {}) handler.render(data, {}) From cd93ee31418a2752667d43bb5a05d22284522c24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Wed, 13 Mar 2024 19:58:24 +0100 Subject: [PATCH 021/243] deps: Add upper bound on Python-Markdown 3.6 to temporarily prevent breaking changes --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 222a7400..05438338 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,7 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ + "markdown>=3.3,<3.6", "mkdocstrings>=0.20", "griffe>=0.37", ] From ddf32c6697f895287c9f5546e51656183e569cf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Wed, 13 Mar 2024 20:02:25 +0100 Subject: [PATCH 022/243] docs: Enable inline syntax highlight --- mkdocs.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mkdocs.yml b/mkdocs.yml index 3d21de72..9a739787 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -111,6 +111,10 @@ markdown_extensions: - pymdownx.emoji: emoji_index: !!python/name:material.extensions.emoji.twemoji emoji_generator: !!python/name:material.extensions.emoji.to_svg +- pymdownx.highlight: + pygments_lang_class: true +- pymdownx.inlinehilite: + style_plain_text: py3 - pymdownx.magiclink - pymdownx.snippets: auto_append: [docs/.glossary.md] From e639c8b1a07aed6ac25eb86c790d7cea1f1628c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Wed, 13 Mar 2024 20:04:48 +0100 Subject: [PATCH 023/243] chore: Prepare release 1.9.0 --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c5647dd..4bc0d6a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,23 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [1.9.0](https://github.com/mkdocstrings/python/releases/tag/1.9.0) - 2024-03-13 + +[Compare with 1.8.0](https://github.com/mkdocstrings/python/compare/1.8.0...1.9.0) + +### Dependencies + +- Add upper bound on Python-Markdown 3.6 to temporarily prevent breaking changes ([cd93ee3](https://github.com/mkdocstrings/python/commit/cd93ee31418a2752667d43bb5a05d22284522c24) by Timothée Mazzucotelli). + +### Features + +- Add `show_labels` option to show/hide labels ([eaf9b82](https://github.com/mkdocstrings/python/commit/eaf9b8240069f7369f401fe048892043c8b173d3) by Viicos). [Issue #120](https://github.com/mkdocstrings/python/issues/120), [PR #130](https://github.com/mkdocstrings/python/pull/130) +- Add option to search for stubs packages ([0c6aa32](https://github.com/mkdocstrings/python/commit/0c6aa323c9e57b8348765a5daa11c79d0c5edb07) by Romain). [PR #128](https://github.com/mkdocstrings/python/pull/128), PR griffe#221: : https://github.com/mkdocstrings/griffe/pull/221 + +### Code Refactoring + +- Mark all Jinja blocks as scoped ([548bdad](https://github.com/mkdocstrings/python/commit/548bdaddd66ffc99b3b9a5a62228a2ff4ff0dd00) by Timothée Mazzucotelli). + ## [1.8.0](https://github.com/mkdocstrings/python/releases/tag/1.8.0) - 2024-01-08 [Compare with 1.7.5](https://github.com/mkdocstrings/python/compare/1.7.5...1.8.0) From e5ccb4f4a5b14170307ca0e5a5bc151d25830720 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Wed, 13 Mar 2024 20:17:23 +0100 Subject: [PATCH 024/243] ci: Fix CI workflow --- .github/workflows/ci.yml | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f3b59817..384bf7cc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,29 +55,6 @@ jobs: - name: Check for breaking changes in the API run: make check-api - exclude-test-jobs: - runs-on: ubuntu-latest - outputs: - jobs: ${{ steps.exclude-jobs.outputs.jobs }} - steps: - - id: exclude-jobs - run: | - if ${{ github.repository_owner == 'pawamoy-insiders' }}; then - echo 'jobs=[ - {"os": "macos-latest"}, - {"os": "windows-latest"}, - {"python-version": "3.9"}, - {"python-version": "3.10"}, - {"python-version": "3.11"}, - {"python-version": "3.12"} - ]' | tr -d '[:space:]' >> $GITHUB_OUTPUT - else - echo 'jobs=[]' >> $GITHUB_OUTPUT - fi - - - name: Check for breaking changes in the API - run: pdm run duty check-api - exclude-test-jobs: runs-on: ubuntu-latest outputs: From 7c8b885fa2b704e719016acb35791723ea3a496a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Sun, 24 Mar 2024 16:11:04 +0100 Subject: [PATCH 025/243] refactor: Maintain original Pygments color for cross-refs in signatures --- .../python/templates/material/style.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/mkdocstrings_handlers/python/templates/material/style.css b/src/mkdocstrings_handlers/python/templates/material/style.css index 82086b8f..805c64c3 100644 --- a/src/mkdocstrings_handlers/python/templates/material/style.css +++ b/src/mkdocstrings_handlers/python/templates/material/style.css @@ -105,4 +105,9 @@ code.doc-symbol-module { code.doc-symbol-module::after { content: "mod"; -} \ No newline at end of file +} + +.doc-signature .autorefs { + color: inherit; + border-bottom: 1px dotted currentcolor; +} From 1fc4cb54ab1f7dede1eb655bd98c5a9866efd361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Sun, 24 Mar 2024 16:11:15 +0100 Subject: [PATCH 026/243] docs: Use current color for autorefs external link icon --- docs/css/mkdocstrings.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/css/mkdocstrings.css b/docs/css/mkdocstrings.css index 727a614c..03c39d33 100644 --- a/docs/css/mkdocstrings.css +++ b/docs/css/mkdocstrings.css @@ -18,10 +18,10 @@ a.autorefs-external::after { height: 1em; width: 1em; - background-color: var(--md-typeset-a-color); + background-color: currentColor; } a.external:hover::after, a.autorefs-external:hover::after { background-color: var(--md-accent-fg-color); -} \ No newline at end of file +} From d62daa71d17be1790d1b61ec83eabcc43db7a684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Sun, 24 Mar 2024 16:11:29 +0100 Subject: [PATCH 027/243] docs: Document customization of syntax highlight in signatures --- docs/usage/customization.md | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/docs/usage/customization.md b/docs/usage/customization.md index 14721092..2567870e 100644 --- a/docs/usage/customization.md +++ b/docs/usage/customization.md @@ -348,10 +348,36 @@ Available context: - `section`: The [DocstringSection][griffe.docstrings.dataclasses.DocstringSection] instance (see `DocstringSection*` subclasses). -## Style recommendations +### Syntax highlight in signatures + +You can customize the colors in syntax highlighted signatures. +If you are using the [Material for MkDocs] theme, +here are some customization examples: - +```css +/* Fancier color for operators such as * and |. */ +.doc-signature .o { + color: var(--md-code-hl-special-color); +} +/* Fancier color for constants such as None, True, and False. */ +.doc-signature .kc { + color: var(--md-code-hl-constant-color); +} + +/* Fancier color for built-in types (only useful when cross-references are used). */ +.doc-signature .n > a[href^="https://docs.python.org/"][href*="/functions.html#"], +.doc-signature .n > a[href^="https://docs.python.org/"][href*="/stdtypes.html#"] { + color: var(--md-code-hl-constant-color); +} +``` + +For other themes, use their own CSS variables, +or use plain colors such as `violet` or `#2987f2`. + +## Style recommendations + +[](){#recommended-style-material} ### Material Here are some CSS rules for the [Material for MkDocs] theme: @@ -360,8 +386,7 @@ Here are some CSS rules for the [Material for MkDocs] theme: --8<-- "docs/css/mkdocstrings.css" ``` - - +[](){#recommended-style-readthedocs} ### ReadTheDocs Here are some CSS rules for the built-in ReadTheDocs theme: From f798a1e19dbac548420dcbe1172e9a49232b615b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Sun, 24 Mar 2024 16:11:41 +0100 Subject: [PATCH 028/243] refactor: Allow first name in a separate signature to be highlighted as a function name --- src/mkdocstrings_handlers/python/rendering.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/mkdocstrings_handlers/python/rendering.py b/src/mkdocstrings_handlers/python/rendering.py index b1cb7ffc..878b74aa 100644 --- a/src/mkdocstrings_handlers/python/rendering.py +++ b/src/mkdocstrings_handlers/python/rendering.py @@ -166,6 +166,15 @@ def do_format_signature( ), ) + # Since we highlight the signature without `def`, + # Pygments sees it as a function call and not a function definition. + # The result is that the function name is not parsed as such, + # but instead as a regular name: `n` CSS class instead of `nf`. + # To fix it, we replace the first occurrence of an `n` CSS class + # with an `nf` one, unless we found `nf` already. + if signature.find('class="nf"') == -1: + signature = signature.replace('class="n"', 'class="nf"', 1) + if stash: for key, value in stash.items(): signature = re.sub(rf"\b{key}\b", value, signature) From 3cf7055a6620e5121f01ca65e589ce8992e8d745 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Sun, 24 Mar 2024 16:11:51 +0100 Subject: [PATCH 029/243] docs: Fix link to Griffe extension in insiders page --- docs/insiders/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/insiders/index.md b/docs/insiders/index.md index 9a0ae309..123fe42d 100644 --- a/docs/insiders/index.md +++ b/docs/insiders/index.md @@ -59,7 +59,7 @@ data_source = [ "docs/insiders/goals.yml", ("griffe-inherited-docstrings", "https://mkdocstrings.github.io/griffe-inherited-docstrings/", "insiders/goals.yml"), ("griffe-pydantic", "https://mkdocstrings.github.io/griffe-pydantic/", "insiders/goals.yml"), - ("griffe-typing-deprecated", "https://mkdocstrings.github.io/griffe-typing-deprecated/", "insiders/goals.yml"), + ("griffe-warnings-deprecated", "https://mkdocstrings.github.io/griffe-warnings-deprecated/", "insiders/goals.yml"), ] ``` From bd7349714059afb1295e743dbc82380fa797a032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Tue, 2 Apr 2024 18:43:59 +0200 Subject: [PATCH 030/243] fix: Don't try loading packages from relative paths Issue-145: https://github.com/mkdocstrings/python/issues/145 --- src/mkdocstrings_handlers/python/handler.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/mkdocstrings_handlers/python/handler.py b/src/mkdocstrings_handlers/python/handler.py index c5217e98..fa8e384c 100644 --- a/src/mkdocstrings_handlers/python/handler.py +++ b/src/mkdocstrings_handlers/python/handler.py @@ -283,8 +283,16 @@ def collect(self, identifier: str, config: Mapping[str, Any]) -> CollectorItem: try: for pre_loaded_module in final_config.get("preload_modules") or []: if pre_loaded_module not in self._modules_collection: - loader.load(pre_loaded_module, find_stubs_package=final_config["find_stubs_package"]) - loader.load(module_name, find_stubs_package=final_config["find_stubs_package"]) + loader.load( + pre_loaded_module, + try_relative_path=False, + find_stubs_package=final_config["find_stubs_package"], + ) + loader.load( + module_name, + try_relative_path=False, + find_stubs_package=final_config["find_stubs_package"], + ) except ImportError as error: raise CollectionError(str(error)) from error unresolved, iterations = loader.resolve_aliases( From d3b05ade6f35d914feb44317a48ed78f0e0d5391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Tue, 2 Apr 2024 18:48:07 +0200 Subject: [PATCH 031/243] chore: Prepare release 1.9.1 --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bc0d6a2..5a06cd76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,19 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [1.9.1](https://github.com/mkdocstrings/python/releases/tag/1.9.1) - 2024-04-02 + +[Compare with 1.9.0](https://github.com/mkdocstrings/python/compare/1.9.0...1.9.1) + +### Bug Fixes + +- Don't try loading packages from relative paths ([bd73497](https://github.com/mkdocstrings/python/commit/bd7349714059afb1295e743dbc82380fa797a032) by Timothée Mazzucotelli). [Issue-145](https://github.com/mkdocstrings/python/issues/145) + +### Code Refactoring + +- Allow first name in a separate signature to be highlighted as a function name ([f798a1e](https://github.com/mkdocstrings/python/commit/f798a1e19dbac548420dcbe1172e9a49232b615b) by Timothée Mazzucotelli). +- Maintain original Pygments color for cross-refs in signatures ([7c8b885](https://github.com/mkdocstrings/python/commit/7c8b885fa2b704e719016acb35791723ea3a496a) by Timothée Mazzucotelli). + ## [1.9.0](https://github.com/mkdocstrings/python/releases/tag/1.9.0) - 2024-03-13 [Compare with 1.8.0](https://github.com/mkdocstrings/python/compare/1.8.0...1.9.0) From 0c1e2c15b2497d99974cbb9bd68f25056bb8451b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Tue, 2 Apr 2024 21:27:22 +0200 Subject: [PATCH 032/243] deps: Remove cap on Python-Markdown 3.6 now that ToC labels are fixed by mkdocstrings --- pyproject.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 05438338..1ce73547 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,8 +28,7 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - "markdown>=3.3,<3.6", - "mkdocstrings>=0.20", + "mkdocstrings>=0.24.2", "griffe>=0.37", ] From 0a2e917cca07ad54ea7da782ab7914f9c9accc5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Tue, 2 Apr 2024 21:27:58 +0200 Subject: [PATCH 033/243] chore: Prepare release 1.9.2 --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a06cd76..b0e9c966 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [1.9.2](https://github.com/mkdocstrings/python/releases/tag/1.9.2) - 2024-04-02 + +[Compare with 1.9.1](https://github.com/mkdocstrings/python/compare/1.9.1...1.9.2) + +### Dependencies + +- Remove cap on Python-Markdown 3.6 now that ToC labels are fixed by mkdocstrings ([0c1e2c1](https://github.com/mkdocstrings/python/commit/0c1e2c15b2497d99974cbb9bd68f25056bb8451b) by Timothée Mazzucotelli). + ## [1.9.1](https://github.com/mkdocstrings/python/releases/tag/1.9.1) - 2024-04-02 [Compare with 1.9.0](https://github.com/mkdocstrings/python/compare/1.9.0...1.9.1) From d6e1d68c099e61c3bd6d93e583708335d84158f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Fri, 12 Apr 2024 16:59:55 +0200 Subject: [PATCH 034/243] feat: Add CSS classes `doc-section-title` and `doc-section-item` in docstring sections Issue-17: https://github.com/mkdocstrings/python/issues/17 --- .../material/_base/docstring/attributes.html | 14 +++++++------- .../material/_base/docstring/classes.html | 14 +++++++------- .../material/_base/docstring/examples.html | 2 +- .../material/_base/docstring/functions.html | 14 +++++++------- .../material/_base/docstring/modules.html | 14 +++++++------- .../material/_base/docstring/other_parameters.html | 14 +++++++------- .../material/_base/docstring/parameters.html | 14 +++++++------- .../templates/material/_base/docstring/raises.html | 14 +++++++------- .../material/_base/docstring/receives.html | 14 +++++++------- .../material/_base/docstring/returns.html | 14 +++++++------- .../templates/material/_base/docstring/warns.html | 14 +++++++------- .../templates/material/_base/docstring/yields.html | 14 +++++++------- .../python/templates/material/style.css | 5 +++++ 13 files changed, 83 insertions(+), 78 deletions(-) diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html index 88c5990d..771a9eed 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html @@ -4,7 +4,7 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

        {{ section.title or lang.t("Attributes:") }}

        +

        {{ section.title or lang.t("Attributes:") }}

        @@ -15,7 +15,7 @@ {% for attribute in section.value %} - +
        {{ attribute.name }} {% if attribute.annotation %} @@ -36,10 +36,10 @@ {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

        {{ section.title or lang.t("Attributes:") }}

        +

        {{ section.title or lang.t("Attributes:") }}

          {% for attribute in section.value %} -
        • +
        • {{ attribute.name }} {% if attribute.annotation %} {% with expression = attribute.annotation %} @@ -59,13 +59,13 @@ - - + + {% for attribute in section.value %} - +
          {{ (section.title or lang.t("ATTRIBUTE")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}{{ (section.title or lang.t("ATTRIBUTE")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
          {{ attribute.name }}
          diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html index b8ad2e0f..054cf5af 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html @@ -4,7 +4,7 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

          {{ section.title or lang.t("Classes:") }}

          +

          {{ section.title or lang.t("Classes:") }}

          @@ -14,7 +14,7 @@ {% for class in section.value %} - +
          {{ class.name }}
          @@ -28,10 +28,10 @@ {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

          {{ section.title or lang.t("Classes:") }}

          +

          {{ section.title or lang.t("Classes:") }}

            {% for class in section.value %} -
          • +
          • {{ class.name }}
            @@ -46,13 +46,13 @@ - - + + {% for class in section.value %} - +
            {{ (section.title or lang.t("CLASS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}{{ (section.title or lang.t("CLASS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
            {{ class.name }}
            diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/examples.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/examples.html index bbec5e22..5305efa9 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/examples.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/examples.html @@ -2,7 +2,7 @@ {% import "language.html" as lang with context %} -

            {{ section.title or lang.t("Examples:") }}

            +

            {{ section.title or lang.t("Examples:") }}

            {% for section_type, sub_section in section.value %} {% if section_type.value == "text" %} {{ sub_section|convert_markdown(heading_level, html_id) }} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html index ab1939f5..a16917bd 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html @@ -4,7 +4,7 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

            {{ section.title or lang.t("Methods:") if obj.is_class else lang.t("Functions:") }}

            +

            {{ section.title or lang.t("Methods:") if obj.is_class else lang.t("Functions:") }}

            @@ -15,7 +15,7 @@ {% for function in section.value %} {% if not function.name == "__init__" or not config.merge_init_into_class %} - + - - + +
            {{ function.name }}
            @@ -30,11 +30,11 @@ {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

            {{ section.title or lang.t("Methods:") if obj.is_class else lang.t("Functions:") }}

            +

            {{ section.title or lang.t("Methods:") if obj.is_class else lang.t("Functions:") }}

              {% for function in section.value %} {% if not function.name == "__init__" or not config.merge_init_into_class %} -
            • +
            • {{ function.name }}
              @@ -50,14 +50,14 @@ - - + + {% for function in section.value %} {% if not function.name == "__init__" or not config.merge_init_into_class %} - + + {% for yields in section.value %} + + {% if name_column %}{% endif %} + + + + {% endfor %} + +
              {{ (section.title or lang.t("METHOD") if obj.is_class else lang.t("FUNCTION")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}{{ (section.title or lang.t("METHOD") if obj.is_class else lang.t("FUNCTION")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
              {{ function.name }}
              diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html index f771f20b..26b38257 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html @@ -4,7 +4,7 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

              {{ section.title or lang.t("Modules:") }}

              +

              {{ section.title or lang.t("Modules:") }}

              @@ -14,7 +14,7 @@ {% for module in section.value %} - + + {% for warns in section.value %} + + + + + {% endfor %} + +
              {{ module.name }}
              @@ -28,10 +28,10 @@ {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

              {{ section.title or lang.t("Modules:") }}

              +

              {{ section.title or lang.t("Modules:") }}

                {% for module in section.value %} -
              • +
              • {{ module.name }}
                @@ -46,13 +46,13 @@ - - + + {% for module in section.value %} - + + {% for warns in section.value %} + + + + + {% endfor %} + +
                {{ (section.title or lang.t("MODULE")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}{{ (section.title or lang.t("MODULE")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                {{ module.name }}
                diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html index 7ede6715..f31836a8 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html @@ -4,7 +4,7 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

                {{ section.title or lang.t("Other Parameters:") }}

                +

                {{ section.title or lang.t("Other Parameters:") }}

                @@ -15,7 +15,7 @@ {% for parameter in section.value %} - + + {% for returns in section.value %} + + {% if name_column %}{% endif %} + + + + {% endfor %} + +
                {{ parameter.name }} {% if parameter.annotation %} @@ -36,10 +36,10 @@ {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                {{ section.title or lang.t("Other Parameters:") }}

                +

                {{ section.title or lang.t("Other Parameters:") }}

                  {% for parameter in section.value %} -
                • +
                • {{ parameter.name }} {% if parameter.annotation %} {% with expression = parameter.annotation %} @@ -59,13 +59,13 @@ - - + + {% for parameter in section.value %} - + + {% for receives in section.value %} + + {% if name_column %}{% endif %} + + + + {% endfor %} + +
                  {{ (section.title or lang.t("PARAMETER")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}{{ (section.title or lang.t("PARAMETER")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                  {{ parameter.name }}
                  diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html index 7b4788ca..05bdadee 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html @@ -4,7 +4,7 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

                  {{ section.title or lang.t("Parameters:") }}

                  +

                  {{ section.title or lang.t("Parameters:") }}

                  @@ -16,7 +16,7 @@ {% for parameter in section.value %} - + + {% for raises in section.value %} + + + + + {% endfor %} + +
                  {{ parameter.name }} {% if parameter.annotation %} @@ -46,10 +46,10 @@ {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                  {{ section.title or lang.t("Parameters:") }}

                  +

                  {{ section.title or lang.t("Parameters:") }}

                    {% for parameter in section.value %} -
                  • +
                  • {{ parameter.name }} {% if parameter.annotation %} {% with expression = parameter.annotation %} @@ -74,13 +74,13 @@ - - + + {% for parameter in section.value %} - + + {% for raises in section.value %} + + + + + {% endfor %} + +
                    {{ (section.title or lang.t("PARAMETER")).rstrip(":").upper() }} {{ lang.t("DESCRIPTION") }}{{ (section.title or lang.t("PARAMETER")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                    {{ parameter.name }}
                    diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html index 396ccc73..5e20b653 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html @@ -4,7 +4,7 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

                    {{ section.title or lang.t("Raises:") }}

                    +

                    {{ section.title or lang.t("Raises:") }}

                    @@ -14,7 +14,7 @@ {% for raises in section.value %} - + + {% for parameter in section.value %} + + + + + {% endfor %} + +
                    {% if raises.annotation %} {% with expression = raises.annotation %} @@ -34,10 +34,10 @@ {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                    {{ lang.t(section.title) or lang.t("Raises:") }}

                    +

                    {{ lang.t(section.title) or lang.t("Raises:") }}

                      {% for raises in section.value %} -
                    • +
                    • {% if raises.annotation %} {% with expression = raises.annotation %} {% include "expression.html" with context %} @@ -56,13 +56,13 @@ - - + + {% for raises in section.value %} - + + {% for parameter in section.value %} + + + + + + + {% endfor %} + +
                      {{ (section.title or lang.t("RAISES")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}{{ (section.title or lang.t("RAISES")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                      {% with expression = raises.annotation %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html index 77d83c0b..e03e8b8e 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html @@ -5,7 +5,7 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} {% set name_column = section.value|selectattr("name")|any %} -

                      {{ section.title or lang.t("Receives:") }}

                      +

                      {{ section.title or lang.t("Receives:") }}

                      @@ -16,7 +16,7 @@ {% for receives in section.value %} - + {% if name_column %}{% endif %} + {% for parameter in section.value %} + + + + + {% endfor %} + +
                      {% if receives.name %}{{ receives.name }}{% endif %} {% if receives.annotation %} @@ -37,10 +37,10 @@ {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                      {{ section.title or lang.t("Receives:") }}

                      +

                      {{ section.title or lang.t("Receives:") }}

                        {% for receives in section.value %} -
                      • +
                      • {% if receives.name %}{{ receives.name }}{% endif %} {% if receives.annotation %} {% with expression = receives.annotation %} @@ -62,13 +62,13 @@ - - + + {% for receives in section.value %} - + + {% for parameter in section.value %} + + + + + + {% endfor %} + +
                        {{ (section.title or lang.t("RECEIVES")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}{{ (section.title or lang.t("RECEIVES")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                        {% if receives.name %} {{ receives.name }} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html index b19917a3..a7a7cb98 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html @@ -5,7 +5,7 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} {% set name_column = section.value|selectattr("name")|any %} -

                        {{ section.title or lang.t("Returns:") }}

                        +

                        {{ section.title or lang.t("Returns:") }}

                        @@ -16,7 +16,7 @@ {% for returns in section.value %} - + {% if name_column %}{% endif %} + {% for module in section.value %} + + + + + {% endfor %} + +
                        {% if returns.name %}{{ returns.name }}{% endif %} {% if returns.annotation %} @@ -37,10 +37,10 @@ {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                        {{ section.title or lang.t("Returns:") }}

                        +

                        {{ section.title or lang.t("Returns:") }}

                          {% for returns in section.value %} -
                        • +
                        • {% if returns.name %}{{ returns.name }}{% endif %} {% if returns.annotation %} {% with expression = returns.annotation %} @@ -62,13 +62,13 @@ - - + + {% for returns in section.value %} - + + {% for module in section.value %} + + + + + {% endfor %} + +
                          {{ (section.title or lang.t("RETURNS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION").upper() }}{{ (section.title or lang.t("RETURNS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION").upper() }}
                          {% if returns.name %} {{ returns.name }} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html index 8377669f..a9bdae26 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html @@ -4,7 +4,7 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

                          {{ section.title or lang.t("Warns:") }}

                          +

                          {{ section.title or lang.t("Warns:") }}

                          @@ -14,7 +14,7 @@ {% for warns in section.value %} - + + {% for class in section.value %} + + + + + {% endfor %} + +
                          {% if warns.annotation %} {% with expression = warns.annotation %} @@ -34,10 +34,10 @@ {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                          {{ section.title or lang.t("Warns:") }}

                          +

                          {{ section.title or lang.t("Warns:") }}

                            {% for warns in section.value %} -
                          • +
                          • {% if warns.annotation %} {% with expression = warns.annotation %} {% include "expression.html" with context %} @@ -56,13 +56,13 @@ - - + + {% for warns in section.value %} - + + {% for class in section.value %} + + + + + {% endfor %} + +
                            {{ (section.title or lang.t("WARNS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}{{ (section.title or lang.t("WARNS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                            {% with expression = warns.annotation %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html index c69135ea..6c4cb0b0 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html @@ -5,7 +5,7 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} {% set name_column = section.value|selectattr("name")|any %} -

                            {{ section.title or lang.t("Yields:") }}

                            +

                            {{ section.title or lang.t("Yields:") }}

                            @@ -16,7 +16,7 @@ {% for yields in section.value %} - + {% if name_column %}{% endif %} + {% for attribute in section.value %} + + + + + {% endfor %} + +
                            {% if yields.name %}{{ yields.name }}{% endif %} {% if yields.annotation %} @@ -37,10 +37,10 @@ {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                            {{ section.title or lang.t("Yields:") }}

                            +

                            {{ section.title or lang.t("Yields:") }}

                              {% for yields in section.value %} -
                            • +
                            • {% if yields.name %}{{ yields.name }}{% endif %} {% if yields.annotation %} {% with expression = yields.annotation %} @@ -62,13 +62,13 @@ - - + + {% for yields in section.value %} - + + {% for attribute in section.value %} + + + + + + {% endfor %} + +
                              {{ (section.title or lang.t("YIELDS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}{{ (section.title or lang.t("YIELDS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                              {% if yields.name %} {{ yields.name }} diff --git a/src/mkdocstrings_handlers/python/templates/material/style.css b/src/mkdocstrings_handlers/python/templates/material/style.css index 805c64c3..154be85d 100644 --- a/src/mkdocstrings_handlers/python/templates/material/style.css +++ b/src/mkdocstrings_handlers/python/templates/material/style.css @@ -25,6 +25,11 @@ float: right; } +/* Backward-compatibility: docstring section titles in bold. */ +.doc-section-title { + font-weight: bold; +} + /* Symbols in Navigation and ToC. */ :root, [data-md-color-scheme="default"] { From 9f8456a55b9659d86a42f684d85b69b218226b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Fri, 12 Apr 2024 17:47:24 +0200 Subject: [PATCH 035/243] docs: Improve docs about CSS customization Issue-48: https://github.com/mkdocstrings/python/issues/48 --- docs/usage/customization.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/usage/customization.md b/docs/usage/customization.md index 2567870e..8eedadd1 100644 --- a/docs/usage/customization.md +++ b/docs/usage/customization.md @@ -5,6 +5,26 @@ and/or by overriding templates. ## CSS classes +Our templates add [CSS](https://www.w3schools.com/Css/) classes to many HTML elements +to make it possible for users to customize the resulting look and feel. + +To add CSS rules and style mkdocstrings' output, +put them in a CSS file in your docs folder, for example in `docs/css/mkdocstrings.css`, +and reference this file in [MkDocs' `extra_css` configuration option](https://www.mkdocs.org/user-guide/configuration/#extra_css): + +```yaml title="mkdocs.yml" +extra_css: +- css/mkdocstrings.css +``` + +Example: + +```css title="docs/css/mkdocstrings.css" +.doc-section-title { + font-weight: bold; +} +``` + The following CSS classes are used in the generated HTML: - `doc`: on all the following elements @@ -22,6 +42,8 @@ The following CSS classes are used in the generated HTML: - `doc-labels`: on `span`s wrapping the object's labels - `doc-label`: on `small` elements containing a label - `doc-label-LABEL`: same, where `LABEL` is replaced by the actual label +- `doc-section-title`: on section titles (depend on the [selected style for section rendering][docstring_style]) +- `doc-section-item`: on section items (depend on the [selected style for section rendering][docstring_style]) - `doc-md-description`: on `div`s containing HTML descriptions converted from Markdown docstrings - `doc-symbol`: on `code` tags of symbol types - `doc-symbol-heading`: on symbol types in headings From 11d81d8e056b7c074eb3a1c47606867156a338fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Fri, 19 Apr 2024 15:06:16 +0200 Subject: [PATCH 036/243] fix: Render enumeration instance name instead of just "value", allowing proper cross-reference Issue-124: https://github.com/mkdocstrings/python/issues/124 --- pyproject.toml | 2 +- .../python/templates/material/_base/expression.html | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1ce73547..c02461f1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ classifiers = [ ] dependencies = [ "mkdocstrings>=0.24.2", - "griffe>=0.37", + "griffe>=0.44", ] [project.urls] diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/expression.html b/src/mkdocstrings_handlers/python/templates/material/_base/expression.html index cbc84e43..00e1c761 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/expression.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/expression.html @@ -29,7 +29,11 @@ {{ render(expression.slice.elements[0], annotations_path) }} {%- elif expression.classname == "ExprAttribute" -%} {%- if annotations_path == "brief" -%} - {{ render(expression.last, "brief") }} + {%- if expression.last.is_enum_value -%} + {{ crossref(expression.last.parent, "brief") }}.value + {%- else -%} + {{ render(expression.last, "brief") }} + {%- endif -%} {%- elif annotations_path == "full" -%} {{ render(expression.first, "full") }} {%- for element in expression -%} From 98e9796fe8ab6eee1ea0a16f1179a0e4f37bcf4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Fri, 19 Apr 2024 15:10:31 +0200 Subject: [PATCH 037/243] chore: Prepare release 1.10.0 --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0e9c966..1fdbdf36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,18 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [1.10.0](https://github.com/mkdocstrings/python/releases/tag/1.10.0) - 2024-04-19 + +[Compare with 1.9.2](https://github.com/mkdocstrings/python/compare/1.9.2...1.10.0) + +### Features + +- Add CSS classes `doc-section-title` and `doc-section-item` in docstring sections ([d6e1d68](https://github.com/mkdocstrings/python/commit/d6e1d68c099e61c3bd6d93e583708335d84158f5) by Timothée Mazzucotelli). [Issue-17](https://github.com/mkdocstrings/python/issues/17) + +### Bug Fixes + +- Render enumeration instance name instead of just "value", allowing proper cross-reference ([11d81d8](https://github.com/mkdocstrings/python/commit/11d81d8e056b7c074eb3a1c47606867156a338fa) by Timothée Mazzucotelli). [Issue-124](https://github.com/mkdocstrings/python/issues/124) + ## [1.9.2](https://github.com/mkdocstrings/python/releases/tag/1.9.2) - 2024-04-02 [Compare with 1.9.1](https://github.com/mkdocstrings/python/compare/1.9.1...1.9.2) From da02284f96cb9bcd412ca34864c569672b949f35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Wed, 24 Apr 2024 14:56:41 +0200 Subject: [PATCH 038/243] style: Improve templates indentation --- .../templates/material/_base/attribute.html | 124 ++++----- .../templates/material/_base/children.html | 56 ++--- .../templates/material/_base/class.html | 236 +++++++++--------- .../material/_base/docstring/attributes.html | 148 +++++------ .../material/_base/docstring/classes.html | 102 ++++---- .../material/_base/docstring/functions.html | 116 ++++----- .../material/_base/docstring/modules.html | 102 ++++---- .../_base/docstring/other_parameters.html | 148 +++++------ .../material/_base/docstring/parameters.html | 194 +++++++------- .../material/_base/docstring/raises.html | 134 +++++----- .../material/_base/docstring/receives.html | 166 ++++++------ .../material/_base/docstring/returns.html | 166 ++++++------ .../material/_base/docstring/warns.html | 134 +++++----- .../material/_base/docstring/yields.html | 166 ++++++------ .../templates/material/_base/function.html | 154 ++++++------ .../templates/material/_base/module.html | 118 ++++----- .../templates/material/_base/signature.html | 81 +++--- .../readthedocs/docstring/returns.html | 42 ++-- 18 files changed, 1193 insertions(+), 1194 deletions(-) diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/attribute.html b/src/mkdocstrings_handlers/python/templates/material/_base/attribute.html index 3f1d887e..80a75fc9 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/attribute.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/attribute.html @@ -1,80 +1,80 @@ {{ log.debug("Rendering " + attribute.path) }}
                              -{% with obj = attribute, html_id = attribute.path %} + {% with obj = attribute, html_id = attribute.path %} - {% if root %} - {% set show_full_path = config.show_root_full_path %} - {% set root_members = True %} - {% elif root_members %} - {% set show_full_path = config.show_root_members_full_path or config.show_object_full_path %} - {% set root_members = False %} - {% else %} - {% set show_full_path = config.show_object_full_path %} - {% endif %} + {% if root %} + {% set show_full_path = config.show_root_full_path %} + {% set root_members = True %} + {% elif root_members %} + {% set show_full_path = config.show_root_members_full_path or config.show_object_full_path %} + {% set root_members = False %} + {% else %} + {% set show_full_path = config.show_object_full_path %} + {% endif %} + + {% set attribute_name = attribute.path if show_full_path else attribute.name %} + + {% if not root or config.show_root_heading %} + {% filter heading( + heading_level, + role="data" if attribute.parent.kind.value == "module" else "attr", + id=html_id, + class="doc doc-heading", + toc_label=(' '|safe if config.show_symbol_type_toc else '') + attribute.name, + ) %} - {% set attribute_name = attribute.path if show_full_path else attribute.name %} + {% block heading scoped %} + {% if config.show_symbol_type_heading %}{% endif %} + {% if config.separate_signature %} + {{ attribute_name }} + {% else %} + {%+ filter highlight(language="python", inline=True) %} + {{ attribute_name }}{% if attribute.annotation %}: {{ attribute.annotation }}{% endif %} + {% if attribute.value %} = {{ attribute.value }}{% endif %} + {% endfilter %} + {% endif %} + {% endblock heading %} - {% if not root or config.show_root_heading %} - {% filter heading( - heading_level, - role="data" if attribute.parent.kind.value == "module" else "attr", - id=html_id, - class="doc doc-heading", - toc_label=(' '|safe if config.show_symbol_type_toc else '') + attribute.name, - ) %} + {% block labels scoped %} + {% with labels = attribute.labels %} + {% include "labels.html" with context %} + {% endwith %} + {% endblock labels %} + + {% endfilter %} - {% block heading scoped %} - {% if config.show_symbol_type_heading %}{% endif %} + {% block signature scoped %} {% if config.separate_signature %} - {{ attribute_name }} - {% else %} - {%+ filter highlight(language="python", inline=True) %} - {{ attribute_name }}{% if attribute.annotation %}: {{ attribute.annotation }}{% endif %} - {% if attribute.value %} = {{ attribute.value }}{% endif %} + {% filter format_attribute(attribute, config.line_length, crossrefs=config.signature_crossrefs) %} + {{ attribute.name }} {% endfilter %} {% endif %} - {% endblock heading %} + {% endblock signature %} - {% block labels scoped %} - {% with labels = attribute.labels %} - {% include "labels.html" with context %} - {% endwith %} - {% endblock labels %} + {% else %} - {% endfilter %} - - {% block signature scoped %} - {% if config.separate_signature %} - {% filter format_attribute(attribute, config.line_length, crossrefs=config.signature_crossrefs) %} - {{ attribute.name }} + {% if config.show_root_toc_entry %} + {% filter heading(heading_level, + role="data" if attribute.parent.kind.value == "module" else "attr", + id=html_id, + toc_label=(' '|safe if config.show_symbol_type_toc else '') + attribute.name, + hidden=True, + ) %} {% endfilter %} {% endif %} - {% endblock signature %} - - {% else %} - - {% if config.show_root_toc_entry %} - {% filter heading(heading_level, - role="data" if attribute.parent.kind.value == "module" else "attr", - id=html_id, - toc_label=(' '|safe if config.show_symbol_type_toc else '') + attribute.name, - hidden=True, - ) %} - {% endfilter %} + {% set heading_level = heading_level - 1 %} {% endif %} - {% set heading_level = heading_level - 1 %} - {% endif %} -
                              - {% block contents scoped %} - {% block docstring scoped %} - {% with docstring_sections = attribute.docstring.parsed %} - {% include "docstring.html" with context %} - {% endwith %} - {% endblock docstring %} - {% endblock contents %} -
                              +
                              + {% block contents scoped %} + {% block docstring scoped %} + {% with docstring_sections = attribute.docstring.parsed %} + {% include "docstring.html" with context %} + {% endwith %} + {% endblock docstring %} + {% endblock contents %} +
                              -{% endwith %} + {% endwith %}
                              diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/children.html b/src/mkdocstrings_handlers/python/templates/material/_base/children.html index 25534f70..cd9a8fac 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/children.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/children.html @@ -20,11 +20,11 @@ {% endif %} {% with attributes = obj.attributes|filter_objects( - filters=config.filters, - members_list=members_list, - inherited_members=config.inherited_members, - keep_no_docstrings=config.show_if_no_docstring, - ) %} + filters=config.filters, + members_list=members_list, + inherited_members=config.inherited_members, + keep_no_docstrings=config.show_if_no_docstring, + ) %} {% if attributes %} {% if config.show_category_heading %} {% filter heading(heading_level, id=html_id ~ "-attributes") %}Attributes{% endfilter %} @@ -40,11 +40,11 @@ {% endwith %} {% with classes = obj.classes|filter_objects( - filters=config.filters, - members_list=members_list, - inherited_members=config.inherited_members, - keep_no_docstrings=config.show_if_no_docstring, - ) %} + filters=config.filters, + members_list=members_list, + inherited_members=config.inherited_members, + keep_no_docstrings=config.show_if_no_docstring, + ) %} {% if classes %} {% if config.show_category_heading %} {% filter heading(heading_level, id=html_id ~ "-classes") %}Classes{% endfilter %} @@ -60,11 +60,11 @@ {% endwith %} {% with functions = obj.functions|filter_objects( - filters=config.filters, - members_list=members_list, - inherited_members=config.inherited_members, - keep_no_docstrings=config.show_if_no_docstring, - ) %} + filters=config.filters, + members_list=members_list, + inherited_members=config.inherited_members, + keep_no_docstrings=config.show_if_no_docstring, + ) %} {% if functions %} {% if config.show_category_heading %} {% filter heading(heading_level, id=html_id ~ "-functions") %}Functions{% endfilter %} @@ -83,11 +83,11 @@ {% if config.show_submodules %} {% with modules = obj.modules|filter_objects( - filters=config.filters, - members_list=members_list, - inherited_members=config.inherited_members, - keep_no_docstrings=config.show_if_no_docstring, - ) %} + filters=config.filters, + members_list=members_list, + inherited_members=config.inherited_members, + keep_no_docstrings=config.show_if_no_docstring, + ) %} {% if modules %} {% if config.show_category_heading %} {% filter heading(heading_level, id=html_id ~ "-modules") %}Modules{% endfilter %} @@ -108,14 +108,14 @@ {% else %} {% for child in obj.all_members - |filter_objects( - filters=config.filters, - members_list=members_list, - inherited_members=config.inherited_members, - keep_no_docstrings=config.show_if_no_docstring, - ) - |order_members(config.members_order, members_list) - %} + |filter_objects( + filters=config.filters, + members_list=members_list, + inherited_members=config.inherited_members, + keep_no_docstrings=config.show_if_no_docstring, + ) + |order_members(config.members_order, members_list) + %} {% if not (obj.is_class and child.name == "__init__" and config.merge_init_into_class) %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/class.html b/src/mkdocstrings_handlers/python/templates/material/_base/class.html index fb7ca764..2934c7c0 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/class.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/class.html @@ -1,142 +1,142 @@ {{ log.debug("Rendering " + class.path) }}
                              -{% with obj = class, html_id = class.path %} + {% with obj = class, html_id = class.path %} - {% if root %} - {% set show_full_path = config.show_root_full_path %} - {% set root_members = True %} - {% elif root_members %} - {% set show_full_path = config.show_root_members_full_path or config.show_object_full_path %} - {% set root_members = False %} - {% else %} - {% set show_full_path = config.show_object_full_path %} - {% endif %} - - {% set class_name = class.path if show_full_path else class.name %} + {% if root %} + {% set show_full_path = config.show_root_full_path %} + {% set root_members = True %} + {% elif root_members %} + {% set show_full_path = config.show_root_members_full_path or config.show_object_full_path %} + {% set root_members = False %} + {% else %} + {% set show_full_path = config.show_object_full_path %} + {% endif %} - {% if not root or config.show_root_heading %} - {% filter heading( - heading_level, - role="class", - id=html_id, - class="doc doc-heading", - toc_label=(' '|safe if config.show_symbol_type_toc else '') + class.name, - ) %} + {% set class_name = class.path if show_full_path else class.name %} - {% block heading scoped %} - {% if config.show_symbol_type_heading %}{% endif %} - {% if config.separate_signature %} - {{ class_name }} - {% elif config.merge_init_into_class and "__init__" in class.all_members %} - {% with function = class.all_members["__init__"] %} - {%+ filter highlight(language="python", inline=True) %} - {{ class_name }}{% include "signature.html" with context %} - {% endfilter %} - {% endwith %} - {% else %} - {{ class_name }} - {% endif %} - {% endblock heading %} - - {% block labels scoped %} - {% with labels = class.labels %} - {% include "labels.html" with context %} - {% endwith %} - {% endblock labels %} + {% if not root or config.show_root_heading %} + {% filter heading( + heading_level, + role="class", + id=html_id, + class="doc doc-heading", + toc_label=(' '|safe if config.show_symbol_type_toc else '') + class.name, + ) %} - {% endfilter %} + {% block heading scoped %} + {% if config.show_symbol_type_heading %}{% endif %} + {% if config.separate_signature %} + {{ class_name }} + {% elif config.merge_init_into_class and "__init__" in class.all_members %} + {% with function = class.all_members["__init__"] %} + {%+ filter highlight(language="python", inline=True) %} + {{ class_name }}{% include "signature.html" with context %} + {% endfilter %} + {% endwith %} + {% else %} + {{ class_name }} + {% endif %} + {% endblock heading %} - {% block signature scoped %} - {% if config.separate_signature and config.merge_init_into_class %} - {% if "__init__" in class.all_members %} - {% with function = class.all_members["__init__"] %} - {% filter format_signature(function, config.line_length, crossrefs=config.signature_crossrefs) %} - {{ class.name }} - {% endfilter %} + {% block labels scoped %} + {% with labels = class.labels %} + {% include "labels.html" with context %} {% endwith %} - {% endif %} - {% endif %} - {% endblock signature %} + {% endblock labels %} - {% else %} - {% if config.show_root_toc_entry %} - {% filter heading(heading_level, - role="class", - id=html_id, - toc_label=(' '|safe if config.show_symbol_type_toc else '') + class.name, - hidden=True, - ) %} {% endfilter %} - {% endif %} - {% set heading_level = heading_level - 1 %} - {% endif %} - -
                              - {% block contents scoped %} - {% block bases scoped %} - {% if config.show_bases and class.bases %} -

                              - Bases: {% for expression in class.bases -%} - {% include "expression.html" with context %}{% if not loop.last %}, {% endif %} - {% endfor -%} -

                              - {% endif %} - {% endblock bases %} - {% block docstring scoped %} - {% with docstring_sections = class.docstring.parsed %} - {% include "docstring.html" with context %} - {% endwith %} - {% if config.merge_init_into_class %} - {% if "__init__" in class.all_members and class.all_members["__init__"].has_docstring %} - {% with docstring_sections = class.all_members["__init__"].docstring.parsed %} - {% include "docstring.html" with context %} + {% block signature scoped %} + {% if config.separate_signature and config.merge_init_into_class %} + {% if "__init__" in class.all_members %} + {% with function = class.all_members["__init__"] %} + {% filter format_signature(function, config.line_length, crossrefs=config.signature_crossrefs) %} + {{ class.name }} + {% endfilter %} {% endwith %} {% endif %} {% endif %} - {% endblock docstring %} + {% endblock signature %} + + {% else %} + {% if config.show_root_toc_entry %} + {% filter heading(heading_level, + role="class", + id=html_id, + toc_label=(' '|safe if config.show_symbol_type_toc else '') + class.name, + hidden=True, + ) %} + {% endfilter %} + {% endif %} + {% set heading_level = heading_level - 1 %} + {% endif %} - {% block source scoped %} - {% if config.show_source %} +
                              + {% block contents scoped %} + {% block bases scoped %} + {% if config.show_bases and class.bases %} +

                              + Bases: {% for expression in class.bases -%} + {% include "expression.html" with context %}{% if not loop.last %}, {% endif %} + {% endfor -%} +

                              + {% endif %} + {% endblock bases %} + + {% block docstring scoped %} + {% with docstring_sections = class.docstring.parsed %} + {% include "docstring.html" with context %} + {% endwith %} {% if config.merge_init_into_class %} - {% if "__init__" in class.all_members and class.all_members["__init__"].source %} - {% with init = class.all_members["__init__"] %} -
                              - Source code in - {%- if init.relative_filepath.is_absolute() -%} - {{ init.relative_package_filepath }} - {%- else -%} - {{ init.relative_filepath }} - {%- endif -%} - - {{ init.source|highlight(language="python", linestart=init.lineno, linenums=True) }} -
                              + {% if "__init__" in class.all_members and class.all_members["__init__"].has_docstring %} + {% with docstring_sections = class.all_members["__init__"].docstring.parsed %} + {% include "docstring.html" with context %} {% endwith %} {% endif %} - {% elif class.source %} -
                              - Source code in - {%- if class.relative_filepath.is_absolute() -%} - {{ class.relative_package_filepath }} - {%- else -%} - {{ class.relative_filepath }} - {%- endif -%} - - {{ class.source|highlight(language="python", linestart=class.lineno, linenums=True) }} -
                              {% endif %} - {% endif %} - {% endblock source %} + {% endblock docstring %} + + {% block source scoped %} + {% if config.show_source %} + {% if config.merge_init_into_class %} + {% if "__init__" in class.all_members and class.all_members["__init__"].source %} + {% with init = class.all_members["__init__"] %} +
                              + Source code in + {%- if init.relative_filepath.is_absolute() -%} + {{ init.relative_package_filepath }} + {%- else -%} + {{ init.relative_filepath }} + {%- endif -%} + + {{ init.source|highlight(language="python", linestart=init.lineno, linenums=True) }} +
                              + {% endwith %} + {% endif %} + {% elif class.source %} +
                              + Source code in + {%- if class.relative_filepath.is_absolute() -%} + {{ class.relative_package_filepath }} + {%- else -%} + {{ class.relative_filepath }} + {%- endif -%} + + {{ class.source|highlight(language="python", linestart=class.lineno, linenums=True) }} +
                              + {% endif %} + {% endif %} + {% endblock source %} - {% block children scoped %} - {% set root = False %} - {% set heading_level = heading_level + 1 %} - {% include "children.html" with context %} - {% endblock children %} - {% endblock contents %} -
                              + {% block children scoped %} + {% set root = False %} + {% set heading_level = heading_level + 1 %} + {% include "children.html" with context %} + {% endblock children %} + {% endblock contents %} +
                              -{% endwith %} + {% endwith %}
                              diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html index 771a9eed..99824653 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/attributes.html @@ -4,87 +4,87 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

                              {{ section.title or lang.t("Attributes:") }}

                              - - - - - - - - - - {% for attribute in section.value %} - - - - +

                              {{ section.title or lang.t("Attributes:") }}

                              +
                              {{ lang.t("Name") }}{{ lang.t("Type") }}{{ lang.t("Description") }}
                              {{ attribute.name }} - {% if attribute.annotation %} - {% with expression = attribute.annotation %} - {% include "expression.html" with context %} - {% endwith %} - {% endif %} - -
                              - {{ attribute.description|convert_markdown(heading_level, html_id) }} -
                              -
                              + + + + + - {% endfor %} - -
                              {{ lang.t("Name") }}{{ lang.t("Type") }}{{ lang.t("Description") }}
                              + +
                              {{ attribute.name }} + {% if attribute.annotation %} + {% with expression = attribute.annotation %} + {% include "expression.html" with context %} + {% endwith %} + {% endif %} + +
                              + {{ attribute.description|convert_markdown(heading_level, html_id) }} +
                              +
                              {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                              {{ section.title or lang.t("Attributes:") }}

                              -
                                - {% for attribute in section.value %} -
                              • - {{ attribute.name }} - {% if attribute.annotation %} - {% with expression = attribute.annotation %} - ({% include "expression.html" with context %}) - {% endwith %} - {% endif %} - – -
                                - {{ attribute.description|convert_markdown(heading_level, html_id) }} -
                                -
                              • - {% endfor %} -
                              +

                              {{ section.title or lang.t("Attributes:") }}

                              +
                                + {% for attribute in section.value %} +
                              • + {{ attribute.name }} + {% if attribute.annotation %} + {% with expression = attribute.annotation %} + ({% include "expression.html" with context %}) + {% endwith %} + {% endif %} + – +
                                + {{ attribute.description|convert_markdown(heading_level, html_id) }} +
                                +
                              • + {% endfor %} +
                              {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} {% block spacy_style scoped %} - - - - - - - - - {% for attribute in section.value %} - - - +
                              {{ (section.title or lang.t("ATTRIBUTE")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                              {{ attribute.name }} -
                              - {{ attribute.description|convert_markdown(heading_level, html_id) }} -
                              -

                              - {% if attribute.annotation %} - - TYPE: - {% with expression = attribute.annotation %} - {% include "expression.html" with context %} - {% endwith %} - - {% endif %} -

                              -
                              + + + + - {% endfor %} - -
                              {{ (section.title or lang.t("ATTRIBUTE")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                              + +
                            {{ attribute.name }} +
                            + {{ attribute.description|convert_markdown(heading_level, html_id) }} +
                            +

                            + {% if attribute.annotation %} + + TYPE: + {% with expression = attribute.annotation %} + {% include "expression.html" with context %} + {% endwith %} + + {% endif %} +

                            +
                            {% endblock spacy_style %} {% endif %} \ No newline at end of file diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html index 054cf5af..c0acac8a 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/classes.html @@ -4,64 +4,64 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

                            {{ section.title or lang.t("Classes:") }}

                            - - - - - - - - - {% for class in section.value %} - - - +

                            {{ section.title or lang.t("Classes:") }}

                            +
                            {{ lang.t("Name") }}{{ lang.t("Description") }}
                            {{ class.name }} -
                            - {{ class.description|convert_markdown(heading_level, html_id) }} -
                            -
                            + + + + - {% endfor %} - -
                            {{ lang.t("Name") }}{{ lang.t("Description") }}
                            + +
                            {{ class.name }} +
                            + {{ class.description|convert_markdown(heading_level, html_id) }} +
                            +
                            {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                            {{ section.title or lang.t("Classes:") }}

                            -
                              - {% for class in section.value %} -
                            • - {{ class.name }} - – -
                              - {{ class.description|convert_markdown(heading_level, html_id) }} -
                              -
                            • - {% endfor %} -
                            +

                            {{ section.title or lang.t("Classes:") }}

                            +
                              + {% for class in section.value %} +
                            • + {{ class.name }} + – +
                              + {{ class.description|convert_markdown(heading_level, html_id) }} +
                              +
                            • + {% endfor %} +
                            {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} {% block spacy_style scoped %} - - - - - - - - - {% for class in section.value %} - - - +
                            {{ (section.title or lang.t("CLASS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                            {{ class.name }} -
                            - {{ class.description|convert_markdown(heading_level, html_id) }} -
                            -
                            + + + + - {% endfor %} - -
                            {{ (section.title or lang.t("CLASS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                            + +
                          {{ class.name }} +
                          + {{ class.description|convert_markdown(heading_level, html_id) }} +
                          +
                          {% endblock spacy_style %} {% endif %} \ No newline at end of file diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html index a16917bd..696826f0 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/functions.html @@ -4,70 +4,70 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

                          {{ section.title or lang.t("Methods:") if obj.is_class else lang.t("Functions:") }}

                          - - - - - - - - - {% for function in section.value %} - {% if not function.name == "__init__" or not config.merge_init_into_class %} - - - - - {% endif %} - {% endfor %} - -
                          {{ lang.t("Name") }}{{ lang.t("Description") }}
                          {{ function.name }} -
                          - {{ function.description|convert_markdown(heading_level, html_id) }} -
                          -
                          +

                          {{ section.title or lang.t("Methods:") if obj.is_class else lang.t("Functions:") }}

                          + + + + + + + + + {% for function in section.value %} + {% if not function.name == "__init__" or not config.merge_init_into_class %} + + + + + {% endif %} + {% endfor %} + +
                          {{ lang.t("Name") }}{{ lang.t("Description") }}
                          {{ function.name }} +
                          + {{ function.description|convert_markdown(heading_level, html_id) }} +
                          +
                          {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                          {{ section.title or lang.t("Methods:") if obj.is_class else lang.t("Functions:") }}

                          -
                            - {% for function in section.value %} - {% if not function.name == "__init__" or not config.merge_init_into_class %} -
                          • - {{ function.name }} - – -
                            - {{ function.description|convert_markdown(heading_level, html_id) }} -
                            -
                          • - {% endif %} - {% endfor %} -
                          - {% endblock list_style %} -{% elif config.docstring_section_style == "spacy" %} - {% block spacy_style scoped %} - - - - - - - - +

                          {{ section.title or lang.t("Methods:") if obj.is_class else lang.t("Functions:") }}

                          +
                            {% for function in section.value %} {% if not function.name == "__init__" or not config.merge_init_into_class %} -
                          - - - +
                        • + {{ function.name }} + – +
                          + {{ function.description|convert_markdown(heading_level, html_id) }} +
                          +
                        • {% endif %} {% endfor %} - -
                          {{ (section.title or lang.t("METHOD") if obj.is_class else lang.t("FUNCTION")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                          {{ function.name }} -
                          - {{ function.description|convert_markdown(heading_level, html_id) }} -
                          -
                          + + {% endblock list_style %} +{% elif config.docstring_section_style == "spacy" %} + {% block spacy_style scoped %} + + + + + + + + + {% for function in section.value %} + {% if not function.name == "__init__" or not config.merge_init_into_class %} + + + + + {% endif %} + {% endfor %} + +
                          {{ (section.title or lang.t("METHOD") if obj.is_class else lang.t("FUNCTION")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                          {{ function.name }} +
                          + {{ function.description|convert_markdown(heading_level, html_id) }} +
                          +
                          {% endblock spacy_style %} {% endif %} \ No newline at end of file diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html index 26b38257..d5ea77e6 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/modules.html @@ -4,64 +4,64 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

                          {{ section.title or lang.t("Modules:") }}

                          - - - - - - - - - {% for module in section.value %} - - - +

                          {{ section.title or lang.t("Modules:") }}

                          +
                          {{ lang.t("Name") }}{{ lang.t("Description") }}
                          {{ module.name }} -
                          - {{ module.description|convert_markdown(heading_level, html_id) }} -
                          -
                          + + + + - {% endfor %} - -
                          {{ lang.t("Name") }}{{ lang.t("Description") }}
                          + +
                          {{ module.name }} +
                          + {{ module.description|convert_markdown(heading_level, html_id) }} +
                          +
                          {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                          {{ section.title or lang.t("Modules:") }}

                          -
                            - {% for module in section.value %} -
                          • - {{ module.name }} - – -
                            - {{ module.description|convert_markdown(heading_level, html_id) }} -
                            -
                          • - {% endfor %} -
                          +

                          {{ section.title or lang.t("Modules:") }}

                          +
                            + {% for module in section.value %} +
                          • + {{ module.name }} + – +
                            + {{ module.description|convert_markdown(heading_level, html_id) }} +
                            +
                          • + {% endfor %} +
                          {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} {% block spacy_style scoped %} - - - - - - - - - {% for module in section.value %} - - - +
                          {{ (section.title or lang.t("MODULE")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                          {{ module.name }} -
                          - {{ module.description|convert_markdown(heading_level, html_id) }} -
                          -
                          + + + + - {% endfor %} - -
                          {{ (section.title or lang.t("MODULE")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                          + +
                        {{ module.name }} +
                        + {{ module.description|convert_markdown(heading_level, html_id) }} +
                        +
                        {% endblock spacy_style %} {% endif %} \ No newline at end of file diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html index f31836a8..17d6d355 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/other_parameters.html @@ -4,87 +4,87 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

                        {{ section.title or lang.t("Other Parameters:") }}

                        - - - - - - - - - - {% for parameter in section.value %} - - - - +

                        {{ section.title or lang.t("Other Parameters:") }}

                        +
                        {{ lang.t("Name") }}{{ lang.t("Type") }}{{ lang.t("Description") }}
                        {{ parameter.name }} - {% if parameter.annotation %} - {% with expression = parameter.annotation %} - {% include "expression.html" with context %} - {% endwith %} - {% endif %} - -
                        - {{ parameter.description|convert_markdown(heading_level, html_id) }} -
                        -
                        + + + + + - {% endfor %} - -
                        {{ lang.t("Name") }}{{ lang.t("Type") }}{{ lang.t("Description") }}
                        + +
                        {{ parameter.name }} + {% if parameter.annotation %} + {% with expression = parameter.annotation %} + {% include "expression.html" with context %} + {% endwith %} + {% endif %} + +
                        + {{ parameter.description|convert_markdown(heading_level, html_id) }} +
                        +
                        {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                        {{ section.title or lang.t("Other Parameters:") }}

                        -
                          - {% for parameter in section.value %} -
                        • - {{ parameter.name }} - {% if parameter.annotation %} - {% with expression = parameter.annotation %} - ({% include "expression.html" with context %}) - {% endwith %} - {% endif %} - – -
                          - {{ parameter.description|convert_markdown(heading_level, html_id) }} -
                          -
                        • - {% endfor %} -
                        +

                        {{ section.title or lang.t("Other Parameters:") }}

                        +
                          + {% for parameter in section.value %} +
                        • + {{ parameter.name }} + {% if parameter.annotation %} + {% with expression = parameter.annotation %} + ({% include "expression.html" with context %}) + {% endwith %} + {% endif %} + – +
                          + {{ parameter.description|convert_markdown(heading_level, html_id) }} +
                          +
                        • + {% endfor %} +
                        {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} {% block spacy_style scoped %} - - - - - - - - - {% for parameter in section.value %} - - - +
                        {{ (section.title or lang.t("PARAMETER")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                        {{ parameter.name }} -
                        - {{ parameter.description|convert_markdown(heading_level, html_id) }} -
                        -

                        - {% if parameter.annotation %} - - {{ lang.t("TYPE:") }} - {% with expression = parameter.annotation %} - {% include "expression.html" with context %} - {% endwith %} - - {% endif %} -

                        -
                        + + + + - {% endfor %} - -
                        {{ (section.title or lang.t("PARAMETER")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                        + +
                      {{ parameter.name }} +
                      + {{ parameter.description|convert_markdown(heading_level, html_id) }} +
                      +

                      + {% if parameter.annotation %} + + {{ lang.t("TYPE:") }} + {% with expression = parameter.annotation %} + {% include "expression.html" with context %} + {% endwith %} + + {% endif %} +

                      +
                      {% endblock spacy_style %} {% endif %} \ No newline at end of file diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html index 05bdadee..7980096d 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/parameters.html @@ -4,110 +4,110 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

                      {{ section.title or lang.t("Parameters:") }}

                      - - - - - - - - - - - {% for parameter in section.value %} - - - - - +

                      {{ section.title or lang.t("Parameters:") }}

                      +
                      {{ lang.t("Name") }}{{ lang.t("Type") }}{{ lang.t("Description") }}{{ lang.t("Default") }}
                      {{ parameter.name }} - {% if parameter.annotation %} - {% with expression = parameter.annotation %} - {% include "expression.html" with context %} - {% endwith %} - {% endif %} - -
                      - {{ parameter.description|convert_markdown(heading_level, html_id) }} -
                      -
                      - {% if parameter.default %} - {% with expression = parameter.default %} - {% include "expression.html" with context %} - {% endwith %} - {% else %} - {{ lang.t("required") }} - {% endif %} -
                      + + + + + + - {% endfor %} - -
                      {{ lang.t("Name") }}{{ lang.t("Type") }}{{ lang.t("Description") }}{{ lang.t("Default") }}
                      + +
                      {{ parameter.name }} + {% if parameter.annotation %} + {% with expression = parameter.annotation %} + {% include "expression.html" with context %} + {% endwith %} + {% endif %} + +
                      + {{ parameter.description|convert_markdown(heading_level, html_id) }} +
                      +
                      + {% if parameter.default %} + {% with expression = parameter.default %} + {% include "expression.html" with context %} + {% endwith %} + {% else %} + {{ lang.t("required") }} + {% endif %} +
                      {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                      {{ section.title or lang.t("Parameters:") }}

                      -
                        - {% for parameter in section.value %} -
                      • - {{ parameter.name }} - {% if parameter.annotation %} - {% with expression = parameter.annotation %} - ({% include "expression.html" with context %} - {%- if parameter.default %}, {{ lang.t("default:") }} - {% with expression = parameter.default %} - {% include "expression.html" with context %} - {% endwith %} - {% endif %}) - {% endwith %} - {% endif %} - – -
                        - {{ parameter.description|convert_markdown(heading_level, html_id) }} -
                        -
                      • - {% endfor %} -
                      +

                      {{ section.title or lang.t("Parameters:") }}

                      +
                        + {% for parameter in section.value %} +
                      • + {{ parameter.name }} + {% if parameter.annotation %} + {% with expression = parameter.annotation %} + ({% include "expression.html" with context %} + {%- if parameter.default %}, {{ lang.t("default:") }} + {% with expression = parameter.default %} + {% include "expression.html" with context %} + {% endwith %} + {% endif %}) + {% endwith %} + {% endif %} + – +
                        + {{ parameter.description|convert_markdown(heading_level, html_id) }} +
                        +
                      • + {% endfor %} +
                      {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} {% block spacy_style scoped %} - - - - - - - - - {% for parameter in section.value %} - - - +
                      {{ (section.title or lang.t("PARAMETER")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                      {{ parameter.name }} -
                      - {{ parameter.description|convert_markdown(heading_level, html_id) }} -
                      -

                      - {% if parameter.annotation %} - - {{ lang.t("TYPE:") }} - {% with expression = parameter.annotation %} - {% include "expression.html" with context %} - {% endwith %} - - {% endif %} - {% if parameter.default %} - - {{ lang.t("DEFAULT:") }} - {% with expression = parameter.default %} - {% include "expression.html" with context %} - {% endwith %} - - {% endif %} -

                      -
                      + + + + - {% endfor %} - -
                      {{ (section.title or lang.t("PARAMETER")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                      + +
                    {{ parameter.name }} +
                    + {{ parameter.description|convert_markdown(heading_level, html_id) }} +
                    +

                    + {% if parameter.annotation %} + + {{ lang.t("TYPE:") }} + {% with expression = parameter.annotation %} + {% include "expression.html" with context %} + {% endwith %} + + {% endif %} + {% if parameter.default %} + + {{ lang.t("DEFAULT:") }} + {% with expression = parameter.default %} + {% include "expression.html" with context %} + {% endwith %} + + {% endif %} +

                    +
                    {% endblock spacy_style %} {% endif %} diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html index 5e20b653..8240dc09 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/raises.html @@ -4,80 +4,80 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

                    {{ section.title or lang.t("Raises:") }}

                    - - - - - - - - - {% for raises in section.value %} - - - +

                    {{ section.title or lang.t("Raises:") }}

                    +
                    {{ lang.t("Type") }}{{ lang.t("Description") }}
                    - {% if raises.annotation %} - {% with expression = raises.annotation %} - {% include "expression.html" with context %} - {% endwith %} - {% endif %} - -
                    - {{ raises.description|convert_markdown(heading_level, html_id) }} -
                    -
                    + + + + - {% endfor %} - -
                    {{ lang.t("Type") }}{{ lang.t("Description") }}
                    + +
                    + {% if raises.annotation %} + {% with expression = raises.annotation %} + {% include "expression.html" with context %} + {% endwith %} + {% endif %} + +
                    + {{ raises.description|convert_markdown(heading_level, html_id) }} +
                    +
                    {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                    {{ lang.t(section.title) or lang.t("Raises:") }}

                    -
                      - {% for raises in section.value %} -
                    • - {% if raises.annotation %} - {% with expression = raises.annotation %} - {% include "expression.html" with context %} - {% endwith %} - – - {% endif %} -
                      - {{ raises.description|convert_markdown(heading_level, html_id) }} -
                      -
                    • - {% endfor %} -
                    +

                    {{ lang.t(section.title) or lang.t("Raises:") }}

                    +
                      + {% for raises in section.value %} +
                    • + {% if raises.annotation %} + {% with expression = raises.annotation %} + {% include "expression.html" with context %} + {% endwith %} + – + {% endif %} +
                      + {{ raises.description|convert_markdown(heading_level, html_id) }} +
                      +
                    • + {% endfor %} +
                    {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} {% block spacy_style scoped %} - - - - - - - - - {% for raises in section.value %} - - - +
                    {{ (section.title or lang.t("RAISES")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                    - - {% with expression = raises.annotation %} - {% include "expression.html" with context %} - {% endwith %} - - -
                    - {{ raises.description|convert_markdown(heading_level, html_id) }} -
                    -
                    + + + + - {% endfor %} - -
                    {{ (section.title or lang.t("RAISES")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                    + +
                  + + {% with expression = raises.annotation %} + {% include "expression.html" with context %} + {% endwith %} + + +
                  + {{ raises.description|convert_markdown(heading_level, html_id) }} +
                  +
                  {% endblock spacy_style %} {% endif %} \ No newline at end of file diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html index e03e8b8e..1eff98ae 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/receives.html @@ -4,100 +4,100 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} - {% set name_column = section.value|selectattr("name")|any %} -

                  {{ section.title or lang.t("Receives:") }}

                  - - - - {% if name_column %}{% endif %} - - - - - - {% for receives in section.value %} - - {% if name_column %}{% endif %} - - + {% set name_column = section.value|selectattr("name")|any %} +

                  {{ section.title or lang.t("Receives:") }}

                  +
                  {{ lang.t("Name") }}{{ lang.t("Type") }}{{ lang.t("Description") }}
                  {% if receives.name %}{{ receives.name }}{% endif %} - {% if receives.annotation %} - {% with expression = receives.annotation %} - {% include "expression.html" with context %} - {% endwith %} - {% endif %} - -
                  - {{ receives.description|convert_markdown(heading_level, html_id) }} -
                  -
                  + + + {% if name_column %}{% endif %} + + - {% endfor %} - -
                  {{ lang.t("Name") }}{{ lang.t("Type") }}{{ lang.t("Description") }}
                  + +
                  {% if receives.name %}{{ receives.name }}{% endif %} + {% if receives.annotation %} + {% with expression = receives.annotation %} + {% include "expression.html" with context %} + {% endwith %} + {% endif %} + +
                  + {{ receives.description|convert_markdown(heading_level, html_id) }} +
                  +
                  {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                  {{ section.title or lang.t("Receives:") }}

                  -
                    - {% for receives in section.value %} -
                  • - {% if receives.name %}{{ receives.name }}{% endif %} - {% if receives.annotation %} - {% with expression = receives.annotation %} - {% if receives.name %} ({% endif %} - {% include "expression.html" with context %} - {% if receives.name %}){% endif %} - {% endwith %} - {% endif %} - – -
                    - {{ receives.description|convert_markdown(heading_level, html_id) }} -
                    -
                  • - {% endfor %} -
                  +

                  {{ section.title or lang.t("Receives:") }}

                  +
                    + {% for receives in section.value %} +
                  • + {% if receives.name %}{{ receives.name }}{% endif %} + {% if receives.annotation %} + {% with expression = receives.annotation %} + {% if receives.name %} ({% endif %} + {% include "expression.html" with context %} + {% if receives.name %}){% endif %} + {% endwith %} + {% endif %} + – +
                    + {{ receives.description|convert_markdown(heading_level, html_id) }} +
                    +
                  • + {% endfor %} +
                  {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} {% block spacy_style scoped %} - - - - - - - - - {% for receives in section.value %} - - - + + + {% endfor %} + +
                  {{ (section.title or lang.t("RECEIVES")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                  - {% if receives.name %} - {{ receives.name }} - {% elif receives.annotation %} - - {% with expression = receives.annotation %} - {% include "expression.html" with context %} - {% endwith %} - - {% endif %} - -
                  - {{ receives.description|convert_markdown(heading_level, html_id) }} -
                  - {% if receives.name and receives.annotation %} -

                  + + + + + + + + + {% for receives in section.value %} + + - - {% endfor %} - -
                  {{ (section.title or lang.t("RECEIVES")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                  + {% if receives.name %} + {{ receives.name }} + {% elif receives.annotation %} - {{ lang.t("TYPE:") }} {% with expression = receives.annotation %} {% include "expression.html" with context %} {% endwith %} -

                  - {% endif %} -
                  + {% endif %} +

                  +
                  + {{ receives.description|convert_markdown(heading_level, html_id) }} +
                  + {% if receives.name and receives.annotation %} +

                  + + {{ lang.t("TYPE:") }} + {% with expression = receives.annotation %} + {% include "expression.html" with context %} + {% endwith %} + +

                  + {% endif %} +
                  {% endblock spacy_style %} {% endif %} \ No newline at end of file diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html index a7a7cb98..bf3bdb4b 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/returns.html @@ -4,100 +4,100 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} - {% set name_column = section.value|selectattr("name")|any %} -

                  {{ section.title or lang.t("Returns:") }}

                  - - - - {% if name_column %}{% endif %} - - - - - - {% for returns in section.value %} - - {% if name_column %}{% endif %} - - + {% set name_column = section.value|selectattr("name")|any %} +

                  {{ section.title or lang.t("Returns:") }}

                  +
                  {{ lang.t("Name") }}{{ lang.t("Type") }}{{ lang.t("Description") }}
                  {% if returns.name %}{{ returns.name }}{% endif %} - {% if returns.annotation %} - {% with expression = returns.annotation %} - {% include "expression.html" with context %} - {% endwith %} - {% endif %} - -
                  - {{ returns.description|convert_markdown(heading_level, html_id) }} -
                  -
                  + + + {% if name_column %}{% endif %} + + - {% endfor %} - -
                  {{ lang.t("Name") }}{{ lang.t("Type") }}{{ lang.t("Description") }}
                  + +
                {% if returns.name %}{{ returns.name }}{% endif %} + {% if returns.annotation %} + {% with expression = returns.annotation %} + {% include "expression.html" with context %} + {% endwith %} + {% endif %} + +
                + {{ returns.description|convert_markdown(heading_level, html_id) }} +
                +
                {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                {{ section.title or lang.t("Returns:") }}

                -
                  - {% for returns in section.value %} -
                • - {% if returns.name %}{{ returns.name }}{% endif %} - {% if returns.annotation %} - {% with expression = returns.annotation %} - {% if returns.name %} ({% endif %} - {% include "expression.html" with context %} - {% if returns.name %}){% endif %} - {% endwith %} - {% endif %} - – -
                  - {{ returns.description|convert_markdown(heading_level, html_id) }} -
                  -
                • - {% endfor %} -
                +

                {{ section.title or lang.t("Returns:") }}

                +
                  + {% for returns in section.value %} +
                • + {% if returns.name %}{{ returns.name }}{% endif %} + {% if returns.annotation %} + {% with expression = returns.annotation %} + {% if returns.name %} ({% endif %} + {% include "expression.html" with context %} + {% if returns.name %}){% endif %} + {% endwith %} + {% endif %} + – +
                  + {{ returns.description|convert_markdown(heading_level, html_id) }} +
                  +
                • + {% endfor %} +
                {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} {% block spacy_style scoped %} - - - - - - - - - {% for returns in section.value %} - - - + + + {% endfor %} + +
                {{ (section.title or lang.t("RETURNS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION").upper() }}
                - {% if returns.name %} - {{ returns.name }} - {% elif returns.annotation %} - - {% with expression = returns.annotation %} - {% include "expression.html" with context %} - {% endwith %} - - {% endif %} - -
                - {{ returns.description|convert_markdown(heading_level, html_id) }} -
                - {% if returns.name and returns.annotation %} -

                + + + + + + + + + {% for returns in section.value %} + + - - {% endfor %} - -
                {{ (section.title or lang.t("RETURNS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION").upper() }}
                + {% if returns.name %} + {{ returns.name }} + {% elif returns.annotation %} - {{ lang.t("TYPE:") }} {% with expression = returns.annotation %} {% include "expression.html" with context %} {% endwith %} -

                - {% endif %} -
                + {% endif %} +

                +
                + {{ returns.description|convert_markdown(heading_level, html_id) }} +
                + {% if returns.name and returns.annotation %} +

                + + {{ lang.t("TYPE:") }} + {% with expression = returns.annotation %} + {% include "expression.html" with context %} + {% endwith %} + +

                + {% endif %} +
                {% endblock spacy_style %} {% endif %} \ No newline at end of file diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html index a9bdae26..f7883a7a 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/warns.html @@ -4,80 +4,80 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} -

                {{ section.title or lang.t("Warns:") }}

                - - - - - - - - - {% for warns in section.value %} - - - +

                {{ section.title or lang.t("Warns:") }}

                +
                {{ lang.t("Type") }}{{ lang.t("Description") }}
                - {% if warns.annotation %} - {% with expression = warns.annotation %} - {% include "expression.html" with context %} - {% endwith %} - {% endif %} - -
                - {{ warns.description|convert_markdown(heading_level, html_id) }} -
                -
                + + + + - {% endfor %} - -
                {{ lang.t("Type") }}{{ lang.t("Description") }}
                + +
                + {% if warns.annotation %} + {% with expression = warns.annotation %} + {% include "expression.html" with context %} + {% endwith %} + {% endif %} + +
                + {{ warns.description|convert_markdown(heading_level, html_id) }} +
                +
                {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

                {{ section.title or lang.t("Warns:") }}

                -
                  - {% for warns in section.value %} -
                • - {% if warns.annotation %} - {% with expression = warns.annotation %} - {% include "expression.html" with context %} - {% endwith %} - – - {% endif %} -
                  - {{ warns.description|convert_markdown(heading_level, html_id) }} -
                  -
                • - {% endfor %} -
                +

                {{ section.title or lang.t("Warns:") }}

                +
                  + {% for warns in section.value %} +
                • + {% if warns.annotation %} + {% with expression = warns.annotation %} + {% include "expression.html" with context %} + {% endwith %} + – + {% endif %} +
                  + {{ warns.description|convert_markdown(heading_level, html_id) }} +
                  +
                • + {% endfor %} +
                {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} {% block spacy_style scoped %} - - - - - - - - - {% for warns in section.value %} - - - +
                {{ (section.title or lang.t("WARNS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                - - {% with expression = warns.annotation %} - {% include "expression.html" with context %} - {% endwith %} - - -
                - {{ warns.description|convert_markdown(heading_level, html_id) }} -
                -
                + + + + - {% endfor %} - -
                {{ (section.title or lang.t("WARNS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
                + +
              + + {% with expression = warns.annotation %} + {% include "expression.html" with context %} + {% endwith %} + + +
              + {{ warns.description|convert_markdown(heading_level, html_id) }} +
              +
              {% endblock spacy_style %} {% endif %} \ No newline at end of file diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html index 6c4cb0b0..2a4bb734 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/docstring/yields.html @@ -4,100 +4,100 @@ {% if config.docstring_section_style == "table" %} {% block table_style scoped %} - {% set name_column = section.value|selectattr("name")|any %} -

              {{ section.title or lang.t("Yields:") }}

              - - - - {% if name_column %}{% endif %} - - - - - - {% for yields in section.value %} - - {% if name_column %}{% endif %} - - + {% set name_column = section.value|selectattr("name")|any %} +

              {{ section.title or lang.t("Yields:") }}

              +
              {{ lang.t("Name") }}{{ lang.t("Type") }}{{ lang.t("Description") }}
              {% if yields.name %}{{ yields.name }}{% endif %} - {% if yields.annotation %} - {% with expression = yields.annotation %} - {% include "expression.html" with context %} - {% endwith %} - {% endif %} - -
              - {{ yields.description|convert_markdown(heading_level, html_id) }} -
              -
              + + + {% if name_column %}{% endif %} + + - {% endfor %} - -
              {{ lang.t("Name") }}{{ lang.t("Type") }}{{ lang.t("Description") }}
              + +
              {% if yields.name %}{{ yields.name }}{% endif %} + {% if yields.annotation %} + {% with expression = yields.annotation %} + {% include "expression.html" with context %} + {% endwith %} + {% endif %} + +
              + {{ yields.description|convert_markdown(heading_level, html_id) }} +
              +
              {% endblock table_style %} {% elif config.docstring_section_style == "list" %} {% block list_style scoped %} -

              {{ section.title or lang.t("Yields:") }}

              -
                - {% for yields in section.value %} -
              • - {% if yields.name %}{{ yields.name }}{% endif %} - {% if yields.annotation %} - {% with expression = yields.annotation %} - {% if yields.name %} ({% endif %} - {% include "expression.html" with context %} - {% if yields.name %}){% endif %} - {% endwith %} - {% endif %} - – -
                - {{ yields.description|convert_markdown(heading_level, html_id) }} -
                -
              • - {% endfor %} -
              +

              {{ section.title or lang.t("Yields:") }}

              +
                + {% for yields in section.value %} +
              • + {% if yields.name %}{{ yields.name }}{% endif %} + {% if yields.annotation %} + {% with expression = yields.annotation %} + {% if yields.name %} ({% endif %} + {% include "expression.html" with context %} + {% if yields.name %}){% endif %} + {% endwith %} + {% endif %} + – +
                + {{ yields.description|convert_markdown(heading_level, html_id) }} +
                +
              • + {% endfor %} +
              {% endblock list_style %} {% elif config.docstring_section_style == "spacy" %} {% block spacy_style scoped %} - - - - - - - - - {% for yields in section.value %} - - - + + + {% endfor %} + +
              {{ (section.title or lang.t("YIELDS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
              - {% if yields.name %} - {{ yields.name }} - {% elif yields.annotation %} - - {% with expression = yields.annotation %} - {% include "expression.html" with context %} - {% endwith %} - - {% endif %} - -
              - {{ yields.description|convert_markdown(heading_level, html_id) }} -
              - {% if yields.name and yields.annotation %} -

              + + + + + + + + + {% for yields in section.value %} + + - - {% endfor %} - -
              {{ (section.title or lang.t("YIELDS")).rstrip(":").upper() }}{{ lang.t("DESCRIPTION") }}
              + {% if yields.name %} + {{ yields.name }} + {% elif yields.annotation %} - {{ lang.t("TYPE:") }}: {% with expression = yields.annotation %} {% include "expression.html" with context %} {% endwith %} -

              - {% endif %} -
              + {% endif %} +

              +
              + {{ yields.description|convert_markdown(heading_level, html_id) }} +
              + {% if yields.name and yields.annotation %} +

              + + {{ lang.t("TYPE:") }}: + {% with expression = yields.annotation %} + {% include "expression.html" with context %} + {% endwith %} + +

              + {% endif %} +
              {% endblock spacy_style %} {% endif %} \ No newline at end of file diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/function.html b/src/mkdocstrings_handlers/python/templates/material/_base/function.html index 5c2ac29e..c4a20a12 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/function.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/function.html @@ -3,96 +3,96 @@ {% import "language.html" as lang with context %}
              -{% with obj = function, html_id = function.path %} + {% with obj = function, html_id = function.path %} - {% if root %} - {% set show_full_path = config.show_root_full_path %} - {% set root_members = True %} - {% elif root_members %} - {% set show_full_path = config.show_root_members_full_path or config.show_object_full_path %} - {% set root_members = False %} - {% else %} - {% set show_full_path = config.show_object_full_path %} - {% endif %} + {% if root %} + {% set show_full_path = config.show_root_full_path %} + {% set root_members = True %} + {% elif root_members %} + {% set show_full_path = config.show_root_members_full_path or config.show_object_full_path %} + {% set root_members = False %} + {% else %} + {% set show_full_path = config.show_object_full_path %} + {% endif %} + + {% set function_name = function.path if show_full_path else function.name %} + {% set symbol_type = "method" if function.parent.is_class else "function" %} + + {% if not root or config.show_root_heading %} + {% filter heading( + heading_level, + role="function", + id=html_id, + class="doc doc-heading", + toc_label=((' ')|safe if config.show_symbol_type_toc else '') + function.name, + ) %} - {% set function_name = function.path if show_full_path else function.name %} - {% set symbol_type = "method" if function.parent.is_class else "function" %} + {% block heading scoped %} + {% if config.show_symbol_type_heading %}{% endif %} + {% if config.separate_signature %} + {{ function_name }} + {% else %} + {%+ filter highlight(language="python", inline=True) %} + {{ function_name }}{% include "signature.html" with context %} + {% endfilter %} + {% endif %} + {% endblock heading %} - {% if not root or config.show_root_heading %} - {% filter heading( - heading_level, - role="function", - id=html_id, - class="doc doc-heading", - toc_label=((' ')|safe if config.show_symbol_type_toc else '') + function.name, - ) %} + {% block labels scoped %} + {% with labels = function.labels %} + {% include "labels.html" with context %} + {% endwith %} + {% endblock labels %} + + {% endfilter %} - {% block heading scoped %} - {% if config.show_symbol_type_heading %}{% endif %} + {% block signature scoped %} {% if config.separate_signature %} - {{ function_name }} - {% else %} - {%+ filter highlight(language="python", inline=True) %} - {{ function_name }}{% include "signature.html" with context %} + {% filter format_signature(function, config.line_length, crossrefs=config.signature_crossrefs) %} + {{ function.name }} {% endfilter %} {% endif %} - {% endblock heading %} + {% endblock signature %} - {% block labels scoped %} - {% with labels = function.labels %} - {% include "labels.html" with context %} - {% endwith %} - {% endblock labels %} + {% else %} - {% endfilter %} - - {% block signature scoped %} - {% if config.separate_signature %} - {% filter format_signature(function, config.line_length, crossrefs=config.signature_crossrefs) %} - {{ function.name }} + {% if config.show_root_toc_entry %} + {% filter heading( + heading_level, + role="function", + id=html_id, + toc_label=((' ')|safe if config.show_symbol_type_toc else '') + function.name, + hidden=True, + ) %} {% endfilter %} {% endif %} - {% endblock signature %} - - {% else %} - - {% if config.show_root_toc_entry %} - {% filter heading( - heading_level, - role="function", - id=html_id, - toc_label=((' ')|safe if config.show_symbol_type_toc else '') + function.name, - hidden=True, - ) %} - {% endfilter %} + {% set heading_level = heading_level - 1 %} {% endif %} - {% set heading_level = heading_level - 1 %} - {% endif %} -
              - {% block contents scoped %} - {% block docstring scoped %} - {% with docstring_sections = function.docstring.parsed %} - {% include "docstring.html" with context %} - {% endwith %} - {% endblock docstring %} +
              + {% block contents scoped %} + {% block docstring scoped %} + {% with docstring_sections = function.docstring.parsed %} + {% include "docstring.html" with context %} + {% endwith %} + {% endblock docstring %} - {% block source scoped %} - {% if config.show_source and function.source %} -
              - {{ lang.t("Source code in") }} - {%- if function.relative_filepath.is_absolute() -%} - {{ function.relative_package_filepath }} - {%- else -%} - {{ function.relative_filepath }} - {%- endif -%} - - {{ function.source|highlight(language="python", linestart=function.lineno, linenums=True) }} -
              - {% endif %} - {% endblock source %} - {% endblock contents %} -
              + {% block source scoped %} + {% if config.show_source and function.source %} +
              + {{ lang.t("Source code in") }} + {%- if function.relative_filepath.is_absolute() -%} + {{ function.relative_package_filepath }} + {%- else -%} + {{ function.relative_filepath }} + {%- endif -%} + + {{ function.source|highlight(language="python", linestart=function.lineno, linenums=True) }} +
              + {% endif %} + {% endblock source %} + {% endblock contents %} +
              -{% endwith %} + {% endwith %}
              diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/module.html b/src/mkdocstrings_handlers/python/templates/material/_base/module.html index 7d45e321..5c3080c6 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/module.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/module.html @@ -1,74 +1,74 @@ {{ log.debug("Rendering " + module.path) }}
              -{% with obj = module, html_id = module.path %} + {% with obj = module, html_id = module.path %} - {% if root %} - {% set show_full_path = config.show_root_full_path %} - {% set root_members = True %} - {% elif root_members %} - {% set show_full_path = config.show_root_members_full_path or config.show_object_full_path %} - {% set root_members = False %} - {% else %} - {% set show_full_path = config.show_object_full_path %} - {% endif %} - - {% set module_name = module.path if show_full_path else module.name %} - - {% if not root or config.show_root_heading %} - {% filter heading( - heading_level, - role="module", - id=html_id, - class="doc doc-heading", - toc_label=(' '|safe if config.show_symbol_type_toc else '') + module.name, - ) %} - - {% block heading scoped %} - {% if config.show_symbol_type_heading %}{% endif %} - {% if config.separate_signature %} - {{ module_name }} - {% else %} - {{ module_name }} - {% endif %} - {% endblock heading %} - - {% block labels scoped %} - {% with labels = module.labels %} - {% include "labels.html" with context %} - {% endwith %} - {% endblock labels %} + {% if root %} + {% set show_full_path = config.show_root_full_path %} + {% set root_members = True %} + {% elif root_members %} + {% set show_full_path = config.show_root_members_full_path or config.show_object_full_path %} + {% set root_members = False %} + {% else %} + {% set show_full_path = config.show_object_full_path %} + {% endif %} - {% endfilter %} + {% set module_name = module.path if show_full_path else module.name %} - {% else %} - {% if config.show_root_toc_entry %} - {% filter heading(heading_level, + {% if not root or config.show_root_heading %} + {% filter heading( + heading_level, role="module", id=html_id, + class="doc doc-heading", toc_label=(' '|safe if config.show_symbol_type_toc else '') + module.name, - hidden=True, - ) %} + ) %} + + {% block heading scoped %} + {% if config.show_symbol_type_heading %}{% endif %} + {% if config.separate_signature %} + {{ module_name }} + {% else %} + {{ module_name }} + {% endif %} + {% endblock heading %} + + {% block labels scoped %} + {% with labels = module.labels %} + {% include "labels.html" with context %} + {% endwith %} + {% endblock labels %} + {% endfilter %} + + {% else %} + {% if config.show_root_toc_entry %} + {% filter heading(heading_level, + role="module", + id=html_id, + toc_label=(' '|safe if config.show_symbol_type_toc else '') + module.name, + hidden=True, + ) %} + {% endfilter %} + {% endif %} + {% set heading_level = heading_level - 1 %} {% endif %} - {% set heading_level = heading_level - 1 %} - {% endif %} -
              - {% block contents scoped %} - {% block docstring scoped %} - {% with docstring_sections = module.docstring.parsed %} - {% include "docstring.html" with context %} - {% endwith %} - {% endblock docstring %} +
              + {% block contents scoped %} + {% block docstring scoped %} + {% with docstring_sections = module.docstring.parsed %} + {% include "docstring.html" with context %} + {% endwith %} + {% endblock docstring %} - {% block children scoped %} - {% set root = False %} - {% set heading_level = heading_level + 1 %} - {% include "children.html" with context %} - {% endblock children %} - {% endblock contents %} -
              + {% block children scoped %} + {% set root = False %} + {% set heading_level = heading_level + 1 %} + {% include "children.html" with context %} + {% endblock children %} + {% endblock contents %} +
              -{% endwith %} + {% endwith %}
              diff --git a/src/mkdocstrings_handlers/python/templates/material/_base/signature.html b/src/mkdocstrings_handlers/python/templates/material/_base/signature.html index 74563385..6d3d2973 100644 --- a/src/mkdocstrings_handlers/python/templates/material/_base/signature.html +++ b/src/mkdocstrings_handlers/python/templates/material/_base/signature.html @@ -3,62 +3,61 @@ {%- with -%} {%- set ns = namespace( - has_pos_only=False, - render_pos_only_separator=True, - render_kw_only_separator=True, - annotation="", - equal="=", - ) - -%} + has_pos_only=False, + render_pos_only_separator=True, + render_kw_only_separator=True, + annotation="", + equal="=", + ) -%} ( - {%- for parameter in function.parameters -%} - {%- if parameter.name not in ("self", "cls") or loop.index0 > 0 or not (function.parent and function.parent.is_class) -%} + {%- for parameter in function.parameters -%} + {%- if parameter.name not in ("self", "cls") or loop.index0 > 0 or not (function.parent and function.parent.is_class) -%} - {%- if parameter.kind.value == "positional-only" -%} - {%- set ns.has_pos_only = True -%} - {%- else -%} - {%- if ns.has_pos_only and ns.render_pos_only_separator -%} - {%- set ns.render_pos_only_separator = False %}/, {% endif -%} - {%- if parameter.kind.value == "keyword-only" -%} - {%- if ns.render_kw_only_separator -%} - {%- set ns.render_kw_only_separator = False %}*, {% endif -%} - {%- endif -%} + {%- if parameter.kind.value == "positional-only" -%} + {%- set ns.has_pos_only = True -%} + {%- else -%} + {%- if ns.has_pos_only and ns.render_pos_only_separator -%} + {%- set ns.render_pos_only_separator = False %}/, {% endif -%} + {%- if parameter.kind.value == "keyword-only" -%} + {%- if ns.render_kw_only_separator -%} + {%- set ns.render_kw_only_separator = False %}*, {% endif -%} {%- endif -%} + {%- endif -%} - {%- if config.show_signature_annotations and parameter.annotation is not none -%} - {%- set ns.equal = " = " -%} - {%- if config.separate_signature and config.signature_crossrefs -%} - {%- with expression = parameter.annotation -%} - {%- set ns.annotation -%}: {% include "expression.html" with context %}{%- endset -%} - {%- endwith -%} - {%- else -%} - {%- set ns.annotation = ": " + parameter.annotation|safe -%} - {%- endif -%} + {%- if config.show_signature_annotations and parameter.annotation is not none -%} + {%- set ns.equal = " = " -%} + {%- if config.separate_signature and config.signature_crossrefs -%} + {%- with expression = parameter.annotation -%} + {%- set ns.annotation -%}: {% include "expression.html" with context %}{%- endset -%} + {%- endwith -%} {%- else -%} - {%- set ns.equal = "=" -%} - {%- set ns.annotation = "" -%} + {%- set ns.annotation = ": " + parameter.annotation|safe -%} {%- endif -%} + {%- else -%} + {%- set ns.equal = "=" -%} + {%- set ns.annotation = "" -%} + {%- endif -%} - {%- if parameter.default is not none and parameter.kind.value != "variadic positional" and parameter.kind.value != "variadic keyword" -%} - {%- set default = ns.equal + parameter.default|safe -%} - {%- endif -%} + {%- if parameter.default is not none and parameter.kind.value != "variadic positional" and parameter.kind.value != "variadic keyword" -%} + {%- set default = ns.equal + parameter.default|safe -%} + {%- endif -%} - {%- if parameter.kind.value == "variadic positional" -%} - {%- set ns.render_kw_only_separator = False -%} - {%- endif -%} + {%- if parameter.kind.value == "variadic positional" -%} + {%- set ns.render_kw_only_separator = False -%} + {%- endif -%} - {% if parameter.kind.value == "variadic positional" %}*{% elif parameter.kind.value == "variadic keyword" %}**{% endif -%} - {{ parameter.name }}{{ ns.annotation }}{{ default }} - {%- if not loop.last %}, {% endif -%} + {% if parameter.kind.value == "variadic positional" %}*{% elif parameter.kind.value == "variadic keyword" %}**{% endif -%} + {{ parameter.name }}{{ ns.annotation }}{{ default }} + {%- if not loop.last %}, {% endif -%} - {%- endif -%} - {%- endfor -%} + {%- endif -%} + {%- endfor -%} ) {%- if config.show_signature_annotations and function.annotation and not (config.merge_init_into_class and function.name == "__init__" ) - %} -> {% if config.separate_signature and config.signature_crossrefs -%} + %} -> {% if config.separate_signature and config.signature_crossrefs -%} {%- with expression = function.annotation %}{% include "expression.html" with context %}{%- endwith -%} {%- else -%} {{ function.annotation|safe }} diff --git a/src/mkdocstrings_handlers/python/templates/readthedocs/docstring/returns.html b/src/mkdocstrings_handlers/python/templates/readthedocs/docstring/returns.html index c2300318..355eedcc 100644 --- a/src/mkdocstrings_handlers/python/templates/readthedocs/docstring/returns.html +++ b/src/mkdocstrings_handlers/python/templates/readthedocs/docstring/returns.html @@ -9,27 +9,27 @@
            {{ section.title or lang.t("Returns:") }} -
              - {% for returns in section.value %} -
            • - {% if returns.name %}{{ returns.name }}{% endif %} - {% if returns.annotation %} - {% with expression = returns.annotation %} - {% if returns.name %}({% endif %} - {% include "expression.html" with context %} - {% if returns.name %}){% endif %} - {% endwith %} - {% endif %} - – -
              - {{ returns.description|convert_markdown(heading_level, html_id) }} -
              -
            • - {% endfor %} -
            -
            {{ section.title or lang.t("Returns:") }} +
              + {% for returns in section.value %} +
            • + {% if returns.name %}{{ returns.name }}{% endif %} + {% if returns.annotation %} + {% with expression = returns.annotation %} + {% if returns.name %}({% endif %} + {% include "expression.html" with context %} + {% if returns.name %}){% endif %} + {% endwith %} + {% endif %} + – +
              + {{ returns.description|convert_markdown(heading_level, html_id) }} +
              +
            • + {% endfor %} +
            +
            From 2bc156bd6f231ae13066651f4490d1e9c2ce3ca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Sun, 28 Apr 2024 14:40:11 +0200 Subject: [PATCH 039/243] build: Depend on mkdocstrings 0.25 which adds support for parameter `once` when logging messages --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c02461f1..398d5d3a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - "mkdocstrings>=0.24.2", + "mkdocstrings>=0.25", "griffe>=0.44", ] From 26e3d66f5334a5aaff75bda030afe6dfa1cc94d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Sun, 28 Apr 2024 14:42:09 +0200 Subject: [PATCH 040/243] refactor: Log a warning when base templates are overridden Issue-151: https://github.com/mkdocstrings/python/issues/151 --- src/mkdocstrings_handlers/python/handler.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/mkdocstrings_handlers/python/handler.py b/src/mkdocstrings_handlers/python/handler.py index fa8e384c..03111005 100644 --- a/src/mkdocstrings_handlers/python/handler.py +++ b/src/mkdocstrings_handlers/python/handler.py @@ -9,6 +9,7 @@ import sys from collections import ChainMap from contextlib import suppress +from pathlib import Path from typing import TYPE_CHECKING, Any, BinaryIO, ClassVar, Iterator, Mapping, Sequence from griffe.collections import LinesCollection, ModulesCollection @@ -208,6 +209,17 @@ def __init__( **kwargs: Same thing, but with keyword arguments. """ super().__init__(*args, **kwargs) + + # Warn if user overrides base templates. + if custom_templates := kwargs.get("custom_templates", ()): + config_dir = Path(config_file_path or "./mkdocs.yml").parent + for theme_dir in config_dir.joinpath(custom_templates, "python").iterdir(): + if theme_dir.joinpath("_base").is_dir(): + logger.warning( + f"Overriding base template '{theme_dir.name}/_base/