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