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.