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 +4 -4
- checksums.yaml.gz.sig +3 -2
- data/CHANGELOG.md +26 -1
- data/README.md +1 -1
- data/lib/kettle/family/discovery.rb +5 -2
- data/lib/kettle/family/local_install.rb +5 -2
- data/lib/kettle/family/version.rb +1 -1
- data/lib/kettle/family/version_bump.rb +25 -122
- data.tar.gz.sig +0 -0
- metadata +11 -11
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1f37904c4583ed3dbc1ef2c372c5d4aa7e3ecec95d8aba520e0979065106087f
|
|
4
|
+
data.tar.gz: ce0b99d87d7a815467428209c2f504ddafc0800890dabf9af5b534e4f8073fc0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b98994c1f6daa8fd29ec064de3b23a241c3e25c3786b67e67bc765dea795e92dfa6cf3ba510a4782f9a9b5a954ef0f748bb82c0d6f94a5f2a5b1f95da9ac0be9
|
|
7
|
+
data.tar.gz: '0189a3faba9e70ec5e333eaee9eaf956d4c7151ded78916f63faaf8d1bce1c2a14d10c636fcec54bb7555dff7332cb0ae8adc9f763231d75b94eac0ec0caaf12'
|
checksums.yaml.gz.sig
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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.
|
|
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.
|
|
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
|
|
|
@@ -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
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
108
|
+
version: '2.3'
|
|
109
109
|
- - ">="
|
|
110
110
|
- !ruby/object:Gem::Version
|
|
111
|
-
version: 2.
|
|
112
|
-
type: :
|
|
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.
|
|
118
|
+
version: '2.3'
|
|
119
119
|
- - ">="
|
|
120
120
|
- !ruby/object:Gem::Version
|
|
121
|
-
version: 2.
|
|
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.
|
|
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.
|
|
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.
|
|
343
|
-
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v0.
|
|
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.
|
|
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
|