class SemanticVersion

Attributes

prefix_delimiter[R]
prefix_segments[R]
segments[R]
suffix_segments[R]
version_string[R]

Public Class Methods

new(version_string, segments = nil) click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 8
def initialize(version_string, segments = nil)
  @version_string = version_string
  @prefix_segments = []
  @suffix_segments = []
  @prefix_delimiter = 0
  version, _ = version_string.split('+')
  if segments.nil?
    @segments = split_version_string!(version)
  else
    @prefix_segments = segments
    @prefix_delimiter = segments.size - 1
    @segments = segments
  end
end

Public Instance Methods

!=(other_semver) click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 159
def !=(other_semver)
  return !(self == other_semver)
end
<(other_semver) click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 91
def <(other_semver)
  self_array, other_array = get_equalized_arrays_for(self, other_semver)
  (0..self_array.size - 1).each {
    |i|
    if self_array[i] < other_array[i]
      return true
    elsif self_array[i] > other_array[i]
      return false
    end
  }
  false
end
<=(other_semver) click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 133
def <=(other_semver)
  self == other_semver || self < other_semver
end
==(other_semver) click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 137
def ==(other_semver)
  segments_a = []
  segments_b = []

  segments_a += other_semver.segments
  segments_b += @segments

  if other_semver.segments.size < @segments.size
    (@segments.size - other_semver.segments.size).times {|_| segments_a << SemanticVersionSegment.new("0")}
  elsif other_semver.segments.size > @segments.size
    (other_semver.segments.size - @segments.size).times {|_| segments_b << SemanticVersionSegment.new("0") }
  end

  (0..segments_a.size - 1).each {
    |i|
    if segments_a[i] != segments_b[i]
      return false
    end
  }
  true
end
>(other_semver) click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 116
def >(other_semver)
  self_array, other_array = get_equalized_arrays_for(self, other_semver)
  (0..self_array.size - 1).each {
    |i|
    if self_array[i] > other_array[i]
      return true
    elsif self_array[i] < other_array[i]
      return false
    end
  }
  false
end
>=(other_semver) click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 129
def >=(other_semver)
  self == other_semver || self > other_semver || self == other_semver
end
_get_equalized_arrays_for(array_a, array_b) click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 59
def _get_equalized_arrays_for(array_a, array_b)
  first_array = array_a.clone()
  second_array = array_b.clone()
  if first_array.size < second_array.size
    (second_array.size - first_array.size).times do
      first_array << SemanticVersionSegment.new("0")
    end
  elsif first_array.size > second_array.size
    (first_array.size - second_array.size).times do
      second_array << SemanticVersionSegment.new("0")
    end
  end
  [first_array, second_array]
end
cross_total() click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 200
def cross_total()
  [self.major, self.minor, self.patch].reject { |i| i.empty? }.map { |i| i.to_i }.inject(0) { |sum, x| sum + x }
end
diff(other_semver, abs = true) click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 163
def diff(other_semver, abs = true)
  diffs = []

  self_array, other_array = get_equalized_prefix_arrays_for(self, other_semver)
  (0..self_array.size - 1).each {
    |i|
    # diff semantic groups
    diffs << (self_array[i].diff(other_array[i], abs))
  }
  diffs
end
get_equalized_arrays_for(semver_a, semver_b) click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 74
def get_equalized_arrays_for(semver_a, semver_b)
  first_array_prefix = semver_a.prefix_segments.clone()
  second_array_prefix = semver_b.prefix_segments.clone()
  first_array_suffix = semver_a.suffix_segments.clone()
  second_array_suffix = semver_b.suffix_segments.clone()
  first_array_prefix, second_array_prefix = _get_equalized_arrays_for(first_array_prefix, second_array_prefix)
  first_array_suffix, second_array_suffix = _get_equalized_arrays_for(first_array_suffix, second_array_suffix)
  [first_array_prefix.concat(first_array_suffix), second_array_prefix.concat(second_array_suffix)]
end
get_equalized_prefix_arrays_for(semver_a, semver_b) click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 84
def get_equalized_prefix_arrays_for(semver_a, semver_b)
  first_array_prefix = semver_a.prefix_segments.clone()
  second_array_prefix = semver_b.prefix_segments.clone()
  first_array_prefix, second_array_prefix = _get_equalized_arrays_for(first_array_prefix, second_array_prefix)
  [first_array_prefix, second_array_prefix]
end
is_successor_of?(other_semver) click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 195
def is_successor_of?(other_semver)
  filtered_segments = self.diff(other_semver, false).reject { |i| i.to_i == 0 }
  filtered_segments.size == 1 && filtered_segments.last.to_i == 1
end
is_zero?() click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 104
def is_zero?
  @prefix_segments.empty? || @prefix_segments.all? { |segment| segment.is_zero? }
end
major() click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 187
def major
  @prefix_segments.size >= 2 ? @prefix_segments[0].to_s : "0"
end
minor() click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 183
def minor
  @prefix_segments.size >= 1 ? @prefix_segments[1].to_s : "0"
end
patch() click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 191
def patch
  @prefix_segments.size >= 3 ? @prefix_segments[2].to_s : "0"
end
post_release?() click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 112
def post_release?
  @suffix_segments.any?(&:is_post_release)
end
pre_release?() click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 108
def pre_release?
  @suffix_segments.any?(&:is_pre_release)
end
split_version_string!(version_string) click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 23
def split_version_string!(version_string)
  delim_pattern = /[\.\-]/
  split_array = version_string.split(delim_pattern).map {
    |grp|
    grp.split(/(\d+)/).reject { |cell| cell.nil? || cell.empty? }
  }.flatten

  # go as far to the right as possible considering numbers and placeholders
  (0..split_array.size - 1).each do
    |i|
    if split_array[i].number? || split_array[i] == "X" || split_array[i] == "x"
      @prefix_delimiter = i
    else
      break
    end
  end

  # remove redundant trailing zeros
  @prefix_delimiter.downto(0).each do
    |i|
    if split_array[i] == "0"
      split_array.delete_at(i)
      @prefix_delimiter -= 1
    else
      break
    end
  end

  @prefix_segments = split_array[0..@prefix_delimiter].map { |group_string| SemanticVersionSegment.new(group_string) } unless @prefix_delimiter < 0
  if split_array.size - 1 >= @prefix_delimiter + 1
    @suffix_segments = split_array[@prefix_delimiter + 1, split_array.size].map { |group_string| SemanticVersionSegment.new(group_string) }
  end

  @prefix_segments.clone().concat(@suffix_segments)
end
to_normalized_s() click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 175
def to_normalized_s
  @segments.map { |group| group.to_normalized_s }.join(":").to_s
end
to_s() click to toggle source
# File lib/semver_dialects/semantic_version/semantic_version.rb, line 179
def to_s
  @segments.map { |group| group.to_s }.join(":").to_s
end