mixlib-versioning 1.1.0 → 1.2.1
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/.expeditor/config.yml +14 -0
- data/.expeditor/update_version.sh +9 -0
- data/.github/CODEOWNERS +3 -0
- data/.travis.yml +20 -19
- data/CHANGELOG.md +21 -7
- data/Gemfile +4 -4
- data/README.md +48 -29
- data/Rakefile +20 -6
- data/VERSION +1 -0
- data/lib/mixlib/versioning.rb +10 -8
- data/lib/mixlib/versioning/format.rb +25 -22
- data/lib/mixlib/versioning/format/git_describe.rb +1 -1
- data/lib/mixlib/versioning/format/opscode_semver.rb +3 -3
- data/lib/mixlib/versioning/format/partial_semver.rb +62 -0
- data/lib/mixlib/versioning/format/rubygems.rb +9 -3
- data/lib/mixlib/versioning/format/semver.rb +1 -1
- data/lib/mixlib/versioning/version.rb +1 -1
- data/mixlib-versioning.gemspec +14 -14
- data/spec/mixlib/versioning/format/git_describe_spec.rb +51 -51
- data/spec/mixlib/versioning/format/opscode_semver_spec.rb +43 -43
- data/spec/mixlib/versioning/format/partial_semver_spec.rb +121 -0
- data/spec/mixlib/versioning/format/rubygems_spec.rb +40 -40
- data/spec/mixlib/versioning/format/semver_spec.rb +31 -31
- data/spec/mixlib/versioning/format_spec.rb +39 -12
- data/spec/mixlib/versioning/versioning_spec.rb +100 -100
- data/spec/spec_helper.rb +5 -6
- data/spec/support/shared_examples/basic_semver.rb +7 -7
- data/spec/support/shared_examples/behaviors/comparable.rb +14 -14
- data/spec/support/shared_examples/behaviors/comparable_types.rb +56 -0
- data/spec/support/shared_examples/behaviors/filterable.rb +11 -11
- data/spec/support/shared_examples/behaviors/parses_valid_version_strings.rb +1 -1
- data/spec/support/shared_examples/behaviors/rejects_invalid_version_strings.rb +1 -1
- data/spec/support/shared_examples/behaviors/serializable.rb +7 -7
- data/spec/support/shared_examples/behaviors/sortable.rb +9 -9
- data/spec/support/shared_examples/semver.rb +54 -54
- metadata +25 -18
- data/.rubocop.yml +0 -22
@@ -16,33 +16,33 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
require
|
19
|
+
require "spec_helper"
|
20
20
|
|
21
21
|
describe Mixlib::Versioning do
|
22
22
|
subject { described_class }
|
23
23
|
|
24
|
-
let(:version_string) {
|
24
|
+
let(:version_string) { "11.0.0" }
|
25
25
|
|
26
|
-
describe
|
27
|
-
describe
|
26
|
+
describe ".parse" do
|
27
|
+
describe "parsing when format type is specified" do
|
28
28
|
{
|
29
|
-
|
29
|
+
"11.0.8" => {
|
30
30
|
format_type: :semver,
|
31
31
|
expected_format: Mixlib::Versioning::Format::SemVer,
|
32
32
|
},
|
33
|
-
|
33
|
+
"11.1.1" => {
|
34
34
|
format_type: :rubygems,
|
35
35
|
expected_format: Mixlib::Versioning::Format::Rubygems,
|
36
36
|
},
|
37
|
-
|
37
|
+
"11.1.1.alpha.1" => {
|
38
38
|
format_type: :rubygems,
|
39
39
|
expected_format: Mixlib::Versioning::Format::Rubygems,
|
40
40
|
},
|
41
|
-
|
41
|
+
"11.1.1-alpha.1" => {
|
42
42
|
format_type: :opscode_semver,
|
43
43
|
expected_format: Mixlib::Versioning::Format::OpscodeSemVer,
|
44
44
|
},
|
45
|
-
|
45
|
+
"11.1.1-rc.2" => {
|
46
46
|
format_type: :opscode_semver,
|
47
47
|
expected_format: Mixlib::Versioning::Format::SemVer,
|
48
48
|
},
|
@@ -59,21 +59,21 @@ describe Mixlib::Versioning do
|
|
59
59
|
context "format type as a: #{format_type.class}" do
|
60
60
|
it "parses version string as: #{options[:expected_format]}" do
|
61
61
|
result = subject.parse(version_string, format_type)
|
62
|
-
result.
|
62
|
+
expect(result).to be_a(expected_format)
|
63
63
|
end # it
|
64
64
|
end # context
|
65
65
|
end # each
|
66
66
|
end # context
|
67
67
|
end # each_pair
|
68
68
|
|
69
|
-
describe
|
69
|
+
describe "invalid format type specified" do
|
70
70
|
[
|
71
71
|
:poop,
|
72
|
-
|
72
|
+
"poop",
|
73
73
|
Mixlib::Versioning,
|
74
74
|
].each do |invalid_format_type|
|
75
75
|
context "invalid format as a: #{invalid_format_type.class}" do
|
76
|
-
it
|
76
|
+
it "raises a Mixlib::Versioning::UnknownFormatError" do
|
77
77
|
expect { subject.parse(version_string, invalid_format_type) }.to raise_error(Mixlib::Versioning::UnknownFormatError)
|
78
78
|
end # it
|
79
79
|
end # context
|
@@ -81,89 +81,89 @@ describe Mixlib::Versioning do
|
|
81
81
|
end # describe
|
82
82
|
end # describe
|
83
83
|
|
84
|
-
describe
|
84
|
+
describe "parsing with automatic format detection" do
|
85
85
|
{
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
86
|
+
"11.0.8" => Mixlib::Versioning::Format::SemVer,
|
87
|
+
"11.0.8-1" => Mixlib::Versioning::Format::SemVer,
|
88
|
+
"11.0.8.rc.1" => Mixlib::Versioning::Format::Rubygems,
|
89
|
+
"11.0.8.rc.1-1" => Mixlib::Versioning::Format::Rubygems,
|
90
|
+
"11.0.8-rc.1" => Mixlib::Versioning::Format::OpscodeSemVer,
|
91
91
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
92
|
+
"10.18.2" => Mixlib::Versioning::Format::SemVer,
|
93
|
+
"10.18.2-poop" => Mixlib::Versioning::Format::SemVer,
|
94
|
+
"10.18.2.poop" => Mixlib::Versioning::Format::Rubygems,
|
95
|
+
"10.18.2.poop-1" => Mixlib::Versioning::Format::Rubygems,
|
96
96
|
|
97
|
-
|
98
|
-
|
99
|
-
|
97
|
+
"12.1.1+20130311134422" => Mixlib::Versioning::Format::OpscodeSemVer,
|
98
|
+
"12.1.1-rc.3+20130311134422" => Mixlib::Versioning::Format::OpscodeSemVer,
|
99
|
+
"12.1.1+20130308110833.git.2.94a1dde" => Mixlib::Versioning::Format::OpscodeSemVer,
|
100
100
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
101
|
+
"10.16.2-49-g21353f0" => Mixlib::Versioning::Format::GitDescribe,
|
102
|
+
"10.16.2-49-g21353f0-1" => Mixlib::Versioning::Format::GitDescribe,
|
103
|
+
"10.16.2.rc.2-49-g21353f0" => Mixlib::Versioning::Format::GitDescribe,
|
104
|
+
"10.16.2-rc.2-49-g21353f0" => Mixlib::Versioning::Format::GitDescribe,
|
105
105
|
}.each_pair do |version_string, expected_format|
|
106
106
|
context version_string do
|
107
107
|
let(:version_string) { version_string }
|
108
108
|
it "parses version string as: #{expected_format}" do
|
109
|
-
subject.parse(version_string).
|
109
|
+
expect(subject.parse(version_string)).to be_a(expected_format)
|
110
110
|
end # it
|
111
111
|
end # context
|
112
112
|
end # each_pair
|
113
113
|
|
114
|
-
describe
|
115
|
-
let(:version_string) {
|
116
|
-
it
|
117
|
-
subject.parse(version_string).
|
114
|
+
describe "version_string cannot be parsed" do
|
115
|
+
let(:version_string) { "A.B.C" }
|
116
|
+
it "returns nil" do
|
117
|
+
expect(subject.parse(version_string)).to be_nil
|
118
118
|
end
|
119
119
|
end
|
120
120
|
end # describe "parsing with automatic format detection"
|
121
121
|
|
122
|
-
describe
|
123
|
-
it
|
122
|
+
describe "parsing an Mixlib::Versioning::Format object" do
|
123
|
+
it "returns the same object" do
|
124
124
|
v = Mixlib::Versioning.parse(version_string)
|
125
125
|
result = subject.parse(v)
|
126
|
-
v.
|
126
|
+
expect(v).to be result
|
127
127
|
end
|
128
128
|
end
|
129
129
|
|
130
|
-
describe
|
131
|
-
context
|
132
|
-
let(:version_string) {
|
133
|
-
it
|
134
|
-
subject.parse(version_string, [Mixlib::Versioning::Format::Rubygems]).
|
130
|
+
describe "when formats are given" do
|
131
|
+
context "when the format is not in the list" do
|
132
|
+
let(:version_string) { "10.16.2-rc.2-49-g21353f0" }
|
133
|
+
it "returns nil when the array contains a Mixlib::Versioning::Format" do
|
134
|
+
expect(subject.parse(version_string, [Mixlib::Versioning::Format::Rubygems])).to be_nil
|
135
135
|
end
|
136
136
|
|
137
|
-
it
|
138
|
-
subject.parse(version_string, [
|
137
|
+
it "returns nil when the array contains a string" do
|
138
|
+
expect(subject.parse(version_string, ["rubygems"])).to be_nil
|
139
139
|
end
|
140
140
|
|
141
|
-
it
|
142
|
-
subject.parse(version_string, [:rubygems]).
|
141
|
+
it "returns nil when the array contains a symbol" do
|
142
|
+
expect(subject.parse(version_string, [:rubygems])).to be_nil
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
146
|
-
context
|
147
|
-
let(:version_string) {
|
146
|
+
context "when the format is in the list" do
|
147
|
+
let(:version_string) { "10.16.2-rc.2-49-g21353f0" }
|
148
148
|
let(:expected_format) { Mixlib::Versioning::Format::GitDescribe }
|
149
|
-
it
|
150
|
-
subject.parse(version_string, [expected_format]).
|
149
|
+
it "returns nil when the array contains a Mixlib::Versioning::Format" do
|
150
|
+
expect(subject.parse(version_string, [expected_format])).to be_a(expected_format)
|
151
151
|
end
|
152
152
|
|
153
|
-
it
|
154
|
-
subject.parse(version_string, [
|
153
|
+
it "returns nil when the array contains a string" do
|
154
|
+
expect(subject.parse(version_string, ["git_describe"])).to be_a(expected_format)
|
155
155
|
end
|
156
156
|
|
157
|
-
it
|
158
|
-
subject.parse(version_string, [:git_describe]).
|
157
|
+
it "returns nil when the array contains a symbol" do
|
158
|
+
expect(subject.parse(version_string, [:git_describe])).to be_a(expected_format)
|
159
159
|
end
|
160
160
|
end
|
161
161
|
end
|
162
162
|
end # describe .parse
|
163
163
|
|
164
|
-
describe
|
164
|
+
describe ".find_target_version" do
|
165
165
|
let(:all_versions) do
|
166
|
-
%w
|
166
|
+
%w{
|
167
167
|
11.0.0-beta.1
|
168
168
|
11.0.0-rc.1
|
169
169
|
11.0.0
|
@@ -172,7 +172,7 @@ describe Mixlib::Versioning do
|
|
172
172
|
11.0.2-alpha.0
|
173
173
|
11.0.2-alpha.0+2013041116332
|
174
174
|
11.0.2
|
175
|
-
|
175
|
+
}
|
176
176
|
end
|
177
177
|
let(:filter_version) { nil }
|
178
178
|
let(:use_prerelease_versions) { false }
|
@@ -182,99 +182,99 @@ describe Mixlib::Versioning do
|
|
182
182
|
all_versions,
|
183
183
|
filter_version,
|
184
184
|
use_prerelease_versions,
|
185
|
-
use_build_versions
|
185
|
+
use_build_versions
|
186
186
|
)
|
187
187
|
end
|
188
188
|
|
189
189
|
{
|
190
190
|
nil => {
|
191
|
-
releases_only:
|
192
|
-
prerelease_versions:
|
193
|
-
build_versions:
|
194
|
-
prerelease_and_build_versions:
|
191
|
+
releases_only: "11.0.2",
|
192
|
+
prerelease_versions: "11.0.2-alpha.0",
|
193
|
+
build_versions: "11.0.1+2013031116332",
|
194
|
+
prerelease_and_build_versions: "11.0.2-alpha.0+2013041116332",
|
195
195
|
},
|
196
|
-
|
197
|
-
releases_only:
|
198
|
-
prerelease_versions:
|
196
|
+
"11.0.0" => {
|
197
|
+
releases_only: "11.0.0",
|
198
|
+
prerelease_versions: "11.0.0-rc.1",
|
199
199
|
build_versions: nil,
|
200
200
|
prerelease_and_build_versions: nil,
|
201
201
|
},
|
202
|
-
|
203
|
-
releases_only:
|
204
|
-
prerelease_versions:
|
202
|
+
"11.0.2" => {
|
203
|
+
releases_only: "11.0.2",
|
204
|
+
prerelease_versions: "11.0.2-alpha.0",
|
205
205
|
build_versions: nil,
|
206
|
-
prerelease_and_build_versions:
|
206
|
+
prerelease_and_build_versions: "11.0.2-alpha.0+2013041116332",
|
207
207
|
},
|
208
|
-
|
209
|
-
releases_only:
|
210
|
-
prerelease_versions:
|
208
|
+
"11.0.2" => { # rubocop: disable Lint/DuplicatedKey
|
209
|
+
releases_only: "11.0.2",
|
210
|
+
prerelease_versions: "11.0.2-alpha.0",
|
211
211
|
build_versions: nil,
|
212
|
-
prerelease_and_build_versions:
|
212
|
+
prerelease_and_build_versions: "11.0.2-alpha.0+2013041116332",
|
213
213
|
},
|
214
|
-
|
215
|
-
releases_only:
|
216
|
-
prerelease_versions:
|
217
|
-
build_versions:
|
218
|
-
prerelease_and_build_versions:
|
214
|
+
"11.0.2-alpha.0" => {
|
215
|
+
releases_only: "11.0.2-alpha.0",
|
216
|
+
prerelease_versions: "11.0.2-alpha.0",
|
217
|
+
build_versions: "11.0.2-alpha.0+2013041116332",
|
218
|
+
prerelease_and_build_versions: "11.0.2-alpha.0+2013041116332",
|
219
219
|
},
|
220
220
|
}.each_pair do |filter_version, options|
|
221
221
|
context "filter version of: #{filter_version}" do
|
222
222
|
let(:filter_version) { filter_version }
|
223
223
|
let(:expected_version) { options[:releases_only] }
|
224
224
|
|
225
|
-
it
|
226
|
-
subject_find.
|
225
|
+
it "finds the most recent release version" do
|
226
|
+
expect(subject_find).to eq Mixlib::Versioning.parse(expected_version)
|
227
227
|
end
|
228
228
|
|
229
|
-
context
|
229
|
+
context "include pre-release versions" do
|
230
230
|
let(:use_prerelease_versions) { true }
|
231
231
|
let(:expected_version) { options[:prerelease_versions] }
|
232
232
|
|
233
|
-
it
|
234
|
-
subject_find.
|
233
|
+
it "finds the most recent pre-release version" do
|
234
|
+
expect(subject_find).to eq Mixlib::Versioning.parse(expected_version)
|
235
235
|
end # it
|
236
236
|
end # context
|
237
237
|
|
238
|
-
context
|
238
|
+
context "include build versions" do
|
239
239
|
let(:use_build_versions) { true }
|
240
240
|
let(:expected_version) { options[:build_versions] }
|
241
241
|
|
242
|
-
it
|
243
|
-
subject_find.
|
242
|
+
it "finds the most recent build version" do
|
243
|
+
expect(subject_find).to eq Mixlib::Versioning.parse(expected_version)
|
244
244
|
end # it
|
245
245
|
end # context
|
246
246
|
|
247
|
-
context
|
247
|
+
context "include pre-release and build versions" do
|
248
248
|
let(:use_prerelease_versions) { true }
|
249
249
|
let(:use_build_versions) { true }
|
250
250
|
let(:expected_version) { options[:prerelease_and_build_versions] }
|
251
251
|
|
252
|
-
it
|
253
|
-
subject_find.
|
252
|
+
it "finds the most recent pre-release build version" do
|
253
|
+
expect(subject_find).to eq Mixlib::Versioning.parse(expected_version)
|
254
254
|
end # it
|
255
255
|
end # context
|
256
256
|
end # context
|
257
257
|
end # each_pair
|
258
258
|
|
259
|
-
describe
|
259
|
+
describe "all_versions argument is a mix of String and Mixlib::Versioning::Format instances" do
|
260
260
|
let(:all_versions) do
|
261
261
|
[
|
262
|
-
|
263
|
-
|
264
|
-
Mixlib::Versioning.parse(
|
262
|
+
"11.0.0-beta.1",
|
263
|
+
"11.0.0-rc.1",
|
264
|
+
Mixlib::Versioning.parse("11.0.0"),
|
265
265
|
]
|
266
266
|
end
|
267
267
|
|
268
|
-
it
|
269
|
-
subject_find.
|
268
|
+
it "correctly parses the array" do
|
269
|
+
expect(subject_find).to eq Mixlib::Versioning.parse("11.0.0")
|
270
270
|
end
|
271
271
|
end # describe
|
272
272
|
|
273
|
-
describe
|
274
|
-
let(:filter_version) { Mixlib::Versioning::Format::SemVer.new(
|
273
|
+
describe "filter_version argument is an instance of Mixlib::Versioning::Format" do
|
274
|
+
let(:filter_version) { Mixlib::Versioning::Format::SemVer.new("11.0.0") }
|
275
275
|
|
276
|
-
it
|
277
|
-
subject_find.
|
276
|
+
it "finds the correct version" do
|
277
|
+
expect(subject_find).to eq Mixlib::Versioning.parse("11.0.0")
|
278
278
|
end
|
279
279
|
end
|
280
280
|
end # describe
|
data/spec/spec_helper.rb
CHANGED
@@ -16,19 +16,20 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
require
|
19
|
+
require "mixlib/versioning"
|
20
|
+
require "rspec/its"
|
20
21
|
|
21
22
|
# load all shared examples and shared contexts
|
22
|
-
Dir[File.expand_path(
|
23
|
+
Dir[File.expand_path("../support/**/*.rb", __FILE__)].each do |file|
|
23
24
|
require(file)
|
24
25
|
end
|
25
26
|
|
26
27
|
RSpec.configure do |config|
|
27
28
|
# a little syntactic sugar
|
28
|
-
config.alias_it_should_behave_like_to :it_has_behavior,
|
29
|
+
config.alias_it_should_behave_like_to :it_has_behavior, "has behavior:"
|
29
30
|
|
30
31
|
# Use color in STDOUT
|
31
|
-
config.
|
32
|
+
config.color = true
|
32
33
|
|
33
34
|
# Use color not only in STDOUT but also in pagers and files
|
34
35
|
config.tty = true
|
@@ -36,8 +37,6 @@ RSpec.configure do |config|
|
|
36
37
|
# run the examples in random order
|
37
38
|
config.order = :rand
|
38
39
|
|
39
|
-
# specify metadata with symobls only (ie no '=> true' required)
|
40
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
41
40
|
config.filter_run focus: true
|
42
41
|
config.run_all_when_everything_filtered = true
|
43
42
|
end
|
@@ -16,9 +16,9 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
shared_examples
|
20
|
-
it_has_behavior
|
21
|
-
|
19
|
+
shared_examples "Basic SemVer" do
|
20
|
+
it_has_behavior "parses valid version strings", {
|
21
|
+
"1.2.3" => {
|
22
22
|
major: 1,
|
23
23
|
minor: 2,
|
24
24
|
patch: 3,
|
@@ -32,9 +32,9 @@ shared_examples 'Basic SemVer' do
|
|
32
32
|
},
|
33
33
|
}
|
34
34
|
|
35
|
-
it_has_behavior
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
it_has_behavior "rejects invalid version strings", {
|
36
|
+
"a.1.1" => "non-numeric MAJOR",
|
37
|
+
"1.a.1" => "non-numeric MINOR",
|
38
|
+
"1.1.a" => "non-numeric PATCH",
|
39
39
|
}
|
40
40
|
end
|
@@ -16,28 +16,28 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
#
|
18
18
|
|
19
|
-
shared_examples
|
20
|
-
describe
|
19
|
+
shared_examples "comparable" do |version_matrix|
|
20
|
+
describe "#<" do
|
21
21
|
version_matrix.each_slice(2) do |a, b|
|
22
22
|
it "confirms that #{a} is less-than #{b}" do
|
23
23
|
expect(described_class.new(a) < b).to be true
|
24
|
-
expect(described_class.new(a)
|
24
|
+
expect(b < described_class.new(a)).to be false
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
describe
|
29
|
+
describe "#<=" do
|
30
30
|
version_matrix.each_slice(2) do |a, b|
|
31
31
|
it "confirms that #{a} less-than or equal to #{b}" do
|
32
32
|
expect(described_class.new(a) <= b).to be true
|
33
33
|
expect(described_class.new(a) <= a).to be true
|
34
|
-
expect(described_class.new(a)
|
35
|
-
expect(described_class.new(a)
|
34
|
+
expect(b <= described_class.new(a)).to be false
|
35
|
+
expect(b < described_class.new(a)).to be false
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
-
describe
|
40
|
+
describe "#==" do
|
41
41
|
version_matrix.each do |v|
|
42
42
|
it "confirms that #{v} is equal to #{v}" do
|
43
43
|
expect(described_class.new(v) == v).to be true
|
@@ -47,30 +47,30 @@ shared_examples 'comparable' do |version_matrix|
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
describe
|
50
|
+
describe "#>" do
|
51
51
|
version_matrix.reverse.each_slice(2) do |a, b|
|
52
52
|
it "confirms that #{a} is greather-than #{b}" do
|
53
53
|
expect(described_class.new(a) > b).to be true
|
54
|
-
expect(described_class.new(a)
|
54
|
+
expect(b > described_class.new(a)).to be false
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
describe
|
59
|
+
describe "#>=" do
|
60
60
|
version_matrix.reverse.each_slice(2) do |a, b|
|
61
61
|
it "confirms that #{a} greater-than or equal to #{b}" do
|
62
62
|
expect(described_class.new(a) >= b).to be true
|
63
63
|
expect(described_class.new(a) >= a).to be true
|
64
|
-
expect(described_class.new(a)
|
65
|
-
expect(described_class.new(a)
|
64
|
+
expect(b >= described_class.new(a)).to be false
|
65
|
+
expect(b > described_class.new(a)).to be false
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
-
describe
|
70
|
+
describe "#between?" do
|
71
71
|
let(:versions) { version_matrix.map { |v| described_class.new(v) }.sort }
|
72
72
|
|
73
|
-
it
|
73
|
+
it "comfirms that a version is between the oldest and latest release" do
|
74
74
|
min, max = versions.minmax.map(&:to_s)
|
75
75
|
middle = versions[versions.size / 2].to_s
|
76
76
|
expect(described_class.new(middle).between?(min, max)).to be true
|