Rumah > Artikel > pembangunan bahagian belakang > Membina penjadual semakan kod Python: semakan susulan
Dalam bahagian tiga siri ini, anda mempelajari cara menyimpan maklumat permintaan semakan kod untuk pemprosesan kemudian. Anda membuat kaedah yang dipanggil read_email
untuk mendapatkan e-mel daripada peti masuk untuk menyemak sama ada penyemak telah membalas permintaan semakan kod. Anda juga melaksanakan pengendalian ralat dalam kod penjadual semakan kod. 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
{ "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" ] }🎜Ubah suai fail
config.json
untuk memasukkan beberapa alamat e-mel yang berkaitan dan simpan alamat e-mel royagasthyan@gmail.com
. Ini kerana git mempunyai komit yang dikaitkan dengan alamat e-mel khusus ini, yang diperlukan untuk kod tersebut dilaksanakan seperti yang diharapkan. Ubah suai bukti kelayakan SMTP
dalam fail schedule.py
: 🎜
for p in main_config: if p['name'] == project: project_url = p['git_url'] project_members = p['members'] followup_frequency = p['followup_frequency'] break🎜 Navigasi ke direktori projek
CodeReviewer
dan cuba laksanakan arahan berikut dalam terminal. 🎜
review_date = datetime.datetime.strptime(review['sendDate'],'%Y-%m-%d') today = datetime.datetime.today() days_since_review = (today - review_date).days🎜Ia harus menghantar permintaan semakan kod kepada pembangun rawak untuk semakan dan membuat fail
reviewer.json
yang mengandungi maklumat semakan. 🎜
followup_request
. Dalam kaedah followup_request
, baca fail reviewer.json
dan simpan kandungan dalam senarai. Kodnya adalah seperti berikut: 🎜
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')🎜Seterusnya, ekstrak maklumat e-mel menggunakan kaedah
read_email
yang anda laksanakan dalam tutorial sebelumnya. 🎜
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)🎜Jika penyemak telah membalas permintaan semakan, harus ada e-mel dengan subjek yang sama dan teg
Re:
di hadapannya. Jadi, ulangi senarai mesej ulasan dan bandingkan subjek ulasan dengan subjek e-mel untuk melihat sama ada penyemak telah membalas permintaan tersebut. 🎜
rrreee
🎜Seperti yang ditunjukkan dalam kod di atas, anda mengulangi senarai review_info
dan semak topik maklumat semakan terhadap subjek e-mel untuk melihat sama ada penyemak telah membalas. 🎜
🎜Kini, setelah penyemak membalas permintaan semakan kod, anda tidak perlu menyimpan maklumat semakan khusus dalam fail reviewer.json
. Oleh itu, buat kaedah Python bernama Delete_Info
untuk memadamkan maklumat semakan khusus daripada fail reviewer.json
. Inilah rupa Delete_Info
: 🎜
rrreee
🎜Seperti yang ditunjukkan dalam kod di atas, anda telah mengulangi senarai maklumat ulasan dan mengalih keluar masukan yang sepadan dengan Id. Selepas mengalih keluar maklumat daripada fail, kembali ke senarai. 🎜
🎜Apabila membalas ulasan, anda perlu memanggil kaedah Delete_Info
. Apabila memanggil kaedah Delete_Info
, anda perlu menghantar salinan review_info
untuk mengelak daripada mengubah senarai maklumat asal. Anda memerlukan senarai maklumat semakan asal untuk perbandingan kemudian. Jadi import copy
modul Python untuk membuat salinan senarai asal mesej komen. 🎜
rrreee
🎜Buat salinan senarai review_info
. 🎜
rrreee
🎜Apabila memadamkan maklumat ulasan yang dibalas daripada senarai asal, hantar senarai yang disalin ke kaedah Delete_Info
. 🎜
rrreee
🎜Ini ialah kaedah followup_request
: 🎜
rrreee
🎜Sekarang, setelah senarai review_info
diulang, anda perlu menyemak sama ada terdapat sebarang perubahan dalam fail reviewer.json
. Jika sebarang maklumat semakan sedia ada telah dialih keluar, anda perlu mengemas kini fail reviewer.json
dengan sewajarnya. Jadi, semak sama ada review_info_copy
dan review_info
adalah sama dan kemas kini reviewer.json
dokumen. 🎜
rrreee
🎜Ini ialah kaedah followup_request
: 🎜
rrreee
🎜Hubungi kaedah followup_request
untuk membuat susulan permintaan semakan yang dihantar. 🎜
rrreee
🎜Simpan perubahan di atas. Untuk menguji kefungsian seterusnya, padamkan fail reviewer.json
daripada direktori projek. Sekarang jalankan penjadual untuk menghantar permintaan semakan kod kepada pembangun rawak. Semak sama ada maklumat ini disimpan dalam fail reviewer.json
. 🎜
🎜Memerlukan pembangun khusus untuk membalas permintaan semakan kod dengan membalas e-mel. Sekarang jalankan penjadual sekali lagi dan kali ini penjadual sepatutnya dapat mencari respons dan mengalih keluarnya daripada fail 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 上获取。
Atas ialah kandungan terperinci Membina penjadual semakan kod Python: semakan susulan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!