Advertisement
  1. Code
  2. Python

Creando una Lista de revisión de código con Python: procesamiento de registros 

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: Sending Review Requests

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

En esta serie de tutoriales, verá cómo crear un planificador de revisión de código utilizando Python. A lo largo del curso de esta serie, te acercarás a algunos conceptos básicos como leer correos electrónicos, enviar un correo electrónico, ejecutar comandos de terminal desde el programa Python, procesar registros de git, etc.

En la primera parte, comenzarás por configurar los archivos de configuración básicos, leer los registros de git y procesarlos para enviar la solicitud de revisión de código.

Introducción

Comience creando una carpeta de proyecto llamada CodeReviewer. Dentro de la carpeta CodeReviewer, cree un archivo llamado scheduler.py.

Suponiendo que el planificador de revisión de código se ejecute en varios proyectos, deberá especificar el nombre del proyecto con el que se ejecutará el planificador y el número de días que debe procesar el registro. Primero lea estos dos parámetros como argumentos del programa de revisión de código.

Hagamos uso del módulo argparse de Python para leer los parámetros del programa. Importe la biblioteca y agregue los argumentos del programa. Puede utilizar el método ArgumentParser del módulo argparse para iniciar el analizador. Una vez iniciado, puede agregar los argumentos al analizador. Aquí está el código para leer los argumentos del programa:

1
import argparse
2
3
parser = argparse.ArgumentParser(description="Code Review Scheduler Program")
4
parser.add_argument("-n", nargs="?", type=int, default=1, help="Number of (d)ays to look for log. ")
5
parser.add_argument("-p", nargs="?", type=str, default="em", help="Project name.")
6
args = parser.parse_args()
7
8
no_days = args.n
9
project = args.p
10
11
print 'Processing the scheduler against project ' + project + '....'

Creando configuraciones del proyecto

Mantengamos un archivo de configuración separado que será procesado por el revisor de código. Cree un archivo llamado config.json dentro del directorio de proyecto CodeReviewer. Dentro del archivo de configuración, habrá información sobre cada proyecto que se procesará. Así es como se vería el archivo de configuración del proyecto:

1
[{
2
    "name": "project_x",
3
    "git_url": "https://github.com/royagasthyan/project_x"
4
}, {
5
    "name": "project_y",
6
    "git_url": "https://github.com/royagasthyan/project_y"
7
}]

En las partes posteriores se añadirían algunas opciones más a las configuraciones del proyecto.

Leamos el archivo JSON de configuración en el programa Python. Importe el módulo JSON y cargue los datos JSON leídos del archivo de configuración.

1
#

2
# Read the scheduler config file

3
#

4
with open('config.json') as cfg_file:
5
    main_config = json.load(cfg_file)

Leer información del Commit desde el repositorio

Cuando se ejecuta el script de revisión, el nombre del proyecto se especifica como un parámetro. Basándose en el nombre del proyecto especificado, comprueba si sus configuraciones están disponibles y clona el repositorio.

En primer lugar, es necesario encontrar la URL del proyecto desde las configuraciones. Itere los datos del proyecto y busque la URL del proyecto como se muestra:

1
for p in main_config:
2
    if p['name'] == project:
3
        project_url = p['git_url']
4
    break

Una vez que tenga la URL del proyecto, compruebe si el proyecto ya está clonado. Si no, clone la URL del proyecto. Si ya existe, navegue hasta el directorio del proyecto existente y obtenga (pull) los cambios más recientes.

1
# Clone the repository if not already exists

2
print "********* Doing project checkout **********"
3
if(os.path.isdir("./" + project)):
4
    execute_cmd("cd " + project + "; git pull")
5
else:
6
    execute_cmd("git clone " + project_url + " " + project)
7
print "*** Done *******"
8
print " "

Para ejecutar comandos del sistema, estarás haciendo uso del módulo os de Python. Cree un método para ejecutar comandos del sistema, ya que lo usará con frecuencia. Aquí está el método execute_cmd:

1
def execute_cmd(cmd):
2
    print "***** Executing command '"+ cmd + "'"
3
    response = os.popen(cmd).read()
4
    return response

Procesamiento del registro de Git

Después de buscar el registro del commit en el repositorio de Git, analizará el registro. Cree un nuevo método Python llamado process_commits para procesar los registros de Git.

1
def process_commits():
2
    # code would be here

Git nos proporciona los comandos para obtener el registro del commit. Para obtener todos los registros de un repositorio, el comando sería:

1
git log --all

La respuesta sería:

1
commit 04d11e21fb625215c5e672a93d955f4a176e16e4
2
Author: royagasthyan <royagasthyan@gmail.com>
3
Date:   Wed Feb 8 21:41:20 2017 +0530
4
5
    Create README.md

También puede obtener registros específicos para el número de días a partir del momento en que se ejecuta el comando. Para obtener registros desde n número de días, el comando sería:

1
git log --all --since=n.days

Puede reducirlo aún más para ver si un commit concreto fue una adición, modificación o eliminación. Ejecute el comando anterior con --name-status:

1
git log --all --since=10.days --name-status

El comando anterior tendría la siguiente salida:

