struct SoftwareVersion
- SoftwareVersion
- Struct
- Value
- Object
Overview
The SoftwareVersion
type represents a version number.
An instance can be created from a version string which consists of a series of segments separated by periods. Each segment contains one ore more alpanumerical ASCII characters. The first segment is expected to contain only digits.
There may be one instance of a dash (-
) which denotes the version as a
pre-release. It is otherwise equivalent to a period.
Optional version metadata may be attached and is separated by a plus character (+
).
All content following a +
is considered metadata.
This format is described by the regular expression:
/[0-9]+(?>\.[0-9a-zA-Z]+)*(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-.]+)?/
This implementation is compatible to popular versioning schemes such as
SemVer
and CalVer
but
doesn't enforce any particular one.
It behaves mostly equivalent to Gem::Version
from rubygems
.
Sort order
This wrapper type is mostly important for properly sorting version numbers,
because generic lexical sorting doesn't work: For instance, 3.10
is supposed
to be greater than 3.2
.
Every set of consecutive digits anywhere in the string are interpreted as a
decimal number and numerically sorted. Letters are lexically sorted.
Periods (and dash) delimit numbers but don't affect sort order by themselves.
Thus 1.0a
is considered equal to 1.0.a
.
Pre-release
If a version number contains a letter (a-z
) then that version is considered
a pre-release. Pre-releases sort lower than the rest of the version prior to
the first letter (or dash). For instance 1.0-b
compares lower than 1.0
but
greater than 1.0-a
.
Included Modules
- Comparable(SoftwareVersion)
Defined in:
util/software_version.crConstructors
-
.new(version : Number)
Constructs a
Version
from the string representation of version number. -
.parse(string : String) : self
Parses an instance from a string.
Class Method Summary
- .compare(a : String, b : String)
-
.parse?(string : String) : self | Nil
Parses an instance from a string.
-
.valid?(string : String) : Bool
Returns
true
if string is a valid version format.
Instance Method Summary
-
#<=>(other : self)
Compares this version with other returning -1, 0, or 1 if the other version is larger, the same, or smaller than this one.
-
#hash(hasher)
Custom hash implementation which produces the same hash for
a
andb
whena <=> b == 0
- #matches_pessimistic_version_constraint?(constraint : String)
-
#metadata : String | Nil
Returns the metadata attached to this version or
nil
if no metadata available. -
#prerelease? : Bool
Returns
true
if this version is a pre-release version. -
#release : self
Returns version representing the release version associated with this version.
-
#to_s(io : IO)
Appends the string representation of this version to io.
-
#to_s : String
Returns the string representation of this version.
Constructor Detail
Constructs a Version
from the string representation of version number.
Parses an instance from a string.
A version string is a series of digits or ASCII letters separated by dots.
Raises ArgumentError
if string describes an invalid version (see .valid?
).
Class Method Detail
Parses an instance from a string.
A version string is a series of digits or ASCII letters separated by dots.
Returns nil
if string describes an invalid version (see .valid?
).
Instance Method Detail
Compares this version with other returning -1, 0, or 1 if the other version is larger, the same, or smaller than this one.
Custom hash implementation which produces the same hash for a
and b
when a <=> b == 0
Returns the metadata attached to this version or nil
if no metadata available.
SoftwareVersion.new("1.0.0").metadata # => nil
SoftwareVersion.new("1.0.0-rc1").metadata # => nil
SoftwareVersion.new("1.0.0+build1").metadata # => "build1"
SoftwareVersion.new("1.0.0-rc1+build1").metadata # => "build1"
Returns true
if this version is a pre-release version.
A version is considered pre-release if it contains an ASCII letter or -
.
SoftwareVersion.new("1.0.0").prerelease? # => false
SoftwareVersion.new("1.0.0-dev").prerelease? # => true
SoftwareVersion.new("1.0.0-1").prerelease? # => true
SoftwareVersion.new("1.0.0a1").prerelease? # => true
Returns version representing the release version associated with this version.
If this version is a pre-release (see #prerelease?
) a new instance will be created
with the same version string before the first ASCII letter or -
.
Version metadata (see #metadata
) will be stripped.
SoftwareVersion.new("1.0.0").release # => SoftwareVersion.new("1.0.0")
SoftwareVersion.new("1.0.0-dev").release # => SoftwareVersion.new("1.0.0")
SoftwareVersion.new("1.0.0-1").release # => SoftwareVersion.new("1.0.0")
SoftwareVersion.new("1.0.0a1").release # => SoftwareVersion.new("1.0.0")
SoftwareVersion.new("1.0.0+b1").release # => SoftwareVersion.new("1.0.0")
SoftwareVersion.new("1.0.0-rc1+b1").release # => SoftwareVersion.new("1.0.0")