Skip to content

Commit

Permalink
[docs] Add rule short code to mkdocs tags (#14040)
Browse files Browse the repository at this point in the history
## Summary

<!-- What's the purpose of the change? What does it do, and why? -->
This PR updates the metadata in the YAML frontmatter of the mkdocs
documentation to include the rule short code as a tag, so it can be
easily searched.
Ref: #13684

## Test Plan

<!-- How was it tested? -->
This has been tested locally using the documentation provided
[here](https://docs.astral.sh/ruff/contributing/#mkdocs) for generating
docs.

This generates docs that now have the tags section:
```markdown
---
description: Checks for abstract classes without abstract methods.
tags:
- B024
---

# abstract-base-class-without-abstract-method (B024)
... trimmed
```

I've also verified that this gives the ability to get straight to the
page via search when serving mkdocs locally.

---------

Co-authored-by: Charlie Marsh <[email protected]>
  • Loading branch information
hreeder and charliermarsh authored Nov 1, 2024
1 parent 8574751 commit 099f077
Showing 1 changed file with 44 additions and 7 deletions.
51 changes: 44 additions & 7 deletions scripts/generate_mkdocs.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,31 +104,68 @@ def clean_file_content(content: str, title: str) -> str:
return f"# {title}\n\n" + content


def add_meta_description(rule_doc: Path) -> str:
"""Add a meta description to the rule doc."""
# Read the rule doc into lines
def generate_rule_metadata(rule_doc: Path) -> None:
"""Add frontmatter metadata containing a rule's code and description.
For example:
```yaml
---
description: Checks for abstract classes without abstract methods.
tags:
- B024
---
```
"""
# Read the rule doc into lines.
with rule_doc.open("r", encoding="utf-8") as f:
lines = f.readlines()

# Get the description from the rule doc lines
# Get the description and rule code from the rule doc lines.
rule_code = None
description = None
what_it_does_found = False
for line in lines:
if line == "\n":
continue

# Assume that the only first-level heading is the rule title and code.
#
# For example: given `# abstract-base-class-without-abstract-method (B024)`,
# extract the rule code (`B024`).
if line.startswith("# "):
rule_code = line.strip().rsplit("(", 1)
rule_code = rule_code[1][:-1]

if line.startswith("## What it does"):
what_it_does_found = True
continue # Skip the '## What it does' line

if what_it_does_found:
if what_it_does_found and not description:
description = line.removesuffix("\n")

if all([rule_code, description]):
break
else:
if not rule_code:
raise ValueError("Missing title line")

if not what_it_does_found:
raise ValueError(f"Missing '## What it does' in {rule_doc}")

with rule_doc.open("w", encoding="utf-8") as f:
f.writelines("\n".join(["---", f"description: {description}", "---", "", ""]))
f.writelines(
"\n".join(
[
"---",
f"description: {description}",
"tags:",
f"- {rule_code}",
"---",
"",
"",
]
)
)
f.writelines(lines)


Expand Down Expand Up @@ -198,7 +235,7 @@ def main() -> None:
# support.
mdformat.file(rule_doc, extensions=["mkdocs", "admon", "no-escape-text"])

add_meta_description(rule_doc)
generate_rule_metadata(rule_doc)

with Path("mkdocs.template.yml").open(encoding="utf8") as fp:
config = yaml.safe_load(fp)
Expand Down

0 comments on commit 099f077

Please sign in to comment.