Статьи

Построение планировщика проверки кода Python: обзор последующих действий

В третьей части этой серии вы увидели, как сохранить информацию о запросе проверки кода для последующих действий . Вы создали метод 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»: [
        «[email protected]»,
        «[email protected]»,
        «[email protected]»,
        «[email protected]»
    ]
}

Таким образом, когда рецензент не отвечает в течение 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 .