class Semverse::Version

Attributes

build[R]
major[R]
minor[R]
patch[R]
pre_release[R]

Public Class Methods

coerce(object) click to toggle source

Coerce the object into a version.

@param [Version, String]

@return [Version]

# File lib/semverse/version.rb, line 9
def coerce(object)
  object.is_a?(self) ? object : new(object)
end
new(*args) click to toggle source

@overload initialize(version_array)

@param [Array] version_array

@example
  Version.new([1, 2, 3, 'rc.1', 'build.1']) => #<Version: @major=1, @minor=2, @patch=3, @pre_release='rc.1', @build='build.1'>

@overload initialize(version_string)

@param [#to_s] version_string

@example
  Version.new("1.2.3-rc.1+build.1") => #<Version: @major=1, @minor=2, @patch=3, @pre_release='rc.1', @build='build.1'>

@overload initialize(version)

@param [Semverse::Version] version

@example
  Version.new(Version.new("1.2.3-rc.1+build.1")) => #<Version: @major=1, @minor=2, @pre_release='rc.1', @build='build.1'>
# File lib/semverse/version.rb, line 60
def initialize(*args)
  if args.first.is_a?(Array)
    @major, @minor, @patch, @pre_release, @build = args.first
  else
    @major, @minor, @patch, @pre_release, @build = self.class.split(args.first.to_s)
  end

  @major       ||= 0
  @minor       ||= 0
  @patch       ||= 0
  @pre_release ||= nil
  @build       ||= nil
end
split(version_string) click to toggle source

@param [#to_s] version_string

@raise [InvalidVersionFormat]

@return [Array]

# File lib/semverse/version.rb, line 18
def split(version_string)
  case version_string.to_s
  when /^(\d+)\.(\d+)\.(\d+)(-([0-9a-z\-\.]+))?(\+([0-9a-z\-\.]+))?$/i
    [ $1.to_i, $2.to_i, $3.to_i, $5, $7 ]
  when /^(\d+)\.(\d+)\.(\d+)?$/
    [ $1.to_i, $2.to_i, $3.to_i ]
  when /^(\d+)\.(\d+)?$/
    [ $1.to_i, $2.to_i, 0 ]
  when /^(\d+)$/
    [ $1.to_i, 0, 0 ]
  else
    raise InvalidVersionFormat.new(version_string)
  end
end

Public Instance Methods

<=>(other) click to toggle source

@param [Semverse::Version] other

@return [Integer]

# File lib/semverse/version.rb, line 77
def <=>(other)
  [:major, :minor, :patch].each do |release|
    ans = self.send(release) <=> other.send(release)
    return ans if ans != 0
  end
  ans = pre_release_and_build_presence_score <=> other.pre_release_and_build_presence_score
  return ans if ans != 0
  ans = identifiers_comparaison(other, :pre_release)
  return ans if ans != 0
  if build && other.build
    return identifiers_comparaison(other, :build)
  else
    return build.to_s <=> other.build.to_s
  end
  0
end
eql?(other) click to toggle source

@param [Semverse::Version] other

@return [Boolean]

# File lib/semverse/version.rb, line 134
def eql?(other)
  other.is_a?(Version) && self == other
end
identifiers(release) click to toggle source

@return [Array]

# File lib/semverse/version.rb, line 95
def identifiers(release)
  send(release).to_s.split('.').map do |str|
    str.to_i.to_s == str ? str.to_i : str
  end
end
identifiers_comparaison(other, release) click to toggle source

@param [Semverse::Version] other

@return [Integer]

# File lib/semverse/version.rb, line 117
def identifiers_comparaison(other, release)
  [identifiers(release).length, other.identifiers(release).length].max.times do |i|
    if identifiers(release)[i].class == other.identifiers(release)[i].class
      ans = identifiers(release)[i] <=> other.identifiers(release)[i]
      return ans if ans != 0
    elsif identifiers(release)[i] && other.identifiers(release)[i]
      return identifiers(release)[i].class.to_s <=> other.identifiers(release)[i].class.to_s
    elsif identifiers(release)[i] || other.identifiers(release)[i]
      return other.identifiers(release)[i].class.to_s <=> identifiers(release)[i].class.to_s
    end
  end
  0
end
inspect() click to toggle source
# File lib/semverse/version.rb, line 138
def inspect
  "#<#{self.class.to_s} #{to_s}>"
end
pre_release?() click to toggle source
# File lib/semverse/version.rb, line 101
def pre_release?
  !!pre_release
end
pre_release_and_build_presence_score() click to toggle source

@return [Integer]

# File lib/semverse/version.rb, line 110
def pre_release_and_build_presence_score
  pre_release ? 0 : (build.nil? ? 1 : 2)
end
to_s() click to toggle source
# File lib/semverse/version.rb, line 142
def to_s
  str = "#{major}.#{minor}.#{patch}"
  str += "-#{pre_release}" if pre_release
  str += "+#{build}" if build
  str
end
zero?() click to toggle source
# File lib/semverse/version.rb, line 105
def zero?
  [major, minor, patch].all? { |n| n == 0 }
end