Pular para o conteúdo

O contrato no CI

dataforge abi sai com erro quando a versão declarada é menor que a quebra exige — antes do release, e não depois.

Conferir a superfície à mão é o tipo de passo que se pula na sexta-feira. No CI ele não é pulado: o job compara o módulo publicado com o de agora, e reprova o release que quebra o contrato sem subir a versão maior.

bash
# no CI, com a última versão publicada baixada em ultima/
dataforge abi ultima/src/main.df src/main.df
# sai com 0 (compatível), 2 (quebra) — e o relatório diz qual regra
dataforge
adopt Arcane.Abi as Abi
adopt Arcane.IO as IO
adopt Arcane.OS as OS

pasta := $"{OS.temp_dir()}/df-abi-{randint(100000, 999999)}"
IO.mkdir(pasta)
antes := $"{pasta}/v1.df"
IO.write(antes, "action somar(a, b):\n    yield a + b\naction dobro(x):\n    yield x * 2\nrelay somar, dobro\n")

depois := $"{pasta}/v2.df"
IO.write(depois, "action somar(a):\n    yield a\nrelay somar\n")

versao_declarada := "1.5.0"                         // o que está no forge.toml
calculada := Abi.proxima_versao("1.4.2", antes, depois)["proxima"]
subiu_certo := versao_declarada.split(".")[0] is calculada.split(".")[0]
assert not subiu_certo                             // 1.5.0 numa quebra: reprovar
out $"declarada {versao_declarada}, exigida {calculada}"
IO.remove_tree(pasta)