kettle-dev 3.0.29 → 3.0.31

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: bc59b144ad35c13c8dc77cdadfcea930ba96aaf4d5d3896de8eaba577e83cd41
4
- data.tar.gz: 3c045b3ba0e37e744a2e6305dd2b06edd30726973fb06c8462c2d40bb553e812
3
+ metadata.gz: 8793d6f66be47b9b55bc6dd2b7dce86a6b80e5b66c3a7f3a8b23356d34dbafde
4
+ data.tar.gz: a15e9ab1030f1d875cf9b2f5cf13c8d271754a51a97f20dcb930ab28fc5e3eab
5
5
  SHA512:
6
- metadata.gz: 1844c35d044d30ea440baca2c784b7aea035f37848c8dfa5b2a5a7533759e00eeaf20e04af3da857821617c762eaa717639b44fd17aabdd78cba5a1b2b7380ed
7
- data.tar.gz: 7b4e5f90dbcf71235efe088f84ae03ec0707539f2072e2f246d0a48e1dc43bd361c8c5befc6a2bebfe7d017ceffca1fab631e897558bbcdf9882f3253cfe747a
6
+ metadata.gz: 610789813bbdefc88abf9f708f80b66ceb7441ae9cab53bd579289a2d94668c90dd94435185ff629a6ec625da50c465b6bde1d13a1cc31c796857808c4c8fa47
7
+ data.tar.gz: 375cf47db46bc26f3bace6b2cd03c0f3078e8af1735c2012abeb494451dcdcadfd1dac9f857d9fb8a6e8d95564a7d6a4f7631fa3936956cdafb4a4e8490d3016
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,32 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [3.0.31] - 2026-09-06
34
+
35
+ - TAG: [v3.0.31][3.0.31t]
36
+ - COVERAGE: 91.85% -- 6060/6598 lines in 47 files
37
+ - BRANCH COVERAGE: 76.33% -- 2315/3033 branches in 47 files
38
+ - 50.00% documented
39
+
40
+ ### Fixed
41
+
42
+ - Preserve every configured Bundler lockfile platform when resetting release lockfiles.
43
+
44
+ - Materialize normalized release bundles before running bundle-exec release checks.
45
+
46
+ ## [3.0.30] - 2026-09-01
47
+
48
+ - TAG: [v3.0.30][3.0.30t]
49
+ - COVERAGE: 91.68% -- 6038/6586 lines in 47 files
50
+ - BRANCH COVERAGE: 76.31% -- 2310/3027 branches in 47 files
51
+ - 50.00% documented
52
+
53
+ ### Fixed
54
+
55
+ - Add an isolated family-member publish mode for concurrent monorepo releases.
56
+
57
+ - Add serialized family-member checksum finalization for concurrent monorepo releases.
58
+
33
59
  ## [3.0.29] - 2026-09-01
34
60
 
35
61
  - TAG: [v3.0.29][3.0.29t]
@@ -3786,7 +3812,11 @@ Please file a bug if you notice a violation of semantic versioning.
3786
3812
  - Selecting will run the selected workflow via `act`
3787
3813
  - This may move to its own gem in the future.
3788
3814
 