1
commit 04d11e21fb625215c5e672a93d955f4a176e16e4
2
Author: royagasthyan <royagasthyan@gmail.com>
3
Date:   Wed Feb 8 21:41:20 2017 +0530
4
5
    Create README.md
6
7
A       README.md

La letra A del lado izquierdo del archivo README.md indica la adición. Del mismo modo, M indicaría modificación y D indicaría supresión.

Dentro del método process_commits, vamos a definir el comando Git a ejecutar para obtener el historial del registro.

1
cmd = "cd " + project + "; git log --all --since=" + str(no_days) + ".day --name-status"

Pase el comando cmd anterior al método execute_cmd.

1
response = execute_cmd(cmd)

Lea la respuesta, iterar cada línea e mostrar la misma.

1
def process_commits():
2
    cmd = "cd " + project + "; git log --all --since=" + str(no_days) + ".day --name-status"
3
    response = execute_cmd(cmd)
4
5
    for line in response.splitlines():
6
        print line

Hacer una llamada al método process_commits después de haber leído las configuraciones.

1
print 'Processing the scheduler against project ' + project + '....'
2
process_commits()

Guarde los cambios anteriores e intente ejecutar el revisor de código con el siguiente comando:

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

Como puede ver, hemos iniciado el revisor de código con el número de días y el nombre del proyecto a procesar. Debería poder ver la siguiente salida:

1
********* Doing project checkout **********
2
***** Executing command 'cd project_x; git pull'
3
*** Done *******
4
 
5
Processing the scheduler against project project_x....
6
***** Executing command 'cd project_x; git log --all --since=10.day --name-status'
7
commit 04d11e21fb625215c5e672a93d955f4a176e16e4
8
Author: royagasthyan <royagasthyan@gmail.com>
9
Date:   Wed Feb 8 21:41:20 2017 +0530
10
11
    Create README.md
12
13
A    README.md

Por lo tanto, cuando ejecuta el revisor de código, puede ver que el repositorio se crea si aún no existe, o bien se actualiza. Después de eso, basado en el número de días que se proporcionan, busca el historial de registro del commit para procesar.

Ahora vamos a analizar el registro del commit para averiguar la identificación, fecha y autor del commit.

Como se ve en los registros, el id del commit comienza con la palabra clave commit, el autor comienza con la palabra clave Author:, y la fecha comienza con la palabra clave Date:. Utilizará las siguientes palabras clave para identificar el Id del commit, el autor y la fecha de un commit.

Intentemos obtener el Id del commit de las líneas de registro de Git. Esto es bastante sencillo. Sólo necesita comprobar si la línea comienza con la palabra clave commit.

1
for line in response.splitlines():
2
    if line.startswith('commit '):
3
        print line[7:]

Guarde los cambios y ejecute el planificador y debería poder obtener el Id del commit .

La siguiente tarea es extraer el nombre del autor. Para comprobar si la línea contiene la información del autor, primero verificará si la línea comienza con la palabra clave Author. Si lo hace, hará uso de una expresión regular para obtener el usuario.

Como puede ver, la dirección de correo electrónico del usuario está dentro de los signos "Menos que, mayor que". Usaremos una expresión regular para leer la dirección de correo electrónico entre <>. La expresión regular será así:

1
'\<(.*?)\>'

Importe el módulo re de Python para utilizar expresiones regulares en Python.

1
import re

Ahora compruebe si la línea comienza con la palabra clave Author. Si lo hace, extraiga la dirección de correo electrónico del usuario utilizando la expresión regular anterior. Así es como se vería:

1
if line.startswith('Author:'):
2
    if(re.search('\<(.*?)\>',line)):
3
        print re.search('\<(.*?)\>',line).group(1)

Para extraer la fecha del registro del commit, debe comprobar si la línea comienza con la palabra clave Date. Así es como se vería:

1
if line.startswith('Date:'):
2
    print line[5:]

Aquí está el método final process_commits:

1
def process_commits():
2
    cmd = "cd " + project + "; git log --all --since=" + str(no_days) + ".day --name-status"
3
    response = execute_cmd(cmd)
4
5
    for line in response.splitlines():
6
        if line.startswith('commit '):
7
            print line[7:]
8
        if line.startswith('Author:'):
9
            if(re.search('\<(.*?)\>',line)):
10
                print re.search('\<(.*?)\>',line).group(1)
11
        if line.startswith('Date:'):
12
            print line[5:]

Guarde los cambios anteriores e inicie el revisor de código.

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

Debe tener cada detalle del commit con la fecha del commit, el autor y del commit impresa en el terminal.

Concluyendo

En esta primera parte del Creando una Lista de revisión de código con Python, vio cómo configurar el proyecto. Lea los parámetros de entrada requeridos por el planificador para procesar el proyecto. En la siguiente parte de esta serie de tutoriales, recopilaremos los detalles de commit del método process_commits y enviaremos el commit a desarrolladores aleatorios para la revisión de código.

No dude en ver lo que tenemos disponible para la venta y para el estudio en Envato Market, y no dude en hacer cualquier pregunta y proporcionar su valiosos comentarios utilizando el feed a continuación.

Espero que haya disfrutado de la primera parte. Háganos saber sus pensamientos o sugerencias en los comentarios a continuación.

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.