mixlib-versioning 1.0.0 → 1.2.12

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 (33) hide show
  1. checksums.yaml +7 -0
  2. data/lib/mixlib/versioning.rb +41 -37
  3. data/lib/mixlib/versioning/exceptions.rb +2 -2
  4. data/lib/mixlib/versioning/format.rb +42 -38
  5. data/lib/mixlib/versioning/format/git_describe.rb +5 -7
  6. data/lib/mixlib/versioning/format/opscode_semver.rb +8 -19
  7. data/lib/mixlib/versioning/format/partial_semver.rb +62 -0
  8. data/lib/mixlib/versioning/format/rubygems.rb +14 -10
  9. data/lib/mixlib/versioning/format/semver.rb +9 -11
  10. data/lib/mixlib/versioning/version.rb +3 -3
  11. metadata +15 -87
  12. data/.gitignore +0 -18
  13. data/.yardopts +0 -7
  14. data/CHANGELOG.md +0 -3
  15. data/CONTRIBUTING.md +0 -188
  16. data/Gemfile +0 -9
  17. data/README.md +0 -364
  18. data/Rakefile +0 -6
  19. data/mixlib-versioning.gemspec +0 -22
  20. data/spec/mixlib/versioning/format/git_describe_spec.rb +0 -178
  21. data/spec/mixlib/versioning/format/opscode_semver_spec.rb +0 -113
  22. data/spec/mixlib/versioning/format/rubygems_spec.rb +0 -142
  23. data/spec/mixlib/versioning/format/semver_spec.rb +0 -107
  24. data/spec/mixlib/versioning/format_spec.rb +0 -69
  25. data/spec/mixlib/versioning/versioning_spec.rb +0 -259
  26. data/spec/spec_helper.rb +0 -43
  27. data/spec/support/shared_examples/basic_semver.rb +0 -42
  28. data/spec/support/shared_examples/behaviors/filterable.rb +0 -66
  29. data/spec/support/shared_examples/behaviors/parses_valid_version_strings.rb +0 -32
  30. data/spec/support/shared_examples/behaviors/rejects_invalid_version_strings.rb +0 -32
  31. data/spec/support/shared_examples/behaviors/serializable.rb +0 -51
  32. data/spec/support/shared_examples/behaviors/sortable.rb +0 -45
  33. data/spec/support/shared_examples/semver.rb +0 -105
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2be21e4975d6fa956538a0eb98cfe608f423a0b34aee5763e627ec31112c66b5
4
+ data.tar.gz: f7909f08f54a4d094516186f68747b96500a62cdcc8677fe6d631947d0d017c6
5
+ SHA512:
6
+ metadata.gz: 9b8554a17dc71628a23c83aeee7b7932733476d1b7769d9e83e5a27f0d884bfc18313a28a27348ca407dc5ac537df9f5a87d521debd45eca6b860b6cd83ba04f
7
+ data.tar.gz: 66d72d18122c944855affd93d57a8ad81f74aedbf8009305d9bd425fd46979b1e41d69cfc8e28d96492957f7ed1df7228a5178e31bfdef0173bcec9825b60972
@@ -1,7 +1,7 @@
1
1
  #
2
- # Author:: Seth Chisamore (<schisamo@opscode.com>)
3
- # Author:: Christopher Maier (<cm@opscode.com>)
4
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
2
+ # Author:: Seth Chisamore (<schisamo@chef.io>)
3
+ # Author:: Christopher Maier (<cm@chef.io>)
4
+ # Copyright:: Copyright (c) 2013-2018 Chef Software Inc.
5
5
  # License:: Apache License, Version 2.0
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,57 +17,62 @@
17
17
  # limitations under the License.
18
18
  #
19
19
 
20
- require 'mixlib/versioning/exceptions'
21
- require 'mixlib/versioning/format'
20
+ require_relative "versioning/exceptions"
21
+ require_relative "versioning/format"
22
22
 
23
23
  module Mixlib
