You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
trezor-firmware/tools/check_docs_summary.py

83 lines
2.2 KiB

"""
This script lists names of markdown files (.md extenstion) present in docs/ directory
which are not referenced in SUMMARY.md file which serves as a firmware docu mainpage.
Running the script:
- `python tools/check_docs_summary.py` from trezor-firmware root directory.
"""
import re
import sys
from pathlib import Path
from typing import Generator, Iterable, Set
DOCS_DIR = "docs/"
SUMMARY_FILENAME = "SUMMARY.md"
RE_MARKDOWN_LINK = r"\[.*?\]\((.+.md)\)"
def gen_pat_in_file(
filepath: str, pat: re.Pattern, grp_idx: int
) -> Generator[str, None, None]:
with open(filepath, "r", encoding="utf-8") as f:
for line in f.readlines():
match = re.search(pat, line)
if match:
yield match.group(grp_idx)
def gen_convert_to_str(inputs: Iterable[Path]) -> Generator[str, None, None]:
for i in inputs:
yield str(i)
def gen_ltrim_pat(inputs: Iterable[str], pat: str) -> Generator[str, None, None]:
for i in inputs:
if i.startswith(pat):
yield i[len(pat) :]
def gen_skip(inputs: Iterable[str], what: str) -> Generator[str, None, None]:
for i in inputs:
if i != what:
yield i
def difference(g1: Iterable[str], g2: Iterable[str]) -> Generator[str, None, None]:
set_g2: Set[str] = set(g2)
for item in g1:
if item not in set_g2:
yield item
def print_result(filenames: Iterable[str]) -> None:
if not filenames:
print("OK")
sys.exit(0)
else:
print(
f"ERROR: these files exist in {DOCS_DIR} but are not linked in {DOCS_DIR + SUMMARY_FILENAME}"
)
for f in filenames:
print(f"\t- {f}")
sys.exit(1)
def main():
re_md_link = re.compile(RE_MARKDOWN_LINK)
md_files_in_docs_dir = Path(DOCS_DIR).rglob("*.md")
md_files_in_docs_dir = gen_convert_to_str(md_files_in_docs_dir)
md_files_in_docs_dir = gen_ltrim_pat(md_files_in_docs_dir, DOCS_DIR)
md_files_in_docs_dir = gen_skip(md_files_in_docs_dir, SUMMARY_FILENAME)
md_files_linked_in_summary = gen_pat_in_file(
DOCS_DIR + SUMMARY_FILENAME, re_md_link, 1
)
diff = difference(md_files_in_docs_dir, md_files_linked_in_summary)
print_result(list(diff))
if __name__ == "__main__":
main()