| Index: infra/tools/antibody/antibody.py
|
| diff --git a/infra/tools/antibody/antibody.py b/infra/tools/antibody/antibody.py
|
| index c011d498e27648b2cc4bdd2f22e23294d1a97d77..6ef2d0c304cf6e21a4d4b4b5230933eef6c7ec35 100644
|
| --- a/infra/tools/antibody/antibody.py
|
| +++ b/infra/tools/antibody/antibody.py
|
| @@ -12,10 +12,13 @@ import shutil
|
| import time
|
|
|
| import infra.tools.antibody.cloudsql_connect as csql
|
| +from infra.tools.antibody import compute_stats
|
|
|
| THIS_DIR = os.path.dirname(os.path.realpath(__file__))
|
| ANTIBODY_UI_MAIN_NAME = 'index.html'
|
| TBR_BY_USER_NAME = 'tbr_by_user.html'
|
| +STATS_NAME = 'stats.html'
|
| +LEADERBOARD_NAME = 'leaderboard.html'
|
|
|
| # https://storage.googleapis.com/chromium-infra-docs/infra/html/logging.html
|
| LOGGER = logging.getLogger(__name__)
|
| @@ -51,32 +54,22 @@ def setup_antibody_db(cc, filename): # pragma: no cover
|
| def generate_antibody_ui(suspicious_commits_data, gitiles_prefix, ui_dirpath):
|
| template_loader = jinja2.FileSystemLoader(os.path.join(THIS_DIR, 'templates'))
|
| template_env = jinja2.Environment(loader=template_loader)
|
| - index_template = template_env.get_template('antibody_ui_all.jinja')
|
| - tbr_by_user_template = template_env.get_template('tbr_by_user.jinja')
|
| -
|
| - template_vars = {
|
| + template_vars_all = {
|
| 'title' : 'Potentially Suspicious Commits',
|
| 'description' : 'List of commits with a TBR but no lgtm',
|
| 'antibody_main_link' : ANTIBODY_UI_MAIN_NAME,
|
| 'tbr_by_user_link' : TBR_BY_USER_NAME,
|
| + 'stats_link' : STATS_NAME,
|
| + 'leaderboard_link' : LEADERBOARD_NAME,
|
| 'generation_time' : time.strftime("%a, %d %b %Y %H:%M:%S",
|
| time.gmtime()),
|
| - 'page_header_text' : "All Potentially Suspicious Commits",
|
| - 'to_be_reviewed' : "To be reviewed by user",
|
| - 'num_tbr_no_lgtm': len(suspicious_commits_data),
|
| - 'num_no_review_url': 42,
|
| - 'blank_TBR': 3,
|
| - 'table_headers' : ['git_hash', 'rietveld_url',
|
| - 'request_timestamp'],
|
| + 'page_header_text' : "Antibody",
|
| + 'to_be_reviewed' : "TBR by user",
|
| + 'stats' : 'Stats',
|
| + 'leaderboard' : 'Leaderboard',
|
| 'suspicious_commits' : suspicious_commits_data,
|
| 'gitiles_prefix' : gitiles_prefix,
|
| }
|
| - with open(os.path.join(ui_dirpath, ANTIBODY_UI_MAIN_NAME), 'wb') as f:
|
| - f.write(index_template.render(template_vars))
|
| -
|
| - with open(os.path.join(ui_dirpath, TBR_BY_USER_NAME), 'wb') as f:
|
| - f.write(tbr_by_user_template.render(template_vars))
|
| -
|
| try: # pragma: no cover
|
| if (ui_dirpath != THIS_DIR): # pragma: no cover
|
| shutil.rmtree(os.path.join(ui_dirpath, 'static'))
|
| @@ -89,15 +82,78 @@ def generate_antibody_ui(suspicious_commits_data, gitiles_prefix, ui_dirpath):
|
| shutil.copytree(os.path.join(THIS_DIR, 'static'),
|
| os.path.join(ui_dirpath, 'static'))
|
|
|
| + file_generators = [generate_homepage, generate_tbr_page, generate_stats_page,
|
| + generate_leaderboard_page]
|
| + for item in file_generators:
|
| + item(template_env, template_vars_all, ui_dirpath)
|
| +
|
| +
|
| +def generate_homepage(template_env, template_vars_all, ui_dirpath):
|
| + index_template = template_env.get_template('antibody_ui_all.jinja')
|
| + with open(os.path.join(ui_dirpath, 'all_monthly_stats.json')) as f:
|
| + data = json.load(f)
|
| + stats_7_day = data['7_days']
|
| + template_vars = {
|
| + 'num_tbr_no_lgtm': stats_7_day['tbr_no_lgtm'],
|
| + 'num_no_review_url': stats_7_day['no_review_url'],
|
| + 'blank_TBR': stats_7_day['blank_tbr'],
|
| + 'table_headers' : ['Git Commit Subject', 'Review URL',
|
| + 'Request Timestamp']}
|
| + template_vars.update(template_vars_all)
|
| + with open(os.path.join(ui_dirpath, ANTIBODY_UI_MAIN_NAME), 'wb') as f:
|
| + f.write(index_template.render(template_vars))
|
| +
|
| +
|
| +def generate_tbr_page(template_env, template_vars_all, ui_dirpath):
|
| + tbr_by_user_template = template_env.get_template('tbr_by_user.jinja')
|
| + template_vars = {
|
| + }
|
| + template_vars.update(template_vars_all)
|
| + with open(os.path.join(ui_dirpath, TBR_BY_USER_NAME), 'wb') as f:
|
| + f.write(tbr_by_user_template.render(template_vars))
|
| +
|
| +
|
| +def generate_stats_page(template_env, template_vars_all, ui_dirpath):
|
| + stats_template = template_env.get_template('stats.jinja')
|
| + with open(os.path.join(ui_dirpath, 'all_monthly_stats.json')) as f:
|
| + data = json.load(f)
|
| + template_vars = {}
|
| + stats_all = [
|
| + [data['7_days'], 'stats_7_day'],
|
| + [data['30_days'], 'stats_30_day'],
|
| + [data['all_time'], 'stats_all_time'],
|
| + ]
|
| + categories_keys = [
|
| + ['"Suspicious":Total Commits', 'suspicious_to_total_ratio'],
|
| + ['Total Commits', 'total_commits'],
|
| + ['TBR without LGTM', 'tbr_no_lgtm'],
|
| + ['Without review url', 'no_review_url'],
|
| + ['Blank TBR', 'blank_tbr'],
|
| + ]
|
| + for stats, key in stats_all:
|
| + template_vars[key] = [[x[0], stats[x[1]]] for x in categories_keys]
|
| + template_vars.update(template_vars_all)
|
| + with open(os.path.join(ui_dirpath, STATS_NAME), 'wb') as f:
|
| + f.write(stats_template.render(template_vars))
|
| +
|
| +
|
| +def generate_leaderboard_page(template_env, template_vars_all, ui_dirpath):
|
| + leaderboard_template = template_env.get_template('leaderboard.jinja')
|
| + template_vars = {
|
| + }
|
| + template_vars.update(template_vars_all)
|
| + with open(os.path.join(ui_dirpath, LEADERBOARD_NAME), 'wb') as f:
|
| + f.write(leaderboard_template.render(template_vars))
|
| +
|
|
|
| def get_tbr_by_user(tbr_no_lgtm, gitiles_prefix, output_dirpath):
|
| - # tbr_no_lgtm: review_url, request_timestamp, hash, people_email_address
|
| + # tbr_no_lgtm: review_url, request_timestamp, subject, people_email_address,
|
| + # hash
|
| tbr_blame_dict = {}
|
| - for url, timestamp, git_hash, reviewer in tbr_no_lgtm:
|
| - reviewer = reviewer.strip().split('@')
|
| - timestamp = timestamp.strftime("%Y-%m-%d %H:%M:%S")
|
| - tbr_blame_dict.setdefault(reviewer[0], []).append(
|
| - [git_hash, url, timestamp])
|
| + for url, timestamp, subject, reviewer, git_hash in tbr_no_lgtm:
|
| + # timestamp = timestamp.strftime("%Y-%m-%d %H:%M:%S")
|
| + tbr_blame_dict.setdefault(reviewer, []).append(
|
| + [subject, url, timestamp, git_hash])
|
| tbr_data = {
|
| "by_user" : tbr_blame_dict,
|
| "gitiles_prefix" : gitiles_prefix,
|
| @@ -106,10 +162,19 @@ def get_tbr_by_user(tbr_no_lgtm, gitiles_prefix, output_dirpath):
|
| f.write(json.dumps(tbr_data))
|
|
|
|
|
| +def generate_stats_files(cc, output_dirpath): # pragma: no cover
|
| + compute_stats.all_time_leaderboard(cc,
|
| + os.path.join(output_dirpath, 'all_time_leaderboard.json'))
|
| + compute_stats.past_month_leaderboard(cc,
|
| + os.path.join(output_dirpath, 'past_month_leaderboard.json'))
|
| + compute_stats.all_monthly_stats(cc,
|
| + os.path.join(output_dirpath, 'all_monthly_stats.json'))
|
| +
|
| +
|
| def get_gitiles_prefix(git_checkout_path):
|
| with open(os.path.join(git_checkout_path, 'codereview.settings'), 'r') as f:
|
| lines = f.readlines()
|
| - for line in lines:
|
| + for line in lines:
|
| if line.startswith('VIEW_VC:'):
|
| return line[len('VIEW_VC:'):].strip()
|
| # TODO (ksho): implement more sophisticated solution if codereview.settings
|
|
|