В первой части серии руководств вы увидели, как настроить проект и его необходимые конфигурации. Вы обработали 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
|
Создайте метод с именем 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 .
Я надеюсь, вам понравилась эта часть. Дайте нам знать ваши мысли в комментариях ниже.