() translation by (you can also view the original English article)
En la primera parte de la serie, vio cómo configurar el proyecto y sus configuraciones requeridas. Usted procesó los registros git del proyecto y los mostro en el terminal. En esta parte, lo llevaremos al siguiente nivel y enviaremos las solicitudes de revisión de código.
Introducción
Comience por clonar el código fuente de la primera parte de la serie.
1 |
git clone https://github.com/royagasthyan/CodeReviewer CodeReviewer |
Una vez que haya clonado el repositorio, vaya al directorio del proyecto CodeReviewer
e intente ejecutar el siguiente comando en el terminal.
1 |
python scheduler.py -n 20 -p "project_x" |
Debe mostrar el ID, la fecha y el autor de los commit en el terminal.
Recolección de todos los Commits con detalles
Obtendrá los detalles del commit mientras itera los registros del commit. Ahora
necesita recopilar los detalles del commit y almacenarlos en
una lista, de modo que pueda iterarlos más tarde para enviar la
solicitud de revisión de código. Para recopilar los detalles del commit, comience creando una clase Commit
con los miembros requeridos como se muestra:
1 |
# -------------------------------------------
|
2 |
#
|
3 |
# Commit class to contain commit related info
|
4 |
#
|
5 |
# -------------------------------------------
|
6 |
class Commit: |
7 |
def __init__(self, Id, Author, Date): |
8 |
self.Id = Id; |
9 |
self.Author = Author; |
10 |
self.Date = Date; |
Mientras
itera los registros del commit en el método process_commits
, cree
una instancia de Commit
para mantener el detalle del commit.
En el método process_commits
, defina algunas variables como se muestra:
1 |
commitId = '' |
2 |
author = '' |
3 |
date = '' |
4 |
commits = [] |
Recogerá cada detalle del commit en una lista de Python denominada commits
. Mientras
lee los registros del commit, la primera vez que se encuentra el
ID del commit, mantenga la identificación del commit y vacíe
las variables de fecha y autor, ya que se trata de un nuevo commit. Modifique
el código del método process_commits
después de la comprobación de la
palabra clave commit, como se muestra a continuación:
1 |
if line.startswith('commit '): |
2 |
author = '' |
3 |
date = '' |
4 |
commitId = line[7:] |
Cuando el identificador del commit no es nulo, es cuando se han recopilado los datos del commit y es hora de agregar el commit a la lista de commits. Agregue la siguiente línea de código al código anterior:
1 |
if line.startswith('commit '): |
2 |
if commitId <> "": |
3 |
commits.append(Commit(commitId, author, date)) |
4 |
author = '' |
5 |
date = '' |
6 |
commitId = line[7:] |
Modifique
la palabra clave Author
y la palabra clave Date
para conservar los
detalles del commit respectivos del autor en las variables de autor y fecha.
1 |
if line.startswith('Author:'): |
2 |
if(re.search('\<(.*?)\>',line)): |
3 |
author = re.search('\<(.*?)\>',line).group(1) |
4 |
if line.startswith('Date:'): |
5 |
date = line[5:] |
Ahora, si sólo hay un commit en el código fuente, los detalles se guardarán dentro de la lista de commit. Por lo tanto, agregue el siguiente código al final del bucle para manejar ese escenario.
1 |
if commitId <> "": |
2 |
commits.append(Commit(commitId, author, date)) |
Aquí está el método completo process_commits
que recopila los detalles del commit y devuelve una lista de commits.
1 |
# ----------------------------------
|
2 |
#
|
3 |
# Process the git log
|
4 |
#
|
5 |
# ----------------------------------
|
6 |
|
7 |
def process_commits(): |
8 |
cmd = "cd " + project + "; git log --all --since=" + str(no_days) + ".day --name-status" |
9 |
response = execute_cmd(cmd) |
10 |
commitId = '' |
11 |
author = '' |
12 |
date = '' |
13 |
commits = [] |
14 |
|
15 |
for line in response.splitlines(): |
16 |
if line.startswith('commit '): |
17 |
if commitId <> "": |
18 |
commits.append(Commit(commitId, author, date)) |
19 |
author = '' |
20 |
date = '' |
21 |
commitId = line[7:] |
22 |
if line.startswith('Author:'): |
23 |
if(re.search('\<(.*?)\>',line)): |
24 |
author = re.search('\<(.*?)\>',line).group(1) |
25 |
if line.startswith('Date:'): |
26 |
date = line[5:] |
27 |
|
28 |
if commitId <> "": |
29 |
commits.append(Commit(commitId, author, date)) |
30 |
|
31 |
return commits |
Programación de una solicitud de revisión de código
Tiene los datos de commit recopilados en el registro del proyecto. Es necesario seleccionar desarrolladores aleatorios para enviar la solicitud de revisión de código. Dentro del archivo config.json
, vamos a añadir los desarrolladores asociados con el proyecto que pueden revisar el código. Aquí está el archivo config.json
modificado:
1 |
[{
|
2 |
"name": "project_x", |
3 |
"git_url": "https://github.com/royagasthyan/project_x", |
4 |
"members": [ |
5 |
"royagasthyan", |
6 |
"hari", |
7 |
"sam", |
8 |
"shaun"
|
9 |
]
|
10 |
}, { |
11 |
"name": "project_y", |
12 |
"git_url": "https://github.com/royagasthyan/project_y", |
13 |
"members": [ |
14 |
"royagasthyan", |
15 |
"hari", |
16 |
"sam", |
17 |
"shaun"
|
18 |
]
|
19 |
}]
|
Leamos la información del desarrollador relacionada con un proyecto en particular. Defina una variable pública denominada project_members
.
1 |
project_members = '' |
Al leer las configuraciones del proyecto, rellene los detalles del miembro del proyecto en la variable de lista project_members
.
1 |
#
|
2 |
# Read the scheduler config file
|
3 |
#
|
4 |
with open('config.json') as cfg_file: |
5 |
main_config = json.load(cfg_file) |
6 |
|
7 |
for p in main_config: |
8 |
if p['name'] == project: |
9 |
project_url = p['git_url'] |
10 |
project_members = p['members'] |
11 |
break
|
Ahora tiene la lista de desarrolladores relacionada con un proyecto en particular en la variable project_members
.
Defina
un método llamado schedule_review_request
que llame para programar la
solicitud de revisión correspondiente a cada commit de proyecto. La
solicitud de revisión se enviará a un desarrollador aleatorio de la
lista project_members
, con exclusión del autor del commit.
Cree un método llamado select_reviewer
para seleccionar el desarrollador aleatorio de la lista project_members
. Para seleccionar desarrolladores aleatorios de la lista, utilizarás el módulo random
de Python. Importe el módulo random
de Python.
1 |
import random |
Así es como se vería el código:
1 |
# -----------------------------------------
|
2 |
#
|
3 |
# Method to select random reviewer
|
4 |
#
|
5 |
# -----------------------------------------
|
6 |
|
7 |
def select_reviewer(author, group): |
8 |
if author in group: |
9 |
group.remove(author) |
10 |
reviewer = random.choice(group) |
11 |
return reviewer |
Como
se ve en el código anterior, el autor de confirmación se ha eliminado
de la lista de desarrolladores antes de seleccionar desarrolladores
aleatorios para revisar el código. Para seleccionar desarrolladores aleatorios de la lista, ha utilizado el método random.choice
del módulo random
.
Dentro del método schedule_review_request
, iterar a través de cada commit de la lista de los commits. Para cada commit, seleccione un desarrollador aleatorio que no sea el autor del commit para enviar la solicitud de revisión. Así es como se vería el código:
1 |
def schedule_review_request(commits): |
2 |
for commit in commits: |
3 |
reviewer = select_reviewer(commit.Author, project_members) |
Formatear la solicitud de revisión de código
Seleccionó desarrolladores aleatorios para enviar la solicitud de revisión de código. Antes de enviar la solicitud de revisión, debe formatearla con detalles sobre la solicitud de revisión. Defina un método denominado format_review_commit
que formateará la solicitud de revisión de código. Así es como se vería el código:
1 |
def format_review_commit(commit): |
2 |
review_req = "" |
3 |
review_req += "URL: " + project_url + '/commit/' + commit.Id + "\n" |
4 |
review_req += "Commit: " + commit.Id + "\n" |
5 |
review_req += "Author: " + commit.Author + "\n" |
6 |
review_req += "Date: " + commit.Date + "\n" |
7 |
return review_req |
En el método schedule_review_request
, crea el contenido de correo electrónico de solicitud de revisión que se enviará al revisor. El contenido del correo electrónico contendrá la información necesaria para que el revisor revise el código de confirmación. Modifique el schedule_review_request
como se muestra:
1 |
def schedule_review_request(commits): |
2 |
date = time.strftime("%Y-%m-%d") |
3 |
|
4 |
for commit in commits: |
5 |
reviewer = select_reviewer(commit.Author, project_members) |
6 |
subject = date + " Code Review [commit:" + commit.Id + "]" |
7 |
body = "Hello '" + reviewer + "', you have been selected to review the code for commit\n" |
8 |
body += "done by '" + commit.Author + "'.\n" |
9 |
body += "\n" |
10 |
|
11 |
body += format_review_commit(commit) |
12 |
|
13 |
print body |
Guarde los cambios anteriores y ejecute el programa planificador de Python.
1 |
python scheduler.py -n 25 -p "project_x" |
Debería poder ver una salida similar a la mostrada a continuación:



