Advertisement
  1. Code
  2. Python

Construcción de un Programador de Tareas de Revisión de Código Python: Revisión de seguimiento

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

() translation by (you can also view the original English article)

En la tercera parte de esta serie este cómo guardar la información de solicitud de revisión de código para seguimiento. Creaste un método llamado read_email para recuperar los correos de la bandeja de entrada para comprobar si un revisor ha respondido a la solicitud de revisión de código. También implementaste manejo de errores en el programador de revisión de código.

En esta parte de la serie, vas a usar la información guardada de revisión de código y la información de los email para revisar si el revisor ha respondido a la solicitud de revisión. Si una solicitud no ha sido respondida, enviarás un email de seguimiento al revisor.

Comenzando

Comienza clocando el código fuente de la tercera parte de la serie de tutoriales.

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

Modifica el archivo config.json para incluir unas direcciones de email relevantes, manteniendo la dirección de email royagasthyan@gmail.com. Eso es porque git tiene commits relacionados a esta dirección de email en particular, los cuales son requeridos por el código para ejecutarse como se espera. Modifica las credenciales SMTP en el archivo schedule.py:

1
FROM_EMAIL      = "your_email_address@gmail.com"
2
FROM_PWD        = "your_password"

Navega al directorio del proyecto CodeReviewer e intenta ejecutar el siguiente comando en la terminal.

1
python scheduler.py -n 20 -p "project_x"

Debería de enviar la solicitud de revisión de código a desarrolladores aleatorios para revisión y crear un archivo reviewer.json con la información de revisión.

Implementando una Solicitud de Seguimiento

Vamos a comenzar creando un método de seguimiento de solicitud llamado followup_request. Dentro del método followup_request lee el archivo reviewer.json y mantiene el contenido en una lista. Así es como el código se ve:

1
with open('reviewer.json','r') as jfile:
2
    review_info = json.load(jfile)

A continuación, obtén de la información de correo electrónico utilizando el método read_email que implementaste en el tutorial pasado.

1
email_info = read_email(no_days)

Si el revisor ha respondido a la solicitud de revisión, debería de haber un email con el mismo asunto y una etiqueta Re: de prefijo. Entonces itera a través de la lista de información de revisión y compara el asunto de revisión con el asunto del email para ver si el revisor ha respondido a la solicitud.

1
for review in review_info:
2
    review_replied = false
3
    expected_subject = 'RE: ' + review['subject']
4
    for email in email_info:
5
        if expected_subject == email['subject']:
6
            review_replied = True
7
            print 'Reviewer has responded'
8
            break;

Como se ve en el código anterior, iteraste a través de la lista review_info y revisaste la información de asunto de la revisión con el asunto del correo electrónico para ver si el revisor ha respondido.

Ahora, una vez que el revisor ha respondido a la solicitud de revisión de código, no necesitas mantener una información particular de revisión en el archivo reviewer.json. Entonces crea un método de Python llamado Delete_Info para remover la información particular de revisión del archivo reviewer.json. Así es como Delete_Info se ve:

1
def Delete_Info(info, id):
2
    for i in xrange(len(info)):
3
        if info[i]['id'] == id:
4
            info.pop(i)
5
            break
6
    return info

Como se ve en el código anterior, has iterado a través de la lista de información de revisión y borrando la entrada que encaja con el Id. Luego de remover la información del archivo, devuelve la lista.

Necesitas llamar al método Delete_Info cuando una pieza particular de información de revisión es respondida. Cuando se llame al método Delete_Info, necesitas pasar una copia de review_info así la lista de información original no es alterada. Después necesitarás la lista de información de revisión original para comparación. Así que importa el módulo copy de Python para crear una copia de la lista original de información de revisión.

1
from copy import copy

Crea una copia de la lista review_info.

1
review_info_copy = copy(review_info)

Cuando elimines la información de revisión a la cual se ha respondido de la lista original, pasa una copia de la lista al método Delete_Info.

1
review_info_copy = Delete_Info(review_info_copy,review['id'])

Aquí está el método followup_request:

1
def followup_request():
2
    with open('reviewer.json','r') as jfile:
3
        review_info = json.load(jfile)
4
    review_info_copy = copy(review_info)
5
6
    email_info = read_email(no_days)
7
8
    for review in review_info:
9
        review_replied = False
10
        expected_subject = 'Re: ' + review['subject']
11
        for email in email_info:
12
            if expected_subject == email['Subject']:
13
                review_replied = True
14
                review_info_copy = Delete_Info(review_info_copy,review['id'])
15
                break;

Ahora, una vez que la lista review_info ha sido iterada, necesitas revisar si hay algún cambio en el archivo reviewer.json. Si alguna información de revisión existente ha sido removida, necesitas actualizar el archivo reviewer.json apropiadamente. Revisa si review_info_copy y review_info son el mismo, y actualiza el archivo reviewer.json.

1
if review_info_copy != review_info:
2
    with open('reviewer.json','w') as outfile:
3
        json.dump(review_info_copy,outfile)

Aquí está el método completo followup_request:

1
def followup_request():
2
    with open('reviewer.json','r') as jfile:
3
        review_info = json.load(jfile)
4
    review_info_copy = copy(review_info)
5
6
    email_info = read_email(no_days)
7
8
    for review in review_info:
9
        review_replied = False
10
        expected_subject = 'Re: ' + review['subject']
