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.
83 lines
2.2 KiB
83 lines
2.2 KiB
![]()
7 months ago
|
"""
|
||
|
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()
|