mixlib-versioning 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.
Files changed (32) hide show
  1. data/.gitignore +18 -0
  2. data/.yardopts +7 -0
  3. data/CHANGELOG.md +3 -0
  4. data/CONTRIBUTING.md +188 -0
  5. data/Gemfile +9 -0
  6. data/LICENSE +201 -0
  7. data/README.md +364 -0
  8. data/Rakefile +6 -0
  9. data/lib/mixlib/versioning.rb +194 -0
  10. data/lib/mixlib/versioning/exceptions.rb +28 -0
  11. data/lib/mixlib/versioning/format.rb +351 -0
  12. data/lib/mixlib/versioning/format/git_describe.rb +71 -0
  13. data/lib/mixlib/versioning/format/opscode_semver.rb +91 -0
  14. data/lib/mixlib/versioning/format/rubygems.rb +66 -0
  15. data/lib/mixlib/versioning/format/semver.rb +66 -0
  16. data/lib/mixlib/versioning/version.rb +23 -0
  17. data/mixlib-versioning.gemspec +22 -0
  18. data/spec/mixlib/versioning/format/git_describe_spec.rb +178 -0
  19. data/spec/mixlib/versioning/format/opscode_semver_spec.rb +113 -0
  20. data/spec/mixlib/versioning/format/rubygems_spec.rb +142 -0
  21. data/spec/mixlib/versioning/format/semver_spec.rb +107 -0
  22. data/spec/mixlib/versioning/format_spec.rb +69 -0
  23. data/spec/mixlib/versioning/versioning_spec.rb +259 -0
  24. data/spec/spec_helper.rb +43 -0
  25. data/spec/support/shared_examples/basic_semver.rb +42 -0
  26. data/spec/support/shared_examples/behaviors/filterable.rb +66 -0
  27. data/spec/support/shared_examples/behaviors/parses_valid_version_strings.rb +32 -0
  28. data/spec/support/shared_examples/behaviors/rejects_invalid_version_strings.rb +32 -0
  29. data/spec/support/shared_examples/behaviors/serializable.rb +51 -0
  30. data/spec/support/shared_examples/behaviors/sortable.rb +45 -0
  31. data/spec/support/shared_examples/semver.rb +105 -0
  32. metadata +127 -0
