class SemanticVersion

Constants

A_EQ_B
A_NEWER
B_NEWER

Attributes

val[R]

Public Class Methods

compare(a,b) click to toggle source
# File lib/epitools/semantic_version.rb, line 15
def self.compare(a,b)
  new(a) <=> new(b)
end
new(val) click to toggle source
# File lib/epitools/semantic_version.rb, line 11
def initialize(val)
  @val = val
end

Public Instance Methods

<=>(other) click to toggle source
# File lib/epitools/semantic_version.rb, line 19
def <=>(other)
  version_a, version_b = val, other.val

  return A_EQ_B if version_a == version_b

  chars_a, chars_b = version_a.chars, version_b.chars

  while chars_a.size != 0 and chars_b.size != 0
    # logger.debug('starting loop comparing %s '
    #        'to %s', chars_a, chars_b)
    check_leading(chars_a, chars_b)

    if chars_a.first == '~' and chars_b.first == '~'
      chars_a.shift
      chars_b.shift
    elsif chars_a.first == '~'
      return B_NEWER
    elsif chars_b.first == '~'
      return A_NEWER
    end

    break if chars_a.size == 0 or chars_b.size == 0

    block_res = get_block_result(chars_a, chars_b)
    return block_res if block_res != A_EQ_B
  end

  if chars_a.size == chars_b.size
    # logger.debug('versions are equal')
    return A_EQ_B
  else
    # logger.debug('versions not equal')
    chars_a.size > chars_b.size ? A_NEWER : B_NEWER
  end
end

Private Instance Methods

check_leading(*char_lists) click to toggle source
# File lib/epitools/semantic_version.rb, line 58
def check_leading(*char_lists)
  # logger.debug('_check_leading(%s)', char_lists)
  for char_list in char_lists
    while char_list.any? and not char_list[0] =~ /^\w/ and not char_list[0] == '~'
      char_list.shift
    end
    # logger.debug('updated list: %s', char_list)
  end
end
compare_blocks(block_a, block_b) click to toggle source
# File lib/epitools/semantic_version.rb, line 93
def compare_blocks(block_a, block_b)
  # logger.debug('compare_blocks(%s, %s)', block_a, block_b)
  if block_a[0] =~ /^\d/
    trim_zeros(block_a, block_b)
    if block_a.size != block_b.size
      # logger.debug('block lengths are not equal')
      return block_a.size > block_b.size ? A_NEWER : B_NEWER
    end
  end

  block_a <=> block_b
end
get_block_result(chars_a, chars_b) click to toggle source
# File lib/epitools/semantic_version.rb, line 68
def get_block_result(chars_a, chars_b)
  # logger.debug('get_block_result(%s, %s)', chars_a, chars_b)
  first_is_digit   = chars_a.first =~ /^\d/
  pop_func         = first_is_digit ? :pop_digits : :pop_letters
  return_if_no_b   = first_is_digit ? A_NEWER : B_NEWER
  block_a, block_b = send(pop_func, chars_a), send(pop_func, chars_b)

  # logger.debug('blocks are equal')
  return return_if_no_b if block_b.size == 0

  compare_blocks(block_a, block_b)
end
pop_digits(char_list) click to toggle source
# File lib/epitools/semantic_version.rb, line 81
def pop_digits(char_list)
  # logger.debug('pop_digits(%s)', char_list)
  digits = []
  while char_list.any? and char_list.first =~ /^\d/
    digits.append(char_list.shift)
  end

  # logger.debug('got digits: %s', digits)
  # logger.debug('updated char list: %s', char_list)
  digits
end
pop_letters(char_list) click to toggle source
# File lib/epitools/semantic_version.rb, line 114
def pop_letters(char_list)
  # logger.debug('pop_letters(%s)', char_list)
  letters = []
  while char_list.any? and char_list.first =~ /^[[:alpha:]]/
    letters << char_list.shift
  end
  # logger.debug('got letters: %s', letters)
  # logger.debug('updated char list: %s', char_list)
  return letters
end
trim_zeros(*char_lists) click to toggle source
# File lib/epitools/semantic_version.rb, line 106
def trim_zeros(*char_lists)
  for char_list in char_lists
    while char_list.any? and char_list.first == '0'
      char_list.shift
    end
  end
end