class Rox::Core::ValueCompareExtensions

Public Class Methods

new(parser) click to toggle source
# File lib/rox/core/roxx/value_compare_extensions.rb, line 4
def initialize(parser)
  @parser = parser
end

Public Instance Methods

extend() click to toggle source
# File lib/rox/core/roxx/value_compare_extensions.rb, line 8
def extend
  @parser.add_operator('lt') do |_parser, stack, _context|
    begin
      op1 = stack.pop.to_f
      op2 = stack.pop.to_f
      stack.push(op1 < op2)
    rescue StandardError
      stack.push(false)
    end
  end

  @parser.add_operator('lte') do |_parser, stack, _context|
    begin
      op1 = stack.pop.to_f
      op2 = stack.pop.to_f
      stack.push(op1 <= op2)
    rescue StandardError
      stack.push(false)
    end
  end

  @parser.add_operator('gt') do |_parser, stack, _context|
    begin
      op1 = stack.pop.to_f
      op2 = stack.pop.to_f
      stack.push(op1 > op2)
    rescue StandardError
      stack.push(false)
    end
  end

  @parser.add_operator('gte') do |_parser, stack, _context|
    begin
      op1 = stack.pop.to_f
      op2 = stack.pop.to_f
      stack.push(op1 >= op2)
    rescue StandardError
      stack.push(false)
    end
  end

  @parser.add_operator('numne') do |_parser, stack, _context|
    begin
      op1 = stack.pop.to_f
      op2 = stack.pop.to_f
      stack.push(op1 != op2)
    rescue StandardError
      stack.push(false)
    end
  end

  @parser.add_operator('numeq') do |_parser, stack, _context|
    begin
      op1 = stack.pop.to_f
      op2 = stack.pop.to_f
      stack.push(op1 == op2)
    rescue StandardError
      stack.push(false)
    end
  end

  @parser.add_operator('semverNe') do |_parser, stack, _context|
    op1 = stack.pop
    op2 = stack.pop
    if op1.is_a?(String) && op2.is_a?(String)
      version1, version2 = normalize_versions(op1, op2)
      stack.push(Gem::Version.new(version1) != Gem::Version.new(version2))
    else
      stack.push(false)
    end
  end

  @parser.add_operator('semverEq') do |_parser, stack, _context|
    op1 = stack.pop
    op2 = stack.pop
    if op1.is_a?(String) && op2.is_a?(String)
      version1, version2 = normalize_versions(op1, op2)
      stack.push(Gem::Version.new(version1) == Gem::Version.new(version2))
    else
      stack.push(false)
    end
  end

  @parser.add_operator('semverLt') do |_parser, stack, _context|
    op1 = stack.pop
    op2 = stack.pop
    if op1.is_a?(String) && op2.is_a?(String)
      version1, version2 = normalize_versions(op1, op2)
      stack.push(Gem::Version.new(version1) < Gem::Version.new(version2))
    else
      stack.push(false)
    end
  end

  @parser.add_operator('semverLte') do |_parser, stack, _context|
    op1 = stack.pop
    op2 = stack.pop
    if op1.is_a?(String) && op2.is_a?(String)
      version1, version2 = normalize_versions(op1, op2)
      stack.push(Gem::Version.new(version1) <= Gem::Version.new(version2))
    else
      stack.push(false)
    end
  end

  @parser.add_operator('semverGt') do |_parser, stack, _context|
    op1 = stack.pop
    op2 = stack.pop
    if op1.is_a?(String) && op2.is_a?(String)
      version1, version2 = normalize_versions(op1, op2)
      stack.push(Gem::Version.new(version1) > Gem::Version.new(version2))
    else
      stack.push(false)
    end
  end

  @parser.add_operator('semverGte') do |_parser, stack, _context|
    op1 = stack.pop
    op2 = stack.pop
    if op1.is_a?(String) && op2.is_a?(String)
      version1, version2 = normalize_versions(op1, op2)
      stack.push(Gem::Version.new(version1) >= Gem::Version.new(version2))
    else
      stack.push(false)
    end
  end
end
normalize_versions(version1, version2) click to toggle source
# File lib/rox/core/roxx/value_compare_extensions.rb, line 136
def normalize_versions(version1, version2)
  # Gem::Version treats versions "1.1", "1.1.0", "1.1.0.0", etc as equal.
  # Fix this behavior.

  segment_count1 = version1.split('.').length
  segment_count2 = version2.split('.').length

  return [version1, version2] if segment_count1 == segment_count2

  if segment_count1 < segment_count2
    version1 += "#{'.0' * (segment_count2 - segment_count1)}.0"
    version2 += '.1'
  else
    version1 += '.1'
    version2 += "#{'.0' * (segment_count1 - segment_count2)}.0"
  end

  [version1, version2]
end