kettle-family 0.1.28 → 0.1.29

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: 064f3f14703f9a178aba7cb549a0c55139f52397caa413adafa1137e44e504bb
4
- data.tar.gz: c1c7ae833d6b815d7f7a52ba287fa186d51be53b09ab4e91d442b2cc6e94ab44
3
+ metadata.gz: 8f2d2daae978ae39fac490631b4c3e50177da30f9d386eb1bc51aa6e97e00cee
4
+ data.tar.gz: 2f054f861e0f108fae73f251bf1b95402f9500d9aafeea012bc2b0eff116fd26
5
5
  SHA512:
6
- metadata.gz: 9c71cc770c2d719561d0d6ef91d4c43a329ac75559cebaaf62732efbc0dd02f03e52684d9fa60ff26ac5ea1ad785c51af7e33e56573dc270b6def694d9bfec39
7
- data.tar.gz: 9a4bc82e5d51c3ff52ccc5b93243c6c36a55e4769b29c0f17f320f1386f1336908acddca9e7dcf508e04680717262a63e6e80c47d5d5aaafdd569ba87fc0d12a
6
+ metadata.gz: 7aeb45976878075ff4ab19b00e01bf664d105307e9494d36bcff52ef0967b989b6526689dcfbeed7492b7bbad2f639f4ef3a78fe5948937c241362e5849c57f8
7
+ data.tar.gz: 7f90c138396b126b1d12768a1a04cd737b8b1699584de3d79148dbee01f4cbed02bab85f503aa3772f193deff792e2be6e5029450c9827f4e2c6dc57b3bbb41b
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,25 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [0.1.29] - 2026-06-28
34
+
35
+ - TAG: [v0.1.29][0.1.29t]
36
+ - COVERAGE: 95.29% -- 1922/2017 lines in 21 files
37
+ - BRANCH COVERAGE: 75.14% -- 668/889 branches in 21 files
38
+ - 38.37% documented
39
+
40
+ ### Added
41
+
42
+ - `kettle-family --only` now accepts comma-separated member names for subset
43
+ workflows.
44
+ - Parallel `kettle-family release` output now includes derived release waves so
45
+ dependency-safe release groups are visible.
46
+
47
+ ### Fixed
48
+
49
+ - Parallel `kettle-family release` waves now stop assigning queued releases as
50
+ soon as any member fails.
51
+
33
52
  ## [0.1.28] - 2026-06-28
34
53
 
35
54
  - TAG: [v0.1.28][0.1.28t]
@@ -495,7 +514,9 @@ Please file a bug if you notice a violation of semantic versioning.
495
514
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
496
515
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
497
516
 
498
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v0.1.28...HEAD
517
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v0.1.29...HEAD
518
+ [0.1.29]: https://github.com/kettle-dev/kettle-family/compare/v0.1.28...v0.1.29
519
+ [0.1.29t]: https://github.com/kettle-dev/kettle-family/releases/tag/v0.1.29
499
520
  [0.1.28]: https://github.com/kettle-dev/kettle-family/compare/v0.1.27...v0.1.28
500
521
  [0.1.28t]: https://github.com/kettle-dev/kettle-family/releases/tag/v0.1.28
501
522
  [0.1.27]: https://github.com/kettle-dev/kettle-family/compare/v0.1.26...v0.1.27
data/README.md CHANGED
@@ -571,7 +571,7 @@ Thanks for RTFM. ☺️
571
571
  [📌gitmoji]: https://gitmoji.dev
572
572
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
573
573
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
574
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-1.994-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
574
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-2.017-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
575
575
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
576
576
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
577
577
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -80,7 +80,7 @@ module Kettle
80
80
  Options:
81
81
  --root PATH Workspace or family root (default: current directory)
82
82
  --config PATH Family config path
83
- --only MEMBER Select exactly one member
83
+ --only MEMBERS Select comma-separated members
84
84
  --start-at NAME Select from member through the end of order; use MEMBER@BRANCH for branch stacks
85
85
  --json Print JSON report to stdout
86
86
  --report PATH Write JSON report to PATH
@@ -59,6 +59,7 @@ module Kettle
59
59
  marker = selected_names.include?(member.name) ? "*" : "-"
60
60
  lines << " #{marker} #{member.name} #{member.version} #{member.root}"
61
61
  end
62
+ append_release_waves(lines)
62
63
  append_results(lines)
63
64
  lines.join("\n")
64
65
  end
@@ -74,8 +75,11 @@ module Kettle
74
75
  return if results.empty?
75
76
  return append_release_state_results(lines) if command == "release-state"
76
77
 
78
+ visible_results = results.reject { |result| release_wave_result?(result) }
79
+ return if visible_results.empty?
80
+
77
81
  lines << "results:"
78
- results.each do |result|
82
+ visible_results.each do |result|
79
83
  lines << " #{result_state(result)} #{result.member_name} #{result.phase} #{result.reason || ""}".rstrip
80
84
  append_indented_output(lines, result.stdout) unless suppress_success_output?(result)
81
85
  append_indented_output(lines, result.stderr) if !result.ok? && !result.stderr.to_s.empty?
@@ -84,6 +88,20 @@ module Kettle
84
88
  append_template_summary(lines) if command == "template"
85
89
  end
86
90
 
91
+ def append_release_waves(lines)
92
+ wave_results = results.select { |result| release_wave_result?(result) }
93
+ return if wave_results.empty?
94
+
95
+ lines << "release waves:"
96
+ wave_results.each do |result|
97
+ lines << " #{result.member_name}: #{result.stdout} (#{result.reason})"
98
+ end
99
+ end
100
+
101
+ def release_wave_result?(result)
102
+ result.phase == "release_wave"
103
+ end
104
+
87
105
  def append_indented_output(lines, output)
