Artigos

Não inclua isso no commit (gulp-check-grep)

Este artigo faz parte da série sobre ferramentas para garantir a qualidade do código.

Se você programa e usa controle de versão há algum tempo, é muito provável que já tenha incluído —ou quase incluído— em um commit código de depuração, comentários para si mesmo ou até arte ASCII. Sem julgar ninguém.

Os hooks de commit são muito úteis para validar o código antes de salvar algo de que você pode se arrepender.

Uso básico

gulp-check-grep é um plugin do gulp que processa seus arquivos, procura um padrão específico e gera um erro se o encontrar.

Por exemplo, se você quiser detectar pontos de interrupção do ipdb em Python:

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

É comum usar chamadas a print() para depurar ao programar com Django: .pipe(gulpCheckGrep(/print\(/g)). Essa linha pode salvar sua carreira.

Mas não são usadas apenas chamadas a print. Vamos cobrir outros casos também:

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

Função pass

A busca por padrões vai servir por algum tempo, mas, em algum momento, talvez você queira escrever em stdout. Em Python, o procedimento habitual é adicionar # noqa ao final da linha.

Você pode alterar as expressões regulares e usar asserções de contexto para ignorar as linhas que terminam em noqa, mas isso pode complicá-las. Por exemplo:

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

Felizmente, gulp-check-grep aceita um parâmetro opcional chamado pass, que é uma função.

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

A função pass recebe a linha que corresponde ao padrão, seu número e o objeto File. Esse objeto pode ser útil para ignorar a validação com base em outros conteúdos do arquivo; por exemplo, um comentário global # noqa no início:

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

A função pass deve retornar um valor booleano.

“Não inclua isso no commit (gulp-check-grep)” por Rodrigo Lopez está sob a licença CC BY SA. Os exemplos de código-fonte estão sob a licença MIT.

Foto de Matthew Fournier.

Classificado em Código aberto.

Leituras relacionadas