Envío por correo electrónico de la solicitud de revisión de código
Cree un método llamado send_email
que enviará por correo electrónico la solicitud de revisión con el tema y el contenido requeridos. Estará haciendo uso del módulo smtplib
para enviar los correos electrónicos. Debe importar smptlib
en el archivo scheduler.py
:
1 |
import smtplib |
Defina los detalles del servidor de correo junto con las variables públicas:
1 |
FROM_EMAIL = "youemail@gmail.com" |
2 |
FROM_PWD = "your password" |
3 |
SERVER = "smtp.gmail.com" |
4 |
PORT = 587 |
Cree un método llamado send_email
que enviará el correo electrónico a la dirección especificada. Así es como se vería el código send_email
:
1 |
def send_email(to, subject, body): |
2 |
header = "From: " + FROM_EMAIL + "\n" |
3 |
header += "To: " + to + "\n" |
4 |
header += "Subject: " + subject + "\n" |
5 |
header += "\n" |
6 |
header += body |
7 |
|
8 |
print "** Sending email to '" + to + "'" |
9 |
|
10 |
|
11 |
mail_server = smtplib.SMTP(SERVER, PORT) |
12 |
mail_server.starttls() |
13 |
mail_server.login(FROM_EMAIL, FROM_PWD) |
14 |
mail_server.sendmail(FROM_EMAIL, to, header) |
15 |
mail_server.quit() |
Como se ve en el código anterior, creó el servidor smtp
utilizando el servidor de gmail y el número de puerto. Utilizando
el nombre de usuario y la contraseña definidos, se registró en la
cuenta de correo electrónico y envió el correo electrónico al
destinatario.
Modifique
el método schedule_review_request
para enviar el correo electrónico en
lugar de mostrar el contenido del correo electrónico en el terminal.
1 |
def schedule_review_request(commits): |
2 |
date = time.strftime("%Y-%m-%d") |
3 |
|
4 |
for commit in commits: |
5 |
reviewer = select_reviewer(commit.Author, project_members) |
6 |
subject = date + " Code Review [commit:" + commit.Id + "]" |
7 |
body = "Hello '" + reviewer + "', you have been selected to review the code for commit\n" |
8 |
body += "done by '" + commit.Author + "'.\n" |
9 |
body += "\n" |
10 |
|
11 |
body += format_review_commit(commit) |
12 |
|
13 |
send_email(reviewer,subject,body) |
Guarde los cambios anteriores. Modifique el archivo config.json
para incluir una dirección de correo electrónico válida que puede comprobar. Ejecute el planificador mediante el siguiente comando:
1 |
python scheduler.py -n 30 -p "project_x" |
Debe poder ver la siguiente salida en el terminal:



Compruebe la dirección de correo electrónico para ver la solicitud de revisión de código enviada por correo desde el planificador de revisión de código.
Conclusion
En esta parte de la serie Creando una Lista de revisión de código con Python, recogió la información de confirmación en una lista. La lista de confirmación se itera para dar formato a la solicitud de revisión. Los desarrolladores aleatorios fueron seleccionados para enviar la solicitud de revisión de código.
En la siguiente parte de esta serie, verá cómo realizar el seguimiento de la solicitud de revisión de código.
El código fuente de este tutorial está disponible en GitHub.
Espero que hayas disfrutado de esta parte. Háganos saber sus pensamientos en los comentarios a continuación.