|
import datetime |
|
import os |
|
import shutil |
|
|
|
import gradio as gr |
|
import requests |
|
|
|
from utils import build_issue_dict |
|
from utils import build_embeddings |
|
from utils.defaults import OWNER, REPO |
|
from utils.fetch import get_issues |
|
from utils.find_similar_issues import get_similar_issues |
|
from utils.update_stored_issues import update_issues |
|
|
|
|
|
def get_query_issue_information(issue_no, token): |
|
headers = { |
|
"Accept": "application/vnd.github+json", |
|
"Authorization": f"{token}", |
|
"X-GitHub-Api-Version": "2022-11-28", |
|
"User-Agent": "amyeroberts", |
|
} |
|
request = requests.get( |
|
f"https://api.github.com/repos/{OWNER}/{REPO}/issues/{issue_no}", |
|
headers=headers, |
|
) |
|
if request.status_code != 200: |
|
raise ValueError(f"Request failed with status code {request.status_code} and message {request.text}") |
|
|
|
return request.json() |
|
|
|
|
|
def run_find_similar_issues(token, n_issues, issue_no, query, issue_types): |
|
if issue_no == "": |
|
issue_no = None |
|
if query == "": |
|
query = None |
|
|
|
if len(issue_types) == 0: |
|
raise ValueError("At least one issue type must be selected") |
|
|
|
similar_issues = [] |
|
similar_pulls = [] |
|
if "Issue" in issue_types: |
|
similar_issues = get_similar_issues(issue_no=issue_no, query=query, token=token, top_k=n_issues, issue_type="issue") |
|
if "Pull Request" in issue_types: |
|
similar_pulls = get_similar_issues(issue_no=issue_no, query=query, token=token, top_k=n_issues, issue_type="pull") |
|
|
|
issues_html = [f"<a href='{issue['html_url']}' target='_blank'>#{issue['number']} - {issue['title']}</a>" for issue in similar_issues] |
|
issues_html = "<br>".join(issues_html) |
|
|
|
pulls_html = [f"<a href='{issue['html_url']}' target='_blank'>#{issue['number']} - {issue['title']}</a>" for issue in similar_pulls] |
|
pulls_html = "<br>".join(pulls_html) |
|
|
|
final = "" |
|
if len(issues_html) > 0: |
|
final += f"<h2>Issues</h2>{issues_html}" |
|
if len(pulls_html) > 0: |
|
final += f"<h2>Pull Requests</h2>{pulls_html}" |
|
|
|
|
|
return final |
|
|
|
|
|
def update(token): |
|
|
|
if os.path.exists("issues.json"): |
|
date_time = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") |
|
shutil.copy("issues.json", f"{date_time}_issues.json") |
|
|
|
|
|
get_issues(overwrite=False, update=True, output_filename="issues.json", token=token) |
|
|
|
update_issues(token=token) |
|
|
|
build_issue_dict.build_json_file("issues.json", "issues_dict.json") |
|
|
|
build_embeddings.embed_issues( |
|
input_filename="issues_dict.json", |
|
issue_type="issue", |
|
model_id="all-mpnet-base-v2", |
|
update=True |
|
) |
|
build_embeddings.embed_issues( |
|
input_filename="issues_dict.json", |
|
issue_type="pull", |
|
model_id="all-mpnet-base-v2", |
|
update=True |
|
) |
|
|
|
|
|
with gr.Blocks(title="Github Bot") as demo: |
|
with gr.Tab("Find similar issues"): |
|
with gr.Row(): |
|
gr.Markdown("## Query settings") |
|
with gr.Row(): |
|
gr.Markdown("Configure the settings for the query. You can either search for similar issues to a given issue or search for issues based on a query.") |
|
with gr.Row(): |
|
with gr.Column(): |
|
gr.Markdown("Find similar issues to a given issue or query") |
|
issue_no = gr.Textbox(label="Github Issue", placeholder="Github issue you want to find similar issues to") |
|
query = gr.Textbox(label="Query", placeholder="Search for issues") |
|
with gr.Column(): |
|
token = gr.Textbox(label="Github Token", placeholder="Your github token for authentication. This is not stored anywhere.") |
|
n_issues = gr.Slider(1, 50, value=5, step=1, label="Number of similar issues", info="Choose between 1 and 50") |
|
issue_types = gr.CheckboxGroup(["Issue", "Pull Request"], label="Issue types") |
|
|
|
with gr.Row(): |
|
submit_button = gr.Button(value="Submit") |
|
|
|
with gr.Row(): |
|
with gr.Row(): |
|
issues_html = gr.HTML(label="Issue text", elem_id="issue_html") |
|
submit_button.click(run_find_similar_issues, outputs=[issues_html], inputs=[token, n_issues, issue_no, query, issue_types]) |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
gr.Markdown("Press `Update Button` to update the stored issues. This will take a few minutes.") |
|
update_button = gr.Button(value="Update issues") |
|
update_button.click(update, outputs=[], inputs=[token], trigger_mode="once") |
|
with gr.Column(): |
|
pass |
|
|
|
with gr.Tab("Find maintainers to ping"): |
|
gr.Markdown("Find maintainers to ping for a given issue or pull request - DO NOT CURRENTLY HAVE FUNCTIONALITY") |
|
with gr.Row(): |
|
issue = gr.Textbox(label="Github Issue / PR", placeholder="Issue or PR you want to find maintainers to ping for") |
|
with gr.Row(): |
|
token = gr.Textbox(label="Github Token", placeholder="Your github token for authentication. This is not stored anywhere.") |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch() |
|
|