在本系列的第三部分中,您了解如何儲存程式碼審查請求資訊以供後續處理。您建立了一個名為 read_email
的方法來從收件匣中取得電子郵件,以檢查審閱者是否已回覆程式碼審閱請求。您還在程式碼審查排程器程式碼中實作了錯誤處理。
在本系列的這一部分中,您將使用已儲存的程式碼審核資訊和電子郵件中的資訊來檢查審核者是否已回覆審核請求。如果請求尚未得到回复,您將向審核者發送一封後續電子郵件。
首先克隆本教程系列第三部分的原始程式碼。
git clone https://github.com/royagasthyan/CodeReviewer-Part3 CodeReviewer
修改 config.json
檔案以包含一些相關的電子郵件地址,並保留 royagasthyan@gmail.com
電子郵件地址。這是因為 git 具有與此特定電子郵件地址相關的提交,這是程式碼按預期執行所必需的。修改 schedule.py
檔案中的 SMTP
憑證:
FROM_EMAIL = "your_email_address@gmail.com" FROM_PWD = "your_password"
導覽至專案目錄 CodeReviewer
並嘗試在終端機中執行以下命令。
python scheduler.py -n 20 -p "project_x"
它應該將程式碼審查請求發送給隨機開發人員進行審查,並創建一個包含審查資訊的 reviewer.json
檔案。
我們先建立一個名為 followup_request
的後續請求方法。在 followup_request
方法內,讀取 reviewer.json
檔案並將內容保存在清單中。程式碼如下:
with open('reviewer.json','r') as jfile: review_info = json.load(jfile)
接下來,使用您在上一個教學中實現的 read_email
方法來提取電子郵件資訊。
email_info = read_email(no_days)
如果審閱者已回覆審閱請求,則應該有一封具有相同主題的電子郵件,並在其前面添加 Re:
標記。因此,迭代審閱資訊列表,並將審閱主題與電子郵件主題進行比較,看看審閱者是否已回覆請求。
for review in review_info: review_replied = false expected_subject = 'RE: ' + review['subject'] for email in email_info: if expected_subject == email['subject']: review_replied = True print 'Reviewer has responded' break;
如上面的程式碼所示,您迭代了 review_info
列表,並根據電子郵件主題檢查了評論訊息主題,以查看評論者是否已回覆。
現在,一旦審閱者回應了程式碼審閱請求,您就無需在 reviewer.json
檔案中保留特定的審查資訊。因此,建立一個名為 Delete_Info
的 Python 方法,以從 reviewer.json
檔案中刪除特定評論資訊。以下是 Delete_Info
的外觀:
def Delete_Info(info, id): for i in xrange(len(info)): if info[i]['id'] == id: info.pop(i) break return info
如上面的程式碼所示,您已經迭代了評論資訊清單並刪除了與Id相符的條目。從文件中刪除資訊後,返回清單。
回覆某一則評論訊息時,需要呼叫 Delete_Info
方法。當呼叫 Delete_Info
方法時,需要傳遞 review_info
的副本,以免更改原始資訊清單。您將需要原始評論資訊清單以供稍後比較。因此導入 copy
Python 模組來建立原始評論資訊清單的副本。
from copy import copy
建立 review_info
清單的副本。
review_info_copy = copy(review_info)
從原始清單中刪除已回覆的評論資訊時,將複製清單傳遞給Delete_Info
方法。
review_info_copy = Delete_Info(review_info_copy,review['id'])
這是 followup_request
方法:
def followup_request(): with open('reviewer.json','r') as jfile: review_info = json.load(jfile) review_info_copy = copy(review_info) email_info = read_email(no_days) for review in review_info: review_replied = False expected_subject = 'Re: ' + review['subject'] for email in email_info: if expected_subject == email['Subject']: review_replied = True review_info_copy = Delete_Info(review_info_copy,review['id']) break;
現在,一旦 review_info
清單被迭代,您需要檢查 reviewer.json
檔案中是否有任何變更。如果任何現有評論資訊已被刪除,您需要相應更新 reviewer.json
檔案。因此,檢查 review_info_copy
和 review_info
是否相同,並更新 reviewer.json
檔案。
if review_info_copy != review_info: with open('reviewer.json','w') as outfile: json.dump(review_info_copy,outfile)
這是完整的 followup_request
方法:
def followup_request(): with open('reviewer.json','r') as jfile: review_info = json.load(jfile) review_info_copy = copy(review_info) email_info = read_email(no_days) for review in review_info: review_replied = False expected_subject = 'Re: ' + review['subject'] for email in email_info: if expected_subject == email['Subject']: review_replied = True review_info_copy = Delete_Info(review_info_copy,review['id']) break; if review_info_copy != review_info: with open('reviewer.json','w') as outfile: json.dump(review_info_copy,outfile)
呼叫 followup_request
方法來跟進已傳送的審核請求。
try: commits = process_commits() # Added the follow Up Method followup_request() if len(commits) == 0: print 'No commits found ' else: schedule_review_request(commits) except Exception,e: print 'Error occurred. Check log for details.' logger.error(str(datetime.datetime.now()) + " - Error occurred : " + str(e) + "\n") logger.exception(str(e))
儲存以上變更。為了測試後續功能,請從專案目錄中刪除 reviewer.json
檔案。現在運行調度程序,以便將程式碼審查請求發送給隨機開發人員。檢查該資訊是否已保存在 reviewer.json
檔案中。
要求特定開發人員透過回覆電子郵件來回應程式碼審查請求。現在再次運行調度程序,這次調度程序應該能夠找到回應並將其從 reviewer.json
檔案中刪除。
审核者回复代码审核请求电子邮件后,需要从 reviewer.json
文件中删除该信息,因为您不需要进一步跟踪它。如果审核者尚未回复代码审核请求,您需要发送后续邮件提醒他或她审核请求。
代码审查调度程序将每天运行。当它运行时,您首先需要检查开发人员响应审核请求是否已经过去了一定时间。在项目配置中,您可以设置一个审核周期,在此期间,如果审核者没有回复,调度程序将发送提醒电子邮件。
让我们首先在项目配置中添加配置。在配置文件中添加一个名为 followup_Frequency
的新配置。
{ "name": "project_x", "git_url": "https://github.com/royagasthyan/project_x", "followup_frequency":2, "members": [ "royagasthyan@gmail.com", "samon@gmail.com", "sualonni@gmail.com", "restuni@gmail.com" ] }
因此,当审阅者在 followup_Frequency
天数内没有回复时,您将发送一封提醒电子邮件。读取配置的同时将配置读入全局变量:
for p in main_config: if p['name'] == project: project_url = p['git_url'] project_members = p['members'] followup_frequency = p['followup_frequency'] break
在 followup_request
方法内部,当审稿人在 followup_frequest
天数内没有回复后续请求时,发送提醒邮件。计算自评论发送以来的天数。
review_date = datetime.datetime.strptime(review['sendDate'],'%Y-%m-%d') today = datetime.datetime.today() days_since_review = (today - review_date).days
如果天数大于配置中的后续频率日期,请发送提醒电子邮件。
if not review_replied: if days_since_review > followup_frequency: send_email(review['reviewer'],'Reminder: ' + review['subject'],'\nYou have not responded to the review request\n')
这是完整的 followup_request
方法:
def followup_request(): with open('reviewer.json','r') as jfile: review_info = json.load(jfile) review_info_copy = copy(review_info) email_info = read_email(no_days) for review in review_info: review_date = datetime.datetime.strptime(review['sendDate'],'%Y-%m-%d') today = datetime.datetime.today() days_since_review = (today - review_date).days review_replied = False expected_subject = 'Re: ' + review['subject'] for email in email_info: if expected_subject == email['Subject']: review_replied = True review_info_copy = Delete_Info(review_info_copy,review['id']) break; if not review_replied: if days_since_review > followup_frequency: send_email(review['reviewer'],'Reminder: ' + review['subject'],'\nYou have not responded to the review request\n') if review_info_copy != review_info: with open('reviewer.json','w') as outfile: json.dump(review_info_copy,outfile)
在本教程中,您了解了如何实现跟进代码审核请求的逻辑。您还添加了如果审阅者在一定天数内没有回复电子邮件的情况下发送提醒电子邮件的功能。
这个 Python 代码审查器可以进一步增强以满足您的需求。请分叉存储库并添加新功能,并在下面的评论中告诉我们。
本教程的源代码可在 GitHub 上获取。
以上是建立一個Python程式碼審查排程:審查跟進的詳細內容。更多資訊請關注PHP中文網其他相關文章!