kettle-family 1.2.58 → 1.2.59

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: 34d40e983c125c689f16bf8ca75d566190006c61796efd6c403ed341df8f067b
4
- data.tar.gz: 118ebf6ca455659ed4b0789b5fed52f301c4bf89990ced82f5ea64ead678712e
3
+ metadata.gz: 1362393294aee4023a1d11a45973f31affd2a4b858f9fbe400b22ebed831d078
4
+ data.tar.gz: e776253f40b9e2c77c2db5638e075d9c0ff08b2841e8be18ab23452da9254e89
5
5
  SHA512:
6
- metadata.gz: 2dce07e1ffe8a539914a1916278e530a38dbed599672f49360e4d97ec49e48496860d61812c0bee3fccd980ec867dbdd7371ffc406a793ac9e4c0c70a5f7e86c
7
- data.tar.gz: a0c7eec1e7992797dc59d459bda064302e93353ae66c7239182c2a16f4515fc15f3a3f48463d7b5a076b0a1679d58d08c9ebc05e603d2d196afbd52af670fc14
6
+ metadata.gz: 7996bae296cfe6b3cee363e53e2992d6033375d34e90866127e59368b8b6b8ed3fe769a15ac66ed7105b365fb591c7fe58967c466ef1f162bf732edb3f2f34ab
7
+ data.tar.gz: 03ccd0e0d856f16f596c80f3b028787bc475a9bebe82e34efce92eb1d4ce6bdd0dc571a5e9b7074680a23ee1a01de9aab2d183f88ddc409557519e809a8eff5b
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,19 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [1.2.59] - 2026-08-25
34
+
35
+ - TAG: [v1.2.59][1.2.59t]
36
+ - COVERAGE: 93.52% -- 5367/5739 lines in 33 files
37
+ - BRANCH COVERAGE: 76.27% -- 2173/2849 branches in 33 files
38
+ - 29.78% documented
39
+
40
+ ### Fixed
41
+
42
+ - Reject configured release waves that place runtime gem dependencies after their dependents.
43
+
44
+ - Keep configured shared changelog version anchors authoritative during partial family releases.
45
+
33
46
  ## [1.2.58] - 2026-08-23
34
47
 
35
48
  - TAG: [v1.2.58][1.2.58t]
@@ -2153,7 +2166,9 @@ Please file a bug if you notice a violation of semantic versioning.
2153
2166
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
2154
2167
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
2155
2168
 
