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"#{issue['number']} - {issue['title']}" for issue in similar_issues] issues_html = "
".join(issues_html) pulls_html = [f"#{issue['number']} - {issue['title']}" for issue in similar_pulls] pulls_html = "
".join(pulls_html) final = "" if len(issues_html) > 0: final += f"

Issues

{issues_html}" if len(pulls_html) > 0: final += f"

Pull Requests

{pulls_html}" # return issues_html return final def update(token): # Archive the stored issues 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") # Retrieve new issues get_issues(overwrite=False, update=True, output_filename="issues.json", token=token) # Update any issues that have been updated since the last update update_issues(token=token) # Update the dictionary of issues build_issue_dict.build_json_file("issues.json", "issues_dict.json") # Update the embeddings 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()