24
- # @author Seth Chisamore (<schisamo@opscode.com>)
25
- # @author Christopher Maier (<cm@opscode.com>)
24
+ # @author Seth Chisamore (<schisamo@chef.io>)
25
+ # @author Christopher Maier (<cm@chef.io>)
26
26
  class Versioning
27
+ DEFAULT_FORMATS = [
28
+ Mixlib::Versioning::Format::GitDescribe,
29
+ Mixlib::Versioning::Format::OpscodeSemVer,
30
+ Mixlib::Versioning::Format::SemVer,
31
+ Mixlib::Versioning::Format::Rubygems,
32
+ Mixlib::Versioning::Format::PartialSemVer,
33
+ ].freeze
27
34
 
28
35
  # Create a new {Format} instance given a version string to parse, and an
29
36
  # optional format type.
30
37
  #
31
38
  # @example
32
- # Mixlib::Versioning.parse("11.0.0")
33
- # Mixlib::Versioning.parse("11.0.0", :semver)
34
- # Mixlib::Versioning.parse("11.0.0", 'semver')
35
- # Mixlib::Versioning.parse("11.0.0", Mixlib::Versioning::Format::SemVer)
39
+ # Mixlib::Versioning.parse('11.0.0')
40
+ # Mixlib::Versioning.parse('11.0.0', :semver)
41
+ # Mixlib::Versioning.parse('11.0.0', 'semver')
42
+ # Mixlib::Versioning.parse('11.0.0', Mixlib::Versioning::Format::SemVer)
36
43
  #
37
44
  # @param version_string [String] String representatin of the version to
38
45
  # parse
39
- # @param format_type [String, Symbol, Mixlib::Versioning::Format] Optional
46
+ # @param format [String, Symbol, Mixlib::Versioning::Format, Array] Optional
40
47
  # format type to parse the version string as. If this is exluded all
41
48
  # version types will be attempted from most specific to most specific
42
- # with a preference for SemVer formats
43
- #
49
+ # with a preference for SemVer formats. If it is an array, only version
50
+ # types in that list will be considered
44
51
  # @raise [Mixlib::Versioning::ParseError] if the parse fails.
45
52
  # @raise [Mixlib::Versioning::UnknownFormatError] if the given format type
46
53
  # doesn't exist.
47
54
  #
48
55
  # @return
49
56
  #
50
- def self.parse(version_string, format_type=nil)
51
- if version_string.kind_of?(Mixlib::Versioning::Format)
52
- return version_string
53
- elsif format_type
54
- return Mixlib::Versioning::Format.for(format_type).new(version_string)
57
+ def self.parse(version_string, format = nil)
58
+ if version_string.is_a?(Mixlib::Versioning::Format)
59
+ version_string
55
60
  else
61
+ formats = if format
62
+ [format].flatten.map { |f| Mixlib::Versioning::Format.for(f) }
63
+ else
64
+ DEFAULT_FORMATS
65
+ end
56
66
  # Attempt to parse from the most specific formats first.
57
67
  parsed_version = nil
58
- [
59
- Mixlib::Versioning::Format::GitDescribe,
60
- Mixlib::Versioning::Format::OpscodeSemVer,
61
- Mixlib::Versioning::Format::SemVer,
62
- Mixlib::Versioning::Format::Rubygems
63
- ].each do |version|
68
+ formats.each do |version|
64
69
  begin
65
70
  break parsed_version = version.new(version_string)
66
71
  rescue Mixlib::Versioning::ParseError
67
72
  next
68
73
  end
69
74
  end
70
- return parsed_version
75
+ parsed_version
71
76
  end
72
77
  end
73
78
 
@@ -103,7 +108,7 @@ module Mixlib
103
108
  # 11.0.1 }
104
109
  #
105
110
  # Mixlib::Versioning.find_target_version(all,
106
- # "11.0.1",
111
+ # '11.0.1',
107
112
  # true,
108
113
  # true)
109
114
  #
@@ -124,19 +129,19 @@ module Mixlib
124
129
  # build version specifier will be filtered out.
125
130
  #
