Artículos

No incluyas eso en el commit (gulp-check-grep)

Este artículo forma parte de la serie sobre herramientas para garantizar la calidad del código.

Si llevas tiempo programando y usando control de versiones, es muy probable que alguna vez hayas incluido —o casi incluido— en un commit código de depuración, comentarios para ti mismo o incluso arte ASCII. Sin juzgar a nadie.

Los hooks de commit son muy útiles para validar el código antes de guardar algo de lo que podrías arrepentirte.

Uso básico

gulp-check-grep es un plugin de gulp que procesa los archivos, busca un patrón específico y genera un error si lo encuentra.

Por ejemplo, si quieres detectar puntos de interrupción de ipdb en Python:

gulp.task('check', function () {
  return gulp.src('**/*.py'
    .pipe(gulpCheckGrep(/ipdb\.set_trace\(/g, {message: 'Found ipdb breakpoint'}))
    .pipe(gulpCheckGrep.failOnError());
    });

Es frecuente usar llamadas a print() para depurar al programar con Django: .pipe(gulpCheckGrep(/print\(/g)). Esta línea podría salvar tu carrera.

Pero no solo se usan llamadas a print. Vamos a cubrir también otros casos:

.pipe(gulpCheckGrep([/print\(/g, /stdout\.write\(/g,], {message: 'stdout write found'}))

Función pass

La búsqueda de patrones te servirá durante un tiempo, pero en algún momento quizá necesites escribir en stdout. En Python, el procedimiento habitual es agregar # noqa al final de la línea.

Puedes modificar las expresiones regulares y usar aserciones de contexto para ignorar las líneas que terminan en noqa, pero eso puede complicarlas. Por ejemplo:

checkGrep(/print\((.(?!noqa$))+$/gm, {message: 'print call'},

Por suerte, gulp-check-grep acepta un parámetro opcional llamado pass, que es una función.

.pipe(gulpCheckGrep(/print\(/g, {pass: (line, lineNumber, file) => line.endsWith('# noqa')}))

La función pass recibe la línea que coincide con el patrón, su número y el objeto File. Este objeto puede ser útil si quieres omitir la validación según otros contenidos del archivo; por ejemplo, un comentario global # noqa al principio:

.pipe(gulpCheckGrep(/print\(/g, {pass: (line, lineNumber, file) => file.contents.startsWith('# noqa')}))

La función pass debe devolver un valor booleano.

“No incluyas eso en el commit (gulp-check-grep)” de Rodrigo Lopez está bajo la licencia CC BY SA. Los ejemplos de código fuente están bajo la licencia MIT.

Foto de Matthew Fournier.

Clasificado en Código abierto.

Lecturas relacionadas