kettle-dev 2.5.25 → 2.5.26

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: 56ce68001beed714f8b15c44336ffe111f1509dfffd9a7063b1bb50f0580fc08
4
- data.tar.gz: 3088a81db9f6327c55fe9113f45be1768f734d2c8b05cfd0c5a55080450de63f
3
+ metadata.gz: 94148c67bb625244972fa5139eeb53715b4589ddcef5bd86375c34e221f462a1
4
+ data.tar.gz: e3763e0664e3a96d57c78ab2f2b4f91d7dabaa2c383f50e2558244e6c17070d5
5
5
  SHA512:
6
- metadata.gz: e9ad45713716d0583fc83e302ea574a67a7855757efc7abf9de24764abd5d66388056677a74a6fbf67a6d05894b4e7edb813c8e9919ddcdb61b03ed694bd70e2
7
- data.tar.gz: 7aa96f4e87ddb6e6b0d41b19e43c56229cca35dbf470313b50f15c6a35124e4e171383c666766ad6a9a937bf3cc6d496df9be5dd71213647ebb2768937852b8f
6
+ metadata.gz: 4ed2d0dcc407ef62c72336c8d824841ec3e7c8d52f228029f56cb50d55260208a2a03483d347e539db50e7df4206b831f2e084dcdcb444f9a4f90b7299fc0913
7
+ data.tar.gz: dd79b14807550e3ed34ef788f51d5326d332a67689cefeb7e1ebba6f9bc9e95108ba724cbb7e08f2b7165d343b0f7ae69b04eaa3ec248c19ee3d057dcb8026fc
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,31 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [2.5.26] - 2026-08-08
34
+
35
+ - TAG: [v2.5.26][2.5.26t]
36
+ - COVERAGE: 91.64% -- 5522/6026 lines in 47 files
37
+ - BRANCH COVERAGE: 76.03% -- 2087/2745 branches in 47 files
38
+ - 50.90% documented
39
+
40
+ ### Fixed
41
+
42
+ - Support family-level gem names and changelog paths when creating aggregate GitHub releases.
43
+
44
+ - Treat never-published RubyGems packages as having no release history.
45
+
46
+ - Keep local development paths disabled through release setup so release lockfiles remain registry-resolvable.
47
+
48
+ - Preserve kettle-jem template tokens during Markdown image URL normalization.
49
+
50
+ - Reset inherited Bundler file selection before running project release tasks.
51
+
52
+ - Run every project-local release check with the release lockfile environment, including prefixed rake commands, so local workspace paths cannot leak back into release lockfiles.
53
+
54
+ - Run gem build and publish commands with local workspace dependency switches disabled so release guards see the registry-backed lockfile.
55
+
56
+ - Recognize release commands with environment prefixes so configured secret providers can answer signing and RubyGems MFA prompts.
57
+
33
58
  ## [2.5.25] - 2026-08-07
34
59
 
35
60
  - TAG: [v2.5.25][2.5.25t]
@@ -3335,7 +3360,9 @@ Please file a bug if you notice a violation of semantic versioning.
3335
3360
  - Selecting will run the selected workflow via `act`
3336
3361
  - This may move to its own gem in the future.
3337
3362
 