2156
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.58...HEAD
2169
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.59...HEAD
2170
+ [1.2.59]: https://github.com/kettle-dev/kettle-family/compare/v1.2.58...v1.2.59
2171
+ [1.2.59t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.59
2157
2172
  [1.2.58]: https://github.com/kettle-dev/kettle-family/compare/v1.2.57...v1.2.58
2158
2173
  [1.2.58t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.58
2159
2174
  [1.2.57]: https://github.com/kettle-dev/kettle-family/compare/v1.2.56...v1.2.57
data/README.md CHANGED
@@ -39,7 +39,9 @@ is, avoiding duplicate release-prep commits after a failure/fix/retry cycle.
39
39
  options such as `start_step=N` and `--local-ci` pass through, CI failures still
40
40
  abort by default, and gem signing passphrases are cached once per family run
41
41
  while RubyGems MFA prompts remain interactive unless an opt-in release secrets
42
- provider supplies them.
42
+ provider supplies them. Resume options are deliberately scoped: use them only
43
+ when the member's prepared release commit is unchanged. If a CI failure requires
44
+ code, version, changelog, or lockfile changes, rerun that member from step 0.
43
45
 
44
46
  ## 💡 Info you can shake a stick at
45
47
 
@@ -286,8 +288,9 @@ release:
286
288
 
287
289
  Resume and security-release options pass through to `kettle-release`. Passing
288
290
  `--start-step N` appends `start_step=N`; as with direct `kettle-release` usage,
289
- `N > 1` resumes after the pre-release gate and should be used only after that
290
- gate already passed or the failure was intentionally handled:
291
+ `N > 0` skips the pre-release gate and should be used only for the same
292
+ prepared release commit after the earlier prerequisites passed. A code or
293
+ metadata fix requires a new full release run from step 0:
291
294
 
292
295
  ```console
293
296
  kettle-family release --publish --start-step 10 --local-ci
@@ -296,6 +299,13 @@ kettle-family release --publish --start-step 10 --local-ci
296
299
  Executed publish runs skip versions that are already published. CI failures
297
300
  abort by default; pass `--continue-ci-failures` to set
298
301
  `K_RELEASE_CI_CONTINUE=true` for the underlying `kettle-release` process.
302
+ That option still monitors CI and only changes whether a failed result blocks
303
+ the release. It does not skip monitoring. Use `--fast-recovery retry-ci`
304
+ for a selected same-commit member when the failure was transient, or
305
+ `--fast-recovery skip-ci` only when you intentionally accept the CI result.
306
+ Use `--skip-ci` when every selected member should run from step 0 while
307
+ skipping remote CI monitoring; it is not a substitute for fixing code and
308
+ creating a new release commit.
299
309
 
300
310
  Executed publish runs can also use a release secrets provider. The default
301
311
  provider is `interactive`. The `1password` provider is supplied by
@@ -449,9 +459,6 @@ step 0 while skipping remote CI monitoring, use `--skip-ci` instead:
449
459
  kettle-family release --publish --execute --skip-ci
450
460
  ```
451
461
 
452
- The existing `--continue-ci-failures` option still monitors CI and only changes
453
- whether a failed result blocks the release; it does not skip CI monitoring.
454
-
455
462
  By default, family publish runs pass `--yes` to configured `kettle-changelog`
456
463
  family changelog commands and child `kettle-release` commands. Use
457
464
  `--no-accept` when you want each child command to ask its own confirmation
@@ -856,7 +863,7 @@ Thanks for RTFM. ☺️
856
863
  [📌gitmoji]: https://gitmoji.dev
857
864
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
858
865
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
859
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.726-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
866
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.739-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
860
867
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
861
868
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
862
869
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -521,12 +521,12 @@ module Kettle
521
521
  option :build_only, long: "--build-only", desc: "Use build release command" do
522
522
  options[:publish] = false
523
523
  end
524
- option :start_step, long: "--start-step", value: {type: Integer, usage: "N"}, desc: "Pass start_step=N through to kettle-release commands"
525
- option :skip_steps, long: "--skip-steps", value: {type: String, usage: "LIST"}, desc: "Pass skip_steps=LIST through to kettle-release commands"
526
- option :fast_recovery, long: "--fast-recovery", value: {type: String, usage: "MODE"}, desc: "Recover selected CI failures with retry-ci or skip-ci"
527
- option :fast_recovery_members, long: "--fast-recovery-members", value: {type: String, usage: "MEMBERS"}, desc: "Limit fast recovery to comma-separated selected members"
528
- option :skip_ci, long: "--skip-ci", desc: "Skip remote CI monitoring for every selected member while running from step 0"
529
- option :skip_changelog, long: "--skip-changelog", desc: "Run pre-release gates and specs, but skip kettle-changelog"
524
+ option :start_step, long: "--start-step", value: {type: Integer, usage: "N"}, desc: "Resume the same release commit at kettle-release step N; use only after that step's prerequisites passed"
525
+ option :skip_steps, long: "--skip-steps", value: {type: String, usage: "LIST"}, desc: "Skip comma-separated kettle-release steps for the same release commit"
526
+ option :fast_recovery, long: "--fast-recovery", value: {type: String, usage: "MODE"}, desc: "Recover selected same-commit CI failures with retry-ci or skip-ci"
527
+ option :fast_recovery_members, long: "--fast-recovery-members", value: {type: String, usage: "MEMBERS"}, desc: "Limit fast recovery to selected comma-separated members; defaults to all selected members"
528
+ option :skip_ci, long: "--skip-ci", desc: "Run every selected member from step 0 while skipping only remote CI monitoring; requires --publish"
529
+ option :skip_changelog, long: "--skip-changelog", desc: "Run release checks and child releases while skipping kettle-changelog"
530
530
  option :local_ci, long: "--local-ci", desc: "Pass --local-ci through to kettle-release commands"
531
531
  option :continue_ci_failures, long: "--continue-ci-failures", desc: "Set K_RELEASE_CI_CONTINUE=true for release commands"
532
532
  option :ci_workflows, long: "--ci-workflows", value: {type: String, usage: "LIST"}, desc: "Pass a comma-separated CI workflow monitor subset through to kettle-release commands"
@@ -13,8 +13,11 @@ module Kettle
13
13
  configured = configured_waves_for_selected_members
14
14
  configured_names = configured.flatten.map(&:name)
15
15
  remaining_members = members.reject { |member| configured_names.include?(member.name) }
16
+ planned = configured + inferred_waves(remaining_members)
16
17
 
17
- configured + inferred_waves(remaining_members)
18
+ validate_configured_dependency_order!(planned) unless configured.empty?
19
+
20
+ planned
18
21
  end
19
22
 
20
23
  private
@@ -74,6 +77,27 @@ module Kettle
74
77
  release_dependency_names(member).select { |dependency| by_name.key?(dependency) }
75
78
  end
76
79
 
80
+ def validate_configured_dependency_order!(planned_waves)
81
+ wave_indexes = planned_waves.each_with_index.flat_map do |wave, index|
82
+ wave.map { |member| [member.name, index] }
83
+ end.to_h
84
+
85
+ members.each do |member|
86
+ member_wave = wave_indexes.fetch(member.name)
87
+ Array(member.dependencies).map(&:to_s).filter_map do |dependency|
88
+ dependency_wave = wave_indexes[dependency]
89
+ next unless dependency_wave
90
+ next if dependency_wave < member_wave
91
+
92
+ [member.name, dependency, member_wave + 1, dependency_wave + 1]
93
+ end.each do |dependent, dependency, dependent_wave, dependency_wave|
94
+ raise Error,
95
+ "configured release waves violate runtime dependency order: #{dependent} (wave #{dependent_wave}) " \
96
+ "requires #{dependency} (wave #{dependency_wave}); move #{dependency} to an earlier wave"
97
+ end
98
+ end
99
+ end
100
+
77
101
  def release_dependency_names(member)
78
102
  Array(member.release_dependencies || member.dependencies).map(&:to_s)
79
103
  end
@@ -5,7 +5,7 @@ module Kettle
5
5
  # Version namespace for this gem.
6
6
  module Version
7
7
  # Current gem version.
8
- VERSION = "1.2.58"
8
+ VERSION = "1.2.59"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
@@ -1979,13 +1979,16 @@ module Kettle
1979
1979
  end
1980
1980
 
1981
1981
  version_path = File.expand_path(version_file, config.root)
1982
- member = members.find { |candidate| path_inside?(version_path, candidate.root) }
1982
+ # The root anchor may belong to an earlier wave, so partial releases
1983
+ # must not fall back to a selected member's independent version.
1984
+ known_members = family_members.empty? ? members : family_members
1985
+ member = known_members.find { |candidate| path_inside?(version_path, candidate.root) }
1983
1986
  return member if member
1984
1987
 
1985
1988
  fallback = members.first
1986
1989
  return fallback if fallback&.version_file
1987
1990
 
1988
- raise Error, "shared root changelog version file #{version_file} is not inside any selected family member"
1991
+ raise Error, "shared root changelog version file #{version_file} is not inside any family member"
1989
1992
  end
1990
1993
 
1991
1994
  def family_changelog_env
@@ -2031,7 +2034,8 @@ module Kettle
2031
2034
 
2032
2035
  def family_changelog_version_file
2033
2036
  configured = config.changelog_version_file.to_s
2034
- return configured if !configured.empty? && members.any? { |member| path_inside?(File.expand_path(configured, config.root), member.root) }
2037
+ known_members = family_members.empty? ? members : family_members
2038
+ return configured if !configured.empty? && known_members.any? { |member| path_inside?(File.expand_path(configured, config.root), member.root) }
2035
2039
 
2036
2040
  members.first&.version_file.to_s
2037
2041
  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: 1.2.58
4
+ version: 1.2.59
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -71,7 +71,7 @@ dependencies:
71
71
  requirements:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
- version: 3.0.8
74
+ version: 3.0.11
75
75
  - - "<"
76
76
  - !ruby/object:Gem::Version
77
77
  version: 4.0.0
@@ -81,7 +81,7 @@ dependencies:
81
81
  requirements:
82
82
  - - ">="
83
83
  - !ruby/object:Gem::Version
84
- version: 3.0.8
84
+ version: 3.0.11
85
85
  - - "<"
86
86
  - !ruby/object:Gem::Version
87
87
  version: 4.0.0
@@ -361,10 +361,10 @@ licenses:
361
361
  - AGPL-3.0-only
362
362
  metadata:
363
363
  homepage_uri: https://kettle-family.galtzo.com
364
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.58
365
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.58/CHANGELOG.md
364
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.59
365
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.59/CHANGELOG.md
366
366
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
367
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.58
367
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.59
368
368
  funding_uri: https://github.com/sponsors/pboling
369
369
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
370
370
  news_uri: https://www.railsbling.com/tags/kettle-family
metadata.gz.sig CHANGED
Binary file