88
106
  output.to_s.each_line(chomp: true) { |line| lines << " #{line}" }
89
107
  end
@@ -21,10 +21,13 @@ module Kettle
21
21
  attr_reader :members
22
22
 
23
23
  def select_only(selected, only)
24
- member = selected.find { |candidate| candidate.name == only }
25
- raise Error, "unknown member #{only.inspect}" unless member
24
+ names = only.split(",").map(&:strip).reject(&:empty?)
25
+ raise Error, "--only requires at least one member" if names.empty?
26
26
 
27
- [member]
27
+ unknown = names - members.map(&:name)
28
+ raise Error, "unknown member(s): #{unknown.join(", ")}" unless unknown.empty?
29
+
30
+ selected.select { |candidate| names.include?(candidate.name) }
28
31
  end
29
32
 
30
33
  def select_start_at(selected, start_at)
@@ -3,7 +3,7 @@
3
3
  module Kettle
4
4
  module Family
5
5
  module Version
6
- VERSION = "0.1.28"
6
+ VERSION = "0.1.29"
7
7
  end
8
8
  VERSION = Version::VERSION # Traditional Constant Location
9
9
  end
@@ -268,7 +268,9 @@ module Kettle
268
268
 
269
269
  def parallel_release_member_results(release_members, initial_results)
270
270
  results = initial_results.dup
271
- release_waves(release_members).each do |wave|
271
+ waves = release_waves(release_members)
272
+ waves.each_with_index do |wave, index|
273
+ results << release_wave_result(wave, index: index, total: waves.length)
272
274
  wave_results = run_release_wave(wave)
273
275
  results.concat(wave_results.flatten)
274
276
  break unless wave_results.all? { |member_results| member_results.all?(&:ok?) }
@@ -281,13 +283,21 @@ module Kettle
281
283
  wave.each_with_index { |member, index| queue << [index, member] }
282
284
  ordered_results = Array.new(wave.length)
283
285
  wave_jobs = release_jobs(wave)
286
+ mutex = Mutex.new
287
+ stop = false
284
288
  release_otp_coordinator&.queue_total = wave_jobs
285
289
  Array.new(wave_jobs) do
286
290
  Thread.new do # rubocop:disable ThreadSafety/NewThread -- family release intentionally runs independent members concurrently.
287
291
  runner = release_command_runner
288
292
  loop do
293
+ break if mutex.synchronize { stop }
294
+
289
295
  index, member = queue.pop(true)
290
- ordered_results[index] = release_results_for_member(member, runner: runner)
296
+ member_results = release_results_for_member(member, runner: runner)
297
+ mutex.synchronize do
298
+ ordered_results[index] = member_results
299
+ stop = true unless member_results.all?(&:ok?)
300
+ end
291
301
  rescue ThreadError
292
302
  break
293
303
  end
@@ -296,6 +306,22 @@ module Kettle
296
306
  ordered_results.compact
297
307
  end
298
308
 
309
+ def release_wave_result(wave, index:, total:)
310
+ CommandResult.new(
311
+ member_name: "wave #{index + 1}",
312
+ phase: "release_wave",
313
+ command: ["internal", "release-wave"],
314
+ workdir: config.root,
315
+ status: 0,
316
+ success: true,
317
+ stdout: wave.map(&:name).join(", "),
318
+ stderr: "",
319
+ elapsed_seconds: 0.0,
320
+ skipped: false,
321
+ reason: "jobs=#{release_jobs(wave)} total=#{total}"
322
+ )
323
+ end
324
+
299
325
  def release_results_for_member(member, runner:)
300
326
  [].tap do |memo|
301
327
  if skip_already_released?(member)
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.28
4
+ version: 0.1.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -80,7 +80,7 @@ dependencies:
80
80
  version: '2.2'
81
81
  - - ">="
82
82
  - !ruby/object:Gem::Version
83
- version: 2.2.20
83
+ version: 2.2.23
84
84
  type: :development
85
85
  prerelease: false
86
86
  version_requirements: !ruby/object:Gem::Requirement
@@ -90,7 +90,7 @@ dependencies:
90
90
  version: '2.2'
91
91
  - - ">="
92
92
  - !ruby/object:Gem::Version
93
- version: 2.2.20
93
+ version: 2.2.23
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: bundler-audit
96
96
  requirement: !ruby/object:Gem::Requirement
@@ -222,7 +222,7 @@ dependencies:
222
222
  version: '1.0'
223
223
  - - ">="
224
224
  - !ruby/object:Gem::Version
225
- version: 1.0.3
225
+ version: 1.0.4
226
226
  type: :development
227
227
  prerelease: false
228
228
  version_requirements: !ruby/object:Gem::Requirement
@@ -232,7 +232,7 @@ dependencies:
232
232
  version: '1.0'
233
233
  - - ">="
234
234
  - !ruby/object:Gem::Version
235
- version: 1.0.3
235
+ version: 1.0.4
236
236
  - !ruby/object:Gem::Dependency
237
237
  name: gitmoji-regex
238
238
  requirement: !ruby/object:Gem::Requirement
@@ -310,10 +310,10 @@ licenses:
310
310
  - AGPL-3.0-only
311
311
  metadata:
312
312
  homepage_uri: https://kettle-family.galtzo.com
313
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v0.1.28
314
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v0.1.28/CHANGELOG.md
313
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v0.1.29
314
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v0.1.29/CHANGELOG.md
315
315
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
316
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/0.1.28
316
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/0.1.29
317
317
  funding_uri: https://github.com/sponsors/pboling
318
318
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
319
319
  news_uri: https://www.railsbling.com/tags/kettle-family
metadata.gz.sig CHANGED
Binary file