Formatação
dataforge fmt: regras determinísticas, idempotência e uso em CI.
Usar#
dataforge fmt arquivo.df # reescreve
dataforge fmt src/ # a pasta inteira
dataforge fmt . --check # só verifica, não escreveO --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
action somar( a,b ):
yield a+b
x:=somar( 1,2 )
v := { "a":1,"b":2 }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.
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:
out $"{"#".repeat(n)} ({n})" # o '#' de dentro é texto, não comentárioEstrutura, 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:
SyncError [line 10]: Indentation mismatch: expected 8 spaces, got 9Um formatador que adivinha a estrutura de um código ambíguo pode mudar o que ele faz. Melhor falhar.
Em CI#
dataforge fmt . --check && dataforge check . && dataforge test