semantic 1.4.1 → 1.5.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.
- checksums.yaml +4 -4
- data/lib/semantic.rb +1 -2
- data/lib/semantic/version.rb +54 -50
- data/spec/core_ext_spec.rb +12 -8
- data/spec/spec_helper.rb +0 -1
- data/spec/version_spec.rb +176 -121
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25912a3ae732b9bee108db7982c3c32a8970579c
|
4
|
+
data.tar.gz: fcd186042df03126f0318442f62e8eccc0b726d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3bf5332d05f69d77d1e04889d2782b201c8c8e1215854abcf5c695cf46793bcf013f5c901707683429989585c155f1111bcd0ad55504db3f865ffbdc1de6636
|
7
|
+
data.tar.gz: 3bedeefba2d4579b5bc262f9b09efa2b7ab625b4b715feb6059f93fced4661632ca037d62686da05c4f2f0527f07bbefd80ee2ae47cb835c0675ccf37b3637d1
|
data/lib/semantic.rb
CHANGED
data/lib/semantic/version.rb
CHANGED
@@ -1,29 +1,54 @@
|
|
1
1
|
# See: http://semver.org
|
2
2
|
module Semantic
|
3
3
|
class Version
|
4
|
-
SemVerRegexp = /\A(\d
|
5
|
-
attr_accessor :major, :minor, :patch, :pre, :build
|
4
|
+
SemVerRegexp = /\A(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][a-zA-Z0-9-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][a-zA-Z0-9-]*))*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?\Z/
|
6
5
|
|
7
|
-
def initialize version_str
|
8
|
-
raise ArgumentError.new("#{version_str} is not a valid SemVer Version (http://semver.org)") unless version_str =~ SemVerRegexp
|
9
6
|
|
10
|
-
|
11
|
-
if not parts.nil? and parts.include? '+'
|
12
|
-
@pre, @build = parts.split '+'
|
13
|
-
elsif version.include? '+'
|
14
|
-
version, @build = version.split '+'
|
15
|
-
else
|
16
|
-
@pre = parts
|
17
|
-
end
|
7
|
+
attr_accessor :major, :minor, :patch, :pre, :build
|
18
8
|
|
9
|
+
def initialize version_str
|
10
|
+
v = version_str.match(SemVerRegexp)
|
19
11
|
|
20
|
-
|
12
|
+
raise ArgumentError.new("#{version_str} is not a valid SemVer Version (http://semver.org)") if v.nil?
|
13
|
+
@major = v[1].to_i
|
14
|
+
@minor = v[2].to_i
|
15
|
+
@patch = v[3].to_i
|
16
|
+
@pre = v[4]
|
17
|
+
@build = v[5]
|
18
|
+
@version = version_str
|
21
19
|
end
|
22
20
|
|
21
|
+
|
23
22
|
def build=(b)
|
24
23
|
@build = (!b.nil? && b.empty?) ? nil : b
|
25
24
|
end
|
26
25
|
|
26
|
+
def identifiers(pre)
|
27
|
+
array = pre.split(".")
|
28
|
+
array.each_with_index {|e,i| array[i] = Integer(e) if /\A\d+\z/.match(e)}
|
29
|
+
return array
|
30
|
+
end
|
31
|
+
|
32
|
+
def compare_pre(prea, preb)
|
33
|
+
if prea.nil? || preb.nil?
|
34
|
+
return 0 if prea.nil? && preb.nil?
|
35
|
+
return 1 if prea.nil?
|
36
|
+
return -1 if preb.nil?
|
37
|
+
end
|
38
|
+
a = identifiers(prea)
|
39
|
+
b = identifiers(preb)
|
40
|
+
smallest = a.size < b.size ? a : b
|
41
|
+
smallest.each_with_index do |e, i|
|
42
|
+
c = a[i] <=> b[i]
|
43
|
+
if c.nil?
|
44
|
+
return a[i].is_a?(Integer) ? -1 : 1
|
45
|
+
elsif c != 0
|
46
|
+
return c
|
47
|
+
end
|
48
|
+
end
|
49
|
+
return a.size <=> b.size
|
50
|
+
end
|
51
|
+
|
27
52
|
def to_a
|
28
53
|
[@major, @minor, @patch, @pre, @build]
|
29
54
|
end
|
@@ -32,7 +57,6 @@ module Semantic
|
|
32
57
|
str = [@major, @minor, @patch].join '.'
|
33
58
|
str << '-' << @pre unless @pre.nil?
|
34
59
|
str << '+' << @build unless @build.nil?
|
35
|
-
|
36
60
|
str
|
37
61
|
end
|
38
62
|
|
@@ -45,19 +69,23 @@ module Semantic
|
|
45
69
|
alias to_array to_a
|
46
70
|
alias to_string to_s
|
47
71
|
|
48
|
-
def
|
49
|
-
|
50
|
-
|
51
|
-
v1 = self.dup
|
52
|
-
v2 = other_version.dup
|
72
|
+
def hash
|
73
|
+
to_a.hash
|
74
|
+
end
|
53
75
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
v1.build = nil
|
58
|
-
v2.build = nil
|
76
|
+
def eql? other_version
|
77
|
+
self.hash == other_version.hash
|
78
|
+
end
|
59
79
|
|
60
|
-
|
80
|
+
def <=> other_version
|
81
|
+
other_version = Version.new(other_version) if other_version.is_a? String
|
82
|
+
[:major, :minor, :patch].each do |part|
|
83
|
+
c = (self.send(part) <=> other_version.send(part))
|
84
|
+
if c != 0
|
85
|
+
return c
|
86
|
+
end
|
87
|
+
end
|
88
|
+
return compare_pre(self.pre, other_version.pre)
|
61
89
|
end
|
62
90
|
|
63
91
|
def > other_version
|
@@ -103,6 +131,7 @@ module Semantic
|
|
103
131
|
end
|
104
132
|
|
105
133
|
def increment!(term)
|
134
|
+
term = term.to_sym
|
106
135
|
new_version = clone
|
107
136
|
new_value = send(term) + 1
|
108
137
|
|
@@ -138,30 +167,5 @@ module Semantic
|
|
138
167
|
end
|
139
168
|
end
|
140
169
|
|
141
|
-
def compare_recursively ary1, ary2
|
142
|
-
# Short-circuit the recursion entirely if they're just equal
|
143
|
-
return 0 if ary1 == ary2
|
144
|
-
|
145
|
-
a = ary1.shift; b = ary2.shift
|
146
|
-
|
147
|
-
# Reached the end of the arrays, equal all the way down
|
148
|
-
return 0 if a.nil? and b.nil?
|
149
|
-
|
150
|
-
# Mismatched types (ie. one has a pre and the other doesn't)
|
151
|
-
if a.nil? and not b.nil?
|
152
|
-
return 1
|
153
|
-
elsif not a.nil? and b.nil?
|
154
|
-
return -1
|
155
|
-
end
|
156
|
-
|
157
|
-
if a < b
|
158
|
-
return -1
|
159
|
-
elsif a > b
|
160
|
-
return 1
|
161
|
-
end
|
162
|
-
|
163
|
-
# Versions are equal thus far, so recurse down to the next part.
|
164
|
-
compare_recursively ary1, ary2
|
165
|
-
end
|
166
170
|
end
|
167
171
|
end
|
data/spec/core_ext_spec.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'semantic/core_ext'
|
3
3
|
|
4
|
+
# rubocop:disable Metrics/BlockLength
|
4
5
|
describe 'Core Extensions' do
|
5
|
-
context
|
6
|
+
context 'String#to_version' do
|
6
7
|
before(:each) do
|
7
8
|
@test_versions = [
|
8
9
|
'1.0.0',
|
@@ -23,20 +24,23 @@ describe 'Core Extensions' do
|
|
23
24
|
]
|
24
25
|
end
|
25
26
|
|
26
|
-
it
|
27
|
-
|
27
|
+
it 'extends String with a #to_version method' do
|
28
|
+
expect('').to respond_to(:to_version)
|
28
29
|
end
|
29
30
|
|
30
|
-
it
|
31
|
+
it 'converts the String into a Version object' do
|
31
32
|
@test_versions.each do |v|
|
32
|
-
expect { v.to_version }.to_not raise_error
|
33
|
-
v.to_version.
|
33
|
+
expect { v.to_version }.to_not raise_error
|
34
|
+
expect(v.to_version).to be_a(Semantic::Version)
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
37
|
-
it
|
38
|
+
it 'raises an error on invalid strings' do
|
38
39
|
@bad_versions.each do |v|
|
39
|
-
expect { v.to_version }.to raise_error(
|
40
|
+
expect { v.to_version }.to raise_error(
|
41
|
+
ArgumentError,
|
42
|
+
/not a valid SemVer/
|
43
|
+
)
|
40
44
|
end
|
41
45
|
end
|
42
46
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/version_spec.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
|
2
|
+
# rubocop:disable Metrics/BlockLength, Style/VariableNumber
|
3
3
|
describe Semantic::Version do
|
4
4
|
before(:each) do
|
5
5
|
@test_versions = [
|
@@ -22,63 +22,66 @@ describe Semantic::Version do
|
|
22
22
|
]
|
23
23
|
end
|
24
24
|
|
25
|
-
context
|
26
|
-
it
|
25
|
+
context 'parsing' do
|
26
|
+
it 'parses valid SemVer versions' do
|
27
27
|
@test_versions.each do |v|
|
28
|
-
expect { Semantic::Version.new v }.
|
28
|
+
expect { Semantic::Version.new v }.not_to raise_error
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
it
|
32
|
+
it 'raises an error on invalid versions' do
|
33
33
|
@bad_versions.each do |v|
|
34
|
-
expect { Semantic::Version.new v }.to raise_error(
|
34
|
+
expect { Semantic::Version.new v }.to raise_error(
|
35
|
+
ArgumentError,
|
36
|
+
/not a valid SemVer/
|
37
|
+
)
|
35
38
|
end
|
36
39
|
end
|
37
40
|
|
38
|
-
it
|
41
|
+
it 'stores parsed versions in member variables' do
|
39
42
|
v1 = Semantic::Version.new '1.5.9'
|
40
|
-
v1.major.
|
41
|
-
v1.minor.
|
42
|
-
v1.patch.
|
43
|
-
v1.pre.
|
44
|
-
v1.build.
|
43
|
+
expect(v1.major).to eq(1)
|
44
|
+
expect(v1.minor).to eq(5)
|
45
|
+
expect(v1.patch).to eq(9)
|
46
|
+
expect(v1.pre).to be_nil
|
47
|
+
expect(v1.build).to be_nil
|
45
48
|
|
46
49
|
v2 = Semantic::Version.new '0.0.1-pre.1'
|
47
|
-
v2.major.
|
48
|
-
v2.minor.
|
49
|
-
v2.patch.
|
50
|
-
v2.pre.
|
51
|
-
v2.build.
|
50
|
+
expect(v2.major).to eq(0)
|
51
|
+
expect(v2.minor).to eq(0)
|
52
|
+
expect(v2.patch).to eq(1)
|
53
|
+
expect(v2.pre).to eq('pre.1')
|
54
|
+
expect(v2.build).to be_nil
|
52
55
|
|
53
56
|
v3 = Semantic::Version.new '1.0.1-pre.5+build.123.5'
|
54
|
-
v3.major.
|
55
|
-
v3.minor.
|
56
|
-
v3.patch.
|
57
|
-
v3.pre.
|
58
|
-
v3.build.
|
57
|
+
expect(v3.major).to eq(1)
|
58
|
+
expect(v3.minor).to eq(0)
|
59
|
+
expect(v3.patch).to eq(1)
|
60
|
+
expect(v3.pre).to eq('pre.5')
|
61
|
+
expect(v3.build).to eq('build.123.5')
|
59
62
|
|
60
63
|
v4 = Semantic::Version.new '0.0.0+hello'
|
61
|
-
v4.major.
|
62
|
-
v4.minor.
|
63
|
-
v4.patch.
|
64
|
-
v4.pre.
|
65
|
-
v4.build.
|
66
|
-
end
|
67
|
-
|
68
|
-
it
|
69
|
-
v = Semantic::Version.new(
|
70
|
-
v.build =
|
64
|
+
expect(v4.major).to eq(0)
|
65
|
+
expect(v4.minor).to eq(0)
|
66
|
+
expect(v4.patch).to eq(0)
|
67
|
+
expect(v4.pre).to be_nil
|
68
|
+
expect(v4.build).to eq('hello')
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'provides round-trip fidelity for an empty build parameter' do
|
72
|
+
v = Semantic::Version.new('1.2.3')
|
73
|
+
v.build = ''
|
71
74
|
expect(Semantic::Version.new(v.to_s).build).to eq(v.build)
|
72
75
|
end
|
73
76
|
|
74
|
-
it
|
75
|
-
v = Semantic::Version.new(
|
77
|
+
it 'provides round-trip fidelity for a nil build parameter' do
|
78
|
+
v = Semantic::Version.new('1.2.3+build')
|
76
79
|
v.build = nil
|
77
80
|
expect(Semantic::Version.new(v.to_s).build).to eq(v.build)
|
78
81
|
end
|
79
82
|
end
|
80
83
|
|
81
|
-
context
|
84
|
+
context 'comparisons' do
|
82
85
|
before(:each) do
|
83
86
|
# These three are all semantically equivalent, according to the spec.
|
84
87
|
@v1_5_9_pre_1 = Semantic::Version.new '1.5.9-pre.1'
|
@@ -87,159 +90,211 @@ describe Semantic::Version do
|
|
87
90
|
|
88
91
|
@v1_5_9 = Semantic::Version.new '1.5.9'
|
89
92
|
@v1_6_0 = Semantic::Version.new '1.6.0'
|
93
|
+
|
94
|
+
@v1_6_0_alpha = Semantic::Version.new '1.6.0-alpha'
|
95
|
+
@v1_6_0_alpha_1 = Semantic::Version.new '1.6.0-alpha.1'
|
96
|
+
@v1_6_0_alpha_beta = Semantic::Version.new '1.6.0-alpha.beta'
|
97
|
+
@v1_6_0_beta = Semantic::Version.new '1.6.0-beta'
|
98
|
+
@v1_6_0_beta_2 = Semantic::Version.new '1.6.0-beta.2'
|
99
|
+
@v1_6_0_beta_11 = Semantic::Version.new '1.6.0-beta.11'
|
100
|
+
@v1_6_0_rc_1 = Semantic::Version.new '1.6.0-rc.1'
|
101
|
+
|
102
|
+
# expected order:
|
103
|
+
# 1.6.0-alpha < 1.6.0-alpha.1 < 1.6.0-alpha.beta < 1.6.0-beta
|
104
|
+
# < 1.6.0-beta.2 < 1.6.0-beta.11 < 1.6.0-rc.1 < 1.6.0.
|
90
105
|
end
|
91
106
|
|
92
|
-
it
|
93
|
-
# The second parameter here can be a string, so we want to ensure that
|
94
|
-
|
107
|
+
it 'determines sort order' do
|
108
|
+
# The second parameter here can be a string, so we want to ensure that
|
109
|
+
# this kind of comparison works also.
|
110
|
+
expect((@v1_5_9_pre_1 <=> @v1_5_9_pre_1.to_s)).to eq(0)
|
95
111
|
|
96
|
-
(@v1_5_9_pre_1 <=> @v1_5_9_pre_1_build_5127).
|
97
|
-
(@v1_5_9_pre_1 <=> @v1_5_9).
|
98
|
-
(@v1_5_9_pre_1_build_5127 <=> @v1_5_9).
|
112
|
+
expect((@v1_5_9_pre_1 <=> @v1_5_9_pre_1_build_5127)).to eq(0)
|
113
|
+
expect((@v1_5_9_pre_1 <=> @v1_5_9)).to eq(-1)
|
114
|
+
expect((@v1_5_9_pre_1_build_5127 <=> @v1_5_9)).to eq(-1)
|
99
115
|
|
100
|
-
@v1_5_9_pre_1_build_5127.build.
|
116
|
+
expect(@v1_5_9_pre_1_build_5127.build).to eq('build.5127')
|
101
117
|
|
102
|
-
(@v1_5_9 <=> @
|
118
|
+
expect((@v1_5_9 <=> @v1_6_0)).to eq(-1)
|
119
|
+
expect((@v1_6_0 <=> @v1_5_9)).to eq(1)
|
120
|
+
expect((@v1_6_0 <=> @v1_5_9_pre_1)).to eq(1)
|
121
|
+
expect((@v1_5_9_pre_1 <=> @v1_6_0)).to eq(-1)
|
103
122
|
|
104
|
-
(@
|
105
|
-
|
106
|
-
|
107
|
-
|
123
|
+
expect([@v1_5_9_pre_1, @v1_5_9_pre_1_build_5127, @v1_5_9, @v1_6_0]
|
124
|
+
.reverse.sort).to \
|
125
|
+
eq([@v1_5_9_pre_1, @v1_5_9_pre_1_build_5127, @v1_5_9, @v1_6_0])
|
126
|
+
end
|
108
127
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
128
|
+
it 'determines sort order pre' do
|
129
|
+
ary = [@v1_6_0_alpha, @v1_6_0_alpha_1, @v1_6_0_alpha_beta,
|
130
|
+
@v1_6_0_beta, @v1_6_0_beta_2, @v1_6_0_beta_11, @v1_6_0_rc_1,
|
131
|
+
@v1_6_0]
|
132
|
+
expect(ary.shuffle.sort).to eq(ary)
|
113
133
|
end
|
114
134
|
|
115
|
-
it
|
116
|
-
# These should be equal, since "Build metadata SHOULD be ignored
|
135
|
+
it 'determines whether it is greater than another instance' do
|
136
|
+
# These should be equal, since "Build metadata SHOULD be ignored
|
137
|
+
# when determining version precedence".
|
117
138
|
# (SemVer 2.0.0-rc.2, paragraph 10 - http://www.semver.org)
|
118
|
-
@v1_5_9_pre_1.
|
119
|
-
@v1_5_9_pre_1.
|
139
|
+
expect(@v1_5_9_pre_1).not_to be > @v1_5_9_pre_1_build_5127
|
140
|
+
expect(@v1_5_9_pre_1).not_to be < @v1_5_9_pre_1_build_5127
|
120
141
|
|
121
|
-
@v1_6_0.
|
122
|
-
@v1_5_9.
|
123
|
-
@v1_5_9.
|
124
|
-
@v1_5_9.
|
142
|
+
expect(@v1_6_0).to be > @v1_5_9
|
143
|
+
expect(@v1_5_9).not_to be > @v1_6_0
|
144
|
+
expect(@v1_5_9).to be > @v1_5_9_pre_1_build_5127
|
145
|
+
expect(@v1_5_9).to be > @v1_5_9_pre_1
|
125
146
|
end
|
126
147
|
|
127
|
-
it
|
128
|
-
@v1_5_9_pre_1.
|
129
|
-
@v1_5_9_pre_1_build_5127.
|
130
|
-
@v1_5_9_pre_1.
|
131
|
-
@v1_5_9_pre_1.
|
132
|
-
@v1_5_9_pre_1_build_5127.
|
133
|
-
@v1_5_9.
|
148
|
+
it 'determines whether it is less than another instance' do
|
149
|
+
expect(@v1_5_9_pre_1).not_to be < @v1_5_9_pre_1_build_5127
|
150
|
+
expect(@v1_5_9_pre_1_build_5127).not_to be < @v1_5_9_pre_1
|
151
|
+
expect(@v1_5_9_pre_1).to be < @v1_5_9
|
152
|
+
expect(@v1_5_9_pre_1).to be < @v1_6_0
|
153
|
+
expect(@v1_5_9_pre_1_build_5127).to be < @v1_6_0
|
154
|
+
expect(@v1_5_9).to be < @v1_6_0
|
134
155
|
end
|
135
156
|
|
136
|
-
it
|
137
|
-
@v1_5_9_pre_1.
|
138
|
-
@v1_5_9_pre_1.
|
139
|
-
@v1_5_9_pre_1_build_5127.
|
140
|
-
@v1_5_9.
|
141
|
-
@v1_6_0.
|
142
|
-
@v1_5_9_pre_1_build_5127.
|
157
|
+
it 'determines whether it is greater than or equal to another instance' do
|
158
|
+
expect(@v1_5_9_pre_1).to be >= @v1_5_9_pre_1
|
159
|
+
expect(@v1_5_9_pre_1).to be >= @v1_5_9_pre_1_build_5127
|
160
|
+
expect(@v1_5_9_pre_1_build_5127).to be >= @v1_5_9_pre_1
|
161
|
+
expect(@v1_5_9).to be >= @v1_5_9_pre_1
|
162
|
+
expect(@v1_6_0).to be >= @v1_5_9
|
163
|
+
expect(@v1_5_9_pre_1_build_5127).not_to be >= @v1_6_0
|
143
164
|
end
|
144
165
|
|
145
|
-
it
|
146
|
-
@v1_5_9_pre_1.
|
147
|
-
@v1_6_0.
|
148
|
-
@v1_5_9_pre_1_build_5127.
|
149
|
-
@v1_5_9.
|
166
|
+
it 'determines whether it is less than or equal to another instance' do
|
167
|
+
expect(@v1_5_9_pre_1).to be <= @v1_5_9_pre_1_build_5127
|
168
|
+
expect(@v1_6_0).not_to be <= @v1_5_9
|
169
|
+
expect(@v1_5_9_pre_1_build_5127).to be <= @v1_5_9_pre_1_build_5127
|
170
|
+
expect(@v1_5_9).not_to be <= @v1_5_9_pre_1
|
150
171
|
end
|
151
172
|
|
152
|
-
it
|
153
|
-
@v1_5_9_pre_1.
|
154
|
-
@v1_5_9_pre_1_build_5127.
|
173
|
+
it 'determines whether it is semantically equal to another instance' do
|
174
|
+
expect(@v1_5_9_pre_1).to eq(@v1_5_9_pre_1.dup)
|
175
|
+
expect(@v1_5_9_pre_1_build_5127).to eq(@v1_5_9_pre_1_build_5127.dup)
|
155
176
|
|
156
|
-
# "Semantically equal" is the keyword here; these are by definition
|
177
|
+
# "Semantically equal" is the keyword here; these are by definition
|
178
|
+
# not "equal" (different build), but should be treated as
|
157
179
|
# equal according to the spec.
|
158
|
-
@v1_5_9_pre_1_build_4352.
|
159
|
-
@v1_5_9_pre_1_build_4352.
|
180
|
+
expect(@v1_5_9_pre_1_build_4352).to eq(@v1_5_9_pre_1_build_5127)
|
181
|
+
expect(@v1_5_9_pre_1_build_4352).to eq(@v1_5_9_pre_1)
|
160
182
|
end
|
161
183
|
|
162
|
-
it
|
163
|
-
@v1_6_0.satisfies('>=1.6.0').
|
164
|
-
@v1_6_0.satisfies('<=1.6.0').
|
165
|
-
@v1_6_0.satisfies('>=1.5.0').
|
166
|
-
@v1_6_0.satisfies('<=1.5.0').
|
184
|
+
it 'determines whether it satisfies >= style specifications' do
|
185
|
+
expect(@v1_6_0.satisfies('>=1.6.0')).to be true
|
186
|
+
expect(@v1_6_0.satisfies('<=1.6.0')).to be true
|
187
|
+
expect(@v1_6_0.satisfies('>=1.5.0')).to be true
|
188
|
+
expect(@v1_6_0.satisfies('<=1.5.0')).not_to be true
|
167
189
|
|
168
190
|
# partial / non-semver numbers after comparator are extremely common in
|
169
191
|
# version specifications in the wild
|
170
192
|
|
171
|
-
@v1_6_0.satisfies('>1.5').
|
172
|
-
@v1_6_0.satisfies('<1').
|
193
|
+
expect(@v1_6_0.satisfies('>1.5')).to be true
|
194
|
+
expect(@v1_6_0.satisfies('<1')).not_to be true
|
173
195
|
end
|
174
196
|
|
175
|
-
it
|
176
|
-
@v1_6_0.satisfies('1.*').
|
177
|
-
@v1_6_0.satisfies('1.6.*').
|
178
|
-
@v1_6_0.satisfies('2.*').
|
179
|
-
@v1_6_0.satisfies('1.5.*').
|
197
|
+
it 'determines whether it satisfies * style specifications' do
|
198
|
+
expect(@v1_6_0.satisfies('1.*')).to be true
|
199
|
+
expect(@v1_6_0.satisfies('1.6.*')).to be true
|
200
|
+
expect(@v1_6_0.satisfies('2.*')).not_to be true
|
201
|
+
expect(@v1_6_0.satisfies('1.5.*')).not_to be true
|
180
202
|
end
|
181
203
|
|
182
|
-
it
|
183
|
-
@v1_6_0.satisfies('~1.6').
|
184
|
-
@v1_5_9_pre_1.satisfies('~1.5').
|
185
|
-
@v1_6_0.satisfies('~1.5').
|
204
|
+
it 'determines whether it satisfies ~ style specifications' do
|
205
|
+
expect(@v1_6_0.satisfies('~1.6')).to be true
|
206
|
+
expect(@v1_5_9_pre_1.satisfies('~1.5')).to be true
|
207
|
+
expect(@v1_6_0.satisfies('~1.5')).not_to be true
|
186
208
|
end
|
187
|
-
|
188
209
|
end
|
189
210
|
|
190
|
-
context
|
191
|
-
it
|
211
|
+
context 'type coercions' do
|
212
|
+
it 'converts to a string' do
|
192
213
|
@test_versions.each do |v|
|
193
|
-
Semantic::Version.new(v).to_s.
|
214
|
+
expect(Semantic::Version.new(v).to_s).to be == v
|
194
215
|
end
|
195
216
|
end
|
196
217
|
|
197
|
-
it
|
198
|
-
Semantic::Version.new('1.0.0').to_a.
|
199
|
-
|
200
|
-
Semantic::Version.new('
|
201
|
-
|
218
|
+
it 'converts to an array' do
|
219
|
+
expect(Semantic::Version.new('1.0.0').to_a).to \
|
220
|
+
eq([1, 0, 0, nil, nil])
|
221
|
+
expect(Semantic::Version.new('6.1.4-pre.5').to_a).to \
|
222
|
+
eq([6, 1, 4, 'pre.5', nil])
|
223
|
+
expect(Semantic::Version.new('91.6.0+build.17').to_a).to \
|
224
|
+
eq([91, 6, 0, nil, 'build.17'])
|
225
|
+
expect(Semantic::Version.new('0.1.5-pre.7+build191').to_a).to \
|
226
|
+
eq([0, 1, 5, 'pre.7', 'build191'])
|
202
227
|
end
|
203
228
|
|
204
|
-
it
|
205
|
-
Semantic::Version.new('1.0.0').to_h.
|
206
|
-
|
207
|
-
Semantic::Version.new('
|
208
|
-
|
229
|
+
it 'converts to a hash' do
|
230
|
+
expect(Semantic::Version.new('1.0.0').to_h).to \
|
231
|
+
eq(major: 1, minor: 0, patch: 0, pre: nil, build: nil)
|
232
|
+
expect(Semantic::Version.new('6.1.4-pre.5').to_h).to \
|
233
|
+
eq(major: 6, minor: 1, patch: 4, pre: 'pre.5', build: nil)
|
234
|
+
expect(Semantic::Version.new('91.6.0+build.17').to_h).to \
|
235
|
+
eq(major: 91, minor: 6, patch: 0, pre: nil, build: 'build.17')
|
236
|
+
expect(Semantic::Version.new('0.1.5-pre.7+build191').to_h).to \
|
237
|
+
eq(major: 0, minor: 1, patch: 5, pre: 'pre.7', build: 'build191')
|
209
238
|
end
|
210
239
|
|
211
|
-
it
|
240
|
+
it 'aliases conversion methods' do
|
212
241
|
v = Semantic::Version.new('0.0.0')
|
213
|
-
[:to_hash, :to_array, :to_string].each
|
242
|
+
[:to_hash, :to_array, :to_string].each do |sym|
|
243
|
+
expect(v).to respond_to(sym)
|
244
|
+
end
|
214
245
|
end
|
215
246
|
end
|
216
247
|
|
248
|
+
it 'as hash key' do
|
249
|
+
hash = {}
|
250
|
+
hash[Semantic::Version.new('1.2.3-pre1+build2')] = 'semantic'
|
251
|
+
expect(hash[Semantic::Version.new('1.2.3-pre1+build2')]).to eq('semantic')
|
252
|
+
end
|
253
|
+
|
217
254
|
describe '#major!' do
|
218
255
|
subject { described_class.new('1.2.3-pre1+build2') }
|
219
256
|
|
220
257
|
context 'changing the major term' do
|
221
258
|
it 'changes the major version and resets the others' do
|
222
|
-
subject.major
|
259
|
+
expect(subject.major!).to eq('2.0.0')
|
223
260
|
end
|
224
261
|
end
|
225
262
|
end
|
226
263
|
|
227
|
-
describe '#minor' do
|
264
|
+
describe '#minor!' do
|
228
265
|
subject { described_class.new('1.2.3-pre1+build2') }
|
229
266
|
|
230
267
|
context 'changing the minor term' do
|
231
268
|
it 'changes minor term and resets patch, pre and build' do
|
232
|
-
subject.minor
|
269
|
+
expect(subject.minor!).to eq('1.3.0')
|
233
270
|
end
|
234
271
|
end
|
235
272
|
end
|
236
273
|
|
237
|
-
describe '#patch' do
|
274
|
+
describe '#patch!' do
|
238
275
|
subject { described_class.new('1.2.3-pre1+build2') }
|
239
276
|
|
240
277
|
context 'changing the patch term' do
|
241
278
|
it 'changes the patch term and resets the pre and build' do
|
242
|
-
subject.patch
|
279
|
+
expect(subject.patch!).to eq('1.2.4')
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
describe '#increment!' do
|
285
|
+
subject { described_class.new('1.2.3-pre1+build2') }
|
286
|
+
|
287
|
+
context 'changing the minor term' do
|
288
|
+
context 'with a string' do
|
289
|
+
it 'changes the minor term and resets the path, pre and build' do
|
290
|
+
expect(subject.increment!('minor')).to eq('1.3.0')
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
context 'with a symbol' do
|
295
|
+
it 'changes the minor term and resets the path, pre and build' do
|
296
|
+
expect(subject.increment!(:minor)).to eq('1.3.0')
|
297
|
+
end
|
243
298
|
end
|
244
299
|
end
|
245
300
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: semantic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Lindsey
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-11-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '11'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '11'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '3'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '3'
|
41
41
|
description: 'Semantic Version utility class for parsing, storing, and comparing versions.
|
42
42
|
See: http://semver.org'
|
43
43
|
email:
|
@@ -74,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
74
|
version: '0'
|
75
75
|
requirements: []
|
76
76
|
rubyforge_project:
|
77
|
-
rubygems_version: 2.
|
77
|
+
rubygems_version: 2.5.1
|
78
78
|
signing_key:
|
79
79
|
specification_version: 4
|
80
80
|
summary: Semantic Version utility class
|