Advertisement
  1. Code
  2. Python

Creando una Lista de revisión de código con Python: Envío de solicitudes de revisión

Scroll to top
Read Time: 9 min
This post is part of a series called Building a Python Code Review Scheduler.
Building a Python Code Review Scheduler: Processing Log
Building a Python Code Review Scheduler: Keeping the Review Information

() 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:

Code Review Scheduler OutputCode Review Scheduler OutputCode Review Scheduler Output

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:

Code Review Request Sending OutputCode Review Request Sending OutputCode Review Request Sending Output

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.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.