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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +28 -1
- data/README.md +1 -1
- data/lib/kettle/dev/pre_release_cli.rb +4 -0
- data/lib/kettle/dev/release_cli.rb +99 -15
- data/lib/kettle/dev/ruby_gems_versions.rb +4 -0
- data/lib/kettle/dev/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +4 -4
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 94148c67bb625244972fa5139eeb53715b4589ddcef5bd86375c34e221f462a1
|
|
4
|
+
data.tar.gz: e3763e0664e3a96d57c78ab2f2b4f91d7dabaa2c383f50e2558244e6c17070d5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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-
|
|
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 =
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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(" ")}
|
|
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(:
|
|
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
|
-
|
|
1268
|
-
|
|
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 =
|
|
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)
|
data/lib/kettle/dev/version.rb
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
406
|
-
changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v2.5.
|
|
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.
|
|
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
|