Spaces:
Sleeping
Sleeping
import os | |
import random | |
import uuid | |
from datetime import datetime | |
import gradio as gr | |
from data_loader import load_data | |
HF_TOKEN = os.environ.get('HF_TOKEN') | |
HF_DATASET = os.environ.get('HF_DATASET') | |
data, models = load_data() | |
n_samples = len(data) | |
n_models = len(models) | |
saver = gr.HuggingFaceDatasetSaver(HF_TOKEN, HF_DATASET, private=True) | |
def convert_diff_to_unified(diff): | |
result = "\n".join( | |
[ | |
f'--- {modified_file["old_path"]}\n' | |
f'+++ {modified_file["new_path"]}\n' | |
f'{modified_file["diff"]}' | |
for modified_file in diff | |
] | |
) | |
return result | |
def get_diff2html_view(raw_diff): | |
html = f""" | |
<div style='width:100%; height:1400px; overflow:auto; position: relative'> | |
<div id='diff-raw' hidden>{raw_diff}</div> | |
<div class="d2h-view-wrapper"> | |
<div id='diff-view'></div> | |
</div> | |
</div> | |
""" | |
return html | |
def get_github_link_md(repo, hash): | |
return f'[See the commit on Github](https://github.com/{repo}/commit/{hash})' | |
def update_commit_view(sample_ind): | |
if sample_ind >= n_samples: | |
return None | |
record = data[sample_ind] | |
diff_view = get_diff2html_view(convert_diff_to_unified(record['mods'])) | |
repo_val = record['repo'] | |
hash_val = record['hash'] | |
github_link_md = get_github_link_md(repo_val, hash_val) | |
diff_loaded_timestamp = datetime.now().isoformat() | |
models_shuffled = models[:] | |
random.shuffle(models_shuffled) | |
commit_messages = tuple(record[model] for model in models_shuffled) | |
return (github_link_md, diff_view, repo_val, hash_val, diff_loaded_timestamp) + commit_messages + tuple( | |
models_shuffled) | |
def next_sample(current_sample_ind, shuffled_idx): | |
if current_sample_ind == n_samples: | |
return None | |
current_sample_ind += 1 | |
updated_view = update_commit_view(shuffled_idx[current_sample_ind]) | |
return (current_sample_ind,) + updated_view | |
with open("head.html") as head_file: | |
head_html = head_file.read() | |
with gr.Blocks(theme=gr.themes.Soft(), head=head_html, css="style_overrides.css") as application: | |
repo_val = gr.Textbox(interactive=False, label='repo', visible=False) | |
hash_val = gr.Textbox(interactive=False, label='hash', visible=False) | |
shuffled_idx_val = gr.JSON(visible=False) | |
with gr.Row(): | |
current_sample_sld = gr.Slider(minimum=0, maximum=n_samples, step=1, | |
value=0, | |
interactive=False, | |
label='sample_ind', | |
info=f"Samples labeled/skipped (out of {n_samples})", | |
show_label=False, | |
container=False, | |
scale=5) | |
with gr.Column(scale=1): | |
skip_btn = gr.Button("Skip the current sample") | |
with gr.Row(): | |
with gr.Column(scale=2): | |
github_link = gr.Markdown() | |
diff_view = gr.HTML() | |
with gr.Column(scale=1): | |
commit_msg = [] | |
is_correct = [] | |
has_what = [] | |
has_why = [] | |
is_not_verbose = [] | |
has_headline = [] | |
easy_to_read = [] | |
overall_rating = [] | |
comments = [] | |
model_name = [] | |
for model_ind in range(n_models): | |
with gr.Tab(f"Message #{model_ind + 1}"): | |
commit_msg.append(gr.TextArea(label="Commit message (can be scrollable)", | |
interactive=False, | |
)) | |
gr.Markdown("## Please, rate your level of agreement with each statement\n" | |
"\n" | |
"*1 - strongly disagree, 2 - disagree, 3 - agree, 4 - strongly agree*") | |
is_correct.append(gr.Slider( | |
info='The information provided in the commit message is consistent with the code changes.', | |
label=f'is_correct_{model_ind}', | |
show_label=False, | |
minimum=1, | |
step=1, | |
interactive=True, | |
maximum=4)) | |
has_what.append(gr.Slider( | |
info='The commit message answers the question of WHAT changes have been made.', | |
label=f'has_what_{model_ind}', | |
show_label=False, | |
minimum=1, | |
step=1, | |
interactive=True, | |
maximum=4)) | |
has_why.append(gr.Slider( | |
info='The commit message answers the question of WHY these changes have been made.', | |
label=f'has_why_{model_ind}', | |
show_label=False, | |
minimum=1, | |
step=1, | |
interactive=True, | |
maximum=4)) | |
is_not_verbose.append(gr.Slider( | |
info='The commit message can be substantially shortened without loss of important information.', | |
label=f'is_not_verbose_{model_ind}', | |
show_label=False, | |
minimum=1, | |
step=1, | |
interactive=True, | |
maximum=4)) | |
has_headline.append(gr.Slider( | |
info='The commit message includes a short headline that provides a good overview of the ' | |
'changes.', | |
label=f'has_headline_{model_ind}', | |
show_label=False, | |
minimum=1, | |
step=1, | |
interactive=True, | |
maximum=4)) | |
easy_to_read.append(gr.Slider( | |
info='The commit message is easy to read and to understand.', | |
label=f'easy_to_read_{model_ind}', | |
show_label=False, | |
minimum=1, | |
step=1, | |
interactive=True, | |
maximum=4)) | |
overall_rating.append(gr.Slider( | |
info='Please, describe your overall impression of the commit message (1 - very bad, 5 - very ' | |
'good)', | |
label=f'overall_rating_{model_ind}', | |
show_label=False, | |
minimum=1, | |
step=1, | |
interactive=True, | |
maximum=5)) | |
comments.append(gr.Textbox( | |
info='Additional comments on the commit message', | |
label=f'comments_{model_ind}', | |
show_label=False, | |
interactive=True)) | |
model_name.append(gr.Textbox(interactive=False, label=f'model_{model_ind}', visible=False)) | |
submit_btn = gr.Button("Submit and continue") | |
session_val = gr.Textbox(info='Session', interactive=False, container=True, show_label=False, | |
label='session') | |
with gr.Row(visible=False): | |
sample_loaded_timestamp = gr.Textbox(info="Sample loaded", label='loaded_ts', interactive=False, | |
container=True, show_label=False) | |
sample_submitted_timestamp = gr.Textbox(info="Current time", | |
interactive=False, container=True, show_label=False, | |
value=lambda: datetime.now().isoformat(), every=1.0, | |
label='submitted_ts') | |
commit_view = [ | |
github_link, | |
diff_view, | |
repo_val, | |
hash_val, | |
sample_loaded_timestamp, | |
*commit_msg, | |
*model_name | |
] | |
feedback_form = [ | |
session_val, | |
repo_val, | |
hash_val, | |
sample_loaded_timestamp, | |
sample_submitted_timestamp, | |
*is_correct, | |
*has_what, | |
*has_why, | |
*is_not_verbose, | |
*has_headline, | |
*easy_to_read, | |
*overall_rating, | |
*comments, | |
*model_name | |
] | |
saver.setup([current_sample_sld] + feedback_form, "feedback") | |
skip_btn.click(next_sample, inputs=[current_sample_sld, shuffled_idx_val], | |
outputs=[current_sample_sld] + commit_view) | |
def submit(current_sample, shuffled_idx, *args): | |
saver.flag((current_sample,) + args) | |
return next_sample(current_sample, shuffled_idx) | |
submit_btn.click(submit, inputs=[current_sample_sld, shuffled_idx_val] + feedback_form, | |
outputs=[current_sample_sld] + commit_view) | |
def init_session(current_sample): | |
session = str(uuid.uuid4()) | |
shuffled_idx = list(range(n_samples)) | |
random.shuffle(shuffled_idx) | |
return (session, shuffled_idx) + update_commit_view(shuffled_idx[current_sample]) | |
application.load(init_session, | |
inputs=[current_sample_sld], | |
outputs=[session_val, shuffled_idx_val] + commit_view, ) | |
application.launch() | |