1
0
Fork 0

Add Python PEP 484/526 type hints to doc/tools/doc_status.py

Also removes the first divider string which cleans up the extraneous dashes at the top of the page.
This commit is contained in:
Andy Maloney 2022-07-29 13:27:48 -04:00
parent 7199314eb3
commit 5036dfb0b6
1 changed files with 35 additions and 34 deletions

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
import fnmatch import fnmatch
import os import os
@ -7,6 +7,7 @@ import re
import math import math
import platform import platform
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
from typing import Dict, List, Set
################################################################################ ################################################################################
# Config # # Config #
@ -103,13 +104,13 @@ overall_progress_description_weight = 10
################################################################################ ################################################################################
def validate_tag(elem, tag): def validate_tag(elem: ET.Element, tag: str) -> None:
if elem.tag != tag: if elem.tag != tag:
print('Tag mismatch, expected "' + tag + '", got ' + elem.tag) print('Tag mismatch, expected "' + tag + '", got ' + elem.tag)
sys.exit(255) sys.exit(255)
def color(color, string): def color(color: str, string: str) -> str:
if flags["c"] and terminal_supports_color(): if flags["c"] and terminal_supports_color():
color_format = "" color_format = ""
for code in colors[color]: for code in colors[color]:
@ -122,7 +123,7 @@ def color(color, string):
ansi_escape = re.compile(r"\x1b[^m]*m") ansi_escape = re.compile(r"\x1b[^m]*m")
def nonescape_len(s): def nonescape_len(s: str) -> int:
return len(ansi_escape.sub("", s)) return len(ansi_escape.sub("", s))
@ -142,14 +143,14 @@ def terminal_supports_color():
class ClassStatusProgress: class ClassStatusProgress:
def __init__(self, described=0, total=0): def __init__(self, described: int = 0, total: int = 0):
self.described = described self.described: int = described
self.total = total self.total: int = total
def __add__(self, other): def __add__(self, other: "ClassStatusProgress"):
return ClassStatusProgress(self.described + other.described, self.total + other.total) return ClassStatusProgress(self.described + other.described, self.total + other.total)
def increment(self, described): def increment(self, described: bool):
if described: if described:
self.described += 1 self.described += 1
self.total += 1 self.total += 1
@ -163,7 +164,7 @@ class ClassStatusProgress:
else: else:
return self.to_colored_string() return self.to_colored_string()
def to_colored_string(self, format="{has}/{total}", pad_format="{pad_described}{s}{pad_total}"): def to_colored_string(self, format: str = "{has}/{total}", pad_format: str = "{pad_described}{s}{pad_total}"):
ratio = float(self.described) / float(self.total) if self.total != 0 else 1 ratio = float(self.described) / float(self.total) if self.total != 0 else 1
percent = int(round(100 * ratio)) percent = int(round(100 * ratio))
s = format.format(has=str(self.described), total=str(self.total), percent=str(percent)) s = format.format(has=str(self.described), total=str(self.total), percent=str(percent))
@ -183,11 +184,11 @@ class ClassStatusProgress:
class ClassStatus: class ClassStatus:
def __init__(self, name=""): def __init__(self, name: str = ""):
self.name = name self.name: str = name
self.has_brief_description = True self.has_brief_description: bool = True
self.has_description = True self.has_description: bool = True
self.progresses = { self.progresses: Dict[str, ClassStatusProgress] = {
"methods": ClassStatusProgress(), "methods": ClassStatusProgress(),
"constants": ClassStatusProgress(), "constants": ClassStatusProgress(),
"members": ClassStatusProgress(), "members": ClassStatusProgress(),
@ -197,7 +198,7 @@ class ClassStatus:
"constructors": ClassStatusProgress(), "constructors": ClassStatusProgress(),
} }
def __add__(self, other): def __add__(self, other: "ClassStatus"):
new_status = ClassStatus() new_status = ClassStatus()
new_status.name = self.name new_status.name = self.name
new_status.has_brief_description = self.has_brief_description and other.has_brief_description new_status.has_brief_description = self.has_brief_description and other.has_brief_description
@ -222,8 +223,8 @@ class ClassStatus:
sum += self.progresses[k].total sum += self.progresses[k].total
return sum < 1 return sum < 1
def make_output(self): def make_output(self) -> Dict[str, str]:
output = {} output: Dict[str, str] = {}
output["name"] = color("name", self.name) output["name"] = color("name", self.name)
ok_string = color("part_good", "OK") ok_string = color("part_good", "OK")
@ -263,22 +264,24 @@ class ClassStatus:
return output return output
@staticmethod @staticmethod
def generate_for_class(c): def generate_for_class(c: ET.Element):
status = ClassStatus() status = ClassStatus()
status.name = c.attrib["name"] status.name = c.attrib["name"]
for tag in list(c): for tag in list(c):
len_tag_text = 0 if (tag.text is None) else len(tag.text.strip())
if tag.tag == "brief_description": if tag.tag == "brief_description":
status.has_brief_description = len(tag.text.strip()) > 0 status.has_brief_description = len_tag_text > 0
elif tag.tag == "description": elif tag.tag == "description":
status.has_description = len(tag.text.strip()) > 0 status.has_description = len_tag_text > 0
elif tag.tag in ["methods", "signals", "operators", "constructors"]: elif tag.tag in ["methods", "signals", "operators", "constructors"]:
for sub_tag in list(tag): for sub_tag in list(tag):
descr = sub_tag.find("description") descr = sub_tag.find("description")
status.progresses[tag.tag].increment(len(descr.text.strip()) > 0) increment = (descr is not None) and (descr.text is not None) and len(descr.text.strip()) > 0
status.progresses[tag.tag].increment(increment)
elif tag.tag in ["constants", "members", "theme_items"]: elif tag.tag in ["constants", "members", "theme_items"]:
for sub_tag in list(tag): for sub_tag in list(tag):
if not sub_tag.text is None: if not sub_tag.text is None:
@ -297,9 +300,9 @@ class ClassStatus:
# Arguments # # Arguments #
################################################################################ ################################################################################
input_file_list = [] input_file_list: List[str] = []
input_class_list = [] input_class_list: List[str] = []
merged_file = "" merged_file: str = ""
for arg in sys.argv[1:]: for arg in sys.argv[1:]:
try: try:
@ -373,8 +376,8 @@ if len(input_file_list) < 1 or flags["h"]:
# Parse class list # # Parse class list #
################################################################################ ################################################################################
class_names = [] class_names: List[str] = []
classes = {} classes: Dict[str, ET.Element] = {}
for file in input_file_list: for file in input_file_list:
tree = ET.parse(file) tree = ET.parse(file)
@ -396,10 +399,10 @@ class_names.sort()
if len(input_class_list) < 1: if len(input_class_list) < 1:
input_class_list = ["*"] input_class_list = ["*"]
filtered_classes = set() filtered_classes_set: Set[str] = set()
for pattern in input_class_list: for pattern in input_class_list:
filtered_classes |= set(fnmatch.filter(class_names, pattern)) filtered_classes_set |= set(fnmatch.filter(class_names, pattern))
filtered_classes = list(filtered_classes) filtered_classes = list(filtered_classes_set)
filtered_classes.sort() filtered_classes.sort()
################################################################################ ################################################################################
@ -413,7 +416,6 @@ table_column_chars = "|"
total_status = ClassStatus("Total") total_status = ClassStatus("Total")
for cn in filtered_classes: for cn in filtered_classes:
c = classes[cn] c = classes[cn]
validate_tag(c, "class") validate_tag(c, "class")
status = ClassStatus.generate_for_class(c) status = ClassStatus.generate_for_class(c)
@ -427,7 +429,7 @@ for cn in filtered_classes:
continue continue
out = status.make_output() out = status.make_output()
row = [] row: List[str] = []
for column in table_columns: for column in table_columns:
if column in out: if column in out:
row.append(out[column]) row.append(out[column])
@ -464,7 +466,7 @@ if flags["a"]:
# without having to scroll back to the top. # without having to scroll back to the top.
table.append(table_column_names) table.append(table_column_names)
table_column_sizes = [] table_column_sizes: List[int] = []
for row in table: for row in table:
for cell_i, cell in enumerate(row): for cell_i, cell in enumerate(row):
if cell_i >= len(table_column_sizes): if cell_i >= len(table_column_sizes):
@ -477,7 +479,6 @@ for cell_i in range(len(table[0])):
divider_string += ( divider_string += (
table_row_chars[1] + table_row_chars[2] * (table_column_sizes[cell_i]) + table_row_chars[1] + table_row_chars[0] table_row_chars[1] + table_row_chars[2] * (table_column_sizes[cell_i]) + table_row_chars[1] + table_row_chars[0]
) )
print(divider_string)
for row_i, row in enumerate(table): for row_i, row in enumerate(table):
row_string = table_column_chars row_string = table_column_chars