Pular para o conteúdo

Aposentar sem quebrar

Renomear com relay … as, avisar com Evolucao.obsoleta, e só então remover — em duas versões, e não em uma.

Um nome ruim numa biblioteca publicada não se troca de uma vez: quem o usa quebra no dia da atualização. O caminho tem três passos, e cada um é uma versão.

VersãoFazQuem usa o nome velho
1.5 (menor)exporta o novo, e o velho como apelido: relay somar, somar as somacontinua funcionando
1.6 (menor)marca o velho com Evolucao.obsoletafunciona, com aviso na saída de erro
2.0 (maior)remove o velhoquebra — mas foi avisado por duas versões
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")

// o renomeio com apelido: o nome velho continua exportado
com_apelido := $"{pasta}/v15.df"
IO.write(com_apelido, "action somar(a, b):\n    yield a + b\naction duplicar(x):\n    yield x * 2\nrelay somar, duplicar, duplicar as dobro\n")
assert Abi.veredito(antes, com_apelido) is "menor"        // nada quebrou

sem_apelido := $"{pasta}/v2.df"
IO.write(sem_apelido, "action somar(a, b):\n    yield a + b\naction duplicar(x):\n    yield x * 2\nrelay somar, duplicar\n")
assert Abi.veredito(antes, sem_apelido) is "maior"        // o 'dobro' sumiu
IO.remove_tree(pasta)

O aviso da versão intermediária vem de `Arcane.Evolucao`: obsoleta(motivo, desde, use) avisa uma vez por ação, na saída de erro, e DF_OBSOLETOS=erro transforma o aviso em falha — para o CI de quem depende descobrir antes do 2.0.