kettle-family 0.1.11 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce5e205f14b0d680ee20770b52bbe6567440d355f192b60df5ea5432539301df
4
- data.tar.gz: a4b1746b3d74bd7a7ed27f08489476fb29edc9f54d118e213c5ca825f1fd3adc
3
+ metadata.gz: f65c88cd11fde014afd2cf4e90a46734d3bc4cad6941604809541404e1e4f8f0
4
+ data.tar.gz: 6f41492fbda81d8106de2e18c88ea34db50ac1e3910a10872d6dc804a6151f4b
5
5
  SHA512:
6
- metadata.gz: 82ec83f5b90a6a18db54ff704a8e1387a19d674db03a6087e08afeedeab1dbf071788a6d4182a262377bd60df38f93c936ead0b3cf23efc1c0645981a956277b
7
- data.tar.gz: c65192a2a1461b648a02dd67fbb2eacba8e01425e92c5cdbfe1b28e3a49af671a9d5a8498de7903ea4cb199ed9be8e29dcc54d5b50af9f226336a9c4a60cc25b
6
+ metadata.gz: 2fbd369fd177a00aae8db444e577c0c87ac9e5d5197301d3338172691ae8793326221453c33ad2a4780616668b0b73a3e3f28c25940bd25815d7ae6feb79bb63
7
+ data.tar.gz: 5dce9c3e088160948803fdf898a1bf913b7c9641a53babaa526fc7be855d3120fe02d4fab0a0e12cf8112b0780109cd9471a9e3eee462a7dc7b5d3e4d93824bf
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -20,6 +20,10 @@ Please file a bug if you notice a violation of semantic versioning.
20
20
 
21
21
  ### Added
22
22
 
23
+ - `kettle-family bump-version` now accepts the same relative bump targets as
24
+ `kettle-bump` (`major`, `minor`, `patch`, and `pre`) and applies them per
25
+ member from each member's current version.
26
+
23
27
  ### Changed
24
28
 
25
29
  ### Deprecated
@@ -26,7 +26,7 @@ module Kettle
26
26
  raise Error, "unknown command #{command.inspect}" unless COMMANDS.include?(command)
27
27
 
28
28
  target_version = argv.shift if command == "bump-version"
29
- raise Error, "bump-version requires VERSION" if command == "bump-version" && !target_version
29
+ raise Error, "bump-version requires VERSION, major, minor, patch, or pre" if command == "bump-version" && !target_version
30
30
 
31
31
  options = parse_options
32
32
  options[:target_version] = target_version
@@ -48,6 +48,7 @@ module Kettle
48
48
  def help
49
49
  out.puts(<<~HELP)
50
50
  Usage: kettle-family COMMAND [options]
51
+ kettle-family bump-version VERSION|major|minor|patch|pre [options]
51
52
 
52
53
  Commands:
53
54
  discover Discover family members and print selected order
@@ -3,7 +3,7 @@
3
3
  module Kettle
4
4
  module Family
5
5
  module Version
6
- VERSION = "0.1.11"
6
+ VERSION = "0.1.12"
7
7
  end
8
8
  VERSION = Version::VERSION # Traditional Constant Location
9
9
  end
@@ -3,14 +3,19 @@
3
3
  module Kettle
4
4
  module Family
5
5
  class VersionBump
6
+ BUMP_TYPES = %w[major minor patch pre].freeze
6
7
  DEPENDENCY_METHODS = %i[add_dependency add_runtime_dependency].freeze
7
8
 
8
9
  def initialize(members:, target_version:, from_version: nil, mode: :dry_run)
9
10
  @members = members
10
- @target_version = validate_version(target_version)
11
+ @target_version = target_version.to_s
12
+ @explicit_target_version = validate_version(target_version) unless BUMP_TYPES.include?(@target_version)
11
13
  @from_version = validate_version(from_version) if from_version
12
14
  @mode = mode
13
15
  @member_names = members.map(&:name)
16
+ @member_target_versions = members.each_with_object({}) do |member, memo|
17
+ memo[member.name] = resolve_target_version(member)
18
+ end
14
19
  end
15
20
 
16
21
  def results
@@ -19,7 +24,7 @@ module Kettle
19
24
 
20
25
  private
21
26
 
22
- attr_reader :members, :target_version, :from_version, :mode, :member_names
27
+ attr_reader :members, :target_version, :explicit_target_version, :from_version, :mode, :member_names, :member_target_versions
23
28
 
24
29
  def validate_version(version)
25
30
  Gem::Version.new(version).to_s
@@ -30,12 +35,13 @@ module Kettle
30
35
  def result_for(member)
31
36
  raise Error, "#{member.name} is #{member.version}, not --from #{from_version}" if from_version && member.version != from_version
32
37
 
33
- edits = collect_edits(member)
38
+ member_target_version = target_version_for(member)
39
+ edits = collect_edits(member, member_target_version)
34
40
  write_edits(edits) if mode == :execute