126
131
  def self.find_target_version(all_versions,
127
- filter_version=nil,
128
- use_prerelease_versions=false,
129
- use_build_versions=false)
132
+ filter_version = nil,
133
+ use_prerelease_versions = false,
134
+ use_build_versions = false)
130
135
 
131
136
  # attempt to parse a `Mixlib::Versioning::Format` instance if we were
132
137
  # passed a string
133
138
  unless filter_version.nil? ||
134
- filter_version.kind_of?(Mixlib::Versioning::Format)
139
+ filter_version.is_a?(Mixlib::Versioning::Format)
135
140
  filter_version = Mixlib::Versioning.parse(filter_version)
136
141
  end
137
142
 
138
143
  all_versions.map! do |v|
139
- if v.kind_of?(Mixlib::Versioning::Format)
144
+ if v.is_a?(Mixlib::Versioning::Format)
140
145
  v
141
146
  else
142
147
  Mixlib::Versioning.parse(v)
@@ -153,7 +158,7 @@ module Mixlib
153
158
  # that prerelease, and then take the most recent. Otherwise, just
154
159
  # return the specified prerelease version
155
160
  if use_build_versions
156
- all_versions.select{|v| v.in_same_prerelease_line?(filter_version)}.max
161
+ all_versions.select { |v| v.in_same_prerelease_line?(filter_version) }.max
157
162
  else
158
163
  filter_version
159
164
  end
@@ -177,18 +182,17 @@ module Mixlib
177
182
  in_release_line && if use_prerelease_versions && use_build_versions
178
183
  v.prerelease_build?
179
184
  elsif !use_prerelease_versions &&
180
- use_build_versions
185
+ use_build_versions
181
186
  v.release_build?
182
187
  elsif use_prerelease_versions &&
183
- !use_build_versions
188
+ !use_build_versions
184
189
  v.prerelease?
185
190
  elsif !use_prerelease_versions &&
186
- !use_build_versions
191
+ !use_build_versions
187
192
  v.release?
188
193
  end
189
194
  end.max # select the most recent version
190
195
  end # if
191
196
  end # self.find_target_version
192
-
193
197
  end # Versioning
194
198
  end # Mixlib
@@ -1,6 +1,6 @@
1
1
  #
2
- # Author:: Seth Chisamore (<schisamo@opscode.com>)
3
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
2
+ # Author:: Seth Chisamore (<schisamo@chef.io>)
3
+ # Copyright:: Copyright (c) 2013-2018 Chef Software, Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -1,6 +1,6 @@
1
1
  #
2
- # Author:: Seth Chisamore (<schisamo@opscode.com>)
3
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
2
+ # Author:: Seth Chisamore (<schisamo@chef.io>)
3
+ # Copyright:: Copyright (c) 2013-2018 Chef Software, Inc.
4
4
  # License:: Apache License, Version 2.0
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,30 +16,30 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- require 'mixlib/versioning/format/git_describe'
20
- require 'mixlib/versioning/format/opscode_semver'
21
- require 'mixlib/versioning/format/rubygems'
22
- require 'mixlib/versioning/format/semver'
19
+ require_relative "format/git_describe"
20
+ require_relative "format/opscode_semver"
21
+ require_relative "format/rubygems"
22
+ require_relative "format/semver"
23
+ require_relative "format/partial_semver"
23
24
 
24
25
  module Mixlib
25
26
  class Versioning
26
-
27
- # @author Seth Chisamore (<schisamo@opscode.com>)
27
+ # @author Seth Chisamore (<schisamo@chef.io>)
28
28
  #
29
29
  # @!attribute [r] major
30
30
  # @return [Integer] major identifier
31
31
  # @!attribute [r] minor
32
32
  # @return [Integer] minor identifier
33
33
  # @!attribute [r] patch
34
- # @return [Integer] patch identifier
34
+ # @return [Integer, nil] patch identifier
35
35
  # @!attribute [r] prerelease
36
- # @return [String] pre-release identifier
36
+ # @return [String, nil] pre-release identifier
37
37
  # @!attribute [r] build
38
- # @return [String] build identifier
38
+ # @return [String, nil] build identifier
39
39
  # @!attribute [r] iteration
