bluenevus's picture
Update app.py
4a7d57e verified
raw
history blame
4.42 kB
import gradio as gr
from datetime import datetime, timedelta
import google.generativeai as genai
from github import Github, GithubException
import docx
import re
def extract_repo_name(github_url):
# Use regex to extract the username and repo name from the URL
match = re.search(r'github\.com/([^/]+)/([^/]+)', github_url)
if match:
return f"{match.group(1)}/{match.group(2)}"
return None
def generate_release_notes(github_url, github_token, gemini_api_key, start_date, end_date):
try:
g = Github(github_token)
repo_name = extract_repo_name(github_url)
if not repo_name:
return "Error: Invalid GitHub URL format.", None
repo = g.get_repo(repo_name)
start_date = datetime.strptime(start_date, "%Y-%m-%d")
end_date = datetime.strptime(end_date, "%Y-%m-%d")
commits = list(repo.get_commits(since=start_date, until=end_date))
commit_messages = [commit.commit.message for commit in commits]
commit_text = "\n".join(commit_messages)
if not commit_text:
return "No commits found in the specified date range.", None
genai.configure(api_key=gemini_api_key)
model = genai.GenerativeModel('gemini-2.5-pro-preview-03-25')
prompt = f"""Based on the following commit messages, generate comprehensive release notes:
{commit_text}
Please organize the release notes into sections such as:
1. New Features
2. Bug Fixes
3. Improvements
4. Breaking Changes (if any)
Provide a concise summary for each item. Do not include any links, but keep issue numbers if present.
Important formatting instructions:
- Do not use any Markdown syntax (*, #, `, etc.)
- Use plain text only
- For section headers, simply use the text as is (e.g., "New Features:")
- For list items, use simple numbers or bullet points (•) followed by a space
- Keep the text structure simple and easy to convert to a Word document format
"""
response = model.generate_content(prompt)
release_notes = response.text
doc = docx.Document()
doc.add_heading('Release Notes', 0)
for line in release_notes.split('\n'):
if line.strip().endswith(':'):
doc.add_heading(line.strip(), level=1)
elif line.strip().startswith('•') or (line.strip() and line.strip()[0].isdigit()):
doc.add_paragraph(line.strip(), style='List Bullet')
else:
doc.add_paragraph(line)
temp_file = "release_notes.docx"
doc.save(temp_file)
return release_notes, temp_file
except GithubException as e:
if e.status == 401:
return "Error: Invalid GitHub token or insufficient permissions.", None
elif e.status == 404:
return f"Error: Repository not found. Please check the GitHub URL. Attempted to access: {repo_name}", None
else:
return f"GitHub API error: {str(e)}", None
except Exception as e:
return f"An error occurred: {str(e)}", None
default_end_date = datetime.now()
default_start_date = default_end_date - timedelta(days=30)
iface = gr.Interface(
fn=generate_release_notes,
inputs=[
gr.Textbox(label="GitHub Repository URL", placeholder="https://github.com/MicroHealthLLC/maiko-assistant"),
gr.Textbox(label="GitHub Personal Access Token", type="password"),
gr.Textbox(label="Gemini API Key", type="password"),
gr.Textbox(
label="Start Date",
placeholder="YYYY-MM-DD",
value=default_start_date.strftime("%Y-%m-%d"),
),
gr.Textbox(
label="End Date",
placeholder="YYYY-MM-DD",
value=default_end_date.strftime("%Y-%m-%d"),
)
],
outputs=[
gr.Textbox(label="Generated Release Notes"),
gr.File(label="Download Release Notes")
],
title="Automated Release Notes Generator",
description="Generate release notes based on GitHub commits using Gemini AI. Enter start and end dates (YYYY-MM-DD) to define the time range for commits.",
allow_flagging="never",
theme="default",
analytics_enabled=False,
)
iface.launch()