Fix footnotes on website

pull/25260/head
Shane Smiskol 3 years ago
parent f79a21d29e
commit c2a11fa34e
  1. 41
      selfdrive/car/docs.py
  2. 13
      selfdrive/car/docs_definitions.py

@ -2,29 +2,24 @@
import argparse import argparse
import jinja2 import jinja2
import os import os
from enum import Enum
from natsort import natsorted from natsort import natsorted
from typing import Dict, List from typing import List
from common.basedir import BASEDIR from common.basedir import BASEDIR
from selfdrive.car.docs_definitions import STAR_DESCRIPTIONS, StarColumns, TierColumns, CarInfo, Column, Star from selfdrive.car.docs_definitions import STAR_DESCRIPTIONS, StarColumns, TierColumns, CarInfo, Column, Star, get_all_footnotes
from selfdrive.car.car_helpers import interfaces, get_interface_attr from selfdrive.car.car_helpers import interfaces, get_interface_attr
from selfdrive.car.hyundai.radar_interface import RADAR_START_ADDR as HKG_RADAR_START_ADDR from selfdrive.car.hyundai.radar_interface import RADAR_START_ADDR as HKG_RADAR_START_ADDR
def get_all_footnotes() -> Dict[Enum, int]:
all_footnotes = []
for footnotes in get_interface_attr("Footnote", ignore_none=True).values():
all_footnotes += footnotes
return {fn: idx + 1 for idx, fn in enumerate(all_footnotes)}
ALL_FOOTNOTES: Dict[Enum, int] = get_all_footnotes()
CARS_MD_OUT = os.path.join(BASEDIR, "docs", "CARS.md") CARS_MD_OUT = os.path.join(BASEDIR, "docs", "CARS.md")
CARS_MD_TEMPLATE = os.path.join(BASEDIR, "selfdrive", "car", "CARS_template.md") CARS_MD_TEMPLATE = os.path.join(BASEDIR, "selfdrive", "car", "CARS_template.md")
def get_all_car_info() -> List[CarInfo]: def get_all_car_info(hide_cols=None) -> List[CarInfo]:
if hide_cols is None:
hide_cols = []
all_footnotes = get_all_footnotes(hide_cols)
all_car_info: List[CarInfo] = [] all_car_info: List[CarInfo] = []
for model, car_info in get_interface_attr("CAR_INFO", combine_brands=True).items(): for model, car_info in get_interface_attr("CAR_INFO", combine_brands=True).items():
# Hyundai exception: those with radar have openpilot longitudinal # Hyundai exception: those with radar have openpilot longitudinal
@ -39,28 +34,21 @@ def get_all_car_info() -> List[CarInfo]:
car_info = (car_info,) car_info = (car_info,)
for _car_info in car_info: for _car_info in car_info:
all_car_info.append(_car_info.init(CP, ALL_FOOTNOTES)) all_car_info.append(_car_info.init(CP, hide_cols, all_footnotes))
# Sort cars by make and model + year # Sort cars by make and model + year
sorted_cars: List[CarInfo] = natsorted(all_car_info, key=lambda car: car.name.lower()) sorted_cars: List[CarInfo] = natsorted(all_car_info, key=lambda car: car.name.lower())
return sorted_cars return sorted_cars
def generate_cars_md(all_car_info: List[CarInfo], template_fn: str, only_tier_cols: bool) -> str: def generate_cars_md(all_car_info: List[CarInfo], template_fn: str, hide_cols: bool) -> str:
with open(template_fn, "r") as f: with open(template_fn, "r") as f:
template = jinja2.Template(f.read(), trim_blocks=True, lstrip_blocks=True) template = jinja2.Template(f.read(), trim_blocks=True, lstrip_blocks=True)
cols = list(Column) cols = [c for c in Column if c not in hide_cols]
if only_tier_cols: footnotes = [fn.value.text for fn in get_all_footnotes(hide_cols)]
hide_cols = set(StarColumns) - set(TierColumns) cars_md: str = template.render(all_car_info=all_car_info, footnotes=footnotes,
cols = [c for c in cols if c not in hide_cols] Star=Star, Column=cols, star_descriptions=STAR_DESCRIPTIONS)
for car in all_car_info:
for c in hide_cols:
del car.row[c]
footnotes = [fn.value.text for fn in ALL_FOOTNOTES if fn.value.column in cols]
cars_md: str = template.render(all_car_info=all_car_info,
footnotes=footnotes, Star=Star, Column=cols, star_descriptions=STAR_DESCRIPTIONS)
return cars_md return cars_md
@ -73,6 +61,7 @@ if __name__ == "__main__":
parser.add_argument("--out", default=CARS_MD_OUT, help="Override default generated filename") parser.add_argument("--out", default=CARS_MD_OUT, help="Override default generated filename")
args = parser.parse_args() args = parser.parse_args()
hide_cols = set(StarColumns) - set(TierColumns) if args.tier_columns else []
with open(args.out, 'w') as f: with open(args.out, 'w') as f:
f.write(generate_cars_md(get_all_car_info(), args.template, args.tier_columns)) f.write(generate_cars_md(get_all_car_info(hide_cols), args.template, hide_cols))
print(f"Generated and written to {args.out}") print(f"Generated and written to {args.out}")