40
- # @return [String] build interation
40
+ # @return [String, nil] build interation
41
41
  # @!attribute [r] input
42
- # @return [String] original input version string that was parsed
42
+ # @return [String, nil] original input version string that was parsed
43
43
  class Format
44
44
  include Comparable
45
45
 
@@ -60,17 +60,18 @@ module Mixlib
60
60
  # @return [Class] the {Mixlib::Versioning::Format} class
61
61
  #
62
62
  def self.for(format_type)
63
- if format_type.kind_of?(Class) &&
64
- format_type.ancestors.include?(Mixlib::Versioning::Format)
63
+ if format_type.is_a?(Class) &&
64
+ format_type.ancestors.include?(Mixlib::Versioning::Format)
65
65
  format_type
66
66
  else
67
67
  case format_type.to_s
68
- when 'semver'; Mixlib::Versioning::Format::SemVer
69
- when 'opscode_semver'; Mixlib::Versioning::Format::OpscodeSemVer
70
- when 'git_describe'; Mixlib::Versioning::Format::GitDescribe
71
- when 'rubygems'; Mixlib::Versioning::Format::Rubygems
68
+ when "semver" then Mixlib::Versioning::Format::SemVer
69
+ when "opscode_semver" then Mixlib::Versioning::Format::OpscodeSemVer
70
+ when "git_describe" then Mixlib::Versioning::Format::GitDescribe
71
+ when "rubygems" then Mixlib::Versioning::Format::Rubygems
72
+ when "partial_semver" then Mixlib::Versioning::Format::PartialSemVer
72
73
  else
73
- msg = "'#{format_type.to_s}' is not a supported Mixlib::Versioning format"
74
+ msg = "'#{format_type}' is not a supported Mixlib::Versioning format"
74
75
  raise Mixlib::Versioning::UnknownFormatError, msg
75
76
  end
76
77
  end
@@ -90,7 +91,7 @@ module Mixlib
90
91
  #
91
92
  # @param version_string [String] string representation of the version
92
93
  # @raise [Mixlib::Versioning::ParseError] raised if parsing fails
93
- def parse(version_string)
94
+ def parse(_version_string)
94
95
  raise Error, "You must override the #parse"
95
96
  end
96
97
 
@@ -101,22 +102,22 @@ module Mixlib
101
102
 
102
103
  # @return [Boolean] Whether or not this is a pre-release version
103
104
  def prerelease?
104
- !!(@prerelease && @build.nil?)
105
+ !@prerelease.nil? && @build.nil?
105
106
  end
106
107
 
107
108
  # @return [Boolean] Whether or not this is a release build version
108
109
  def release_build?
109
- !!(@prerelease.nil? && @build)
110
+ @prerelease.nil? && !@build.nil?
110
111
  end
111
112
 
112
113
  # @return [Boolean] Whether or not this is a pre-release build version
113
114
  def prerelease_build?
114
- !!(@prerelease && @build)
115
+ !@prerelease.nil? && !@build.nil?
115
116
  end
116
117
 
117
118
  # @return [Boolean] Whether or not this is a build version
118
119
  def build?
119
- !!@build
120
+ !@build.nil?
120
121
  end
121
122
 
122
123
  # Returns `true` if `other` and this {Format} share the same `major`,
@@ -126,8 +127,8 @@ module Mixlib
126
127
  # @return [Boolean]
127
128
  def in_same_release_line?(other)
128
129
  @major == other.major &&
129
- @minor == other.minor &&
130
- @patch == other.patch
130
+ @minor == other.minor &&
131
+ @patch == other.patch
131
132
  end
132
133
 
133
134
  # Returns `true` if `other` an share the same
@@ -137,9 +138,9 @@ module Mixlib
137
138
  # @return [Boolean]
138
139
  def in_same_prerelease_line?(other)
139
140
  @major == other.major &&
140
- @minor == other.minor &&
141
- @patch == other.patch &&
142
- @prerelease == other.prerelease
141
+ @minor == other.minor &&
142
+ @patch == other.patch &&
143
+ @prerelease == other.prerelease
143
144
  end
