blob: da4987ff3cb65ecf1c25870ecada66eee70b8380 [file]
#!/usr/bin/env python3
import argparse
import difflib
import re
import sys
from pathlib import Path
def parse_arguments() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Print supported distributions")
parser.add_argument("-d", "--docs-dir",
type=Path,
default=Path(__file__).resolve().parent.parent,
help="Path to documentation/ directory in yocto-docs")
return parser.parse_args()
glossaries = (
'ref-manual/variables.rst',
'ref-manual/terms.rst',
)
def main():
args = parse_arguments()
in_glossary = False
# Pattern to match:
# :term:`A <ABIEXTENSION>` :term:`B` :term:`C <CACHE>`
glossary_re = re.compile(r":term:`(?P<letter>[A-Z]{1})( <(?P<varname>[A-Z_]+)>)?`")
entry_re = re.compile(r"^ :term:`(?P<entry>.+)`\s*$")
exit_code = 0
for rst in glossaries:
glossary = {}
rst_path = Path(args.docs_dir) / rst
with open(rst_path, "r") as f:
for line in f.readlines():
if "check_glossary_begin" in line:
in_glossary = True
continue
if in_glossary:
for m in re.finditer(glossary_re, line.strip()):
letter = m.group("letter")
varname = m.group("varname")
if varname is None:
varname = letter
glossary[letter] = varname
if "check_glossary_end" in line:
in_glossary = False
break
entries = []
with open(rst_path, "r") as f:
for line in f.readlines():
m = re.match(entry_re, line)
if m:
entries.append(m.group("entry"))
# We lower here because underscore (_) come before lowercase letters
# (the natural way) but after uppercase letters (which is not natural)
sorted_entries = sorted(entries, key=lambda t: t.lower())
diffs = list(difflib.unified_diff(entries,
sorted_entries,
fromfile="original_list",
tofile="sorted_list"))
if diffs:
print(f"WARNING: {rst}: entries are not properly sorted:")
print('\n'.join(diffs))
exit_code = 1
for letter in glossary:
try:
index = entries.index(glossary[letter])
except ValueError:
print(f"WARNING: {rst}: variable "
f"{glossary[letter]} in glossary does not exist")
exit_code = 1
if index > 0 and entries[index - 1].startswith(letter[0]):
print(f"WARNING: {rst}: The variable {glossary[letter]} shouldn't be in "
"the glossary.")
exit_code = 1
sys.exit(exit_code)
if __name__ == "__main__":
main()