naturalsorter 0.7.12 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +2 -2
- data/lib/natcmp.rb +33 -33
- data/lib/naturalsorter.rb +56 -0
- data/lib/naturalsorter/version.rb +1 -1
- data/lib/release_recognizer.rb +83 -6
- data/lib/versioncmp.rb +97 -119
- data/spec/release_recognizer_spec.rb +115 -0
- data/spec/versioncmp_spec.rb +8 -0
- metadata +2 -2
data/README.markdown
CHANGED
|
@@ -42,7 +42,7 @@ This here is again for an array with objects. Spezially optimizied for sorting v
|
|
|
42
42
|
|
|
43
43
|
`Naturalsorter::Sorter.sort_version_by_method(array, method)`
|
|
44
44
|
|
|
45
|
-
`Naturalsorter::Sorter.sort_version_by_method_desc(array)`
|
|
45
|
+
`Naturalsorter::Sorter.sort_version_by_method_desc(array, method)`
|
|
46
46
|
|
|
47
47
|
Get the newest version from the both given.
|
|
48
48
|
|
|
@@ -76,7 +76,7 @@ because '~>1.1' doesn't fit anymore the newest version.
|
|
|
76
76
|
|
|
77
77
|
You should add this line to your Gemfile
|
|
78
78
|
|
|
79
|
-
`gem 'naturalsorter', '0.
|
|
79
|
+
`gem 'naturalsorter', '1.0.0'`
|
|
80
80
|
|
|
81
81
|
and run this command in your app root directory
|
|
82
82
|
|
data/lib/natcmp.rb
CHANGED
|
@@ -30,47 +30,47 @@ class Natcmp
|
|
|
30
30
|
|
|
31
31
|
# 'Natural order' comparison of two strings
|
|
32
32
|
def self.natcmp(str1, str2, caseInsensitive=false)
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
str1, str2 = str1.dup, str2.dup
|
|
34
|
+
compareExpression = /^(\D*)(\d*)(.*)$/
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
if caseInsensitive
|
|
37
|
+
str1.downcase!
|
|
38
|
+
str2.downcase!
|
|
39
|
+
end
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
# Remove all whitespace
|
|
42
|
+
str1.gsub!(/\s*/, '')
|
|
43
|
+
str2.gsub!(/\s*/, '')
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
while (str1.length > 0) or (str2.length > 0) do
|
|
46
|
+
# Extract non-digits, digits and rest of string
|
|
47
|
+
str1 =~ compareExpression
|
|
48
|
+
chars1, num1, str1 = $1.dup, $2.dup, $3.dup
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
str2 =~ compareExpression
|
|
51
|
+
chars2, num2, str2 = $1.dup, $2.dup, $3.dup
|
|
52
52
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
53
|
+
# Compare the non-digits
|
|
54
|
+
case (chars1 <=> chars2)
|
|
55
|
+
when 0 # Non-digits are the same, compare the digits...
|
|
56
|
+
# If either number begins with a zero, then compare alphabetically,
|
|
57
|
+
# otherwise compare numerically
|
|
58
|
+
if (num1[0] != 48) and (num2[0] != 48)
|
|
59
|
+
num1, num2 = num1.to_i, num2.to_i
|
|
60
|
+
end
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
62
|
+
case (num1 <=> num2)
|
|
63
|
+
when -1 then return -1
|
|
64
|
+
when 1 then return 1
|
|
65
|
+
end
|
|
66
|
+
when -1 then return -1
|
|
67
|
+
when 1 then return 1
|
|
68
|
+
end # case
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
end # while
|
|
71
71
|
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
# Strings are naturally equal
|
|
73
|
+
return 0
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
end
|
data/lib/naturalsorter.rb
CHANGED
|
@@ -156,7 +156,63 @@ module Naturalsorter
|
|
|
156
156
|
end
|
|
157
157
|
true
|
|
158
158
|
end
|
|
159
|
+
|
|
160
|
+
def self.replace_minimum_stability val
|
|
161
|
+
Sorter.replace_minimum_stability val
|
|
162
|
+
end
|
|
159
163
|
|
|
160
164
|
end
|
|
165
|
+
|
|
166
|
+
class ReleaseRecognizer
|
|
167
|
+
|
|
168
|
+
def self.value_for( value )
|
|
169
|
+
ReleaseRecognizer.value_for value
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def self.compare_scopes( a, b)
|
|
173
|
+
ReleaseRecognizer.compare_scopes(a, b)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def self.scoped? value
|
|
177
|
+
ReleaseRecognizer.scoped? value
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def self.remove_scope value
|
|
181
|
+
ReleaseRecognizer.remove_scope value
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def self.stable? value
|
|
185
|
+
ReleaseRecognizer.stable? value
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def self.alpha? value
|
|
189
|
+
ReleaseRecognizer.alpha? value
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def self.beta? value
|
|
193
|
+
ReleaseRecognizer.beta? value
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def self.dev? value
|
|
197
|
+
ReleaseRecognizer.dev? value
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def self.rc? value
|
|
201
|
+
ReleaseRecognizer.rc? value
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def self.snapshot? value
|
|
205
|
+
ReleaseRecognizer.snapshot? value
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def self.pre? value
|
|
209
|
+
ReleaseRecognizer.pre? value
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def self.jbossorg? value
|
|
213
|
+
ReleaseRecognizer.jbossorg? value
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
end
|
|
161
217
|
|
|
162
218
|
end
|
data/lib/release_recognizer.rb
CHANGED
|
@@ -1,16 +1,93 @@
|
|
|
1
1
|
class ReleaseRecognizer
|
|
2
2
|
|
|
3
|
-
def self.
|
|
3
|
+
def self.value_for( value )
|
|
4
|
+
return 0 if self.dev? value
|
|
5
|
+
return 2 if self.snapshot? value
|
|
6
|
+
return 3 if self.pre? value
|
|
7
|
+
return 4 if self.alpha? value
|
|
8
|
+
return 5 if self.beta? value
|
|
9
|
+
return 6 if self.rc? value
|
|
10
|
+
return 10 if self.stable? value
|
|
11
|
+
return 1
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.compare_scopes( a, b)
|
|
15
|
+
a_val = self.value_for a
|
|
16
|
+
b_val = self.value_for b
|
|
17
|
+
return -1 if a_val < b_val
|
|
18
|
+
return 1 if a_val > b_val
|
|
19
|
+
return 0
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.scoped? value
|
|
23
|
+
self.alpha?(value) or self.beta?(value) or
|
|
24
|
+
self.dev?(value) or self.rc?(value) or
|
|
25
|
+
self.snapshot?(value) or self.pre?(value) or
|
|
26
|
+
self.jbossorg?(value)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.remove_scope value
|
|
30
|
+
if self.alpha? value
|
|
31
|
+
new_value = value.gsub(/\.[\w-]*alpha.*$/i, "")
|
|
32
|
+
return new_value.gsub(/\.[\w-]*a.*$/i, "")
|
|
33
|
+
elsif self.beta? value
|
|
34
|
+
new_value = value.gsub(/\.[\w-]*beta.*$/i, "")
|
|
35
|
+
return new_value.gsub(/\.[\w-]*b.*$/i, "")
|
|
36
|
+
elsif self.rc? value
|
|
37
|
+
return value.gsub(/\.[\w-]*rc.*$/i, "")
|
|
38
|
+
elsif self.pre? value
|
|
39
|
+
return value.gsub(/\.[\w-]*pre.*$/i, "")
|
|
40
|
+
elsif self.jbossorg? value
|
|
41
|
+
return value.gsub(/\.jbossorg.*$/i, "")
|
|
42
|
+
elsif self.snapshot? value
|
|
43
|
+
return value.gsub(/\.snapshot.*$/i, "")
|
|
44
|
+
end
|
|
45
|
+
return value
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def self.release? value
|
|
49
|
+
self.stable? value
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def self.stable? value
|
|
4
53
|
if value.match(/.+RELEASE.*/i) or value.match(/.+BUILD.*/i) or
|
|
5
54
|
value.match(/.+FINAL.*/i) or value.match(/.+SP.*/i) or
|
|
6
55
|
value.match(/.+GA.*/i)
|
|
7
56
|
return true
|
|
8
57
|
end
|
|
9
|
-
!
|
|
10
|
-
!
|
|
11
|
-
!
|
|
12
|
-
!
|
|
13
|
-
|
|
58
|
+
!self.alpha?(value) and !self.beta?(value) and
|
|
59
|
+
!self.dev?(value) and !self.pre?(value) and
|
|
60
|
+
!self.rc?(value) and !value.match(/.+SEC.*/i) and
|
|
61
|
+
!self.snapshot?(value) and !value.match(/.+M.+/i)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def self.alpha? value
|
|
65
|
+
return false if self.beta? value
|
|
66
|
+
value.match(/.*alpha.*/i) or value.match(/.+a.*/i)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def self.beta? value
|
|
70
|
+
value.match(/.*beta.*/i) or value.match(/.+b.*/i)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def self.dev? value
|
|
74
|
+
value.match(/.*dev.*/i)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def self.rc? value
|
|
78
|
+
value.match(/.*rc.*/i)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def self.snapshot? value
|
|
82
|
+
value.match(/.+SNAPSHOT.*/i)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def self.pre? value
|
|
86
|
+
value.match(/.*pre.*$/i)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def self.jbossorg? value
|
|
90
|
+
value.match(/.*jbossorg.*$/i)
|
|
14
91
|
end
|
|
15
92
|
|
|
16
93
|
end
|
data/lib/versioncmp.rb
CHANGED
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
class Versioncmp
|
|
27
27
|
|
|
28
28
|
# 'Natural version order' comparison of two version strings
|
|
29
|
+
#
|
|
29
30
|
def self.compare(a_val, b_val)
|
|
30
31
|
|
|
31
32
|
if (!a_val.nil? || a_val.eql?("") ) && b_val.nil?
|
|
@@ -40,154 +41,75 @@ class Versioncmp
|
|
|
40
41
|
return -1
|
|
41
42
|
end
|
|
42
43
|
|
|
43
|
-
a =
|
|
44
|
-
b =
|
|
44
|
+
a = pre_process a_val
|
|
45
|
+
b = pre_process b_val
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
replace_leading_v( b )
|
|
48
|
-
|
|
49
|
-
offset1 = 0;
|
|
47
|
+
offset1 = 0;
|
|
50
48
|
offset2 = 0;
|
|
51
49
|
|
|
52
50
|
for i in 0..100
|
|
53
51
|
break if offset1 >= a.length() || offset2 >= b.length()
|
|
54
52
|
|
|
55
|
-
part1 = Versioncmp.
|
|
56
|
-
part2 = Versioncmp.
|
|
53
|
+
part1 = Versioncmp.get_a_piece_of_the_cake(offset1, a);
|
|
54
|
+
part2 = Versioncmp.get_a_piece_of_the_cake(offset2, b);
|
|
57
55
|
|
|
58
|
-
if Versioncmp.timestamp?(part1) && part2.length() < 8
|
|
59
|
-
|
|
60
|
-
end
|
|
61
|
-
if Versioncmp.timestamp?(part2) && part1.length() < 8
|
|
62
|
-
return 1
|
|
63
|
-
end
|
|
56
|
+
return -1 if Versioncmp.timestamp?(part1) && part2.length() < 8
|
|
57
|
+
return 1 if Versioncmp.timestamp?(part2) && part1.length() < 8
|
|
64
58
|
|
|
65
59
|
offset1 += part1.length() + 1;
|
|
66
60
|
offset2 += part2.length() + 1;
|
|
67
61
|
|
|
68
|
-
if ( part1.match(/^[0-9]+$/)
|
|
62
|
+
if ( part1.match(/^[0-9]+$/) && part2.match(/^[0-9]+$/) )
|
|
69
63
|
ai = part1.to_i;
|
|
70
64
|
bi = part2.to_i;
|
|
71
|
-
result = Versioncmp.
|
|
65
|
+
result = Versioncmp.compare_int(ai, bi);
|
|
72
66
|
return result if result != 0
|
|
73
67
|
next
|
|
74
|
-
elsif ( part1.match(/^[0-9]+$/)
|
|
75
|
-
result =
|
|
68
|
+
elsif ( !part1.match(/^[0-9]+$/) && !part2.match(/^[0-9]+$/) )
|
|
69
|
+
result = double_scope_checker(a, b)
|
|
70
|
+
return result if result != 0
|
|
71
|
+
result = Versioncmp.compare_string(part1, part2)
|
|
76
72
|
return result if (result != 0)
|
|
77
73
|
next
|
|
78
74
|
else
|
|
79
75
|
result = Versioncmp.check_jquery_versioning(part1, part2)
|
|
80
|
-
if result != nil
|
|
81
|
-
|
|
82
|
-
end
|
|
83
|
-
return 1 if (part1.match(/^[0-9]+$/) != nil && part2.match(/^[0-9]+$/) == nil)
|
|
76
|
+
return result if result != nil
|
|
77
|
+
return 1 if (part1.match(/^[0-9]+$/) && part2.match(/^[0-9]+$/) == nil)
|
|
84
78
|
return -1;
|
|
85
79
|
end
|
|
86
|
-
end
|
|
87
|
-
result = Versioncmp.checkForRC(a, b)
|
|
88
|
-
return result
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def self.compareInt(ai, bi)
|
|
92
|
-
return -1 if (ai < bi)
|
|
93
|
-
return 0 if (ai == bi)
|
|
94
|
-
return 1
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def self.compareString(a, b)
|
|
98
|
-
return 0 if a.eql? b
|
|
99
|
-
return -1 if a < b
|
|
100
|
-
return 1
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def self.check_jquery_versioning(part1, part2)
|
|
104
|
-
# --- START ---- special case for awesome jquery shitty verison numbers
|
|
105
|
-
if ( part1.match(/^[0-9]+[a-zA-Z]+[0-9]+$/) != nil && part2.match(/^[0-9]+$/) != nil )
|
|
106
|
-
part1_1 = part1.match(/^[0-9]+/)
|
|
107
|
-
result = Versioncmp.compareInt(part1_1[0], part2)
|
|
108
|
-
if result != 0
|
|
109
|
-
return result
|
|
110
|
-
end
|
|
111
|
-
return -1
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
if ( part2.match(/^[0-9]+[a-zA-Z]+[0-9]+$/) != nil && part1.match(/^[0-9]+$/) != nil )
|
|
115
|
-
part2_1 = part2.match(/^[0-9]+/)
|
|
116
|
-
result = Versioncmp.compareInt(part1, part2_1[0])
|
|
117
|
-
if result != 0
|
|
118
|
-
return result
|
|
119
|
-
end
|
|
120
|
-
return 1
|
|
121
80
|
end
|
|
122
|
-
|
|
123
|
-
return
|
|
124
|
-
# --- END ---- special case for awesome jquery shitty verison numbers
|
|
81
|
+
result = Versioncmp.check_for_scopes(a, b)
|
|
82
|
+
return result
|
|
125
83
|
end
|
|
126
84
|
|
|
127
|
-
def self.
|
|
85
|
+
def self.check_for_scopes(a, b)
|
|
128
86
|
big = String.new(a)
|
|
129
87
|
small = String.new(b)
|
|
130
88
|
if (a.length() < b.length())
|
|
131
89
|
big = String.new(b)
|
|
132
90
|
small = String.new(a)
|
|
133
91
|
end
|
|
134
|
-
if (
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
return Versioncmp.getRcValue(a, b)
|
|
139
|
-
end
|
|
140
|
-
elsif (Versioncmp.isBeta(big))
|
|
141
|
-
bigwithoutBeta = big.gsub(/\.beta.*$/i, "")
|
|
142
|
-
bigwithoutBeta = bigwithoutBeta.gsub(/\-beta.*$/i, "")
|
|
143
|
-
if (Versioncmp.compareString(bigwithoutBeta, small) == 0)
|
|
144
|
-
return Versioncmp.getRcValue(a, b)
|
|
145
|
-
end
|
|
146
|
-
elsif (Versioncmp.isAlpha(big))
|
|
147
|
-
bigwithoutAlpha = big.gsub(/\.alpha.*$/i, "")
|
|
148
|
-
bigwithoutAlpha = bigwithoutAlpha.gsub(/\-alpha.*$/i, "")
|
|
149
|
-
if (Versioncmp.compareString(bigwithoutAlpha, small) == 0)
|
|
150
|
-
return Versioncmp.getRcValue(a, b)
|
|
151
|
-
end
|
|
152
|
-
elsif (Versioncmp.isPre(big))
|
|
153
|
-
bigwithoutPre = big.gsub(/\.pre.*$/i, "")
|
|
154
|
-
bigwithoutPre = bigwithoutPre.gsub(/\-pre.*$/i, "")
|
|
155
|
-
if (Versioncmp.compareString(bigwithoutPre, small) == 0)
|
|
156
|
-
return Versioncmp.getRcValue(a, b)
|
|
157
|
-
end
|
|
158
|
-
elsif (Versioncmp.isJbossorg(big))
|
|
159
|
-
bigwithoutRc = big.gsub(/\.jbossorg.*$/i, "")
|
|
160
|
-
bigwithoutRc = bigwithoutRc.gsub(/\-jbossorg.*$/i, "")
|
|
161
|
-
if (Versioncmp.compareString(bigwithoutRc, small) == 0)
|
|
162
|
-
return Versioncmp.getRcValue(a, b)
|
|
92
|
+
if (ReleaseRecognizer.scoped?(big))
|
|
93
|
+
big_without_scope = ReleaseRecognizer.remove_scope big
|
|
94
|
+
if (Versioncmp.compare_string(big_without_scope, small) == 0)
|
|
95
|
+
return Versioncmp.compare_string_length(a, b)
|
|
163
96
|
end
|
|
164
97
|
end
|
|
165
|
-
|
|
166
|
-
return -1 if a.length < b.length
|
|
167
|
-
return 0
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
def self.isRc(a)
|
|
171
|
-
return a.match(/.*rc.*$/i) != nil;
|
|
98
|
+
self.compare_string_length_odd(a, b)
|
|
172
99
|
end
|
|
173
|
-
|
|
174
|
-
def self.
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
return a.match(/.*alpha.*$/i) != nil;
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
def self.isPre(a)
|
|
187
|
-
return a.match(/.*pre.*$/i) != nil;
|
|
100
|
+
|
|
101
|
+
def self.double_scope_checker(a, b)
|
|
102
|
+
if ReleaseRecognizer.scoped?(a) && ReleaseRecognizer.scoped?(b)
|
|
103
|
+
a_without_scope = ReleaseRecognizer.remove_scope a
|
|
104
|
+
b_without_scope = ReleaseRecognizer.remove_scope b
|
|
105
|
+
if a_without_scope.eql? b_without_scope
|
|
106
|
+
return ReleaseRecognizer.compare_scopes(a, b)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
0
|
|
188
110
|
end
|
|
189
111
|
|
|
190
|
-
def self.
|
|
112
|
+
def self.get_a_piece_of_the_cake(offset, cake)
|
|
191
113
|
for z in 0..100
|
|
192
114
|
offsetz = offset + z
|
|
193
115
|
break if offsetz > cake.length()
|
|
@@ -203,16 +125,18 @@ class Versioncmp
|
|
|
203
125
|
return piece
|
|
204
126
|
end
|
|
205
127
|
|
|
206
|
-
def self.getRcValue(a, b)
|
|
207
|
-
return 1 if (a.length() < b.length())
|
|
208
|
-
return -1
|
|
209
|
-
end
|
|
210
|
-
|
|
211
128
|
def self.timestamp?(part)
|
|
212
129
|
return part.length() == 8 && part.match(/^[0-9]+$/) != nil
|
|
213
130
|
end
|
|
214
131
|
|
|
215
|
-
def self.
|
|
132
|
+
def self.pre_process val
|
|
133
|
+
a = replace_x_dev val
|
|
134
|
+
replace_leading_v( a )
|
|
135
|
+
replace_minimum_stability( a )
|
|
136
|
+
a
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def self.replace_x_dev val
|
|
216
140
|
new_val = String.new(val)
|
|
217
141
|
if val.eql?("dev-master")
|
|
218
142
|
new_val = "9999999"
|
|
@@ -230,4 +154,58 @@ class Versioncmp
|
|
|
230
154
|
end
|
|
231
155
|
end
|
|
232
156
|
|
|
157
|
+
def self.replace_minimum_stability val
|
|
158
|
+
if val.match(/@.*$/)
|
|
159
|
+
val.gsub!(/@.*$/, "")
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def self.check_jquery_versioning(part1, part2)
|
|
164
|
+
# --- START ---- special case for awesome jquery shitty verison numbers
|
|
165
|
+
if ( part1.match(/^[0-9]+[a-zA-Z]+[0-9]+$/) != nil && part2.match(/^[0-9]+$/) != nil )
|
|
166
|
+
part1_1 = part1.match(/^[0-9]+/)
|
|
167
|
+
result = Versioncmp.compare_int(part1_1[0], part2)
|
|
168
|
+
if result != 0
|
|
169
|
+
return result
|
|
170
|
+
end
|
|
171
|
+
return -1
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
if ( part2.match(/^[0-9]+[a-zA-Z]+[0-9]+$/) != nil && part1.match(/^[0-9]+$/) != nil )
|
|
175
|
+
part2_1 = part2.match(/^[0-9]+/)
|
|
176
|
+
result = Versioncmp.compare_int(part1, part2_1[0])
|
|
177
|
+
if result != 0
|
|
178
|
+
return result
|
|
179
|
+
end
|
|
180
|
+
return 1
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
return nil
|
|
184
|
+
# --- END ---- special case for awesome jquery shitty verison numbers
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def self.compare_int(ai, bi)
|
|
188
|
+
return -1 if (ai < bi)
|
|
189
|
+
return 0 if (ai == bi)
|
|
190
|
+
return 1
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def self.compare_string(a, b)
|
|
194
|
+
return 0 if a.eql? b
|
|
195
|
+
return -1 if a < b
|
|
196
|
+
return 1
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def self.compare_string_length(a, b)
|
|
200
|
+
return 0 if a.length() == b.length()
|
|
201
|
+
return 1 if a.length() < b.length()
|
|
202
|
+
return -1
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def self.compare_string_length_odd(a, b)
|
|
206
|
+
return 1 if a.length > b.length
|
|
207
|
+
return -1 if a.length < b.length
|
|
208
|
+
return 0
|
|
209
|
+
end
|
|
210
|
+
|
|
233
211
|
end
|
|
@@ -122,4 +122,119 @@ describe ReleaseRecognizer do
|
|
|
122
122
|
ReleaseRecognizer.release?("2.0-m4").should be_false
|
|
123
123
|
end
|
|
124
124
|
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
it "is alpha? is true" do
|
|
128
|
+
ReleaseRecognizer.alpha?("2.0.alpha").should be_true
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "is alpha? is true" do
|
|
132
|
+
ReleaseRecognizer.alpha?("2.1.0alpha").should be_true
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it "is alpha? is false" do
|
|
136
|
+
ReleaseRecognizer.alpha?("2.0.1").should be_false
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
it "is alpha? is false" do
|
|
140
|
+
ReleaseRecognizer.alpha?("2.1.0-BETA1").should be_false
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it "is scoped? is true" do
|
|
144
|
+
ReleaseRecognizer.scoped?("2.1.0alpha").should be_true
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "remove_scope is right" do
|
|
148
|
+
ReleaseRecognizer.remove_scope("2.1.0alpha").should eql("2.1")
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
it "is beta? is true" do
|
|
154
|
+
ReleaseRecognizer.beta?("2.0.beta").should be_true
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it "is beta? is true" do
|
|
158
|
+
ReleaseRecognizer.beta?("2.1.0beta").should be_true
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
it "is beta? is false" do
|
|
162
|
+
ReleaseRecognizer.beta?("2.0.1").should be_false
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
it "is beta? is true" do
|
|
166
|
+
ReleaseRecognizer.beta?("2.2.0-BETA2").should be_true
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
it "is beta? is true" do
|
|
170
|
+
ReleaseRecognizer.beta?("2.1.0-BETA1").should be_true
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it "is scoped? is true" do
|
|
174
|
+
ReleaseRecognizer.scoped?("2.1.0-BETA1").should be_true
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "remove_scope is right" do
|
|
178
|
+
ReleaseRecognizer.remove_scope("2.1.0-BETA1").should eql("2.1")
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
it "is dev? is true" do
|
|
184
|
+
ReleaseRecognizer.dev?("dev-master").should be_true
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
it "is dev? is true" do
|
|
188
|
+
ReleaseRecognizer.dev?("dev-progress-helper").should be_true
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
it "is dev? is true" do
|
|
192
|
+
ReleaseRecognizer.dev?("dev-deprecated").should be_true
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
it "is dev? is true" do
|
|
196
|
+
ReleaseRecognizer.dev?("2.2.x-dev").should be_true
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it "is dev? is false" do
|
|
200
|
+
ReleaseRecognizer.dev?("2.0.1").should be_false
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
it "is rc? is true" do
|
|
206
|
+
ReleaseRecognizer.rc?("2.0.rc").should be_true
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
it "is rc? is true" do
|
|
210
|
+
ReleaseRecognizer.rc?("2.1.0rc").should be_true
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
it "is rc? is true" do
|
|
214
|
+
ReleaseRecognizer.rc?("2.2.0-RC3").should be_true
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
it "is rc? is false" do
|
|
218
|
+
ReleaseRecognizer.rc?("2.0.1").should be_false
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
it "is snapshot? is true" do
|
|
224
|
+
ReleaseRecognizer.snapshot?("2.0.snapshot").should be_true
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
it "is snapshot? is true" do
|
|
228
|
+
ReleaseRecognizer.snapshot?("2.1.0snapshot").should be_true
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
it "is snapshot? is true" do
|
|
232
|
+
ReleaseRecognizer.snapshot?("2.2.0-snapshot3").should be_true
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
it "is snapshot? is false" do
|
|
236
|
+
ReleaseRecognizer.snapshot?("2.0.1").should be_false
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
|
|
125
240
|
end
|
data/spec/versioncmp_spec.rb
CHANGED
|
@@ -45,6 +45,10 @@ describe Versioncmp do
|
|
|
45
45
|
it "smaller RC" do
|
|
46
46
|
Versioncmp.compare("1.1.rc1", "1.1").should eql(-1)
|
|
47
47
|
end
|
|
48
|
+
|
|
49
|
+
it "smaller RC" do
|
|
50
|
+
Versioncmp.compare("1.1.rc1", "2.0").should eql(-1)
|
|
51
|
+
end
|
|
48
52
|
|
|
49
53
|
it "smaller RC" do
|
|
50
54
|
Versioncmp.compare("1.1-rc1", "1.1").should eql(-1)
|
|
@@ -53,6 +57,10 @@ describe Versioncmp do
|
|
|
53
57
|
it "smaller alpha" do
|
|
54
58
|
Versioncmp.compare("1.1-alpha1", "1.1").should eql(-1)
|
|
55
59
|
end
|
|
60
|
+
|
|
61
|
+
it "alpha is smaller than BETA" do
|
|
62
|
+
Versioncmp.compare("2.1.0alpha", "2.1.0-BETA1").should eql(-1)
|
|
63
|
+
end
|
|
56
64
|
|
|
57
65
|
it "smaller alpha-1" do
|
|
58
66
|
Versioncmp.compare("1.1-alpha-1", "1.1").should eql(-1)
|
metadata
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: naturalsorter
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease:
|
|
5
|
-
version: 0.
|
|
5
|
+
version: 1.0.0
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
8
8
|
- reiz
|
|
@@ -11,7 +11,7 @@ autorequire:
|
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
13
|
|
|
14
|
-
date: 2013-03-
|
|
14
|
+
date: 2013-03-13 00:00:00 Z
|
|
15
15
|
dependencies:
|
|
16
16
|
- !ruby/object:Gem::Dependency
|
|
17
17
|
name: rspec
|