class SemanticVersion

Constants

OPERATORS
RANGE_OPERATORS
SINGLE_OPERATORS

Attributes

build_metadata[R]
number_components[R]
prerelease_components[R]

Public Class Methods

[](version) click to toggle source

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
new(version) click to toggle source

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
parse_components(version) click to toggle source

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

is(comparison) click to toggle source

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
number() click to toggle source

Returns the string representation of the “MAJOR.MINOR.PATCH” version part.

# File lib/semantic_version.rb, line 157
def number
  @number_components.join('.')
end
prerelease() click to toggle source

Returns the string representation of the pre-release version part.

# File lib/semantic_version.rb, line 164
def prerelease
  @prerelease_components.join('.')
end
to_s() click to toggle source

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