Source code for repo_stats.runner

import argparse
import json
from collections import Counter
from pathlib import Path

import repo_stats
from repo_stats.citation_metrics import ADSCitations
from repo_stats.git_metrics import GitMetrics
from repo_stats.plot import author_plot, author_time_plot, citation_plot, issue_pr_time_plot, open_issue_pr_plot
from repo_stats.user_stats import StatsImage

repo_stats_path = Path(repo_stats.__file__).parent


[docs] def parse_parameters(*args): """ Read the repository and citation targets and the analysis parameters from a .json parameter file. Parameters ---------- *args : list of str Simulates the command line arguments Returns ------- params : dict Parameters used by the analysis """ default_param_file = f"{repo_stats_path}/parameters.json" parser = argparse.ArgumentParser() parser.add_argument( "-a", "--ads_token", type=str, required=True, ) parser.add_argument( "-g", "--git_token", type=str, required=True, ) parser.add_argument( "-p", "--parameter_file", type=str, default=default_param_file, required=False, ) parser.add_argument( "-c", "--cache_dir", type=str, required=False, ) args = parser.parse_args(*args) with Path(args.parameter_file).open() as f: params = json.load(f) params["ads_token"], params["git_token"], params["cache_dir"] = ( args.ads_token, args.git_token, args.cache_dir, ) if params["cache_dir"] is None: params["cache_dir"] = f"{repo_stats_path}/../cache" Path(params["cache_dir"]).mkdir(parents=True, exist_ok=True) if params["template_image"] is None: params["template_image"] = [ f"{repo_stats_path}/../dashboard_template/user_stats_template_transparent.png", f"{repo_stats_path}/../dashboard_template/user_stats_template_dark.png", f"{repo_stats_path}/../dashboard_template/user_stats_template_light.png", ] params["template_image"] = list(params["template_image"]) params["font"] = f"{repo_stats_path}/../dashboard_template/Jost[wght].ttf" return params
[docs] def main(*args): """ Run the citation and repository statistics analysis. Parameters ---------- *args : list of str Simulates the command line arguments """ base_params = parse_parameters(*args) total_commit_stats = {} for repo in base_params["repos"]: repo_name = repo["repo_name"] cache_dir = f"{base_params['cache_dir']}/{repo_name}" Path(cache_dir).mkdir(parents=True, exist_ok=True) print(f"\nAnalyzing {repo_name}") if "bibs" in repo: cites = ADSCitations(base_params["ads_token"], cache_dir) cite_stats = cites.aggregate_citations(repo["bibs"], base_params["ads_metrics"]) citation_plot(cite_stats, repo_name, cache_dir, repo["bib_names"]) gits = GitMetrics( base_params["git_token"], base_params["repo_owner"], repo_name, cache_dir, ) commits = gits.get_commits() commit_stats = gits.process_commits(commits, base_params["age_recent_commit"]) total_commit_stats[repo_name] = commit_stats["commits_for_each_author"] issues = gits.get_issues_prs("issues") prs = gits.get_issues_prs("pullRequests") if "labels" not in repo: repo["labels"] = [] issue_pr_stats = gits.process_issues_prs( [issues, prs], ["issues", "pullRequests"], repo["labels"], base_params["age_recent_issue_pr"], ) all_stats = {**cite_stats, **commit_stats, **issue_pr_stats} print("\nUpdating dashboard image with stats") for ii in base_params["template_image"]: userstatsimage = StatsImage(ii, base_params["font"]) userstatsimage.update_image(all_stats, repo_name, cache_dir) author_plot( commit_stats, base_params["repo_owner"], repo_name, cache_dir, ) author_time_plot( commit_stats, base_params["repo_owner"], repo_name, cache_dir, base_params["window_avg"], ) if "issues" in issue_pr_stats: open_issue_pr_plot(issue_pr_stats, repo_name, cache_dir) issue_pr_time_plot( issue_pr_stats, base_params["repo_owner"], repo_name, cache_dir, base_params["window_avg"], ) total_commit_stats["commits_for_each_author"] = Counter() for counts in total_commit_stats.values(): total_commit_stats["commits_for_each_author"] += counts author_plot( total_commit_stats, base_params["repo_owner"], "Every Repository", Path(cache_dir).parent, commit_number=50, )
if __name__ == "__main__": main()