Analisador de sintaxe de Looker Liquid

O Looker lançou um novo analisador de sintaxe líquida no Looker 21.6. O novo analisador de sintaxe de líquido do Looker é usado durante a validação do LookML e expõe erros de sintaxe do Liquid. Esse analisador tem como objetivo evitar falhas silenciosas, facilitar a depuração da sintaxe de líquido, melhorar a segurança de referências de atributo do usuário e o armazenamento em cache dos resultados, além de detectar referências de campo dinâmico de forma mais eficaz. Como esse analisador introduz novas verificações de sintaxe Liquid válida, é possível que você veja novas mensagens de validação para a sintaxe líquida existente.

Para as versões do Looker anteriores à 22.2, o analisador era controlado por um recurso legado chamado Líquido tolerante de sintaxe. Esse recurso legado não afetava o uso do analisador, mas afetava o nível dos erros expostos. Quando o recurso legado Sintaxe de tolerância a sintaxe era ativado, todos os erros eram categorizados como informativos. A partir do Looker 22.2, o recurso Sintaxe de tolerância foi totalmente removido. Consulte a programação da descontinuação de recursos legados para saber mais detalhes.

Com o novo analisador de líquidos, todos os erros são categorizados como avisos, o que pode ter implicações para confirmações de código, dependendo da configuração de Qualidade do código do projeto.

O analisador de líquidos atualmente não renderiza o Fluid em consultas em execução. Fique de olho nas próximas notas da versão.

Como interpretar avisos de sintaxe de líquido

Os novos avisos de sintaxe de líquidos são detalhados e incluem explicitamente as seguintes informações:

  • A entrada problemática seguida pela linha e pelo número de índice da entrada dentro do bloco Liquid
  • Um link para o arquivo de visualização do LookML relevante e a linha de código

Veja o exemplo do erro a seguir:

Error parsing liquid: Liquid parse exception: parser error "extraneous input '{{' expecting {Str, '(', '[', DoubleNum, LongNum, 'capture', 'endcapture', 'comment'
'endcomment', RawStart, 'if ', 'elsif', 'endif', 'unless ', 'endunless', 'else ', 'contains', 'case', 'endcase', 'when', 'cycle', 'for', 'endfor', 'in ', 'and', 'or'
'tablerow', 'endtablerow', 'assign', 'true', 'false', Nil, 'include', 'with ', 'empty','blank', EndId, Id, RawEnd}" on line 1, index 16
view_name.view:60 (project_name:view_name)
moonrise-replace0c58c9dc9acb47eead9b6093f5d59c07moonrise-replace

Esse erro é baseado na definição da dimensão foo, que começa na linha 60 do arquivo LookML:

moonrise-replaced3168132f1cb49e79b7706a178372d14moonrise-replace
dimension: foo {
  type: number
  sql: ${TABLE}.bar ;;
  html:
      moonrise-replace3cb2e10366044055a89c7693d4c7c8e4moonrise-replace
      {{var}}
    ;;
}

Esse aviso indica que a entrada {{moonrise-replacea86980a872084a89bdbe62adc04e4fc0moonrise-replace está sendo usada indevidamente nas tags moonrise-replacedca36cd414d141f7aaeef4c7312e50ebmoonrise-replacemoonrise-replace930f03c69885481f9b22392cf4c357bdmoonrise-replacemoonrise-replacef00d6bef8ee54d74a194cd8022084047moonrise-replace na linha 1 e no índice 16 do bloco Liquid na linha 60 de view_name. O Fluid tem regras para entradas permitidas nesse contexto, e essas entradas são listadas da seguinte maneira:

moonrise-replace870df24a06a047d4a2987620879daa10moonrise-replace
{Str ,'(' ,'[' , DoubleNum , LongNum ,'capture' ,'endcapture' ,'comment' ,'endcomment' ,RawStart ,'if' ,'elsif' ,'endif' ,'unless' ,'endunless' ,'else' ,'contains'
'case' , 'endcase' ,'when' , 'cycle' ,'for' ,'endfor' ,'in' ,'and' ,'or' ,'tablerow' ,'endtablerow' ,'assign' ,'true' ,'false' , Nil,'include' ,'with' ,'empty' ,'blank' , EndId, Id, RawEnd}.
moonrise-replace044563155a5d440a8040097144ba50cemoonrise-replace

Se o moonrise-replace8127a18d3247467e96a06b221bb27944moonrise-replace{{...}} ao redor de value for removido, o Liquid deve ser analisado com sucesso.

Embora os novos avisos sigam um padrão estrutural, haverá variações nos detalhes da mensagem. Veja a seguir exemplos de outras variações, bem como alguns indicadores de alto nível para resolvê-los.

Exemplo 1

Aviso:

  Error  parsing liquid: Liquid parse exception: lexer error  \ "token recognition error at: '(token)'\" on line x, index y

Isso pode ser gerado quando um token inesperado, como #, é usado:

dimension: foo {
  type: number
  sql: ${TABLE}.bar ;;
  html:
      {% assign var = #value %}
      {{var}}
    ;;
}

Remover o token inesperado, # neste caso, deve resolver o aviso.

Exemplo 2

Aviso:

Error  parsing liquid: Liquid parse exception: parser error  \ "mismatched input (input)|' expecting {TagEnd, '.', NEq, '==', '>=', '>', '<=', '<', '[', '?','contains', 'and', 'or'}\" on line x, index y

Isso pode ser gerado quando as funções estão encadeadas com o token | dentro de um condicional if:

dimension: foo {
  type: number
  sql: ${TABLE}.bar ;;
  html:
      {% dynamic if 20 |divided_by(7) |times(1.0) >= 2 %}
        hello world
      {% dynamic endif %}
    ;;
}

Atribuir a saída da cadeia de funções a uma variável e incluir essa variável no condicional if resolve o aviso.

Exemplo 3

Aviso:

Error parsing liquid: Liquid parse exception: parser error "missing '(character)' at '%}'" on line x, index y

Esse aviso pode ser gerado quando um caractere necessário está ausente, como o parêntese de fechamento na linha {% assign var = (true and false %} no exemplo a seguir:

dimension: foo {
    type: number
    sql: ${TABLE}.bar ;;
    html:
        {% assign var = (true and false %}
        {{var}}
      ;;
}

Adicionar o caractere necessário, um parêntese de fechamento ) nesse caso, precisa resolver o aviso.