35
41
  CommandResult.new(
36
42
  member_name: member.name,
37
43
  phase: "bump-version",
38
- command: ["internal", "bump-version", target_version],
44
+ command: ["internal", "bump-version", member_target_version],
39
45
  workdir: member.root,
40
46
  status: check_failed?(edits) ? 1 : 0,
41
47
  success: !check_failed?(edits),
@@ -59,20 +65,20 @@ module Kettle
59
65
  nil
60
66
  end
61
67
 
62
- def collect_edits(member)
68
+ def collect_edits(member, member_target_version)
63
69
  edits = []
64
- edits << version_file_edit(member) if member.version_file
70
+ edits << version_file_edit(member, member_target_version) if member.version_file
65
71
  edits.concat(gemspec_dependency_edits(member))
66
72
  edits.compact
67
73
  end
68
74
 
69
- def version_file_edit(member)
75
+ def version_file_edit(member, member_target_version)
70
76
  source = File.read(member.version_file)
71
77
  node = version_string_node(source, member.version_file)
72
78
  current = node.unescaped
73
- return nil if current == target_version
79
+ return nil if current == member_target_version
74
80
 
75
- replacement = quote_like(node.location.slice, target_version)
81
+ replacement = quote_like(node.location.slice, member_target_version)
76
82
  file_edit(member.version_file, source, node.location.start_offset, node.location.end_offset, replacement)
77
83
  end
78
84
 
@@ -131,14 +137,70 @@ module Kettle
131
137
  raise Error, "ambiguous family dependency #{name_node.unescaped.inspect} in #{path}" unless requirement_node.is_a?(Prism::StringNode)
132
138
 
133
139
  current = requirement_node.unescaped
140
+ dependency_target_version = member_target_versions.fetch(name_node.unescaped)
134
141
  exact_prefix = "= "
135
142
  raise Error, "ambiguous family dependency #{name_node.unescaped.inspect} requirement #{current.inspect} in #{path}" unless current.start_with?(exact_prefix)
136
- return if current == "#{exact_prefix}#{target_version}"
143
+ return if current == "#{exact_prefix}#{dependency_target_version}"
137
144
 
138
- replacement = quote_like(requirement_node.location.slice, "#{exact_prefix}#{target_version}")
145
+ replacement = quote_like(requirement_node.location.slice, "#{exact_prefix}#{dependency_target_version}")
139
146
  file_edit(path, source, requirement_node.location.start_offset, requirement_node.location.end_offset, replacement)
140
147
  end
141
148
 
149
+ def target_version_for(member)
150
+ member_target_versions.fetch(member.name)
151
+ end
152
+
153
+ def resolve_target_version(member)
154
+ return explicit_target_version unless BUMP_TYPES.include?(target_version)
155
+
156
+ bumped_version(target_version, member.version)
157
+ end
158
+
159
+ def bumped_version(type, current_version)
160
+ return bumped_prerelease_version(current_version) if type == "pre"
161
+
162
+ version = Gem::Version.new(current_version)
163
+ segments = version.segments
164
+ unless segments.all? { |segment| segment.is_a?(Integer) }
165
+ raise Error, "cannot #{type}-bump non-numeric version #{current_version.inspect}"
166
+ end
167
+
168
+ major, minor, patch = (segments + [0, 0, 0])[0, 3]
169
+ case type
170
+ when "major"
171
+ "#{major + 1}.0.0"
172
+ when "minor"
173
+ "#{major}.#{minor + 1}.0"
174
+ when "patch"
175
+ "#{major}.#{minor}.#{patch + 1}"
176
+ end
177
+ end
178
+
179
+ def bumped_prerelease_version(current_version)
180
+ version = Gem::Version.new(current_version)
181
+ segments = version.segments
182
+ prerelease_index = segments.index { |segment| !segment.is_a?(Integer) }
183
+ raise Error, "cannot pre-bump version without prerelease segment #{current_version.inspect}" unless prerelease_index
184
+
185
+ release_core = segments[0...prerelease_index].join(".")
186
+ prerelease_suffix = prerelease_suffix_for(current_version, release_core)
187
+ "#{release_core}.#{prerelease_suffix.next}"
188
+ end
189
+
190
+ def prerelease_suffix_for(current_version, release_core)
191
+ prefix = "#{release_core}."
192
+ return string_tail(current_version, prefix.length) if current_version.start_with?(prefix)
193
+
194
+ canonical_version = Gem::Version.new(current_version).to_s
195
+ return string_tail(canonical_version, prefix.length) if canonical_version.start_with?(prefix)
196
+
197
+ raise Error, "cannot find prerelease segment in version #{current_version.inspect}"
198
+ end
199
+
200
+ def string_tail(value, offset)
201
+ value[offset, value.length - offset]
202
+ end
203
+
142
204
  def file_edit(path, source, start_offset, end_offset, replacement)
143
205
  {path: path, source: source, start_offset: start_offset, end_offset: end_offset, replacement: replacement}
144
206
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kettle-family
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -309,10 +309,10 @@ licenses:
309
309
  - AGPL-3.0-only
310
310
  metadata:
311
311
  homepage_uri: https://kettle-family.galtzo.com
312
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v0.1.11
313
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v0.1.11/CHANGELOG.md
312
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v0.1.12
313
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v0.1.12/CHANGELOG.md
314
314
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
315
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/0.1.11
315
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/0.1.12
316
316
  funding_uri: https://github.com/sponsors/pboling
317
317
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
318
318
  news_uri: https://www.railsbling.com/tags/kettle-family
metadata.gz.sig CHANGED
Binary file