import csv # Define supported macOS versions, skipping 17–25 os_versions = ( [f"10.{i}" for i in range(4, 16)] + # 10.4 to 10.15 [str(i) for i in range(11, 16)] + # 11 to 15 ["26"] # macOS 15 Sequoia (versioned as 26) ) # Map of macOS versions to initial release years version_years = { "10.4": "2005", "10.5": "2007", "10.6": "2009", "10.7": "2011", "10.8": "2012", "10.9": "2013", "10.10": "2014", "10.11": "2015", "10.12": "2016", "10.13": "2017", "10.14": "2018", "10.15": "2019", "11": "2020", "12": "2021", "13": "2022", "14": "2023", "15": "2024", "26": "2025", } def parse_version(v): parts = v.strip().split(".") major = int(parts[0]) minor = int(parts[1]) if len(parts) > 1 else 0 return (major, minor) # Read the CSV data file with open("mac_support_matrix.csv", newline="") as csvfile: reader = csv.DictReader(csvfile, delimiter=',') data = list(reader) # Sort by last OS first (oldest unsupported first), then by first OS data.sort(key=lambda row: ( parse_version(row['Last OS']), parse_version(row['First OS']) )) # Build the markdown table header_row = "| Model | " + " | ".join(os_versions) + " |" separator_row = "|" + "---|" * (len(os_versions) + 1) year_row = "| Year | " + " | ".join(version_years.get(v, "") for v in os_versions) + " |" print(header_row) print(separator_row) print(year_row) for row in data: model = row['Model'] first_os = row['First OS'].strip() last_os = row['Last OS'].strip() try: start_index = os_versions.index(first_os) except ValueError: print(f"Warning: First OS {first_os} not in version list") continue try: end_index = os_versions.index(last_os) except ValueError: print(f"Warning: Last OS {last_os} not in version list") continue row_checks = [ "✅" if start_index <= i <= end_index else "" for i in range(len(os_versions)) ] print(f"| {model:25} | " + " | ".join(row_checks) + " |")