3789
- [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.29...HEAD
3815
+ [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.31...HEAD
3816
+ [3.0.31]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.30...v3.0.31
3817
+ [3.0.31t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.0.31
3818
+ [3.0.30]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.29...v3.0.30
3819
+ [3.0.30t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.0.30
3790
3820
  [3.0.29]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.28...v3.0.29
3791
3821
  [3.0.29t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.0.29
3792
3822
  [3.0.28]: https://github.com/kettle-dev/kettle-dev/compare/v3.0.27...v3.0.28
data/README.md CHANGED
@@ -1066,7 +1066,7 @@ Thanks for RTFM. ☺️
1066
1066
  [📌gitmoji]: https://gitmoji.dev
1067
1067
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
1068
1068
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
1069
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.555-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1069
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.598-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1070
1070
  [🔐security]: https://github.com/kettle-dev/kettle-dev/blob/main/SECURITY.md
1071
1071
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
1072
1072
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -202,12 +202,10 @@ module Kettle
202
202
  command << " #{key}=#{Shellwords.escape(value)}"
203
203
  end
204
204
  command << " bundle lock"
205
- removed_platforms.sort.each do |platform|
206
- command << " --remove-platform=#{Shellwords.escape(platform)}"
207
- end
208
- platforms.each do |platform|
209
- command << " --add-platform=#{Shellwords.escape(platform)}"
210
- end
205
+ # Bundler accepts each platform option once followed by a list. Repeating
206
+ # either option silently keeps only the final occurrence with Bundler 4.
207
+ command << " --remove-platform #{removed_platforms.sort.map { |platform| Shellwords.escape(platform) }.join(" ")}" unless removed_platforms.empty?
208
+ command << " --add-platform #{platforms.map { |platform| Shellwords.escape(platform) }.join(" ")}" unless platforms.empty?
211
209
  command << " --update"
212
210
  command << " #{update_gems.map { |gem_name| Shellwords.escape(gem_name) }.join(" ")}" unless update_gems.empty?
213
211
  # Bundler preserves BUNDLED WITH during a normal lockfile update.
@@ -69,6 +69,8 @@ module Kettle
69
69
  ].freeze
70
70
  DEBUG_TRUE_VALUES = %w[1 true yes on].freeze
71
71
  RELEASE_VALIDATION_SOURCE = "https://gem.coop"
72
+ FAMILY_MEMBER_PUBLISH_MODE_ENV = "KETTLE_RELEASE_FAMILY_MEMBER_PUBLISH"
73
+ FAMILY_MEMBER_FINALIZE_MODE_ENV = "KETTLE_RELEASE_FAMILY_MEMBER_FINALIZE"
72
74
 
73
75
  class << self
74
76
  def run_cmd!(cmd)
@@ -223,6 +225,8 @@ module Kettle
223
225
  @finished_report = nil
224
226
  @changelog_generated_coverage = false
225
227
  @release_task_lockfile_paths = {}
228
+ @family_member_publish = truthy_value?(ENV[FAMILY_MEMBER_PUBLISH_MODE_ENV])
229
+ @family_member_finalize = truthy_value?(ENV[FAMILY_MEMBER_FINALIZE_MODE_ENV])
226
230
  end
227
231
 
228
232
  def run
@@ -255,11 +259,17 @@ module Kettle
255
259
  attr_reader :finished_report
256
260
 
257
261
  def run_with_release_environment
262
+ return run_family_member_publish if family_member_publish?
263
+ return run_family_member_finalize if family_member_finalize?
264
+
258
265
  # Changelog generation at step 0 runs the target project's test bundle
259
266
  # to collect coverage. Normalize its canonical release lockfile before
260
267
  # that subprocess starts; otherwise a local development PATH lock can
261
268
  # force Bundler to resolve an invalid mixed local/released graph.
262
- prepare_release_lockfiles_for_release_tasks! if release_lockfile_preflight_needed?
269
+ if release_lockfile_preflight_needed?
270
+ prepare_release_lockfiles_for_release_tasks!
271
+ materialize_release_lockfiles_for_release_tasks!
272
+ end
263
273
  run_pre_release_checks! if run_step?(0)
264
274
 
265
275
  # 1. Ensure Bundler version and record its current release in the
@@ -605,6 +615,41 @@ module Kettle
605
615
  @skip_bundle_audit
606
616
  end
607
617
 
618
+ # Kettle Family uses this mode only after it has prepared and validated
619
+ # the shared monorepo release commit. A member may build and publish its
620
+ # gem, but it must never alter the shared Git repository or release it.
621
+ def family_member_publish?
622
+ @family_member_publish
623
+ end
624
+
625
+ def family_member_finalize?
626
+ @family_member_finalize
627
+ end
628
+
629
+ def run_family_member_publish
630
+ version = detect_version
631
+ prepare_release_lockfiles_for_release_tasks!
632
+ ensure_signing_setup_or_skip!
633
+ ensure_release_secrets_ready_for_signing! if signing_enabled? && release_secrets_configured?
634
+ run_cmd!(release_project_command("bundle exec rake build"))
635
+
636
+ gem_name = detect_gem_name
637
+ @release_candidate = build_release_candidate(gem_name, version)
638
+ with_unpublished_candidate_cleanup { publish_built_gem!(version) }
639
+ human_output.puts "\n🚀 Published #{gem_name} v#{version} from family member mode 🚀"
640
+ end
641
+
642
+ # Kettle Family invokes this serially in the primary checkout after
643
+ # concurrent member publication. bin/gem_checksums owns its checksum
644
+ # commit; the family owns the one shared tag, pushes, and GitHub Release.
645
+ def run_family_member_finalize
646
+ version = detect_version
647
+ gem_path = checksum_gem_path_for_version!(version)
648
+ run_cmd!(release_child_command("bin/gem_checksums #{Shellwords.escape(gem_path)}"))
649
+ validate_checksums!(version, stage: "after family member publish")
650
+ human_output.puts "\n🔒 Finalized checksums for #{detect_gem_name} v#{version} from family member mode 🔒"
651
+ end
652
+
608
653
  def truthy_value?(value)
609
654
  return true if value == true
610
655
 
@@ -710,6 +755,36 @@ module Kettle
710
755
  reset_release_lockfiles!(stage: "before release task bundle installs")
711
756
  end
712
757
 
758
+ # Resetting can select a platform-specific artifact that is not installed
759
+ # in the invoking development bundle. Materialize every canonical release
760
+ # bundle before a release gate runs `bundle exec`. Use a disposable copy:
761
+ # Bundler may reconcile the active host platform during installation, and
762
+ # that must never alter the canonical release-preparation lockfile.
763
+ def materialize_release_lockfiles_for_release_tasks!
764
+ release_lockfile_paths.each do |lockfile|
765
+ gemfile = release_gemfile_for_lockfile(lockfile)
766
+ next unless gemfile && File.file?(gemfile)
767
+
768
+ begin
769
+ stage = "before release task bundle installs"
770
+ task_lockfile = release_task_lockfile_path(gemfile: gemfile)
771
+ emit_release_lockfile_event(action: "install", status: "started", stage: stage, reason: File.basename(gemfile))
772
+ puts "Installing normalized release bundle for #{File.basename(gemfile)}..."
773
+ run_cmd!(release_child_command(
774
+ "bundle install",
775
+ environment: {
776
+ "BUNDLE_GEMFILE" => gemfile,
777
+ "BUNDLE_LOCKFILE" => task_lockfile || lockfile
778
+ }
779
+ ))
780
+ emit_release_lockfile_event(action: "install", status: "ok", stage: stage, reason: File.basename(gemfile))
781
+ rescue => error
782
+ emit_release_lockfile_event(action: "install", status: "failed", stage: stage, reason: error.message)
783
+ raise
784
+ end
785
+ end
786
+ end
787
+
713
788
  def reset_release_lockfiles!(stage:)
714
789
  return if @release_lockfiles_reset_for_release_tasks && stage == "before release task bundle installs"
715
790
 
@@ -1868,6 +1943,15 @@ module Kettle
1868
1943
  abort("Failed to create local tag #{tag}.") unless @git.tag_annotated(tag, tag)
1869
1944
  end
1870
1945
 
1946
+ publish_built_gem!(version)
1947
+ end
1948
+
1949
+ def publish_built_gem!(version)
1950
+ gem_path = gem_file_for_version(version)
1951
+ unless gem_path && File.file?(gem_path)
1952
+ abort("Unable to locate built gem for version #{version} in pkg/. Did the build succeed?")
1953
+ end
1954
+
1871
1955
  puts "Publishing #{File.basename(gem_path)} to RubyGems without pushing git refs..."
1872
1956
  run_cmd!("gem push #{Shellwords.escape(gem_path)}")
1873
1957
  gem_name = gem_name_from_gem_path(gem_path, version)
@@ -5,7 +5,7 @@ module Kettle
5
5
  # Version namespace for this gem.
6
6
  module Version
7
7
  # Current gem version.
8
- VERSION = "3.0.29"
8
+ VERSION = "3.0.31"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kettle-dev
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.29
4
+ version: 3.0.31
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -400,10 +400,10 @@ licenses:
400
400
  - AGPL-3.0-only
401
401
  metadata:
402
402
  homepage_uri: https://kettle-dev.galtzo.com
403
- source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v3.0.29
404
- changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v3.0.29/CHANGELOG.md
403
+ source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v3.0.31
404
+ changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v3.0.31/CHANGELOG.md
405
405
  bug_tracker_uri: https://github.com/kettle-dev/kettle-dev/issues
406
- documentation_uri: https://www.rubydoc.info/gems/kettle-dev/3.0.29
406
+ documentation_uri: https://www.rubydoc.info/gems/kettle-dev/3.0.31
407
407
  funding_uri: https://github.com/sponsors/pboling
408
408
  wiki_uri: https://github.com/kettle-dev/kettle-dev/wiki
409
409
  news_uri: https://www.railsbling.com/tags/kettle-dev
metadata.gz.sig CHANGED
Binary file