Version Types

Component Types

version.MajorVersion

The major version number. Must be non-negative.

import version.*

// Safe construction
MajorVersion.from(2) // Right(MajorVersion(2))
MajorVersion.from(-1) // Left(InvalidMajorVersion(-1))

// Unsafe construction
val major = MajorVersion.fromUnsafe(2)

// Access and operations
major.value // 2
major.increment // MajorVersion(3)
major.isStable // true (> 0)

// Constants
MajorVersion.minimum // MajorVersion(0)
MajorVersion.reset // MajorVersion(0)

version.MinorVersion

The minor version number. Must be non-negative.

val minor = MinorVersion.fromUnsafe(5)
minor.value // 5
minor.increment // MinorVersion(6)
MinorVersion.reset // MinorVersion(0)

version.PatchNumber

The patch version number. Must be non-negative.

val patch = PatchNumber.fromUnsafe(3)
patch.value // 3
patch.increment // PatchNumber(4)
PatchNumber.reset // PatchNumber(0)

version.PreReleaseNumber

The pre-release version number. Must be positive (>= 1).

PreReleaseNumber.from(1) // Right(PreReleaseNumber(1))
PreReleaseNumber.from(0) // Left(InvalidPreReleaseNumber(0))

val prn = PreReleaseNumber.fromUnsafe(1)
prn.value // 1
prn.increment // PreReleaseNumber(2)

Pre-release Types

version.PreReleaseClassifier

An enumeration of constrained classifiers with defined precedence (lowest to highest):

Classifier Aliases Requires Number
Dev dev
Milestone milestone, m
Alpha alpha, a
Beta beta, b
ReleaseCandidate rc, cr
Snapshot snapshot, SNAPSHOT
import version.PreReleaseClassifier
import version.PreReleaseClassifier.*

// Properties
Alpha.show // "alpha"
Alpha.aliases // List("alpha", "a")
Alpha.versioned // true
Snapshot.versioned // false

// Parsing from alias
PreReleaseClassifier.fromAlias("rc") // Some(ReleaseCandidate)
PreReleaseClassifier.fromAlias("a") // Some(Alpha)
PreReleaseClassifier.fromAlias("foo") // None

// Pattern matching
"beta" match
  case PreReleaseClassifier(c) => c // Beta

version.PreRelease

Combines a classifier with an optional version number:

import version.{PreRelease, PreReleaseNumber}

// Factory methods (no validation needed)
PreRelease.snapshot // snapshot
PreRelease.alpha(PreReleaseNumber.fromUnsafe(1)) // alpha.1
PreRelease.beta(PreReleaseNumber.fromUnsafe(2)) // beta.2
PreRelease.releaseCandidate(PreReleaseNumber.fromUnsafe(1)) // rc.1

// Safe construction with validation
PreRelease.from(PreReleaseClassifier.Alpha, Some(PreReleaseNumber.fromUnsafe(1)))
// Right(PreRelease(Alpha, Some(1)))

PreRelease.from(PreReleaseClassifier.Alpha, None)
// Left(MissingPreReleaseNumber(Alpha))

PreRelease.from(PreReleaseClassifier.Snapshot, Some(PreReleaseNumber.fromUnsafe(1)))
// Left(UnexpectedPreReleaseNumber(Snapshot, 1))

// Operations
val pr = PreRelease.alpha(PreReleaseNumber.fromUnsafe(1))
pr.show // "alpha.1"
pr.increment // PreRelease(Alpha, Some(2))
pr.isAlpha // true

version.Metadata

Build metadata identifiers. Each must match [0-9A-Za-z-]+.

import version.Metadata

// Construction
Metadata.from(List("build", "456"))
// Right(Metadata(List("build", "456")))

Metadata.from(List("")) // Left(InvalidMetadata(...))
Metadata.from(List("a@b")) // Left(InvalidMetadata(...))

// Access
val bm = Metadata(List("sha", "abc123"))
bm.identifiers // List("sha", "abc123")
bm.show // "+sha.abc123"

version.Version

The complete SemVer 2.0.0 representation:

import version.*

// Construction via apply overloads
Version(major, minor, patch) // Final release
Version(major, minor, patch, preRelease) // With pre-release
Version(major, minor, patch, metadata) // With metadata
Version(major, minor, patch, preRelease, meta) // Full form

// Full example
val v = Version(
  MajorVersion.fromUnsafe(1),
  MinorVersion.fromUnsafe(2),
  PatchNumber.fromUnsafe(3),
  Some(PreRelease.alpha(PreReleaseNumber.fromUnsafe(1))),
  None
)
v.show // "1.2.3-alpha.1"

Ordering

All types provide Ordering instances following SemVer precedence:

val versions = List(
  "1.0.0".toVersionUnsafe,
  "1.0.0-alpha.1".toVersionUnsafe,
  "1.0.0-beta.1".toVersionUnsafe,
  "0.9.0".toVersionUnsafe
)

versions.sorted
// List(0.9.0, 1.0.0-alpha.1, 1.0.0-beta.1, 1.0.0)

Precedence rules:

  1. Major, minor, patch compared numerically
  2. Pre-release versions rank below final releases of the same core
  3. Pre-releases compared by classifier precedence, then number
  4. Build metadata does not affect precedence