kettle-dev 3.1.28 → 3.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: 7b32e53c198f91521db0de1d622d3eaf2a05e9f3e36ef26a168b2514b38494d7
4
- data.tar.gz: d36fb7303f562a7556317337f39b7f7824ec5ff5bc33174334aaf8743d1e059e
3
+ metadata.gz: b5bbcae9e4ae2d02da16163b286f45912220cd5efba41059ece7180b8f8f87bf
4
+ data.tar.gz: ca49ffbec4f7e7ab8063fb8dc12751e097cedd7c5401aa7ea6a379331d3f0c48
5
5
  SHA512:
6
- metadata.gz: 3f070d4cee546793360971982e5edd75d99b05bd97c03a0d809664e1fb45bde935e304246744d74238152c90ebeb8310945712efca507a5a4609db2601dd3ebd
7
- data.tar.gz: df03d639bb72e06cc70177706dd0dfc185a00cfec4544e6cef5ce44edfbff35813b5cf35b2c143190ec3309a3e7e84e420c0ad5e232a281fcd4d78c341cc92ba
6
+ metadata.gz: 5109ef39ece4dcd59b0277b25b28c29463c48f8f3bfecbc3508fe9742cd8860e734629c18b377b150ef81894cb78e4f5fbe2d515ffd20c1a591b7936f5d95cf9
7
+ data.tar.gz: bae2bd4613e1666fdd80c40a3ad24fc43d2950de94c6983bbf954ed8658ed09f89b4e121d7d70bbe987ba64dd89e04d787dd75156fa54ea7609c006ff43ed791
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,37 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [3.1.29] - 2026-11-15
34
+
35
+ - TAG: [v3.1.29][3.1.29t]
36
+ - COVERAGE: 91.95% -- 5856/6369 lines in 48 files
37
+ - BRANCH COVERAGE: 75.81% -- 2247/2964 branches in 48 files
38
+ - 53.68% documented
39
+
40
+ ### Changed
41
+
42
+ - [kc] kettle-jem/prepare: updated 14 project files:
43
+ - dependencies (14)
44
+
45
+ - [kc] kettle-jem/template: updated 17 project files:
46
+ - code and tests (2)
47
+ - dependencies (3)
48
+ - other (3)
49
+ - workflows (9)
50
+
51
+ ### Fixed
52
+
53
+ - `BundlerPinning.install_stable` no longer reinstalls an exact Bundler version
54
+ that is already installed, and serializes installs with a blocking `flock` in
55
+ the gem dir. Rewriting an installed Bundler in place made parallel family
56
+ members that were loading it fail with `LoadError` for files under
57
+ `bundler-X/lib/bundler`.
58
+
59
+ - `bundle:audit:update` is serialized across processes with a blocking `flock`
60
+ on a lock file next to the shared ruby-advisory-db, and a failed update is a
61
+ warning (audit uses the existing copy) when a local database exists. Fixes
62
+ `cannot lock ref 'refs/remotes/origin/master'` in parallel releases ([#57](https://github.com/kettle-dev/kettle-dev/issues/57)).
63
+
33
64
  ## [3.1.28] - 2026-11-08
34
65
 
35
66
  - TAG: [v3.1.28][3.1.28t]
@@ -1901,6 +1932,10 @@ Please file a bug if you notice a violation of semantic versioning.
1901
1932
 
1902
1933
  ### Added
1903
1934
 
1935
+ - `KETTLE_DEV_SKIP_AUDIT_UPDATE=true` (also `1`/`yes`/`on`) skips only
1936
+ `bundle:audit:update` while `bundle:audit` still runs, so a coordinator such
1937
+ as kettle-family can update the shared advisory database once ([#57](https://github.com/kettle-dev/kettle-dev/issues/57)).
1938
+
1904
1939
  - `kettle-pre-release` now skips volatile star-history image URLs by default
1905
1940
  during Markdown image validation, and accepts additional
1906
1941
  `.kettle-family.yml` or `KETTLE_FAMILY_CONFIG` patterns under
@@ -4304,7 +4339,9 @@ Please file a bug if you notice a violation of semantic versioning.
4304
4339
  - Selecting will run the selected workflow via `act`
4305
4340
  - This may move to its own gem in the future.
4306
4341
 
4307
- [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.28...HEAD
4342
+ [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.29...HEAD
4343
+ [3.1.29]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.28...v3.1.29
4344
+ [3.1.29t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.1.29
4308
4345
  [3.1.28]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.27...v3.1.28
4309
4346
  [3.1.28t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v3.1.28
4310
4347
  [3.1.27]: https://github.com/kettle-dev/kettle-dev/compare/v3.1.26...v3.1.27
data/README.md CHANGED
@@ -1048,7 +1048,7 @@ Thanks for RTFM. ☺️
1048
1048
  [📌gitmoji]: https://gitmoji.dev
1049
1049
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
1050
1050
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
1051
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.334-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1051
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.369-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1052
1052
  [🔐security]: https://github.com/kettle-dev/kettle-dev/blob/main/SECURITY.md
1053
1053
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
1054
1054
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
data/exe/kettle-release CHANGED
@@ -137,6 +137,8 @@ if ARGV.include?("-h") || ARGV.include?("--help")
137
137
  # Use slower appraisal:update instead of default appraisal:generate
138
138
  KETTLE_DEV_SKIP_BUNDLE_AUDIT=true
139
139
  # Skip bundle:audit/update during release rake checks
140
+ KETTLE_DEV_SKIP_AUDIT_UPDATE=true
141
+ # Skip only bundle:audit:update (advisory-db pull); bundle:audit still runs
140
142
  GITHUB_TOKEN / GH_TOKEN # Optional; enables GitHub release creation and API queries
141
143
  GITLAB_TOKEN / GL_TOKEN # Optional; enables GitLab API queries when applicable
142
144
  DEBUG=true # Print backtraces on errors
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "bundler"
4
+ require "fileutils"
4
5
  require "rubygems/dependency_installer"
5
6
 
6
7
  module Kettle
@@ -58,15 +59,49 @@ module Kettle
58
59
  # stable when nil. rubygems.org only, never prereleases, and a spec
59
60
  # reset so the just-installed version is visible to later gem lookups
60
61
  # in this process. Returns the installed specs.
62
+ #
63
+ # An exact version that is already installed is NOT reinstalled:
64
+ # RubyGems rewrites an installed gem's files in place, and parallel
65
+ # family members that are loading that Bundler at the time die with
66
+ # LoadError for random files under bundler-X/lib/bundler. Installs are
67
+ # also serialized across processes with a blocking flock in the gem dir,
68
+ # and the installed check is repeated once the lock is held, so only the
69
+ # first of several concurrent members actually installs.
61
70
  def install_stable(version = nil)
62
- original_sources = Gem.sources.to_a
63
- Gem.sources = [RUBYGEMS_SOURCE]
64
- requirements = version ? ["= #{version}"] : []
65
- specs = Gem::DependencyInstaller.new(domain: :remote, prerelease: false, document: []).install("bundler", *requirements)
66
- Gem::Specification.reset
67
- specs
68
- ensure
69
- Gem.sources = original_sources if original_sources
71
+ return [] if version && version_installed?(version)
72
+
73
+ with_install_lock do
74
+ next [] if version && version_installed?(version)
75
+
76
+ original_sources = Gem.sources.to_a
77
+ begin
78
+ Gem.sources = [RUBYGEMS_SOURCE]
79
+ requirements = version ? ["= #{version}"] : []
80
+ specs = Gem::DependencyInstaller.new(domain: :remote, prerelease: false, document: []).install("bundler", *requirements)
81
+ Gem::Specification.reset
82
+ specs
83
+ ensure
84
+ Gem.sources = original_sources if original_sources
85
+ end
86
+ end
87
+ end
88
+
89
+ # True when bundler-VERSION's gemspec is on disk in any Gem.path entry.
90
+ # Reads the specifications dir directly (see installed_stable) so a
91
+ # bundle-scoped spec index cannot hide an installed version.
92
+ def version_installed?(version)
93
+ Array(Gem.path).any? do |base|
94
+ File.file?(File.join(base, "specifications", "bundler-#{version}.gemspec"))
95
+ end
96
+ end
97
+
98
+ def with_install_lock(&block)
99
+ dir = Gem.dir
100
+ FileUtils.mkdir_p(dir)
101
+ File.open(File.join(dir, ".kettle-bundler-install.lock"), File::RDWR | File::CREAT, 0o644) do |lock|
102
+ lock.flock(File::LOCK_EX)
103
+ block.call
104
+ end
70
105
  end
71
106
 
72
107
  # The version a release should pin BUNDLED WITH to: the registry's
@@ -1,6 +1,43 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  skip_bundle_audit = %w[1 true yes on].include?(ENV.fetch("KETTLE_DEV_SKIP_BUNDLE_AUDIT", "").downcase)
4
+ # Skips only the advisory database update; bundle:audit itself still runs.
5
+ skip_audit_update = %w[1 true yes on].include?(ENV.fetch("KETTLE_DEV_SKIP_AUDIT_UPDATE", "").downcase)
6
+
7
+ # Replaces bundler-audit's `bundle:audit:update` body. The ruby-advisory-db
8
+ # lives in one directory shared by every process (e.g. parallel family
9
+ # releases), so the update is serialized with a blocking flock on a lock file
10
+ # next to the database, and a failed update is non-fatal when a usable local
11
+ # copy exists.
12
+ redefine_audit_update_task = lambda do
13
+ require "fileutils"
14
+ require "bundler/audit/database"
15
+ Rake::Task["bundle:audit:update"].clear
16
+ # rubocop:disable Rake/DuplicateTask
17
+ desc("Updates the bundler-audit vulnerability database (serialized; see KETTLE_DEV_SKIP_AUDIT_UPDATE)")
18
+ task("bundle:audit:update") do
19
+ if skip_audit_update
20
+ warn("NOTE: bundle:audit:update skipped because KETTLE_DEV_SKIP_AUDIT_UPDATE is enabled")
21
+ next
22
+ end
23
+ db_path = Bundler::Audit::Database.path
24
+ lock_path = "#{db_path.to_s.chomp("/")}.lock"
25
+ FileUtils.mkdir_p(File.dirname(lock_path))
26
+ ok = File.open(lock_path, File::RDWR | File::CREAT, 0o644) do |lock|
27
+ lock.flock(File::LOCK_EX) # blocks until other updaters finish
28
+ system("bundler-audit", "update")
29
+ end
30
+ unless ok
31
+ if Bundler::Audit::Database.exists?(db_path)
32
+ warn("WARNING: bundle:audit:update failed; auditing with the existing local database at #{db_path}")
33
+ else
34
+ warn("ERROR: bundle:audit:update failed and no local advisory database exists at #{db_path}")
35
+ exit($?&.exitstatus || 1)
36
+ end
37
+ end
38
+ end
39
+ # rubocop:enable Rake/DuplicateTask
40
+ end
4
41
 
5
42
  define_bundle_audit_stub_tasks = lambda do |description_prefix, warning|
6
43
  desc("#{description_prefix} bundle:audit")
@@ -8,7 +45,7 @@ define_bundle_audit_stub_tasks = lambda do |description_prefix, warning|
8
45
  warn(warning.call("bundle:audit"))
9
46
  end
10
47
  desc("#{description_prefix} bundle:audit:update")
11
- task("bundle:audit:update") do
48
+ task("bundle:audit:update") do # rubocop:disable Rake/DuplicateTask
12
49
  warn(warning.call("bundle:audit:update"))
13
50
  end
14
51
  end
@@ -24,6 +61,7 @@ else
24
61
  require "bundler/audit/task"
25
62
 
26
63
  Bundler::Audit::Task.new
64
+ redefine_audit_update_task.call
27
65
  Kettle::Dev.register_default("bundle:audit:update")
28
66
  Kettle::Dev.register_default("bundle:audit")
29
67
  rescue LoadError
@@ -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.1.28"
8
+ VERSION = "3.1.29"
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
@@ -1,2 +1,6 @@
1
- t�h�KBbj�v�N���l�ܧ$��;Mc����i�n��m��VEx��bgݏ�>����E#����6���Q#�l?w��Dy��ZX*ϑr���]�{~���0����7ʲdI3���tlF«"i����}&L3ʅ�v=����h_b���Fj��X��5����%�g���!�sX�f[�>���GF����٩�.���"5�|��](���O���-��n�܈u�]5B5\�p���3�eC��2�Ǭ�!��f�%���_f{�:)�����ƙ������]�1�h��i"��)����4�2��
2
- PU[��
1
+ Zpܪ7����:�}���c2:,:�.�[�0����ߑ!@�î�s��(��+�B����*��P�+��F��}T���>����m�Cvx��-� +5��x
2
+ ��WɶRh�T׮���- �N9��\�ut ��:��G��
3
+ fy&�V��x
4
+ f:|�l ^ �`��"^ɒ�>]�I('ڕ�k
5
+ ���
6
+ �K3��W��'�7��Ja��A݌���"���iF}O49���\��}�c R,\p��(�y/���@��@e�Y<p�O��"��i�:}�6�js���ƃ�RʏCO �T
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.1.28
4
+ version: 3.1.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -120,7 +120,7 @@ dependencies:
120
120
  version: '2.0'
121
121
  - - ">="
122
122
  - !ruby/object:Gem::Version
123
- version: 2.0.29
123
+ version: 2.0.30
124
124
  type: :runtime
125
125
  prerelease: false
126
126
  version_requirements: !ruby/object:Gem::Requirement
@@ -130,7 +130,7 @@ dependencies:
130
130
  version: '2.0'
131
131
  - - ">="
132
132
  - !ruby/object:Gem::Version
133
- version: 2.0.29
133
+ version: 2.0.30
134
134
  - !ruby/object:Gem::Dependency
135
135
  name: ruby-progressbar
136
136
  requirement: !ruby/object:Gem::Requirement
@@ -276,7 +276,7 @@ dependencies:
276
276
  version: '4.0'
277
277
  - - ">="
278
278
  - !ruby/object:Gem::Version
279
- version: 4.0.0
279
+ version: 4.0.2
280
280
  type: :development
281
281
  prerelease: false
282
282
  version_requirements: !ruby/object:Gem::Requirement
@@ -286,7 +286,7 @@ dependencies:
286
286
  version: '4.0'
287
287
  - - ">="
288
288
  - !ruby/object:Gem::Version
289
- version: 4.0.0
289
+ version: 4.0.2
290
290
  - !ruby/object:Gem::Dependency
291
291
  name: stone_checksums
292
292
  requirement: !ruby/object:Gem::Requirement
@@ -296,7 +296,7 @@ dependencies:
296
296
  version: '1.0'
297
297
  - - ">="
298
298
  - !ruby/object:Gem::Version
299
- version: 1.0.9
299
+ version: 1.0.10
300
300
  type: :development
301
301
  prerelease: false
302
302
  version_requirements: !ruby/object:Gem::Requirement
@@ -306,7 +306,7 @@ dependencies:
306
306
  version: '1.0'
307
307
  - - ">="
308
308
  - !ruby/object:Gem::Version
309
- version: 1.0.9
309
+ version: 1.0.10
310
310
  - !ruby/object:Gem::Dependency
311
311
  name: gitmoji-regex
312
312
  requirement: !ruby/object:Gem::Requirement
@@ -316,7 +316,7 @@ dependencies:
316
316
  version: '2.0'
317
317
  - - ">="
318
318
  - !ruby/object:Gem::Version
319
- version: 2.0.15
319
+ version: 2.0.16
320
320
  type: :development
321
321
  prerelease: false
322
322
  version_requirements: !ruby/object:Gem::Requirement
@@ -326,7 +326,7 @@ dependencies:
326
326
  version: '2.0'
327
327
  - - ">="
328
328
  - !ruby/object:Gem::Version
329
- version: 2.0.15
329
+ version: 2.0.16
330
330
  description: "\U0001F372 Kettle::Dev is a meta tool from kettle-dev to streamline
331
331
  development and testing. Acts as a shim dependency, pulling in many other dependencies,
332
332
  to give you OOTB productivity with a RubyGem, or Ruby app project. Configures a
@@ -423,10 +423,10 @@ licenses:
423
423
  - AGPL-3.0-only
424
424
  metadata:
425
425
  homepage_uri: https://kettle-dev.galtzo.com
426
- source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v3.1.28
427
- changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v3.1.28/CHANGELOG.md
426
+ source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v3.1.29
427
+ changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v3.1.29/CHANGELOG.md
428
428
  bug_tracker_uri: https://github.com/kettle-dev/kettle-dev/issues
429
- documentation_uri: https://www.rubydoc.info/gems/kettle-dev/3.1.28
429
+ documentation_uri: https://www.rubydoc.info/gems/kettle-dev/3.1.29
430
430
  funding_uri: https://github.com/sponsors/pboling
431
431
  wiki_uri: https://github.com/kettle-dev/kettle-dev/wiki
432
432
  news_uri: https://www.railsbling.com/tags/kettle-dev
metadata.gz.sig CHANGED
Binary file