144
145
 
145
146
  # @return [String] String representation of this {Format} instance
@@ -154,7 +155,7 @@ module Mixlib
154
155
  vars = instance_variables.map do |n|
155
156
  "#{n}=#{instance_variable_get(n).inspect}"
156
157
  end
157
- "#<%s:0x%x %s>" % [self.class,object_id,vars.join(', ')]
158
+ format("#<%s:0x%x %s>", self.class, object_id, vars.join(", "))
158
159
  end
159
160
 
160
161
  # Returns SemVer compliant string representation of this {Format}
@@ -168,7 +169,7 @@ module Mixlib
168
169
  # {Format} instance
169
170
  # @todo create a proper serialization abstraction
170
171
  def to_semver_string
171
- s = [@major, @minor, @patch].join(".")
172
+ s = [@major, @minor, @patch].map(&:to_i).join(".")
172
173
  s += "-#{@prerelease}" if @prerelease
173
174
  s += "+#{@build}" if @build
174
175
  s
@@ -185,7 +186,7 @@ module Mixlib
185
186
  # {Format} instance
186
187
  # @todo create a proper serialization abstraction
187
188
  def to_rubygems_string
188
- s = [@major, @minor, @patch].join(".")
189
+ s = [@major, @minor, @patch].map(&:to_i).join(".")
189
190
  s += ".#{@prerelease}" if @prerelease
190
191
  s
191
192
  end
@@ -197,6 +198,10 @@ module Mixlib
197
198
  # @return [Integer] -1, 0, or 1 depending on whether the this version is
198
199
  # less than, equal to, or greater than the other version
199
200
  def <=>(other)
201
+ # Check whether the `other' is a String and if so, then get an
202
+ # instance of *this* class (e.g., GitDescribe, OpscodeSemVer,
203
+ # SemVer, Rubygems, etc.), so we can compare against it.
204
+ other = self.class.new(other) if other.is_a?(String)
200
205
 
201
206
  # First, perform comparisons based on major, minor, and patch
202
207
  # versions. These are always presnt and always non-nil
@@ -251,7 +256,7 @@ module Mixlib
251
256
  end
252
257
 
253
258
  # If we get down here, they're both equal
254
- return 0
259
+ 0
255
260
  end
256
261
 
257
262
  # @param other [Mixlib::Versioning::Format]
@@ -305,7 +310,7 @@ module Mixlib
305
310
 
306
311
  max_length = [a_components.length, b_components.length].max
307
312
 
308
- (0..(max_length-1)).each do |i|
313
+ (0..(max_length - 1)).each do |i|
309
314
  # Convert the ith component into a number if possible
310
315
  a = maybe_int(a_components[i])
311
316
  b = maybe_int(b_components[i])
@@ -323,7 +328,7 @@ module Mixlib
323
328
  # Now we need to compare appropriately based on type.
324
329
  #
325
330
  # Numbers have lower precedence than strings; therefore, if
326
- # the components are of differnt types (String vs. Integer),
331
+ # the components are of different types (String vs. Integer),
327
332
  # we just return -1 for the numeric one and we're done.
328
333
  #
329
334
  # If both are the same type (Integer vs. Integer, or String
@@ -343,9 +348,8 @@ module Mixlib
343
348
 
344
349
  # We've compared all components of both strings; if we've gotten
345
350
  # down here, they're totally the same
346
- return 0
351
+ 0
347
352
  end
348
-
349
353
  end # Format
350
354
  end # Versioning
351
355
  end # Mixlib
@@ -1,7 +1,7 @@
1
1
  #
2
- # Author:: Seth Chisamore (<schisamo@opscode.com>)
3
- # Author:: Christopher Maier (<cm@opscode.com>)
4
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
2
+ # Author:: Seth Chisamore (<schisamo@chef.io>)
3
+ # Author:: Christopher Maier (<cm@chef.io>)
4
+ # Copyright:: Copyright (c) 2013-2018 Chef Software, Inc.
5
5
  # License:: Apache License, Version 2.0
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -41,10 +41,9 @@ module Mixlib
41
41
  # 11.0.0-alpha.1-1-gcea071e