11
        for email in email_info:
12
            if expected_subject == email['Subject']:
13
                review_replied = True
14
                review_info_copy = Delete_Info(review_info_copy,review['id'])
15
                break;
16
17
    if review_info_copy != review_info:
18
        with open('reviewer.json','w') as outfile:
19
            json.dump(review_info_copy,outfile)

Has una llamada al método followup_request para seguir las solicitudes de revisión que ya han sido enviadas.

1
try:
2
    commits = process_commits()
3
4
    # Added the follow Up Method

5
    followup_request()
6
7
    if len(commits) == 0:
8
        print 'No commits found '
9
    else:
10
        schedule_review_request(commits)
11
12
except Exception,e:
13
    print 'Error occurred. Check log for details.'
14
    logger.error(str(datetime.datetime.now()) + " - Error occurred : " + str(e) + "\n")
15
    logger.exception(str(e))

Guarda los cambios de arriba. Para probar la funcionalidad de seguimiento, borra el archivo reviewer.json del directorio del proyecto. Ahora ejecuta el programador para que las solicitudes de revision de código sean enviadas a desarrolladores aleatorios. Revisa si la información ha sido guardada en el archivo reviewer.json.

Pregunta al desarrollador en particular que responda a la solicitud de revisión de código respondiendo al email. Ahora ejecuta el programador de nuevo, y esta ves debería de ser capaz de encontrar la respuesta y removerlo del archivo reviewer.json.

Enviando Correos Electrónicos de Recordatorio

Una vez que el revisor ha respondido a los correos electrónicos de solicitudes de revisión de código, esa información necesita ser removida del archivo reviewer.json ya que no necesitas rastrearla mas. Si el revisor no ha respondido a la solicitud de revisión de código, necesitas enviar un correo electrónico de seguimiento para recordarle sobre la solicitud de revisión.

El programador de revisión de código sería ejecutado a diario. Cuando se esté ejecutando, primero necesitas revisar si ha pasado cierto tiempo desde que el desarrollador ha respondido a la solicitud de revisión. En la configuración del proyecto, puedes ajustar un periodo de revisión durante el cual, si el revisor no ha respondido, el programador enviaría un correo electrónico de recordatorio.

Vamos a comenzar agregando un ajuste en la configuración del proyecto. Agrega una nueva configuración llamada followup_frequency en el archivo de configuración.

1
{
2
    "name": "project_x",
3
    "git_url": "https://github.com/royagasthyan/project_x",
4
    "followup_frequency":2,
5
    "members": [
6
        "royagasthyan@gmail.com",
7
      "samon@gmail.com",
8
    	"sualonni@gmail.com",
9
    	"restuni@gmail.com"
10
    ]
11
}

Entonces cuando el revisor no haya respondido por followup_frequency numero de días, enviarás un correo electrónico de recordatorio. Lee la configuración dentro de una variable global mientras lees las configuraciones:

1
for p in main_config:
2
    if p['name'] == project:
3
        project_url = p['git_url']
4
        project_members = p['members']
5
        followup_frequency = p['followup_frequency']
6
    break

Dentro del método followup_request, envía un email de recordatorio cuando el revisor no haya respondido a las solicitudes de seguimiento por followup_frequency numero de días. Calcula el numero de días desde que la revisión fue enviada.

1
review_date = datetime.datetime.strptime(review['sendDate'],'%Y-%m-%d')
2
today = datetime.datetime.today()
3
days_since_review = (today - review_date).days

Si el número de días es mas grande de que la fecha frecuencia de seguimiento en las configuraciones, envía el correo electrónico de recordatorio.

1
if not review_replied:
2
    if days_since_review > followup_frequency:
3
        send_email(review['reviewer'],'Reminder: ' + review['subject'],'\nYou have not responded to the review request\n')

Aquí está el método followup_request completo:

1
def followup_request():
2
    with open('reviewer.json','r') as jfile:
3
        review_info = json.load(jfile)
4
    review_info_copy = copy(review_info)
5
6
    email_info = read_email(no_days)
7
8
    for review in review_info:
9
        review_date = datetime.datetime.strptime(review['sendDate'],'%Y-%m-%d')
10
        today = datetime.datetime.today()
11
        days_since_review = (today - review_date).days
12
        review_replied = False
13
        expected_subject = 'Re: ' + review['subject']
14
        for email in email_info:
15
            if expected_subject == email['Subject']:
16
                review_replied = True
17
                review_info_copy = Delete_Info(review_info_copy,review['id'])
18
                break;
19
20
        if not review_replied:
21
            if days_since_review > followup_frequency:
22
                send_email(review['reviewer'],'Reminder: ' + review['subject'],'\nYou have not responded to the review request\n')
23
24
    if review_info_copy != review_info:
25
        with open('reviewer.json','w') as outfile:
26
            json.dump(review_info_copy,outfile)

En Resumen

En este tutorial, viste cómo implementar la lógica para seguir solicitudes de revisión de código. También agregaste la funcionalidad para enviar un correo electrónico de recordatorio si el revisor no ha respondido al email por un cierto numero de días.

Este revisor de código Python puede ser mejorado para ajustarse a tus necesidades. Bifurca el repositorio y agrega nuevas funciones, y haznos saber en los comentarios de abajo.

El código fuente de este tutorial está disponible en Github.

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.