import requests import csv # config OWNER = "numpy" # Chosen repo (this is just an example) REPO = "numpy" # ----------------------- API_URL = f"https://api.github.com/repos/{OWNER}/{REPO}/contributors?per_page=100" def get_contributors(): contributors = [] page = 1 while True: response = requests.get(f"{API_URL}&page={page}") if response.status_code != 200: print("Error fetching data:", response.status_code) break data = response.json() if not data: break for c in data: contributors.append({"login": c["login"], "commits": c["contributions"]}) page += 1 return contributors def calculate_bus_factor(contributors): sorted_contribs = sorted(contributors, key=lambda x: x["commits"], reverse=True) total_commits = sum(c["commits"] for c in sorted_contribs) running_total = 0 bus_factor = 0 for c in sorted_contribs: running_total += c["commits"] bus_factor += 1 if running_total >= total_commits * 0.5: break return bus_factor, sorted_contribs def save_contributors_csv(contributors_sorted): with open("contributors.csv", "w", newline="") as f: writer = csv.DictWriter(f, fieldnames=["login", "commits"]) writer.writeheader() writer.writerows(contributors_sorted) print("Saved contributors.csv") def main(): contributors = get_contributors() if not contributors: print("No contributors found or error fetching data.") return bus_factor, sorted_contribs = calculate_bus_factor(contributors) print(f"Estimated Bus Factor for {OWNER}/{REPO}: {bus_factor}") save_contributors_csv(sorted_contribs) if __name__ == "__main__": main()