#!/usr/bin/env python3 import argparse import pickle from selfdrive.car.docs import get_all_car_info from selfdrive.car.docs_definitions import Column STAR_ICON = '' COLUMNS = "|" + "|".join([column.value for column in Column]) + "|" COLUMN_HEADER = "|---|---|---|:---:|:---:|:---:|:---:|:---:|" ARROW_SYMBOL = "➡️" def load_base_car_info(path): with open(path, "rb") as f: return pickle.load(f) def get_star_diff(base_car, new_car): return [column for column, value in base_car.row.items() if value != new_car.row[column]] def format_row(builder): return "|" + "|".join(builder) + "|" def print_car_info_diff(path): base_car_info = {f"{i.make} {i.model}": i for i in load_base_car_info(path)} new_car_info = {f"{i.make} {i.model}": i for i in get_all_car_info()} tier_changes = [] star_changes = [] removals = [] additions = [] # Changes (tier + stars) for base_car_model, base_car in base_car_info.items(): if base_car_model not in new_car_info: continue new_car = new_car_info[base_car_model] # Tier changes if base_car.tier != new_car.tier: tier_changes.append(f"- Tier for {base_car.make} {base_car.model} changed! ({base_car.tier.name.title()} {ARROW_SYMBOL} {new_car.tier.name.title()})") # Star changes diff = get_star_diff(base_car, new_car) if not len(diff): continue row_builder = [] for column in list(Column): if column not in diff: row_builder.append(new_car.get_column(column, STAR_ICON, "{}")) else: row_builder.append(base_car.get_column(column, STAR_ICON, "{}") + ARROW_SYMBOL + new_car.get_column(column, STAR_ICON, "{}")) star_changes.append(format_row(row_builder)) # Removals for model in set(base_car_info) - set(new_car_info): car_info = base_car_info[model] removals.append(format_row([car_info.get_column(column, STAR_ICON, "{}") for column in Column])) # Additions for model in set(new_car_info) - set(base_car_info): car_info = new_car_info[model] additions.append(format_row([car_info.get_column(column, STAR_ICON, "{}") for column in Column])) # Print diff if len(star_changes) or len(tier_changes) or len(removals) or len(additions): markdown_builder = ["### ⚠️ This PR makes changes to [CARS.md](../blob/master/docs/CARS.md) ⚠️"] for title, category in (("## 🏅 Tier Changes", tier_changes), ("## 🔀 Star Changes", star_changes), ("## ❌ Removed", removals), ("## ➕ Added", additions)): if len(category): markdown_builder.append(title) if "Tier" not in title: markdown_builder.append(COLUMNS) markdown_builder.append(COLUMN_HEADER) markdown_builder.extend(category) print("\n".join(markdown_builder)) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--path", required=True) args = parser.parse_args() print_car_info_diff(args.path)