Update app.py
Browse files
app.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
import dash
|
2 |
-
from dash import dcc, html, Input, Output, State
|
3 |
import dash_bootstrap_components as dbc
|
4 |
from datetime import datetime, timedelta
|
5 |
import google.generativeai as genai
|
@@ -19,8 +19,9 @@ app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
|
|
19 |
HF_GEMINI_API_KEY = os.environ.get('HF_GEMINI_API_KEY')
|
20 |
HF_GITHUB_TOKEN = os.environ.get('HF_GITHUB_TOKEN')
|
21 |
|
22 |
-
# Global
|
23 |
generated_file = None
|
|
|
24 |
|
25 |
def generate_release_notes(git_provider, repo_url, start_date, end_date, folder_location):
|
26 |
global generated_file
|
@@ -94,51 +95,61 @@ def generate_release_notes(git_provider, repo_url, start_date, end_date, folder_
|
|
94 |
generated_file = io.BytesIO(markdown_content.encode())
|
95 |
generated_file.seek(0)
|
96 |
|
97 |
-
# Update SUMMARY.md
|
98 |
-
summary_url = "https://github.com/MicroHealthLLC/maiko-assistant/blob/main/documentation%2Freleases%2FSUMMARY.md"
|
99 |
-
update_summary(summary_url, file_name)
|
100 |
-
|
101 |
return release_notes, file_name
|
102 |
|
103 |
except Exception as e:
|
104 |
return f"An error occurred: {str(e)}", None
|
105 |
|
106 |
-
def
|
|
|
107 |
try:
|
108 |
g = Github(HF_GITHUB_TOKEN)
|
109 |
-
repo = g.get_repo(
|
110 |
-
|
|
|
|
|
|
|
111 |
|
112 |
# Add new file to the top of the Releases section
|
113 |
new_entry = f"{datetime.now().strftime('%b %d, %Y')}\n"
|
114 |
-
|
115 |
|
116 |
# Create a new branch for the PR
|
117 |
base_branch = repo.default_branch
|
118 |
-
new_branch = f"update-
|
119 |
ref = repo.get_git_ref(f"heads/{base_branch}")
|
120 |
repo.create_git_ref(ref=f"refs/heads/{new_branch}", sha=ref.object.sha)
|
121 |
|
122 |
# Update SUMMARY.md in the new branch
|
123 |
repo.update_file(
|
124 |
-
|
125 |
f"Update SUMMARY.md with new release notes {new_file_name}",
|
126 |
-
|
127 |
-
repo.get_contents(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
128 |
branch=new_branch
|
129 |
)
|
130 |
|
131 |
# Create a pull request
|
132 |
pr = repo.create_pull(
|
133 |
-
title=f"
|
134 |
-
body="Automatically generated PR to
|
135 |
head=new_branch,
|
136 |
base=base_branch
|
137 |
)
|
138 |
|
139 |
-
|
|
|
140 |
except Exception as e:
|
141 |
-
return f"Error
|
142 |
|
143 |
# App layout
|
144 |
app.layout = dbc.Container([
|
@@ -192,7 +203,11 @@ app.layout = dbc.Container([
|
|
192 |
dbc.Card([
|
193 |
dbc.CardBody([
|
194 |
html.H4("Generated Release Notes"),
|
195 |
-
|
|
|
|
|
|
|
|
|
196 |
])
|
197 |
]),
|
198 |
dcc.Download(id="download-markdown")
|
@@ -232,18 +247,30 @@ def download_markdown(n_clicks):
|
|
232 |
return dcc.send_bytes(generated_file.getvalue(), f"release_notes_{datetime.now().strftime('%Y%m%d%H%M%S')}.md")
|
233 |
|
234 |
@app.callback(
|
235 |
-
Output("pr-button", "children"),
|
|
|
236 |
Input("pr-button", "n_clicks"),
|
237 |
-
[State("
|
|
|
238 |
prevent_initial_call=True
|
239 |
)
|
240 |
-
def create_pr(n_clicks, folder_location):
|
241 |
if n_clicks is None:
|
242 |
-
return dash.no_update
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
243 |
|
244 |
-
|
245 |
-
|
246 |
-
|
|
|
247 |
|
248 |
if __name__ == '__main__':
|
249 |
print("Starting the Dash application...")
|
|
|
1 |
import dash
|
2 |
+
from dash import dcc, html, Input, Output, State, callback
|
3 |
import dash_bootstrap_components as dbc
|
4 |
from datetime import datetime, timedelta
|
5 |
import google.generativeai as genai
|
|
|
19 |
HF_GEMINI_API_KEY = os.environ.get('HF_GEMINI_API_KEY')
|
20 |
HF_GITHUB_TOKEN = os.environ.get('HF_GITHUB_TOKEN')
|
21 |
|
22 |
+
# Global variables to store generated files and PR URL
|
23 |
generated_file = None
|
24 |
+
pr_url = None
|
25 |
|
26 |
def generate_release_notes(git_provider, repo_url, start_date, end_date, folder_location):
|
27 |
global generated_file
|
|
|
95 |
generated_file = io.BytesIO(markdown_content.encode())
|
96 |
generated_file.seek(0)
|
97 |
|
|
|
|
|
|
|
|
|
98 |
return release_notes, file_name
|
99 |
|
100 |
except Exception as e:
|
101 |
return f"An error occurred: {str(e)}", None
|
102 |
|
103 |
+
def update_summary_and_create_pr(repo_url, folder_location, new_file_name, markdown_content):
|
104 |
+
global pr_url
|
105 |
try:
|
106 |
g = Github(HF_GITHUB_TOKEN)
|
107 |
+
repo = g.get_repo(repo_url)
|
108 |
+
|
109 |
+
# Get the current content of SUMMARY.md
|
110 |
+
summary_path = f"{folder_location}/SUMMARY.md"
|
111 |
+
summary_content = repo.get_contents(summary_path).decoded_content.decode()
|
112 |
|
113 |
# Add new file to the top of the Releases section
|
114 |
new_entry = f"{datetime.now().strftime('%b %d, %Y')}\n"
|
115 |
+
updated_summary = summary_content.replace("Releases\n", f"Releases\n{new_entry}")
|
116 |
|
117 |
# Create a new branch for the PR
|
118 |
base_branch = repo.default_branch
|
119 |
+
new_branch = f"update-release-notes-{datetime.now().strftime('%Y%m%d%H%M%S')}"
|
120 |
ref = repo.get_git_ref(f"heads/{base_branch}")
|
121 |
repo.create_git_ref(ref=f"refs/heads/{new_branch}", sha=ref.object.sha)
|
122 |
|
123 |
# Update SUMMARY.md in the new branch
|
124 |
repo.update_file(
|
125 |
+
summary_path,
|
126 |
f"Update SUMMARY.md with new release notes {new_file_name}",
|
127 |
+
updated_summary,
|
128 |
+
repo.get_contents(summary_path).sha,
|
129 |
+
branch=new_branch
|
130 |
+
)
|
131 |
+
|
132 |
+
# Create the new release notes file
|
133 |
+
new_file_path = f"{folder_location}/{new_file_name}"
|
134 |
+
repo.create_file(
|
135 |
+
new_file_path,
|
136 |
+
f"Add release notes {new_file_name}",
|
137 |
+
markdown_content,
|
138 |
branch=new_branch
|
139 |
)
|
140 |
|
141 |
# Create a pull request
|
142 |
pr = repo.create_pull(
|
143 |
+
title=f"Add release notes {new_file_name} and update SUMMARY.md",
|
144 |
+
body="Automatically generated PR to add new release notes and update SUMMARY.md.",
|
145 |
head=new_branch,
|
146 |
base=base_branch
|
147 |
)
|
148 |
|
149 |
+
pr_url = pr.html_url
|
150 |
+
return f"Pull request created: {pr_url}"
|
151 |
except Exception as e:
|
152 |
+
return f"Error creating PR: {str(e)}"
|
153 |
|
154 |
# App layout
|
155 |
app.layout = dbc.Container([
|
|
|
203 |
dbc.Card([
|
204 |
dbc.CardBody([
|
205 |
html.H4("Generated Release Notes"),
|
206 |
+
dcc.Loading(
|
207 |
+
id="loading-output",
|
208 |
+
type="circle",
|
209 |
+
children=[html.Pre(id="output-notes", style={"white-space": "pre-wrap"})]
|
210 |
+
)
|
211 |
])
|
212 |
]),
|
213 |
dcc.Download(id="download-markdown")
|
|
|
247 |
return dcc.send_bytes(generated_file.getvalue(), f"release_notes_{datetime.now().strftime('%Y%m%d%H%M%S')}.md")
|
248 |
|
249 |
@app.callback(
|
250 |
+
[Output("pr-button", "children"),
|
251 |
+
Output("pr-button", "disabled")],
|
252 |
Input("pr-button", "n_clicks"),
|
253 |
+
[State("repo-url", "value"),
|
254 |
+
State("folder-location", "value")],
|
255 |
prevent_initial_call=True
|
256 |
)
|
257 |
+
def create_pr(n_clicks, repo_url, folder_location):
|
258 |
if n_clicks is None:
|
259 |
+
return dash.no_update, dash.no_update
|
260 |
+
|
261 |
+
global generated_file
|
262 |
+
if generated_file is None:
|
263 |
+
return "Error: No file generated", True
|
264 |
+
|
265 |
+
file_name = f"{datetime.now().strftime('%m-%d-%Y')}.md"
|
266 |
+
markdown_content = generated_file.getvalue().decode()
|
267 |
+
|
268 |
+
result = update_summary_and_create_pr(repo_url, folder_location, file_name, markdown_content)
|
269 |
|
270 |
+
if pr_url:
|
271 |
+
return f"PR Created: {pr_url}", True
|
272 |
+
else:
|
273 |
+
return result, False
|
274 |
|
275 |
if __name__ == '__main__':
|
276 |
print("Starting the Dash application...")
|