1
+ import logging
1
2
import os
2
- import requests
3
3
from datetime import datetime , timedelta
4
4
5
+ import requests
6
+
7
+ logger = logging .getLogger (__name__ )
8
+
5
9
# Set up the GitHub and Slack tokens from environment variables
6
10
GH_TOKEN = os .getenv ("GH_TOKEN" )
7
11
SLACK_TOKEN = os .getenv ("SLACK_TOKEN" )
@@ -39,26 +43,30 @@ def get_slack_user_id(slack_email: str) -> int:
39
43
headers = {"Authorization" : f"Bearer { SLACK_TOKEN } " }
40
44
params = {"email" : slack_email }
41
45
response = requests .get (
42
- "https://slack.com/api/users.lookupByEmail" , headers = headers , params = params
46
+ "https://slack.com/api/users.lookupByEmail" ,
47
+ headers = headers ,
48
+ params = params ,
49
+ timeout = 30 ,
43
50
)
44
51
45
52
if response .status_code != 200 or not response .json ().get ("ok" ):
46
- print (f"Error fetching Slack user ID for email { slack_email } : { response .text } " )
53
+ logger . info (f"Error fetching Slack user ID for email { slack_email } : { response .text } " )
47
54
return None
48
55
49
- slack_user_id = response .json ().get ("user" , {}).get ("id" )
50
- return slack_user_id
56
+ return response .json ().get ("user" , {}).get ("id" )
51
57
52
58
53
59
# Helper function to fetch pull requests from GitHub
54
60
def get_pull_requests () -> dict :
55
61
headers = {"Authorization" : f"token { GH_TOKEN } " }
56
62
response = requests .get (
57
- f"https://api.github.com/repos/{ REPO_OWNER } /{ REPO_NAME } /pulls" , headers = headers
63
+ f"https://api.github.com/repos/{ REPO_OWNER } /{ REPO_NAME } /pulls" ,
64
+ headers = headers ,
65
+ timeout = 30 ,
58
66
)
59
67
60
68
if response .status_code != 200 :
61
- print (f"Error fetching PRs: { response .text } " )
69
+ logger . info (f"Error fetching PRs: { response .text } " )
62
70
response .raise_for_status ()
63
71
64
72
return response .json ()
@@ -69,10 +77,14 @@ def get_pr_reviews(pull_request: dict) -> list[dict]:
69
77
pr_number = pull_request ["number" ]
70
78
reviews_url = f"https://api.github.com/repos/{ REPO_OWNER } /{ REPO_NAME } /pulls/{ pr_number } /reviews"
71
79
headers = {"Authorization" : f"token { GH_TOKEN } " }
72
- response = requests .get (reviews_url , headers = headers )
80
+ response = requests .get (
81
+ reviews_url ,
82
+ headers = headers ,
83
+ timeout = 30 ,
84
+ )
73
85
74
86
if response .status_code != 200 :
75
- print (f"Error fetching reviews for PR { pr_number } : { response .text } " )
87
+ logger . info (f"Error fetching reviews for PR { pr_number } : { response .text } " )
76
88
return []
77
89
78
90
reviews = response .json ()
@@ -86,10 +98,8 @@ def get_pr_reviews(pull_request: dict) -> list[dict]:
86
98
# Convert the submitted_at timestamp to a datetime object for comparison
87
99
review_time = datetime .strptime (submitted_at , "%Y-%m-%dT%H:%M:%SZ" )
88
100
# If the user doesn't have a review or the current one is later, update
89
- if (
90
- user not in latest_reviews
91
- or review_time > latest_reviews [user ]["submitted_at" ]
92
- and state != "COMMENTED"
101
+ if user not in latest_reviews or (
102
+ review_time > latest_reviews [user ]["submitted_at" ] and state != "COMMENTED"
93
103
):
94
104
latest_reviews [user ] = {
95
105
"user" : user ,
@@ -105,7 +115,7 @@ def get_pr_reviews(pull_request: dict) -> list[dict]:
105
115
"state" : "PENDING" ,
106
116
}
107
117
for user_dict in pull_request .get ("requested_reviewers" , [])
108
- }
118
+ },
109
119
)
110
120
# Return the latest review state and URL for each user
111
121
return latest_reviews .values ()
@@ -119,11 +129,14 @@ def send_slack_message(slack_user_id: int, message: str) -> None:
119
129
}
120
130
payload = {"channel" : slack_user_id , "text" : message }
121
131
response = requests .post (
122
- "https://slack.com/api/chat.postMessage" , json = payload , headers = headers
132
+ "https://slack.com/api/chat.postMessage" ,
133
+ json = payload ,
134
+ headers = headers ,
135
+ timeout = 30 ,
123
136
)
124
137
125
138
if response .status_code != 200 or not response .json ().get ("ok" ):
126
- print (f"Error sending Slack message: { response .text } " )
139
+ logger . info (f"Error sending Slack message: { response .text } " )
127
140
response .raise_for_status ()
128
141
129
142
@@ -162,13 +175,13 @@ def notify_reviewers():
162
175
slack_email_to_slack_id = {}
163
176
pull_requests = get_pull_requests ()
164
177
# Logging all fetched PR details
165
- print (f"Fetched { len (pull_requests )} PRs from GitHub." )
178
+ logger . info (f"Fetched { len (pull_requests )} PRs from GitHub." )
166
179
for pull_request in pull_requests :
167
180
title = pull_request ["title" ]
168
181
pr_number = pull_request ["number" ]
169
- print (f"Processing PR: { pr_number } - { title } " )
182
+ logger . info (f"Processing PR: { pr_number } - { title } " )
170
183
reviews = get_pr_reviews (pull_request )
171
- print (f"Found { len (reviews )} reviews for PR { pr_number } ." )
184
+ logger . info (f"Found { len (reviews )} reviews for PR { pr_number } ." )
172
185
message = format_pr_message (pull_request , reviews )
173
186
# Map Slack users to PR messages
174
187
for review in reviews :
@@ -191,13 +204,14 @@ def notify_reviewers():
191
204
if pr_list :
192
205
if slack_email := GITHUB_USER_NAME_TO_SLACK_EMAIL .get (github_username ):
193
206
if slack_user_id := slack_email_to_slack_id .get (
194
- slack_email , get_slack_user_id (slack_email )
207
+ slack_email ,
208
+ get_slack_user_id (slack_email ),
195
209
):
196
210
message_content = f"Hello { github_username } ! { header_message } \n { pr_list } \n { tips_message } "
197
- # print ("\n\n", message_content, "\n\n")
211
+ # logger.info ("\n\n", message_content, "\n\n")
198
212
send_slack_message (slack_user_id , message_content )
199
213
except Exception as e :
200
- print (f"Error occurred: { e } " )
214
+ logger . info (f"Error occurred: { e } " )
201
215
raise
202
216
203
217
0 commit comments