Статьи

Создание планировщика проверки кода Python: отправка запросов на проверку

В первой части серии руководств вы увидели, как настроить проект и его необходимые конфигурации. Вы обработали git логи проекта и распечатали их в терминале. В этой части мы перейдем на следующий уровень и отправим запросы на проверку кода.

Начните с клонирования исходного кода из первой части серии руководств.

1
git clone https://github.com/royagasthyan/CodeReviewer CodeReviewer

После того, как вы клонировали репозиторий, перейдите в каталог проекта CodeReviewer и попробуйте выполнить следующую команду в терминале.

1
python scheduler.py -n 20 -p «project_x»

Он должен напечатать идентификаторы фиксации, дату фиксации и автора фиксации в терминале.

Вы получите подробную информацию о коммите, просматривая логи коммитов. Теперь вам нужно собрать детали фиксации и сохранить их в списке, чтобы вы могли повторить их позже, чтобы отправить запрос на проверку кода. Чтобы собрать подробности фиксации, начните с создания класса Commit с необходимыми членами, как показано ниже:

01
02
03
04
05
06
07
08
09
10
# ——————————————-
#
# Commit class to contain commit related info
#
# ——————————————-
class Commit:
    def __init__(self, Id, Author, Date):
        self.Id = Id;
        self.Author = Author;
        self.Date = Date;

Выполняя итерации журналов фиксации в методе process_commits , создайте экземпляр Commit чтобы сохранить детали фиксации.

В методе process_commits определите несколько переменных, как показано:

1
2
3
4
commitId = »
author = »
date = »
commits = []

Вы будете собирать каждую деталь коммита в список Python, называемый commits . При чтении журналов фиксации при первом обнаружении идентификатора фиксации сохраняйте идентификатор фиксации и сбрасывайте переменные даты и автора, поскольку это новый коммит. Измените код метода process_commits после проверки ключевого слова commit, как показано ниже:

1
2
3
4
if line.startswith(‘commit ‘):
   author = »
   date = »
   commitId = line[7:]

Когда идентификатор фиксации не равен NULL, именно тогда данные о коммите были собраны, и пришло время добавить коммит в список коммитов. Добавьте следующую строку кода в приведенный выше код:

1
2
3
4
5
6
if line.startswith(‘commit ‘):
   if commitId <> «»:
       commits.append(Commit(commitId, author, date))
   author = »
   date = »
   commitId = line[7:]

Измените проверку ключевого слова Author и проверку ключевого слова Date чтобы сохранить соответствующие данные фиксации в переменных author и date.

1
2
3
4
5
if line.startswith(‘Author:’):
    if(re.search(‘\<(.*?)\>’,line)):
        author = re.search(‘\<(.*?)\>’,line).group(1)
if line.startswith(‘Date:’):
    date = line[5:]

Теперь, если в исходном коде только один коммит, детали будут сохранены в списке коммитов. Поэтому добавьте следующий код в конец цикла для обработки этого сценария.

1
2
if commitId <> «»:
   commits.append(Commit(commitId, author, date))

Вот полный метод process_commits который собирает детали коммита и возвращает список коммитов.

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
27
28
29
30
31
# ———————————-
#
# Process the git log
#
# ———————————-
 
def process_commits():
    cmd = «cd » + project + «; git log —all —since=» + str(no_days) + «.day —name-status»
    response = execute_cmd(cmd)
    commitId = »
    author = »
    date = »
    commits = []
 
    for line in response.splitlines():
        if line.startswith(‘commit ‘):
            if commitId <> «»:
                commits.append(Commit(commitId, author, date))
            author = »
            date = »
            commitId = line[7:]
        if line.startswith(‘Author:’):
            if(re.search(‘\<(.*?)\>’,line)):
                author = re.search(‘\<(.*?)\>’,line).group(1)
        if line.startswith(‘Date:’):
            date = line[5:]
 
    if commitId <> «»:
        commits.append(Commit(commitId, author, date))
 
    return commits

У вас есть данные фиксации, собранные из журнала проекта. Вам нужно выбрать случайных разработчиков, чтобы отправить запрос на проверку кода. config.json файле config.json давайте добавим разработчиков, связанных с проектом, которые могут просмотреть код. Вот модифицированный файл config.json :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
[{
    «name»: «project_x»,
    «git_url»: «https://github.com/royagasthyan/project_x»,
    «members»: [
        «royagasthyan»,
        «hari»,
        «sam»,
        «shaun»
    ]
}, {
    «name»: «project_y»,
    «git_url»: «https://github.com/royagasthyan/project_y»,
    «members»: [
        «royagasthyan»,
        «hari»,
        «sam»,
        «shaun»
    ]
}]

Давайте прочитаем информацию разработчика, связанную с конкретным проектом. Определите публичную переменную с именем project_members .

1
project_members = »

При чтении конфигураций проекта, заполните детали участника проекта в переменной списка project_members .

01
02
03
04
05
06
07
08
09
10
11
#
# Read the scheduler config file
#
with open(‘config.json’) as cfg_file:
    main_config = json.load(cfg_file)
 
for p in main_config:
    if p[‘name’] == project:
        project_url = p[‘git_url’]
        project_members = p[‘members’]
    break

Теперь у вас есть список разработчиков, связанный с конкретным проектом, в переменной project_members .

Определите метод schedule_review_request который вы будете вызывать для планирования запроса на проверку, соответствующего каждой фиксации проекта. Запрос на проверку будет отправлен случайному разработчику из списка project_members , за исключением автора коммита.

