class SplitIoClient::Semver

def self.build(version, logger)

Returns:
  • (type) - Semver instance

Parameters:
  • version (String) -- raw version as read from splitChanges response.
def self.build(version, logger)
  new(version)
rescue NoMethodError => e
  logger.error("Failed to parse Semver data, incorrect data type:  #{e}")
  nil
rescue StandardError => e
  logger.error("Failed to parse Semver data:  #{e}")
  nil
end

def assign_major_minor_and_patch(version)

Parameters:
  • version (String) -- raw version containing major.minor.patch numbers.
def assign_major_minor_and_patch(version)
  parts = version.split(VALUE_DELIMITER)
  if parts.length != 3 ||
     !(integer?(parts[0]) &&
       integer?(parts[1]) &&
       integer?(parts[2]))
    raise "Unable to convert to Semver, incorrect format: #{version}"
  end
  @major = parts[0].to_i
  @minor = parts[1].to_i
  @patch = parts[2].to_i
  @version = "#{@major}#{VALUE_DELIMITER}#{@minor}#{VALUE_DELIMITER}#{@patch}"
  @version += parse_pre_release
  @version += "#{METADATA_DELIMITER}#{@metadata}" unless @metadata.empty?
end

def compare(to_compare)

Parameters:
  • to_compare (trype) -- splitio.models.grammar.matchers.semver.Semver object
def compare(to_compare)
  return 0 if @version == to_compare.version
  # Compare major, minor, and patch versions numerically
  result = compare_attributes(to_compare)
  return result if result != 0
  # Compare pre-release versions lexically
  compare_pre_release(to_compare)
end

def compare_attributes(to_compare)

Parameters:
  • to_compare (trype) -- splitio.models.grammar.matchers.semver.Semver object
def compare_attributes(to_compare)
  result = compare_vars(@major, to_compare.major)
  return result if result != 0
  result = compare_vars(@minor, to_compare.minor)
  return result if result != 0
  result = compare_vars(@patch, to_compare.patch)
  return result if result != 0
  return -1 if !@is_stable && to_compare.is_stable
  return 1 if @is_stable && !to_compare.is_stable
  0
end

def compare_pre_release(to_compare)

Parameters:
  • to_compare (trype) -- splitio.models.grammar.matchers.semver.Semver object
def compare_pre_release(to_compare)
  min_length = get_pre_min_length(to_compare)
  0.upto(min_length - 1) do |i|
    next if @pre_release[i] == to_compare.pre_release[i]
    if integer?(@pre_release[i]) && integer?(to_compare.pre_release[i])
      return compare_vars(@pre_release[i].to_i, to_compare.pre_release[i].to_i)
    end
    return compare_vars(@pre_release[i], to_compare.pre_release[i])
  end
  # Compare lengths of pre-release versions
  compare_vars(@pre_release.length, to_compare.pre_release.length)
end

def compare_vars(var1, var2)

Parameters:
  • var2 (type) -- String/Integer object that accept ==, < or > operators
  • var1 (type) -- String/Integer object that accept ==, < or > operators
def compare_vars(var1, var2)
  return 0 if var1 == var2
  return 1 if var1 > var2
  -1
end

def get_pre_min_length(to_compare)

Parameters:
  • to_compare (trype) -- splitio.models.grammar.matchers.semver.Semver object
def get_pre_min_length(to_compare)
  [@pre_release.length, to_compare.pre_release.length].min
end

def initialize(version)

def initialize(version)
  @major = 0
  @minor = 0
  @patch = 0
  @pre_release = []
  @is_stable = false
  @version = ''
  @metadata = ''
  parse(version)
end

def integer?(value)

def integer?(value)
  !!value.match(/^(\d)+$/)
end

def parse(old_version)


Parse the string in version to update the other internal variables
def parse(old_version)
  without_metadata = remove_metadata_if_exists(old_version)
  index = without_metadata.index(PRE_RELEASE_DELIMITER)
  if index.nil?
    @is_stable = true
  else
    pre_release_data = without_metadata[index + 1..-1]
    without_metadata = without_metadata[0, index]
    @pre_release = pre_release_data.split(VALUE_DELIMITER)
  end
  assign_major_minor_and_patch(without_metadata)
end

def parse_pre_release

def parse_pre_release
  return '' if @pre_release.empty?
  pre_parsed = []
  @pre_release.each do |pre_digit|
    pre_digit = pre_digit.to_i if integer?(pre_digit)
    pre_parsed << pre_digit
  end
  "#{PRE_RELEASE_DELIMITER}#{pre_parsed.join('.')}"
end

def remove_metadata_if_exists(old_version)

Returns:
  • (type) - String semver without the metadata
def remove_metadata_if_exists(old_version)
  index = old_version.index(METADATA_DELIMITER)
  return old_version if index.nil?
  @metadata = old_version[index + 1, old_version.length]
  old_version[0, index]
end