Pular para o conteúdo

Formatação

dataforge fmt: regras determinísticas, idempotência e uso em CI.

Usar#

bash
dataforge fmt arquivo.df       # reescreve
dataforge fmt src/             # a pasta inteira
dataforge fmt . --check        # só verifica, não escreve

O --check sai com código diferente de zero se algo estiver fora do formato — é a forma de usar em integração contínua.

As regras#

  • 4 espaços por nível de indentação; tabs viram espaços
  • Um espaço em volta de operadores binários e de :=
  • Nenhum espaço depois de (, antes de ), ou antes de , e :
  • Sem espaço entre um nome e o ( da chamada
  • Nenhum espaço em branco no fim da linha
  • No máximo uma linha em branco dentro de um bloco, duas no topo do arquivo
  • O arquivo termina com exatamente uma quebra de linha
antes
action   somar( a,b ):
      yield a+b
x:=somar( 1,2 )
v := { "a":1,"b":2 }
depois
action somar(a, b):
    yield a + b

x := somar(1, 2)
v := {"a": 1, "b": 2}

Idempotência#

Formatar duas vezes dá o mesmo resultado que formatar uma. Há teste para isso, e ele roda sobre os 225 arquivos do repositório.

text
format_source(format_source(x)) == format_source(x)

Dois detalhes que importam#

~/ em vez de //#

O formatador reimprime a divisão inteira sempre como ~/. Reimprimir // faria a linha virar comentário na próxima passagem — o operador some e o código muda de sentido.

Comentários e strings interpoladas#

O extrator de comentário percorre o fluxo de tokens, não os caracteres. Só assim # dentro de $"…" não é confundido com um comentário:

dataforge
out $"{"#".repeat(n)} ({n})"     # o '#' de dentro é texto, não comentário

Estrutura, não espaços#

A profundidade de cada linha vem do INDENT/DEDENT do lexer, não da contagem de espaços do original. Isso significa que um arquivo com indentação inconsistente é recusado em vez de ser adivinhado:

text
SyncError [line 10]: Indentation mismatch: expected 8 spaces, got 9

Um formatador que adivinha a estrutura de um código ambíguo pode mudar o que ele faz. Melhor falhar.

Em CI#

bash
dataforge fmt . --check && dataforge check . && dataforge test