Pular para o conteúdo

A próxima versão, calculada

Abi.proxima_versao compara as duas superfícies e diz 2.0.0, 1.5.0 ou 1.4.3 — com o porquê.

O versionamento semântico é uma promessa: a maior sobe quando algo quebra, a menor quando algo entra sem quebrar, a correção quando a superfície não muda. A promessa só vale se o número for calculado; escolhido a olho, ele sobe menor numa quebra — e o ^1.4 de todo mundo que depende do pacote puxa a versão que quebra.

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")

quebra := $"{pasta}/quebra.df"
IO.write(quebra, "action somar(a, b):\n    yield a + b\nrelay somar\n")
acrescimo := $"{pasta}/acrescimo.df"
IO.write(acrescimo, "action somar(a, b):\n    yield a + b\naction dobro(x):\n    yield x * 2\naction triplo(x):\n    yield x * 3\nrelay somar, dobro, triplo\n")

p := Abi.proxima_versao("1.4.2", antes, quebra)
assert p["proxima"] is "2.0.0"
out p["porque"]

assert Abi.proxima_versao("1.4.2", antes, acrescimo)["proxima"] is "1.5.0"
assert Abi.proxima_versao("1.4.2", antes, antes)["proxima"] is "1.4.3"
IO.remove_tree(pasta)
VereditoQuando1.4.2 vira
maiorum nome sumiu, um parâmetro obrigatório entrou, um parâmetro mudou de nome2.0.0
menorum nome novo, um parâmetro opcional novo1.5.0
correcaoa superfície é a mesma1.4.3
desconhecidouma das versões não compilanão calcula — proxima é void

A superfície vê o que é visível. Uma mudança de comportamento com a mesma assinatura — a ação passa a arredondar diferente — é quebra, e só um teste pega. O cálculo é o piso, não o teto.