3338
- [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v2.5.25...HEAD
3363
+ [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v2.5.26...HEAD
3364
+ [2.5.26]: https://github.com/kettle-dev/kettle-dev/compare/v2.5.25...v2.5.26
3365
+ [2.5.26t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v2.5.26
3339
3366
  [2.5.25]: https://github.com/kettle-dev/kettle-dev/compare/v2.5.24...v2.5.25
3340
3367
  [2.5.25t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v2.5.25
3341
3368
  [2.5.24]: https://github.com/kettle-dev/kettle-dev/compare/v2.5.23...v2.5.24
data/README.md CHANGED
@@ -1007,7 +1007,7 @@ Thanks for RTFM. ☺️
1007
1007
  [📌gitmoji]: https://gitmoji.dev
1008
1008
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
1009
1009
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
1010
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.974-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1010
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-6.026-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1011
1011
  [🔐security]: https://github.com/kettle-dev/kettle-dev/blob/main/SECURITY.md
1012
1012
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
1013
1013
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -374,6 +374,10 @@ module Kettle
374
374
  end
375
375
 
376
376
  def normalized_markdown_image_url(url_str)
377
+ # Kettle-Jem template tokens are intentionally not URI components yet;
378
+ # encoding them here prevents the templater from recognizing them.
379
+ return url_str if url_str.include?("{KJ|")
380
+
377
381
  addr = Addressable::URI.parse(url_str)
378
382
  normalized = addr.normalize
379
383
  normalized.query = addr.query if addr.query && normalized.query != addr.query
@@ -58,14 +58,15 @@ module Kettle
58
58
  end
59
59
  puts "$ #{cmd}"
60
60
  # Pass a plain Hash for the environment to satisfy tests and avoid ENV object oddities
61
- env_hash = command_env
61
+ env_hash = command_env_for(cmd)
62
62
 
63
63
  # Some commands are interactive (e.g., `bundle exec rake release` prompting for RubyGems MFA).
64
64
  # Using capture3 detaches STDIN, preventing prompts from working. For such commands, use system
65
65
  # so they inherit the current TTY and can read the user's input.
66
- interactive = /\Abundle(\s+exec)?\s+rake\s+release\b/.match?(cmd) ||
67
- /\Agem\s+push\b/.match?(cmd) ||
68
- /\A(bundle\s+exec\s+)?kettle-changelog\b/.match?(cmd)
66
+ interactive_words = effective_command_words(cmd)
67
+ interactive = interactive_words.first(4) == ["bundle", "exec", "rake", "release"] ||
68
+ interactive_words.first(2) == ["gem", "push"] ||
69
+ interactive_words.first(2) == ["bundle", "exec"] && interactive_words[2] == "kettle-changelog"
69
70
  if interactive
70
71
  ok = system(env_hash, cmd)
71
72
  unless ok
@@ -104,6 +105,42 @@ module Kettle
104
105
  env_hash.merge(QUIET_ENV)
105
106
  end
106
107
 
108
+ def command_env_for(cmd)
109
+ env_hash = command_env
110
+ return env_hash unless project_bundle_command?(cmd)
111
+
112
+ env_hash.merge(BundlerEnvGuard.unbundled_env)
113
+ end
114
+
115
+ def project_bundle_command?(cmd)
116
+ words = effective_command_words(cmd)
117
+ words == ["bin/setup"] ||
118
+ words.first(1) == ["bin/rake"] ||
119
+ words.first(3) == ["bundle", "exec", "rake"]
120
+ rescue ArgumentError
121
+ false
122
+ end
123
+
124
+ def effective_command_words(cmd)
125
+ words = Shellwords.split(cmd.to_s)
126
+ words.shift while words.first&.match?(/\A[A-Za-z_][A-Za-z0-9_]*=/)
127
+
128
+ if words.first == "env"
129
+ words.shift
130
+ while words.any?
131
+ if words.first == "-u"
132
+ words.shift(2)
133
+ elsif words.first&.include?("=")
134
+ words.shift
135
+ else
136
+ break
137
+ end
138
+ end
139
+ end
140
+
141
+ words
142
+ end
143
+
107
144
  def debug_env_enabled?
108
145
  DEBUG_TRUE_VALUES.include?(ENV.fetch("KETTLE_DEV_DEBUG", "").downcase)
109
146
  end
@@ -286,13 +323,13 @@ module Kettle
286
323
  appraisals_path = File.join(@root, "Appraisals")
287
324
  if File.file?(appraisals_path)
288
325
  puts "Appraisals detected at #{Kettle::Dev.display_path(appraisals_path)}. Running: bin/rake #{@appraisal_task}"
289
- run_cmd!("bin/rake #{@appraisal_task}")
326
+ run_cmd!(release_project_command("bin/rake #{@appraisal_task}"))
290
327
  else
291
328
  puts "No Appraisals file found; skipping #{@appraisal_task}"
292
329
  end
293
330
 
294
331
  puts "Generating docs site via canonical task: bin/rake yard"
295
- run_cmd!("bin/rake yard")
332
+ run_cmd!(release_project_command("bin/rake yard"))
296
333
  end
297
334
 
298
335
  # 6. git user + commit release prep
@@ -389,7 +426,7 @@ module Kettle
389
426
  else
390
427
  puts "Running build (you may be prompted for the signing key password)..."
391
428
  end
392
- run_cmd!("bundle exec rake build")
429
+ run_cmd!(release_project_command("bundle exec rake build"))
393
430
  end
394
431
 
395
432
  # 15. release and tag
@@ -407,7 +444,7 @@ module Kettle
407
444
  puts "Running release (you may be prompted for signing key password and RubyGems MFA OTP)..."
408
445
  end
409
446
  with_unpublished_candidate_cleanup do
410
- run_cmd!("bundle exec rake release")
447
+ run_cmd!(release_project_command("bundle exec rake release"))
411
448
  @release_candidate.published = true
412
449
  confirm_release_candidate_available!(@release_candidate)
413
450
  end
@@ -819,14 +856,29 @@ module Kettle
819
856
  # its test/coverage prerequisites and still run lint, audit, documentation, and any
820
857
  # other non-test release checks. Resumed releases do not set this flag, so they keep
821
858
  # the full default task behavior.
822
- return "KETTLE_DEV_SKIP_TESTS=true bin/rake" if @changelog_generated_coverage
859
+ return release_project_command("KETTLE_DEV_SKIP_TESTS=true bin/rake") if @changelog_generated_coverage
823
860
 
824
- "bin/rake"
861
+ release_project_command("bin/rake")
825
862
  end
826
863
 
827
864
  def release_setup_command
865
+ release_project_command("bin/setup")
866
+ end
867
+
868
+ # Every command that loads the project bundle must run outside the
869
+ # release tool's bundle and with local workspace dependency switches
870
+ # disabled. The default task may carry a leading environment assignment,
871
+ # so relying on BundlerEnvGuard's command classification alone is not
872
+ # sufficient.
873
+ def release_project_command(command)
874
+ project_command = command
828
875
  unbundled_keys = (BundlerEnvGuard::RESET_ENV_KEYS + %w[RUBYLIB RUBYOPT]).uniq
829
- "env #{unbundled_keys.map { |key| "-u #{Shellwords.escape(key)}" }.join(" ")} bin/setup"
876
+ command = +"env #{unbundled_keys.map { |key| "-u #{Shellwords.escape(key)}" }.join(" ")}"
877
+ release_lockfile_normalization_env.each do |key, value|
878
+ command << " #{key}=#{Shellwords.escape(value)}"
879
+ end
880
+ command << " #{project_command}"
881
+ command
830
882
  end
831
883
 
832
884
  def confirm_yes!(message, prompt, abort_message)
@@ -1189,7 +1241,7 @@ module Kettle
1189
1241
  secrets_provider: @secrets_provider,
1190
1242
  secret_event_handler: ->(payload) { emit_secret_event(payload) }
1191
1243
  ).call(
1192
- self.class.send(:command_env),
1244
+ self.class.send(:command_env_for, cmd),
1193
1245
  cmd
1194
1246
  )
1195
1247
  return if status.success?
@@ -1264,8 +1316,31 @@ module Kettle
1264
1316
  end
1265
1317
 
1266
1318
  def release_secret_command?(cmd)
1267
- /\Abundle(\s+exec)?\s+rake\s+(build|release)\b/.match?(cmd) ||
1268
- /\Agem\s+push\b/.match?(cmd)
1319
+ words = effective_command_words(cmd)
1320
+ (words.first(3) == ["bundle", "exec", "rake"] && %w[build release].include?(words[3])) ||
1321
+ words.first(2) == ["gem", "push"]
1322
+ rescue ArgumentError
1323
+ false
1324
+ end
1325
+
1326
+ def effective_command_words(cmd)
1327
+ words = Shellwords.split(cmd.to_s)
1328
+ words.shift while words.first&.match?(/\A[A-Za-z_][A-Za-z0-9_]*=/)
1329
+
1330
+ if words.first == "env"
1331
+ words.shift
1332
+ while words.any?
1333
+ if words.first == "-u"
1334
+ words.shift(2)
1335
+ elsif words.first&.include?("=")
1336
+ words.shift
1337
+ else
1338
+ break
1339
+ end
1340
+ end
1341
+ end
1342
+
1343
+ words
1269
1344
  end
1270
1345
 
1271
1346
  def with_bundle_audit_skip_env
@@ -1549,6 +1624,9 @@ module Kettle
1549
1624
  end
1550
1625
 
1551
1626
  def detect_gem_name
1627
+ env_gem_name = ENV.fetch("K_CHANGELOG_GEM_NAME", "").to_s.strip
1628
+ return env_gem_name unless env_gem_name.empty?
1629
+
1552
1630
  gemspecs = Dir[File.join(@root, "*.gemspec")]
1553
1631
  abort("Could not find a .gemspec in project root.") if gemspecs.empty?
1554
1632
  path = gemspecs.min
@@ -2496,7 +2574,7 @@ module Kettle
2496
2574
 
2497
2575
  # Returns [section_text, compare_ref_line, tag_ref_line]
2498
2576
  def extract_changelog_for_version(version)
2499
- path = File.join(@root, "CHANGELOG.md")
2577
+ path = resolved_changelog_path
2500
2578
  return [nil, nil, nil] unless File.file?(path)
2501
2579
 
2502
2580
  content = File.read(path)
@@ -2525,6 +2603,12 @@ module Kettle
2525
2603
  [nil, nil, nil]
2526
2604
  end
2527
2605
 
2606
+ def resolved_changelog_path
2607
+ path = ENV.fetch("K_CHANGELOG_PATH", "").to_s.strip
2608
+ path = "CHANGELOG.md" if path.empty?
2609
+ File.expand_path(path, @root)
2610
+ end
2611
+
2528
2612
  def extract_release_notes_footer
2529
2613
  path = File.join(@root, "FUNDING.md")
2530
2614
  return unless File.file?(path)
@@ -35,6 +35,10 @@ module Kettle
35
35
  response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
36
36
  http.request(request)
37
37
  end
38
+ if response.code.to_i == 404
39
+ write_versions(name, [])
40
+ return []
41
+ end
38
42
  return cached unless response.is_a?(Net::HTTPSuccess)
39
43
 
40
44
  data = JSON.parse(response.body)
@@ -5,7 +5,7 @@ module Kettle
5
5
  # Version namespace for this gem.
6
6
  module Version
7
7
  # Current gem version.
8
- VERSION = "2.5.25"
8
+ VERSION = "2.5.26"
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: 2.5.25
4
+ version: 2.5.26
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -402,10 +402,10 @@ licenses:
402
402
  - AGPL-3.0-only
403
403
  metadata:
404
404
  homepage_uri: https://kettle-dev.galtzo.com
405
- source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v2.5.25
406
- changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v2.5.25/CHANGELOG.md
405
+ source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v2.5.26
406
+ changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v2.5.26/CHANGELOG.md
407
407
  bug_tracker_uri: https://github.com/kettle-dev/kettle-dev/issues
408
- documentation_uri: https://www.rubydoc.info/gems/kettle-dev/2.5.25
408
+ documentation_uri: https://www.rubydoc.info/gems/kettle-dev/2.5.26
409
409
  funding_uri: https://github.com/sponsors/pboling
410
410
  wiki_uri: https://github.com/kettle-dev/kettle-dev/wiki
411
411
  news_uri: https://www.railsbling.com/tags/kettle-dev
metadata.gz.sig CHANGED
Binary file