kettle-family 0.1.32 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ab7db3c6a2cfe0e5c9456e14e0d7b643ee341da154f591c5de6b81d09a423a65
4
- data.tar.gz: 9b1b9ecbc828efccfc1d51327a9a4efe7b69b2726500cabdca5943c6ca742f4e
3
+ metadata.gz: 1f37904c4583ed3dbc1ef2c372c5d4aa7e3ecec95d8aba520e0979065106087f
4
+ data.tar.gz: ce0b99d87d7a815467428209c2f504ddafc0800890dabf9af5b534e4f8073fc0
5
5
  SHA512:
6
- metadata.gz: 4e95a38962f4f0f4dada8de8adf59e9c2910ef9c7984df519f474fda1167e86523a6bb54d87382da9dd7e231bbd44df08955fed36e916aeb28acf078354cfc28
7
- data.tar.gz: 28c0f4e0592ef36165f5a4bfe62a82fb8c13c8ee2ff5a22ad28dddad84a4b5003a84d5272f84eeb936d920f2fc2a135d426e54ca8d0b48a84203b6e2cefc33d9
6
+ metadata.gz: b98994c1f6daa8fd29ec064de3b23a241c3e25c3786b67e67bc765dea795e92dfa6cf3ba510a4782f9a9b5a954ef0f748bb82c0d6f94a5f2a5b1f95da9ac0be9
7
+ data.tar.gz: '0189a3faba9e70ec5e333eaee9eaf956d4c7151ded78916f63faaf8d1bce1c2a14d10c636fcec54bb7555dff7332cb0ae8adc9f763231d75b94eac0ec0caaf12'
checksums.yaml.gz.sig CHANGED
@@ -1,2 +1,3 @@
1
- �-`
2
- �d�$�'��Uz�D� �ᢉ�TT^�ت���]K ��G@�"LM�?�N7;��������<UX�s���ҮS��c���,�"m�a�zT�� ���ݡ%&��3P�n)�MoTB�<��D&A������ɒݯ���5D�9eQ��Q����Y�;
1
+ [���4w���Z�
2
+ ���
3
+ ^���Q�뢦C)m�� "]���0NN�������f�g��Rf��qe �`ie�qE�zSʄj�zW �l?��{��tw'�Ph<��^��]���-D���Ӊ�k�+
data/CHANGELOG.md CHANGED
@@ -30,6 +30,29 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [0.2.0] - 2026-07-02
34
+
35
+ - TAG: [v0.2.0][0.2.0t]
36
+ - COVERAGE: 95.56% -- 2173/2274 lines in 21 files
37
+ - BRANCH COVERAGE: 76.50% -- 700/915 branches in 21 files
38
+ - 29.96% documented
39
+
40
+ ### Changed
41
+
42
+ - `kettle-family bump-version` now delegates per-member version file,
43
+ gemspec-version, and relative bump target handling to `kettle-dev`'s shared
44
+ `kettle-bump` engine, leaving `kettle-family` responsible only for
45
+ family-specific dependency pin updates and reporting.
46
+ - `kettle-dev` is now a runtime dependency because `kettle-family` reuses its
47
+ version bump engine directly.
48
+ - Runtime dependency `kettle-dev` now requires 2.3.0 or newer.
49
+
50
+ ### Fixed
51
+
52
+ - `kettle-family bump-version` now prefers `lib/<gem_name>/version.rb` over
53
+ alphabetically earlier compatibility namespace version files when discovering
54
+ each member's editable version file.
55
+
33
56
  ## [0.1.32] - 2026-07-01
34
57
 
35
58
  - TAG: [v0.1.32][0.1.32t]
@@ -572,7 +595,9 @@ Please file a bug if you notice a violation of semantic versioning.
572
595
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
573
596
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
574
597
 
575
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v0.1.32...HEAD
598
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v0.2.0...HEAD
599
+ [0.2.0]: https://github.com/kettle-dev/kettle-family/compare/v0.1.32...v0.2.0
600
+ [0.2.0t]: https://github.com/kettle-dev/kettle-family/releases/tag/v0.2.0
576
601
  [0.1.32]: https://github.com/kettle-dev/kettle-family/compare/v0.1.31...v0.1.32
577
602
  [0.1.32t]: https://github.com/kettle-dev/kettle-family/releases/tag/v0.1.32
578
603
  [0.1.31]: https://github.com/kettle-dev/kettle-family/compare/v0.1.30...v0.1.31
data/README.md CHANGED
@@ -592,7 +592,7 @@ Thanks for RTFM. ☺️
592
592
  [📌gitmoji]: https://gitmoji.dev
593
593
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
594
594
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
595
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-2.333-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
595
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-2.274-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
596
596
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
597
597
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
598
598
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -61,7 +61,7 @@ module Kettle
61
61
  name: spec.name,
62
62
  root: File.dirname(path),
63
63
  gemspec_path: path,
64
- version_file: version_file(File.dirname(path)),
64
+ version_file: version_file(File.dirname(path), spec.name),
65
65
  version: spec.version.to_s,
66
66
  dependencies: spec.runtime_dependencies.map(&:name).sort,
67
67
  required_ruby_version: required_ruby_version(spec),
@@ -85,7 +85,10 @@ module Kettle
85
85
  Array(spec.authors).compact.map(&:to_s).map(&:strip).reject(&:empty?)
86
86
  end
87
87
 
88
- def version_file(root)
88
+ def version_file(root, gem_name)
89
+ canonical = File.join(root, "lib", gem_name.tr("-", "_"), "version.rb")
90
+ return canonical if File.file?(canonical)
91
+
89
92
  candidates = Dir.glob(File.join(root, "lib", "**", "version.rb"))
90
93
  candidates.min
91
94
  end
@@ -124,7 +124,7 @@ module Kettle
124
124
  name: spec.name,
125
125
  root: File.dirname(gemspec),
126
126
  gemspec_path: gemspec,
127
- version_file: version_file(File.dirname(gemspec)),
127
+ version_file: version_file(File.dirname(gemspec), spec.name),
128
128
  version: spec.version.to_s,
129
129
  dependencies: spec.runtime_dependencies.map(&:name).sort,
130
130
  required_ruby_version: required_ruby_version(spec),
@@ -158,7 +158,10 @@ module Kettle
158
158
  raise Error, "could not load gemspec #{path}: #{error.message}"
159
159
  end
160
160
 
161
- def version_file(root)
161
+ def version_file(root, gem_name)
162
+ canonical = File.join(root, "lib", gem_name.tr("-", "_"), "version.rb")
163
+ return canonical if File.file?(canonical)
164
+
162
165
  Dir.glob(File.join(root, "lib", "**", "version.rb")).min
163
166
  end
164
167
 
@@ -3,7 +3,7 @@
3
3
  module Kettle
4
4
  module Family
5
5
  module Version
6
- VERSION = "0.1.32"
6
+ VERSION = "0.2.0"
7
7
  end
8
8
  VERSION = Version::VERSION # Traditional Constant Location
9
9
  end
@@ -1,15 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "kettle/dev"
4
+
3
5
  module Kettle
4
6
  module Family
5
7
  class VersionBump
6
- BUMP_TYPES = %w[major minor patch pre].freeze
7
8
  DEPENDENCY_METHODS = %i[add_dependency add_runtime_dependency].freeze
8
9
 
9
10
  def initialize(members:, target_version:, from_version: nil, mode: :dry_run)
10
11
  @members = members
11
12
  @target_version = target_version.to_s
12
- @explicit_target_version = validate_version(target_version) unless BUMP_TYPES.include?(@target_version)
13
+ @explicit_target_version = validate_version(target_version) unless Kettle::Dev::VersionBump::BUMP_TYPES.include?(@target_version)
13
14
  @from_version = validate_version(from_version) if from_version
14
15
  @mode = mode
15
16
  @member_names = members.map(&:name)
@@ -27,9 +28,7 @@ module Kettle
27
28
  attr_reader :members, :target_version, :explicit_target_version, :from_version, :mode, :member_names, :member_target_versions
28
29
 
29
30
  def validate_version(version)
30
- Gem::Version.new(version).to_s
31
- rescue ArgumentError => error
32
- raise Error, "invalid version #{version.inspect}: #{error.message}"
31
+ with_dev_errors { Kettle::Dev::VersionBump.validate_version(version) }
33
32
  end
34
33
 
35
34
  def result_for(member)
@@ -66,67 +65,25 @@ module Kettle
66
65
  end
67
66
 
68
67
  def collect_edits(member, member_target_version)
69
- edits = []
70
- edits << version_file_edit(member, member_target_version) if member.version_file
71
- edits.concat(gemspec_dependency_edits(member))
72
- edits.compact
73
- end
74
-
75
- def version_file_edit(member, member_target_version)
76
- source = File.read(member.version_file)
77
- node = version_string_node(source, member.version_file)
78
- current = node.unescaped
79
- return nil if current == member_target_version
80
-
81
- replacement = quote_like(node.location.slice, member_target_version)
82
- file_edit(member.version_file, source, node.location.start_offset, node.location.end_offset, replacement)
83
- end
84
-
85
- def version_string_node(source, path)
86
- parse_result = parse_source(source, path)
87
-
88
- constant = each_node(parse_result.value).find do |node|
89
- node.is_a?(Prism::ConstantWriteNode) && node.name == :VERSION && node.value.is_a?(Prism::StringNode)
90
- end || raise(Error, "could not find string VERSION constant in #{path}")
91
- constant.value
68
+ version_edits = with_dev_errors do
69
+ Kettle::Dev::VersionBump.new(
70
+ root: member.root,
71
+ current_version: member.version,
72
+ target_version: member_target_version
73
+ ).edits
74
+ end
75
+ version_edits + gemspec_dependency_edits(member)
92
76
  end
93
77
 
94
78
  def gemspec_dependency_edits(member)
95
79
  source = File.read(member.gemspec_path)
96
- parse_result = parse_source(source, member.gemspec_path)
80
+ parse_result = with_dev_errors { Kettle::Dev::VersionBump.parse_source(source, member.gemspec_path) }
97
81
 
98
- each_node(parse_result.value).filter_map do |node|
82
+ Kettle::Dev::VersionBump.each_node(parse_result.value).filter_map do |node|
99
83
  dependency_edit_for(member.gemspec_path, source, node)
100
84
  end
101
85
  end
102
86
 
103
- def parse_source(source, path)
104
- require_prism
105
- parse_result = Prism.parse(source)
106
- raise Error, "could not parse #{path}" unless parse_result.success?
107
-
108
- parse_result
109
- end
110
-
111
- def require_prism
112
- return if defined?(Prism)
113
-
114
- require "prism"
115
- rescue LoadError => error
116
- raise Error, "bump-version requires Prism; install the prism gem or run on a Ruby engine that provides it (#{error.message})"
117
- end
118
-
119
- def each_node(root)
120
- return enum_for(__method__, root) unless block_given?
121
-
122
- queue = [root]
123
- until queue.empty?
124
- node = queue.shift
125
- yield node
126
- queue.concat(node.child_nodes.compact) if node.respond_to?(:child_nodes)
127
- end
128
- end
129
-
130
87
  def dependency_edit_for(path, source, node)
131
88
  return unless node.is_a?(Prism::CallNode) && DEPENDENCY_METHODS.include?(node.name)
132
89
 
@@ -142,8 +99,8 @@ module Kettle
142
99
  return unless current.start_with?(exact_prefix)
143
100
  return if current == "#{exact_prefix}#{dependency_target_version}"
144
101
 
145
- replacement = quote_like(requirement_node.location.slice, "#{exact_prefix}#{dependency_target_version}")
146
- file_edit(path, source, requirement_node.location.start_offset, requirement_node.location.end_offset, replacement)
102
+ replacement = Kettle::Dev::VersionBump.quote_like(requirement_node.location.slice, "#{exact_prefix}#{dependency_target_version}")
103
+ Kettle::Dev::VersionBump.file_edit(path, source, requirement_node.location.start_offset, requirement_node.location.end_offset, replacement)
147
104
  end
148
105
 
149
106
  def target_version_for(member)
@@ -151,73 +108,13 @@ module Kettle
151
108
  end
152
109
 
153
110
  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
111
+ return explicit_target_version unless Kettle::Dev::VersionBump::BUMP_TYPES.include?(target_version)
158
112
 
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
-
204
- def file_edit(path, source, start_offset, end_offset, replacement)
205
- {path: path, source: source, start_offset: start_offset, end_offset: end_offset, replacement: replacement}
206
- end
207
-
208
- def quote_like(original, value)
209
- quote = original.start_with?("'") ? "'" : '"'
210
- "#{quote}#{value}#{quote}"
113
+ with_dev_errors { Kettle::Dev::VersionBump.resolve_target_version(target_version, member.version) }
211
114
  end
212
115
 
213
116
  def write_edits(edits)
214
- edits.group_by { |edit| edit.fetch(:path) }.each_value do |file_edits|
215
- source = file_edits.first.fetch(:source)
216
- file_edits.sort_by { |edit| -edit.fetch(:start_offset) }.each do |edit|
217
- source[edit.fetch(:start_offset)...edit.fetch(:end_offset)] = edit.fetch(:replacement)
218
- end
219
- File.write(file_edits.first.fetch(:path), source)
220
- end
117
+ Kettle::Dev::VersionBump.write_edits(edits)
221
118
  end
222
119
 
223
120
  def edit_summary(member:, target_version:, edits:)
@@ -228,6 +125,12 @@ module Kettle
228
125
  lines.concat(edits.map { |edit| "#{verb} #{edit.fetch(:path)}" }.uniq)
229
126
  lines.join("\n")
230
127
  end
128
+
129
+ def with_dev_errors
130
+ yield
131
+ rescue Kettle::Dev::Error => error
132
+ raise Error, error.message
133
+ end
231
134
  end
232
135
  end
233
136
  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.32
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -105,20 +105,20 @@ dependencies:
105
105
  requirements:
106
106
  - - "~>"
107
107
  - !ruby/object:Gem::Version
108
- version: '2.2'
108
+ version: '2.3'
109
109
  - - ">="
110
110
  - !ruby/object:Gem::Version
111
- version: 2.2.24
112
- type: :development
111
+ version: 2.3.0
112
+ type: :runtime
113
113
  prerelease: false
114
114
  version_requirements: !ruby/object:Gem::Requirement
115
115
  requirements:
116
116
  - - "~>"
117
117
  - !ruby/object:Gem::Version
118
- version: '2.2'
118
+ version: '2.3'
119
119
  - - ">="
120
120
  - !ruby/object:Gem::Version
121
- version: 2.2.24
121
+ version: 2.3.0
122
122
  - !ruby/object:Gem::Dependency
123
123
  name: bundler-audit
124
124
  requirement: !ruby/object:Gem::Requirement
@@ -196,7 +196,7 @@ dependencies:
196
196
  version: '2.0'
197
197
  - - ">="
198
198
  - !ruby/object:Gem::Version
199
- version: 2.0.8
199
+ version: 2.0.9
200
200
  type: :development
201
201
  prerelease: false
202
202
  version_requirements: !ruby/object:Gem::Requirement
@@ -206,7 +206,7 @@ dependencies:
206
206
  version: '2.0'
207
207
  - - ">="
208
208
  - !ruby/object:Gem::Version
209
- version: 2.0.8
209
+ version: 2.0.9
210
210
  - !ruby/object:Gem::Dependency
211
211
  name: turbo_tests2
212
212
  requirement: !ruby/object:Gem::Requirement
@@ -339,10 +339,10 @@ licenses:
339
339
  - AGPL-3.0-only
340
340
  metadata:
341
341
  homepage_uri: https://kettle-family.galtzo.com
342
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v0.1.32
343
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v0.1.32/CHANGELOG.md
342
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v0.2.0
343
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v0.2.0/CHANGELOG.md
344
344
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
345
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/0.1.32
345
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/0.2.0
346
346
  funding_uri: https://github.com/sponsors/pboling
347
347
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
348
348
  news_uri: https://www.railsbling.com/tags/kettle-family
metadata.gz.sig CHANGED
Binary file