Создайте метод с именем select_reviewer чтобы выбрать случайного разработчика из списка project_members . Чтобы выбрать случайных разработчиков из списка, вы будете использовать random модуль Python. Импортируйте random модуль Python.

1
import random

Вот как будет выглядеть код:

01
02
03
04
05
06
07
08
09
10
11
# ——————————————
#
# Method to select random reviewer
#
# ——————————————
 
def select_reviewer(author, group):
    if author in group:
        group.remove(author)
    reviewer = random.choice(group)
    return reviewer

Как видно из приведенного выше кода, автор коммитов был удален из списка разработчиков перед выбором случайных разработчиков для просмотра кода. Чтобы выбрать случайных разработчиков из списка, вы использовали метод random.choice из модуля random .

Внутри метода schedule_review_request итерируйте каждый коммит из списка коммитов. Для каждого коммита выберите случайного разработчика, отличного от автора коммита, для отправки запроса на проверку. Вот как будет выглядеть код:

1
2
3
def schedule_review_request(commits):
   for commit in commits:
       reviewer = select_reviewer(commit.Author, project_members)

Вы выбрали случайных разработчиков для отправки запроса на проверку кода. Перед отправкой запроса на проверку необходимо отформатировать его, указав сведения о запросе на проверку. Определите метод с именем format_review_commit который будет форматировать запрос на проверку кода. Вот как будет выглядеть код:

1
2
3
4
5
6
7
def format_review_commit(commit):
   review_req = «»
   review_req += «URL: » + project_url + ‘/commit/’ + commit.Id + «\n»
   review_req += «Commit: » + commit.Id + «\n»
   review_req += «Author: » + commit.Author + «\n»
   review_req += «Date: » + commit.Date + «\n»
   return review_req

В методе schedule_review_request создайте содержимое электронного письма с запросом на рецензирование, которое будет отправлено рецензенту. Содержимое электронной почты будет содержать информацию, необходимую для проверки рецензентом кода. Измените schedule_review_request как показано:

01
02
03
04
05
06
07
08
09
10
11
12
13
def schedule_review_request(commits):
   date = time.strftime(«%Y-%m-%d»)
    
   for commit in commits:
       reviewer = select_reviewer(commit.Author, project_members)
       subject = date + » Code Review [commit:» + commit.Id + «]»
       body = «Hello ‘» + reviewer + «‘, you have been selected to review the code for commit\n»
       body += «done by ‘» + commit.Author + «‘.\n»
       body += «\n»
        
       body += format_review_commit(commit)
 
       print body

Сохраните вышеуказанные изменения и запустите программу планировщика Python.

1
python scheduler.py -n 25 -p «project_x»

Вы должны увидеть вывод, подобный показанному ниже:

Вывод планировщика проверки кода

Создайте метод с именем send_email который отправит запрос на проверку по электронной почте с send_email требуемой темы и содержания. Вы будете использовать модуль smtplib для отправки электронных писем. Импортируйте smptlib в файл scheduler.py :

1
import smtplib

Определите детали почтового сервера вместе с общедоступными переменными:

1
2
3
4
FROM_EMAIL = «youemail@gmail.com»
FROM_PWD = «your password»
SERVER = «smtp.gmail.com»
PORT = 587

Создайте метод с именем send_email который будет отправлять электронную почту на указанный адрес. Вот как будет выглядеть код send_email :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
def send_email(to, subject, body):
   header = «From: » + FROM_EMAIL + «\n»
   header += «To: » + to + «\n»
   header += «Subject: » + subject + «\n»
   header += «\n»
   header += body
 
   print «** Sending email to ‘» + to + «‘»
    
    
   mail_server = smtplib.SMTP(SERVER, PORT)
   mail_server.starttls()
   mail_server.login(FROM_EMAIL, FROM_PWD)
   mail_server.sendmail(FROM_EMAIL, to, header)
   mail_server.quit()

Как видно из приведенного выше кода, вы создали сервер smtp используя сервер Gmail и номер порта. Используя определенное имя пользователя и пароль, вы вошли в учетную запись электронной почты и отправили письмо получателю.

Измените метод schedule_review_request чтобы отправлять электронную почту вместо печати содержимого электронной почты на терминал.

01
02
03
04
05
06
07
08
09
10
11
12
13
def schedule_review_request(commits):
   date = time.strftime(«%Y-%m-%d»)
    
   for commit in commits:
       reviewer = select_reviewer(commit.Author, project_members)
       subject = date + » Code Review [commit:» + commit.Id + «]»
       body = «Hello ‘» + reviewer + «‘, you have been selected to review the code for commit\n»
       body += «done by ‘» + commit.Author + «‘.\n»
       body += «\n»
        
       body += format_review_commit(commit)
 
       send_email(reviewer,subject,body)

Сохраните вышеуказанные изменения. Измените файл config.json в него действующий адрес электронной почты, который вы можете проверить. Запустите планировщик, используя следующую команду:

1
python scheduler.py -n 30 -p «project_x»

Вы должны увидеть следующий вывод на терминале:

Отправка запроса на проверку кода

Проверьте адрес электронной почты, чтобы увидеть запрос на проверку кода, отправленный из планировщика Code Review.

В этой части серии Планировщика проверки кода Python вы собрали информацию о коммите в список. Список коммитов был дополнительно повторен для форматирования запроса на рецензирование. Случайные разработчики были выбраны для отправки запроса на проверку кода.

В следующей части этой серии вы узнаете, как выполнить запрос на проверку кода.

Исходный код из этого урока доступен на GitHub .

Я надеюсь, вам понравилась эта часть. Дайте нам знать ваши мысли в комментариях ниже.