leanmind logo leanmind text logo

Blog

Código Sostenible

Cómo escribir código fácil de mantener mediante valores, principios y técnicas.

Crea tu propio watcher

Por Eric Driussi

En ocasiones trabajamos con proyectos sin “hot reload” o una librería de tests sin “watcher”, teniendo que relanzar a cada rato la aplicación y/o los tests. Según el flujo de trabajo, sobre todo si estás haciendo TDD, esto puede resultar algo tedioso.

No hay necesidad de hacer a mano tareas repetitivas, ¡tenemos tecnología!

tech

Vamos a preparar nuestro propio watcher-reloader multi uso, ¡con extra de colorines!

Ingredientes

Preparación

Para empezar con buen pie, creamos un alias/una función para mantener el orden:


alias watch="run_on_change"; run_on_change() {}

Pescamos todo lo que le pasemos (por ejemplo el comando que lanza nuestros tests) tal que "$@" y se lo pasamos a inotifywait:


inotifywait -qq -r -e create,modify,move,delete ./ && "$@"

inotifywait: -qq para que no nos cuente su vida. -r para evaluar revursivamente todos los directorios hijos. -e create,modify,move,delete para que solo responda a eventos de este tipo. De lo contrario lanzaría el comando con cada letra que escribamos en los ficheros.

Encerramos el comando en un while y nos quedamos con algo así:


alias watch="run_on_change"; run_on_change() {
"$@"
while true; do
inotifywait -qq -r -e create,modify,move,delete ./ && "$@"
done
}

Por lo pronto hemos pasado de un flujo como este:

crea-tu-propio-watcher-pre.gif

A uno algo más cómodo:

crea-tu-propio-watcher-base.gif

Presentación

Por ahora tenemos el MVP. Vamos a ver si podemos adornarlo un poquito.

Aunque hot reload sea suficiente, como watcher para tests parece que falta algo. Dependemos del output de nuestra librería para colores; la cual puede pintarnos adecuadamente los tests fallidos/exitosos, o puede no hacerlo (como es el caso de go test).

Vamos a darle una vuelta al formato del output para ver con claridad el resultado de los tests.

Para empezar, espaciemos un poco las cosas mejorando el comando que tenemos en el while:


inotifywait -qq -r -e create,modify,move,delete ./ &&
printf "\n[ . . . Re-running command . . . ]\n" &&
"$@"

Luego, podemos usar nuestro querido amigo y fiel compañero sed, para pintar las palabras fail y pass (o cualquiera que nos encaje) de rojo y verde respectivamente.

Dentro de nuestra función, añadimos otra a la que le pasaremos el comando re-lanzar:


color_command(){
# Palabras a buscar en el output del comando
pass_terms="pass"
fail_terms="fail"

# Estilos (colores, negrita) que aplicar a las palabras
pass_color=$'\e[1;32m'
fail_color=$'\e[1;31m'
reset_color=$'\e[0m'

# Palabras ya parseadas
colored_pass_terms="${pass_color}&${reset_color}"
colored_fail_terms="${fail_color}&${reset_color}"

"$@" | sed \
-Ee "s/${pass_terms}/${colored_pass_terms}/" \
- Ee "s/${fail_terms}/${colored_fail_terms}/"
}

Los códigos \e no son más que códigos ANSI para los estilos a aplicar. Son muy útiles pero un dolor al leer y al modificar, por lo que si queremos darle más vueltas de tuerca a esta parte, sería recomendable instalar ncurses y usar algo como:


pass_color="$(tput setaf 2)$(tput bold)"
fail_color="$(tput setaf 1)$(tput bold)"
reset_color="$(tput sgr0)"

En cualquier caso, podemos modificar esta parte a nuestro antojo.

Si por ejemplo parseamos varias palabras, lo hacemos case insensitive y añadimos emojis, nos quedamos con algo como esto:


alias watch="run_on_change"; run_on_change() {
color_command(){
pass_terms="pass|ok"
fail_terms="fail|failed"
pass_color=$'\e[1;32m'
fail_color=$'\e[1;31m'
reset_color=$'\e[0m'

colored_pass_terms="✅ ${pass_color}&${reset_color}"
colored_fail_terms="❌ ${fail_color}&${reset_color}"

"$@" | sed \
-Ee "s/${pass_terms}/${colored_pass_terms}/I" \
- Ee "s/${fail_terms}/${colored_fail_terms}/I"
}

color_command "$@"
while true; do
inotifywait -qq -r -e create,modify,move,delete ./ &&
printf "\n[ . . . Re-running command . . . ]\n" &&
color_command "$@"
done
}

Nuestro flujo de testing ahora es algo más cómodo y podemos extenderlo bajo demanda:

crea-tu-propio-watcher-post.gif

¡Happy TDD!

Publicado el 17/01/2024 por

¿Quieres más? te invitamos a suscribirte a nuestro boletín para avisarte cada vez que recopilemos contenido de calidad que compartir.

Si disfrutas leyendo nuestro blog, ¿imaginas lo divertido que sería trabajar con nosotros? ¿te gustaría?

Impulsamos el crecimiento profesional de tu equipo de developers