В третьей части этой серии вы увидели, как сохранить информацию о запросе проверки кода для последующих действий . Вы создали метод read_email
для извлечения писем из папки «Входящие», чтобы проверить, ответил ли рецензент на запрос проверки кода. Вы также реализовали обработку ошибок в коде планировщика проверки кода.
В этой части серии вы будете использовать сохраненную информацию о проверке кода и информацию из электронных писем, чтобы проверить, ответил ли рецензент на запрос проверки. Если на запрос не было получено ответа, вы отправите рецензенту сообщение по электронной почте.
Начиная
Начните с клонирования исходного кода из третьей части серии уроков.
1
|
git clone https://github.com/royagasthyan/CodeReviewer-Part3 CodeReviewer
|
Измените файл config.json
включив в него некоторые соответствующие адреса электронной почты, оставив [email protected]
электронной почты [email protected]
. Это потому, что git имеет коммиты, связанные с этим конкретным адресом электронной почты, которые требуются для выполнения кода, как ожидается. Измените учетные данные SMTP
в файле schedule.py
:
1
2
|
FROM_EMAIL = «[email protected]»
FROM_PWD = «your_password»
|
Перейдите в каталог проекта CodeReviewer
и попробуйте выполнить следующую команду в терминале.
1
|
python scheduler.py -n 20 -p «project_x»
|
Он должен отправить запрос на проверку кода случайным разработчикам для проверки и создать файл reviewer.json
с информацией о проверке.
Реализация последующего запроса
Давайте начнем с создания последующего метода запроса с именем followup_request
. В методе followup_request
прочитайте файл reviewer.json
и сохраните содержимое в списке. Вот как выглядит код:
1
2
|
with open(‘reviewer.json’,’r’) as jfile:
review_info = json.load(jfile)
|
Затем извлеките информацию электронной почты, используя метод read_email
который вы реализовали в последнем уроке.
1
|
email_info = read_email(no_days)
|
Если рецензент ответил на запрос о рецензировании, должно быть электронное письмо с той же темой и префиксом Re:
Так что переберите список информации о рецензировании и сравните тему рецензирования с темой электронного письма, чтобы увидеть, ответил ли рецензент на запрос.
1
2
3
4
5
6
7
8
|
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
список review_info
и проверяете тему информации о проверке на предмет электронной почты, чтобы узнать, ответил ли рецензент.
Теперь, когда рецензент ответил на запрос проверки кода, вам не нужно сохранять конкретную информацию о рецензировании в файле reviewer.json
. Поэтому создайте метод Python с именем Delete_Info
чтобы удалить конкретную информацию о рецензировании из файла reviewer.json
. Вот как выглядит Delete_Info
:
1
2
3
4
5
6
|
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
ответ. При вызове метода Delete_Info
вам нужно передать копию review_info
чтобы исходный информационный список не был изменен. Вам понадобится исходный список с информацией для обзора для сравнения позже Поэтому импортируйте модуль Python для copy
чтобы создать копию оригинального списка информации об обзоре.
1
|
from copy import copy
|
Создайте копию списка review_info
.
1
|
review_info_copy = copy(review_info)
|
При удалении информации об обзоре, на которую был Delete_Info
ответ, из исходного списка, передайте список Delete_Info
методу Delete_Info
.
1
|
review_info_copy = Delete_Info(review_info_copy,review[‘id’])
|
Вот метод followup_request
:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
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
список review_info
был повторен, вам нужно проверить, есть ли какие-либо изменения в файле reviewer.json
. Если какая-либо существующая информация об обзоре была удалена, вам необходимо соответствующим образом обновить файл reviewer.json
. Поэтому проверьте, review_info_copy
ли review_info_copy
и review_info
, и обновите файл reviewer.json
.
1
2
3
|
if review_info_copy != review_info:
with open(‘reviewer.json’,’w’) as outfile:
json.dump(review_info_copy,outfile)
|
Вот полный метод followup_request
:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
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
для отслеживания уже отправленных запросов на проверку.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
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.
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
в файл конфигурации.
01
02
03
04
05
06
07
08
09
10
11
|
{
«name»: «project_x»,
«git_url»: «https://github.com/royagasthyan/project_x»,
«followup_frequency»:2,
«members»: [
]
}
|
Таким образом, когда рецензент не отвечает в течение followup_frequency
количества дней, вы отправите электронное письмо с напоминанием. Считайте конфигурацию в глобальную переменную, читая конфигурации:
1
2
3
4
5
6
|
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_frequency
. Подсчитайте количество дней с момента отправки отзыва.
1
2
3
|
review_date = datetime.datetime.strptime(review[‘sendDate’],’%Y-%m-%d’)
today = datetime.datetime.today()
days_since_review = (today — review_date).days
|
Если количество дней превышает дату повторного наблюдения в конфигурациях, отправьте электронное письмо с напоминанием.
1
2
3
|
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
:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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 .