@ -5,6 +5,7 @@ from collections import namedtuple
from dataclasses import dataclass from dataclasses import dataclass
from enum import Enum from enum import Enum
from typing import Dict, List, Optional, Tuple, Union, no_type_check from typing import Dict, List, Optional, Tuple, Union, no_type_check
from selfdrive.car.interfaces import get_interface_attr
GOOD_TORQUE_THRESHOLD = 1.0 # m/s^2 GOOD_TORQUE_THRESHOLD = 1.0 # m/s^2
MODEL_YEARS_RE = r"(?<= )((\d{4}-\d{2})|(\d{4}))(,|$)" MODEL_YEARS_RE = r"(?<= )((\d{4}-\d{2})|(\d{4}))(,|$)"
@ -46,6 +47,13 @@ def get_footnote(footnotes: Optional[List[Enum]], column: Column) -> Optional[En
return None return None
def get_all_footnotes(hide_cols) -> Dict[Enum, int]:
all_footnotes = []
for footnotes in get_interface_attr("Footnote", ignore_none=True).values():
all_footnotes.extend([fn for fn in footnotes if fn not in hide_cols])
return {fn: idx + 1 for idx, fn in enumerate(all_footnotes)}
def split_name(name: str) -> Tuple[str, str, str]: def split_name(name: str) -> Tuple[str, str, str]:
make, model = name.split(" ", 1) make, model = name.split(" ", 1)
years = "" years = ""
@ -66,7 +74,7 @@ class CarInfo:
min_enable_speed: Optional[float] = None min_enable_speed: Optional[float] = None
harness: Optional[Enum] = None harness: Optional[Enum] = None
def init(self, CP: car.CarParams, all_footnotes: Dict[Enum, int]): def init(self, CP: car.CarParams, hide_cols, all_footnotes: Dict[Enum, int]):
# TODO: set all the min steer speeds in carParams and remove this # TODO: set all the min steer speeds in carParams and remove this
min_steer_speed = CP.minSteerSpeed min_steer_speed = CP.minSteerSpeed
if self.min_steer_speed is not None: if self.min_steer_speed is not None:
@ -110,6 +118,9 @@ class CarInfo:
if footnote is not None and footnote.value.star is not None: if footnote is not None and footnote.value.star is not None:
self.row[column] = footnote.value.star self.row[column] = footnote.value.star
# Remove hidden columns
self.row = {c: self.row[c] for c in self.row if c not in hide_cols}
# openpilot ACC star doesn't count for tiers # openpilot ACC star doesn't count for tiers
full_stars = [s for col, s in self.row.items() if col in TierColumns].count(Star.FULL) full_stars = [s for col, s in self.row.items() if col in TierColumns].count(Star.FULL)
if full_stars == len(TierColumns): if full_stars == len(TierColumns):

Loading…
Cancel
Save