Class: Rox::Core::ValueCompareExtensions

Inherits:
Object
  • Object
show all
Defined in:
lib/rox/core/roxx/value_compare_extensions.rb

Instance Method Summary collapse

Constructor Details

#initialize(parser) ⇒ ValueCompareExtensions

Returns a new instance of ValueCompareExtensions.



4
5
6
# File 'lib/rox/core/roxx/value_compare_extensions.rb', line 4

def initialize(parser)
  @parser = parser
end

Instance Method Details

#extendObject



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/rox/core/roxx/value_compare_extensions.rb', line 8

def extend
  @parser.add_operator('lt') do |parser, stack, context|
    op1 = stack.pop
    op2 = stack.pop
    if op1.is_a?(Numeric) && op2.is_a?(Numeric)
      stack.push(op1 < op2)
    else
      stack.push(false)
    end
  end

  @parser.add_operator('lte') do |parser, stack, context|
    op1 = stack.pop
    op2 = stack.pop
    if op1.is_a?(Numeric) && op2.is_a?(Numeric)
      stack.push(op1 <= op2)
    else
      stack.push(false)
    end
  end

  @parser.add_operator('gt') do |parser, stack, context|
    op1 = stack.pop
    op2 = stack.pop
    if op1.is_a?(Numeric) && op2.is_a?(Numeric)
      stack.push(op1 > op2)
    else
      stack.push(false)
    end
  end

  @parser.add_operator('gte') do |parser, stack, context|
    op1 = stack.pop
    op2 = stack.pop
    if op1.is_a?(Numeric) && op2.is_a?(Numeric)
      stack.push(op1 >= op2)
    else
      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) ⇒ Object



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/rox/core/roxx/value_compare_extensions.rb', line 116

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