Superfície e contrato
O que um módulo oferece é um contrato com quem o usa — e a ferramenta que diz, antes do release, se ele foi quebrado.
A superfície de um módulo é o que ele exporta com relay: nomes, parâmetros, campos. Quem adota o módulo depende exatamente disso. Mudar a superfície é mudar o contrato — e Arcane.Abi compara duas versões e diz se a mudança quebra quem usava a anterior.
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, b, c := 0):\n yield a + b + c\naction dobro(x):\n yield x * 2\nrelay somar, dobro\n")
assert Abi.veredito(antes, depois) is "menor" // acrescentou, não quebrou
assert Abi.compativel(antes, depois)
IO.remove_tree(pasta)A superfície é o contrato
o que entra, e o que o relay esconde
O que quebra
as onze regras, uma a uma
A próxima versão
calculada da superfície, e não escolhida a olho
O changelog
o esqueleto que a superfície consegue escrever
Aposentar sem quebrar
renomear com relay … as, e avisar antes de remover
O contrato no CI
o release que quebra sem subir a versão maior é reprovado
Antes do 1.0
o que o 0.x promete, e o que não
O mapa de símbolos
quem exporta o quê
Alvos
onde um programa roda
ABI e alvos: o mapa
o que existe, e o que não