42
42
  # ```
43
43
  #
44
- # @author Seth Chisamore (<schisamo@opscode.com>)
45
- # @author Christopher Maier (<cm@opscode.com>)
44
+ # @author Seth Chisamore (<schisamo@chef.io>)
45
+ # @author Christopher Maier (<cm@chef.io>)
46
46
  class GitDescribe < Format
47
-
48
47
  GIT_DESCRIBE_REGEX = /^(\d+)\.(\d+)\.(\d+)(?:\-|\.)?(.+)?\-(\d+)\-g([a-f0-9]{7,40})(?:\-)?(\d+)?$/
49
48
 
50
49
  attr_reader :commits_since, :commit_sha
@@ -64,7 +63,6 @@ module Mixlib
64
63
  # we'll store our internal information in that format
65
64
  @build = "#{@commits_since}.g#{@commit_sha}.#{@iteration}"
66
65
  end
67
-
68
66
  end # class GitDescribe
69
67
  end # class Format
70
68
  end # module Versioning
@@ -1,7 +1,7 @@
1
1
  #
2
- # Author:: Seth Chisamore (<schisamo@opscode.com>)
3
- # Author:: Christopher Maier (<cm@opscode.com>)
4
- # Copyright:: Copyright (c) 2013 Opscode, Inc.
2
+ # Author:: Seth Chisamore (<schisamo@chef.io>)
3
+ # Author:: Christopher Maier (<cm@chef.io>)
4
+ # Copyright:: Copyright (c) 2013-2018 Chef Software, Inc.
5
5
  # License:: Apache License, Version 2.0
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,7 +17,7 @@
17
17
  # limitations under the License.
18
18
  #
19
19
 
20
- require 'mixlib/versioning/format/semver'
20
+ require_relative "semver"
21
21
 
22
22
  module Mixlib
23
23
  class Versioning
@@ -51,10 +51,9 @@ module Mixlib
51
51
  # 11.0.0-alpha1+20121218164140.git.207.694b062
52
52
  # ```
53
53
  #
54
- # @author Seth Chisamore (<schisamo@opscode.com>)
55
- # @author Christopher Maier (<cm@opscode.com>)
54
+ # @author Seth Chisamore (<schisamo@chef.io>)
55
+ # @author Christopher Maier (<cm@chef.io>)
56
56
  class OpscodeSemVer < SemVer
57
-
58
57
  # The pattern is: `YYYYMMDDHHMMSS.git.COMMITS_SINCE.SHA1`
59
58
  OPSCODE_BUILD_REGEX = /^\d{14}(\.git\.\d+\.[a-f0-9]{7})?$/
60
59
 
@@ -72,19 +71,9 @@ module Mixlib
72
71
  def parse(version_string)
73
72
  super(version_string)
74
73
 
75
- unless @prerelease.nil?
76
- unless @prerelease.match(OPSCODE_PRERELEASE_REGEX)
77
- raise Mixlib::Versioning::ParseError, "'#{@prerelease}' is not a valid Opscode pre-release signifier!"
78
- end
79
- end
80
-
81
- unless @build.nil?
82
- unless @build.match(OPSCODE_BUILD_REGEX)
83
- raise Mixlib::Versioning::ParseError, "'#{@build}' is not a valid Opscode build signifier!"
84
- end
85
- end
74
+ raise Mixlib::Versioning::ParseError, "'#{@prerelease}' is not a valid Opscode pre-release signifier!" unless @prerelease.nil? || @prerelease.match(OPSCODE_PRERELEASE_REGEX)
75
+ raise Mixlib::Versioning::ParseError, "'#{@build}' is not a valid Opscode build signifier!" unless @build.nil? || @build.match(OPSCODE_BUILD_REGEX)
86
76
  end
87
-
88
77
  end # class OpscodeSemVer
89
78
  end # class Format
90
79
  end # module Versioning