@@ -0,0 +1,113 @@
1
+ #
2
+ # Author:: Seth Chisamore (<schisamo@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'spec_helper'
20
+
21
+ describe Mixlib::Versioning::Format::OpscodeSemVer do
22
+
23
+ subject{ described_class.new(version_string) }
24
+
25
+ it_should_behave_like Mixlib::Versioning::Format::SemVer
26
+
27
+ it_has_behavior "rejects invalid version strings", {
28
+ "1.0.0-poop.0" => "non-valid pre-release type",
29
+ "1.0.0+2010AA08010101" => "a malformed timestamp",
30
+ "1.0.0+cvs.33.e0f985a" => "a malformed git describe: no git string",
31
+ "1.0.0+git.AA.e0f985a" => "a malformed git describe: non-numeric COMMITS_SINCE",
32
+ "1.0.0+git.33.z0f985a" => "a malformed git describe: invalid SHA1"
33
+ }
34
+
35
+ it_has_behavior "serializable", [
36
+ "1.0.0",
37
+ "1.0.0-alpha.1",
38
+ "1.0.0-alpha.1+20130308110833",
39
+ "1.0.0+20130308110833.git.2.94a1dde"
40
+ ]
41
+
42
+ it_has_behavior "sortable" do
43
+ let(:unsorted_version_strings){%w{
44
+ 1.0.0-beta.2
45
+ 1.0.0-alpha
46
+ 1.0.0-rc.1+20130309074433
47
+ 1.0.0
48
+ 1.0.0-beta.11
49
+ 1.0.0+20121009074433
50
+ 1.0.0-rc.1
51
+ 1.0.0-alpha.1
52
+ 1.3.7+20131009104433.git.2.94a1dde
53
+ 1.3.7+20131009104433
54
+ 1.3.7+20131009074433
55
+ }}
56
+ let(:sorted_version_strings){%w{
57
+ 1.0.0-alpha
58
+ 1.0.0-alpha.1
59
+ 1.0.0-beta.2
60
+ 1.0.0-beta.11
61
+ 1.0.0-rc.1
62
+ 1.0.0-rc.1+20130309074433
63
+ 1.0.0
64
+ 1.0.0+20121009074433
65
+ 1.3.7+20131009074433
66
+ 1.3.7+20131009104433
67
+ 1.3.7+20131009104433.git.2.94a1dde
68
+ }}
69
+ let(:min){ "1.0.0-alpha" }
70
+ let(:max){ "1.3.7+20131009104433.git.2.94a1dde" }
71
+ end # it_has_behavior
72
+
73
+ it_has_behavior "filterable" do
74
+ let(:unsorted_version_strings){%w{
75
+ 1.0.0-beta.2
76
+ 1.0.0-alpha
77
+ 1.0.0-rc.1+20130309074433
78
+ 1.0.0
79
+ 1.0.0-beta.11
80
+ 1.0.0+20121009074433
81
+ 1.0.0-rc.1
82
+ 1.0.0-alpha.1
83
+ 1.3.7+20131009104433.git.2.94a1dde
84
+ 1.3.7+20131009104433
85
+ 1.3.7+20131009074433
86
+ }}
87
+ let(:release_versions){%w{ 1.0.0 }}
88
+ let(:prerelease_versions){%w{
89
+ 1.0.0-beta.2
90
+ 1.0.0-alpha
91
+ 1.0.0-beta.11
92
+ 1.0.0-rc.1
93
+ 1.0.0-alpha.1
94
+ }}
95
+ let(:build_versions){%w{
96
+ 1.0.0-rc.1+20130309074433
97
+ 1.0.0+20121009074433
98
+ 1.3.7+20131009104433.git.2.94a1dde
99
+ 1.3.7+20131009104433
100
+ 1.3.7+20131009074433
101
+ }}
102
+ let(:release_build_versions){%w{
103
+ 1.0.0+20121009074433
104
+ 1.3.7+20131009104433.git.2.94a1dde
105
+ 1.3.7+20131009104433
106
+ 1.3.7+20131009074433
107
+ }}
108
+ let(:prerelease_build_versions){%w{
109
+ 1.0.0-rc.1+20130309074433
110
+ }}
111
+ end # it_has_behavior
112
+
113
+ end # describe
@@ -0,0 +1,142 @@
1
+ #
2
+ # Author:: Seth Chisamore (<schisamo@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'spec_helper'
20
+
21
+ describe Mixlib::Versioning::Format::Rubygems do
22
+
23
+ subject{ described_class.new(version_string) }
24
+
25
+ it_should_behave_like "Basic SemVer"
26
+
27
+ it_has_behavior "parses valid version strings", {
28
+ "10.1.1" => {
29
+ :major => 10,
30
+ :minor => 1,
31
+ :patch => 1,
32
+ :prerelease => nil,
33
+ :build => nil,
34
+ :release? => true,
35
+ :prerelease? => false,
36
+ :build? => false,
37
+ :release_build? => false,
38
+ :prerelease_build? => false,
39
+ :iteration => 0
40
+ },
41
+ "10.1.1.alpha.1" => {
42
+ :major => 10,
43
+ :minor => 1,
44
+ :patch => 1,
45
+ :prerelease => "alpha.1",
46
+ :build => nil,
47
+ :release? => false,
48
+ :prerelease? => true,
49
+ :build? => false,
50
+ :release_build? => false,
51
+ :prerelease_build? => false,
52
+ :iteration => 0
53
+ },
54
+ "11.0.8.rc.3" => {
55
+ :major => 11,
56
+ :minor => 0,
57
+ :patch => 8,
58
+ :prerelease => "rc.3",
59
+ :build => nil,
60
+ :release? => false,
61
+ :prerelease? => true,
62
+ :build? => false,
63
+ :release_build? => false,
64
+ :prerelease_build? => false,
65
+ :iteration => 0
66
+ },
67
+ "11.0.8-33" => {
68
+ :major => 11,
69
+ :minor => 0,
70
+ :patch => 8,
71
+ :prerelease => nil,
72
+ :build => nil,
73
+ :release? => true,
74
+ :prerelease? => false,
75
+ :build? => false,
76
+ :release_build? => false,
77
+ :prerelease_build? => false,
78
+ :iteration => 33
79
+ },
80
+ "11.0.8.rc.3-1" => {
81
+ :major => 11,
82
+ :minor => 0,
83
+ :patch => 8,
84
+ :prerelease => "rc.3",
85
+ :build => nil,
86
+ :release? => false,
87
+ :prerelease? => true,
88
+ :build? => false,
89
+ :release_build? => false,
90
+ :prerelease_build? => false,
91
+ :iteration => 1
92
+ }
93
+ }
94
+
95
+ it_has_behavior "rejects invalid version strings", {
96
+ "1.1.1-rutro" => "dash for pre-release delimeter"
97
+ }
98
+
99
+ it_has_behavior "serializable", [
100
+ "1.0.0",
101
+ "1.0.0.alpha.1",
102
+ "1.0.0.beta"
103
+ ]
104
+
105
+ it_has_behavior "sortable" do
106
+ let(:unsorted_version_strings){%w{
107
+ 1.0.0.beta.2
108
+ 1.3.7.alpha.0
109
+ 1.0.0.alpha
110
+ 1.0.0.rc.1
111
+ 1.0.0
112
+ }}
113
+ let(:sorted_version_strings){%w{
114
+ 1.0.0.alpha
115
+ 1.0.0.beta.2
116
+ 1.0.0.rc.1
117
+ 1.0.0
118
+ 1.3.7.alpha.0
119
+ }}
120
+ let(:min){ "1.0.0.alpha" }
121
+ let(:max){ "1.3.7.alpha.0" }
122
+ end
123
+
124
+ # The +Rubygems+ format only produces release and prerelease versions.
125
+ it_has_behavior "filterable" do
126
+ let(:unsorted_version_strings){%w{
127
+ 1.0.0.beta.2
128
+ 1.3.7.alpha.0
129
+ 1.0.0.alpha
130
+ 1.0.0.rc.1
131
+ 1.0.0
132
+ }}
133
+ let(:release_versions){%w{ 1.0.0 }}
134
+ let(:prerelease_versions){%w{
135
+ 1.0.0.beta.2
136
+ 1.3.7.alpha.0
137
+ 1.0.0.alpha
138
+ 1.0.0.rc.1
139
+ }}
140
+ end
141
+
142
+ end
@@ -0,0 +1,107 @@
1
+ #
2
+ # Author:: Seth Chisamore (<schisamo@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'spec_helper'
20
+
21
+ describe Mixlib::Versioning::Format::SemVer do
22
+
23
+ subject{ described_class.new(version_string) }
24
+
25
+ it_should_behave_like Mixlib::Versioning::Format::SemVer
26
+
27
+ it_has_behavior "serializable", [
28
+ "1.0.0",
29
+ "1.0.0-alpha.1",
30
+ "1.0.0-alpha.1+some.build.version",
31
+ "1.0.0+build.build.build"
32
+ ]
33
+
34
+ it_has_behavior "sortable" do
35
+ let(:unsorted_version_strings){%w{
36
+ 1.0.0-beta.2
37
+ 1.0.0-alpha
38
+ 1.0.0-rc.1+build.1
39
+ 1.0.0
40
+ 1.0.0-beta.11
41
+ 1.0.0+0.3.7
42
+ 1.0.0-rc.1
43
+ 1.0.0-alpha.1
44
+ 1.3.7+build.2.b8f12d7
45
+ 1.3.7+build.11.e0f985a
46
+ 1.3.7+build
47
+ }}
48
+ let(:sorted_version_strings){%w{
49
+ 1.0.0-alpha
50
+ 1.0.0-alpha.1
51
+ 1.0.0-beta.2
52
+ 1.0.0-beta.11
53
+ 1.0.0-rc.1
54
+ 1.0.0-rc.1+build.1
55
+ 1.0.0
56
+ 1.0.0+0.3.7
57
+ 1.3.7+build
58
+ 1.3.7+build.2.b8f12d7
59
+ 1.3.7+build.11.e0f985a
60
+ }}
61
+ let(:min){ "1.0.0-alpha" }
62
+ let(:max){ "1.3.7+build.11.e0f985a" }
63
+ end # it_has_behavior
64
+
65
+ it_has_behavior "filterable" do
66
+ let(:unsorted_version_strings){%w{
67
+ 1.0.0-beta.2
68
+ 1.0.0-alpha
69
+ 1.0.0-rc.1+build.1
70
+ 1.0.0
71
+ 1.0.0-beta.11
72
+ 1.0.0+0.3.7
73
+ 1.0.0-rc.1
74
+ 1.0.0-alpha.1
75
+ 1.3.7+build.2.b8f12d7
76
+ 1.3.7+build.11.e0f985a
77
+ 1.3.7+build
78
+ }}
79
+ let(:release_versions){%w{
80
+ 1.0.0
81
+ }}
82
+ let(:prerelease_versions){%w{
83
+ 1.0.0-beta.2
84
+ 1.0.0-alpha
85
+ 1.0.0-beta.11
86
+ 1.0.0-rc.1
87
+ 1.0.0-alpha.1
88
+ }}
89
+ let(:build_versions){%w{
90
+ 1.0.0-rc.1+build.1
91
+ 1.0.0+0.3.7
92
+ 1.3.7+build.2.b8f12d7
93
+ 1.3.7+build.11.e0f985a
94
+ 1.3.7+build
95
+ }}
96
+ let(:release_build_versions){%w{
97
+ 1.0.0+0.3.7
98
+ 1.3.7+build.2.b8f12d7
99
+ 1.3.7+build.11.e0f985a
100
+ 1.3.7+build
101
+ }}
102
+ let(:prerelease_build_versions){%w{
103
+ 1.0.0-rc.1+build.1
104
+ }}
105
+ end # it_has_behavior
106
+
107
+ end # describe
@@ -0,0 +1,69 @@
1
+ #
2
+ # Author:: Seth Chisamore (<schisamo@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'spec_helper'
20
+
21
+ describe Mixlib::Versioning::Format do
22
+
23
+ describe "#initialize" do
24
+ subject{ described_class.new(version_string) }
25
+ let(:version_string) { "11.0.0" }
26
+
27
+ it "descendants must override #parse" do
28
+ expect { subject }.to raise_error
29
+ end
30
+ end
31
+
32
+ describe ".for" do
33
+
34
+ subject{ described_class }
35
+
36
+ [
37
+ :rubygems,
38
+ "rubygems",
39
+ Mixlib::Versioning::Format::Rubygems
40
+ ].each do |format_type|
41
+
42
+ context "format_type is a: #{format_type.class}" do
43
+ let(:format_type){ format_type }
44
+ it "returns the correct format class" do
45
+ subject.for(format_type).should eq Mixlib::Versioning::Format::Rubygems
46
+ end # it
47
+ end # context
48
+
49
+ end # each
50
+
51
+ describe "unknown format_type" do
52
+ [
53
+ :poop,
54
+ "poop",
55
+ Mixlib::Versioning
56
+ ].each do |invalid_format_type|
57
+
58
+ context "format_type is a: #{invalid_format_type.class}" do
59
+ it "raises a Mixlib::Versioning::UnknownFormatError" do
60
+ expect { subject.for(invalid_format_type) }.to raise_error(Mixlib::Versioning::UnknownFormatError)
61
+ end # it
62
+ end # context
63
+
64
+ end # each
65
+ end # describe
66
+
67
+ end # describe ".for"
68
+
69
+ end # describe Mixlib::Versioning::Format
@@ -0,0 +1,259 @@
1
+ #
2
+ # Author:: Seth Chisamore (<schisamo@opscode.com>)
3
+ # Copyright:: Copyright (c) 2013 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+
19
+ require 'spec_helper'
20
+
21
+ describe Mixlib::Versioning do
22
+
23
+ subject{ described_class }
24
+
25
+ let(:version_string){ "11.0.0" }
26
+
27
+ describe ".parse" do
28
+
29
+ describe "parsing when format type is specified" do
30
+ {
31
+ "11.0.8" => {
32
+ :format_type => :semver,
33
+ :expected_format => Mixlib::Versioning::Format::SemVer
34
+ },
35
+ "11.1.1" => {
36
+ :format_type => :rubygems,
37
+ :expected_format => Mixlib::Versioning::Format::Rubygems
38
+ },
39
+ "11.1.1.alpha.1" => {
40
+ :format_type => :rubygems,
41
+ :expected_format => Mixlib::Versioning::Format::Rubygems
42
+ },
43
+ "11.1.1-alpha.1" => {
44
+ :format_type => :opscode_semver,
45
+ :expected_format => Mixlib::Versioning::Format::OpscodeSemVer
46
+ },
47
+ "11.1.1-rc.2" => {
48
+ :format_type => :opscode_semver,
49
+ :expected_format => Mixlib::Versioning::Format::SemVer
50
+ }
51
+ }.each_pair do |version_string, options|
52
+
53
+ context "#{version_string} as #{options[:expected_format]}" do
54
+ let(:version_string){ version_string }
55
+ let(:expected_format){ options[:expected_format] }
56
+
57
+ [
58
+ options[:format_type],
59
+ options[:format_type].to_s,
60
+ options[:expected_format]
61
+ ].each do |format_type|
62
+
63
+ context "format type as a: #{format_type.class}" do
64
+ it "parses version string as: #{options[:expected_format]}" do
65
+ result = subject.parse(version_string, format_type)
66
+ result.should be_a(expected_format)
67
+ end # it
68
+ end # context
69
+
70
+ end # each
71
+ end # context
72
+ end # each_pair
73
+
74
+
75
+ describe "invalid format type specified" do
76
+ [
77
+ :poop,
78
+ "poop",
79
+ Mixlib::Versioning
80
+ ].each do |invalid_format_type|
81
+
82
+ context "invalid format as a: #{invalid_format_type.class}" do
83
+ it "raises a Mixlib::Versioning::UnknownFormatError" do
84
+ expect { subject.parse(version_string, invalid_format_type) }.to raise_error(Mixlib::Versioning::UnknownFormatError)
85
+ end # it
86
+ end # context
87
+
88
+ end # each
89
+
90
+ end # describe
91
+ end # describe
92
+
93
+ describe "parsing with automatic format detection" do
94
+ {
95
+ "11.0.8" => Mixlib::Versioning::Format::SemVer,
96
+ "11.0.8-1" => Mixlib::Versioning::Format::SemVer,
97
+ "11.0.8.rc.1" => Mixlib::Versioning::Format::Rubygems,
98
+ "11.0.8.rc.1-1" => Mixlib::Versioning::Format::Rubygems,
99
+ "11.0.8-rc.1" => Mixlib::Versioning::Format::OpscodeSemVer,
100
+
101
+ "10.18.2" => Mixlib::Versioning::Format::SemVer,
102
+ "10.18.2-poop" => Mixlib::Versioning::Format::SemVer,
103
+ "10.18.2.poop" => Mixlib::Versioning::Format::Rubygems,
104
+ "10.18.2.poop-1" => Mixlib::Versioning::Format::Rubygems,
105
+
106
+ "12.1.1+20130311134422" => Mixlib::Versioning::Format::OpscodeSemVer,
107
+ "12.1.1-rc.3+20130311134422" => Mixlib::Versioning::Format::OpscodeSemVer,
108
+ "12.1.1+20130308110833.git.2.94a1dde" => Mixlib::Versioning::Format::OpscodeSemVer,
109
+
110
+ "10.16.2-49-g21353f0" => Mixlib::Versioning::Format::GitDescribe,
111
+ "10.16.2-49-g21353f0-1" => Mixlib::Versioning::Format::GitDescribe,
112
+ "10.16.2.rc.2-49-g21353f0" => Mixlib::Versioning::Format::GitDescribe,
113
+ "10.16.2-rc.2-49-g21353f0" => Mixlib::Versioning::Format::GitDescribe,
114
+ }.each_pair do |version_string, expected_format|
115
+
116
+ context version_string do
117
+ let(:version_string){ version_string }
118
+ it "parses version string as: #{expected_format}" do
119
+ subject.parse(version_string).should be_a(expected_format)
120
+ end # it
121
+ end # context
122
+
123
+ end # each_pair
124
+
125
+ describe "version_string cannot be parsed" do
126
+ let(:version_string){ "A.B.C" }
127
+ it "returns nil" do
128
+ subject.parse(version_string).should be_nil
129
+ end
130
+ end
131
+
132
+ end # describe "parsing with automatic format detection"
133
+
134
+ describe "parsing an Mixlib::Versioning::Format object" do
135
+ it "returns the same object" do
136
+ v = Mixlib::Versioning.parse(version_string)
137
+ result = subject.parse(v)
138
+ v.should be result
139
+ end
140
+ end
141
+
142
+ end # describe .parse
143
+
144
+ describe ".find_target_version" do
145
+ let(:all_versions){%w{
146
+ 11.0.0-beta.1
147
+ 11.0.0-rc.1
148
+ 11.0.0
149
+ 11.0.1
150
+ 11.0.1+2013031116332
151
+ 11.0.2-alpha.0
152
+ 11.0.2-alpha.0+2013041116332
153
+ 11.0.2
154
+ }}
155
+ let(:filter_version){ nil }
156
+ let(:use_prerelease_versions){ false }
157
+ let(:use_build_versions){ false }
158
+ let(:subject_find) do
159
+ subject.find_target_version(all_versions,
160
+ filter_version,
161
+ use_prerelease_versions,
162
+ use_build_versions)
163
+ end
164
+
165
+ {
166
+ nil => {
167
+ :releases_only => "11.0.2",
168
+ :prerelease_versions => "11.0.2-alpha.0",
169
+ :build_versions => "11.0.1+2013031116332",
170
+ :prerelease_and_build_versions => "11.0.2-alpha.0+2013041116332"
171
+ },
172
+ "11.0.0" => {
173
+ :releases_only => "11.0.0",
174
+ :prerelease_versions => "11.0.0-rc.1",
175
+ :build_versions => nil,
176
+ :prerelease_and_build_versions => nil
177
+ },
178
+ "11.0.2" => {
179
+ :releases_only => "11.0.2",
180
+ :prerelease_versions => "11.0.2-alpha.0",
181
+ :build_versions => nil,
182
+ :prerelease_and_build_versions => "11.0.2-alpha.0+2013041116332"
183
+ },
184
+ "11.0.2" => {
185
+ :releases_only => "11.0.2",
186
+ :prerelease_versions => "11.0.2-alpha.0",
187
+ :build_versions => nil,
188
+ :prerelease_and_build_versions => "11.0.2-alpha.0+2013041116332"
189
+ },
190
+ "11.0.2-alpha.0" => {
191
+ :releases_only => "11.0.2-alpha.0",
192
+ :prerelease_versions => "11.0.2-alpha.0",
193
+ :build_versions => "11.0.2-alpha.0+2013041116332",
194
+ :prerelease_and_build_versions => "11.0.2-alpha.0+2013041116332"
195
+ }
196
+ }.each_pair do |filter_version, options|
197
+
198
+ context "filter version of: #{filter_version}" do
199
+ let(:filter_version){ filter_version }
200
+ let(:expected_version){ options[:releases_only] }
201
+
202
+ it "finds the most recent release version" do
203
+ subject_find.should eq Mixlib::Versioning.parse(expected_version)
204
+ end
205
+
206
+ context "include pre-release versions" do
207
+ let(:use_prerelease_versions){ true }
208
+ let(:expected_version){ options[:prerelease_versions] }
209
+
210
+ it "finds the most recent pre-release version" do
211
+ subject_find.should eq Mixlib::Versioning.parse(expected_version)
212
+ end # it
213
+ end # context
214
+
215
+ context "include build versions" do
216
+ let(:use_build_versions){ true }
217
+ let(:expected_version){ options[:build_versions] }
218
+
219
+ it "finds the most recent build version" do
220
+ subject_find.should eq Mixlib::Versioning.parse(expected_version)
221
+ end # it
222
+ end # context
223
+
224
+ context "include pre-release and build versions" do
225
+ let(:use_prerelease_versions){ true }
226
+ let(:use_build_versions){ true }
227
+ let(:expected_version){ options[:prerelease_and_build_versions] }
228
+
229
+ it "finds the most recent pre-release build version" do
230
+ subject_find.should eq Mixlib::Versioning.parse(expected_version)
231
+ end # it
232
+ end # context
233
+
234
+ end # context
235
+ end # each_pair
236
+
237
+ describe "all_versions argument is a mix of String and Mixlib::Versioning::Format instances" do
238
+ let(:all_versions){[
239
+ "11.0.0-beta.1",
240
+ "11.0.0-rc.1",
241
+ Mixlib::Versioning.parse("11.0.0")
242
+ ]}
243
+
244
+ it "correctly parses the array" do
245
+ subject_find.should eq Mixlib::Versioning.parse("11.0.0")
246
+ end
247
+ end # describe
248
+
249
+ describe "filter_version argument is an instance of Mixlib::Versioning::Format" do
250
+ let(:filter_version){ Mixlib::Versioning::Format::SemVer.new("11.0.0") }
251
+
252
+ it "finds the correct version" do
253
+ subject_find.should eq Mixlib::Versioning.parse("11.0.0")
254
+ end
255
+ end
256
+
257
+ end # describe
258
+
259
+ end # describe Mixlib::Versioning