class SemanticVersion
Constants
- OPERATORS
- RANGE_OPERATORS
- SINGLE_OPERATORS
Attributes
Public Class Methods
Instantiates a new SemanticVersion
.
@param [String] version: A semantic version (see semver.org).
# File lib/semantic_version.rb, line 32 def self.[](version) self.new(version) end
Instantiates a new SemanticVersion
.
@param [String] version: A semantic version (see semver.org).
# File lib/semantic_version.rb, line 62 def initialize(version) @number_components, @prerelease_components, @build_metadata = self.class.parse_components(version) end
Parses the given value into version components.
@param [String or SemanticVersion] version: A semantic version (see semver.org).
@return An array [version_number, prerelease, build_metadata
], where ‘version_number` is an array of the
number components [MAJOR, MINOR, PATCH], `prerelease` is an array of the prerelease components, and `build_metadata` is, like, you know, the build metadata.
# File lib/semantic_version.rb, line 45 def self.parse_components(version) return version.components if version.is_a? SemanticVersion version_number, extensions = version.to_s.split('-', 2) prerelease, build_metadata = extensions.to_s.split('+', 2) version_number = version_number.to_s.split('.').map(&:to_i) prerelease = prerelease.to_s.split('.').map {|c| c == c.to_i.to_s ? c.to_i : c } return [version_number, prerelease, build_metadata] end
Public Instance Methods
Compares this SemanticVersion
with one or more other version numbers.
@param [Hash] assertions: A hash where keys are OPERATORS
and values are operands in the form of semantic versions.
@return True if all assertions are true, false otherwise.
# File lib/semantic_version.rb, line 73 def is(comparison) comparison.each_pair do |operator, version| unless OPERATORS.keys.include? operator raise ArgumentError.new("unrecognized operator `#{operator}'") end if RANGE_OPERATORS.keys.include? operator unless version.is_a?(Array) && version.length >= 2 raise ArgumentError.new("range operand must be an array containing at least two elements") end result = if operator == :between is gt: version[0], lt: version[1] elsif operator == :within is gte: version[0], lte: version[1] elsif operator == :any_of version.map {|v| is eq: v }.any? else false end return false unless result == true else number_components, prerelease_components, _ = self.class.parse_components(version) result = 0 # Compare version number components. (0..[@number_components.count, number_components.count].max-1).each do |i| a = @number_components[i] b = number_components[i] result = if !a.nil? && b.nil? a == 0 ? 0 : 1 elsif a.nil? && !b.nil? b == 0 ? 0 : -1 else a <=> b end break unless result == 0 end if result == 0 if @prerelease_components.empty? && !prerelease_components.empty? result = 1 elsif !@prerelease_components.empty? && prerelease_components.empty? result = -1 end end # Compare pre-release components. if result == 0 (0..[@prerelease_components.count, prerelease_components.count].max-1).each do |i| break unless result == 0 a = @prerelease_components[i] b = prerelease_components[i] result = if !a.nil? && b.nil? 1 elsif a.nil? && !b.nil? -1 elsif a.class == b.class a <=> b else a.to_s <=> b.to_s end end end return false unless OPERATORS[operator].include? result end end return true end
Returns the string representation of the “MAJOR.MINOR.PATCH” version part.
# File lib/semantic_version.rb, line 157 def number @number_components.join('.') end
Returns the string representation of the pre-release version part.
# File lib/semantic_version.rb, line 164 def prerelease @prerelease_components.join('.') end
Returns the string representation of the version.
# File lib/semantic_version.rb, line 171 def to_s number + (@prerelease_components.empty? ? "" : "-#{prerelease}") + (@build_metadata.nil? ? "" : "+#{@build_metadata}") end