Versions
NAME
App::Ariza::Versions - the pinned component versions every ariza artefact is built against
SYNOPSIS
use App::Ariza::Versions;
my $v = App::Ariza::Versions.load; # ariza's shipped resources/versions.toml
say $v.rakudo-version; # 2026.07 (bundled runtime)
say $v.rakudo-revision; # 01
say $v.rakudo-tag; # 2026.07-01
say $v.sqlcipher; # 4.14.0 (advisory ā see below)
.note for $v.warnings; # unrecognised keys, if any
# An alternate pin set (tests, experiments):
my $alt = App::Ariza::Versions.load('/tmp/versions.toml'.IO);
DESCRIPTION
Everything ariza produces ā a bundle, a generated installer, a CI
workflow ā quotes version numbers of software ariza does not own: a
Rakudo release, a SQLCipher build. Those numbers live in exactly one
file, resources/versions.toml, so that bumping a pin regenerates
every app's artefacts in lockstep and nothing can drift.
This class is that file, parsed. It holds no logic beyond parsing: consumers ask it for a string and put the string where it belongs.
THE FILE
sqlcipher = "4.14.0"
[rakudo]
version = "2026.07"
revision = "01"
The SQLCipher pin is advisory
sqlcipher is the version ariza expects, not one it can enforce. A
bundle's SQLCipher comes from the build machine's package manager
(App::Ariza::Native) ā there is no ariza-operated mirror, because
SQLCipher's ABI does not move often enough to justify release
infrastructure of its own ā and a package manager ships what it ships.
So a staged library whose version differs from this pin warns and the
build continues, and the manifest records the version that was actually
staged with the pin alongside it.
One flat pin, one nested
sqlcipher and [rakudo] are not shaped the same, and the shapes are
not interchangeable:
sqlcipheris a flat pin ā a single string, compared against whatever the build machine's package manager actually staged. See above.[rakudo]is a table, because the runtime a bundle embeds needs two coordinates,versionandrevision, not one.revisiondisambiguates rebuilds of the same upstream release ā a repackaged runtime, a patched MoarVM ā without pretending upstream cut a new version.rakudo-tagjoins the two asversion-revision.
Unknown keys warn; wrong types die
The house rule, shared with App::Ariza::Config and
App::Shigur::Config: an unrecognised key at any level is collected
into warnings and parsing continues, so a pin file written for a
newer ariza still loads in an older one (and vice versa). A key whose
value is the wrong type dies immediately, naming the dotted path and
the expected shape ā "ariza: rakudo.version must be a string" ā
because a mistyped pin would otherwise be silently baked into an
artefact.
Keys beginning with // are ignored entirely, without a warning. TOML
has real comments, so this convention is redundant here; it is kept
because every ariza config file behaves the same way, and a config
author should never have to remember which file format they are in.
METHODS
load(IO() $path = resource('versions.toml') --> App::Ariza::Versions)
Parse a pin file. The default is ariza's own shipped copy, located through App::Ariza::Resources so it works installed and from a checkout alike.
Dies if the file is missing, unreadable, not valid TOML, or not a TOML table ā each with its own message naming the path, so an unreadable file is never confused with a malformed one.
An empty (or whitespace-only) file is not an error: an empty
document is a valid, empty TOML table, and every pin comes back
undefined. Config::TOML rejects it outright, so load short-circuits
before handing it over rather than reporting a legal file as malformed.
warnings(--> List)
Human-readable strings naming every unrecognised key found while loading. Empty when the file was clean.
path(--> IO::Path)
The file this instance was loaded from. Useful in error messages from consumers ("pin X missing from {$v.path}").
sqlcipher
The flat top-level pin, as a string. Undefined Str if absent from the
file.
rakudo-version / rakudo-revision / rakudo-tag
The [rakudo] table's two keys, and the version-revision join of
them. rakudo-tag is the undefined Str unless both halves are
present.
AUTHOR
Matt Doughty
COPYRIGHT AND LICENSE
Copyright 2026 Matt Doughty
This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.