kettle-family 1.1.7 → 1.1.8
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 +15 -1
- data/README.md +1 -1
- data/lib/kettle/family/release_state_check.rb +61 -2
- data/lib/kettle/family/report.rb +3 -2
- data/lib/kettle/family/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: 168c6823b78ae99fcbe6066d6d923b4111ea9a01fb208e100addfad6914dfb06
|
|
4
|
+
data.tar.gz: ca1d7f9dda6ab6a9324db3fb0dfbb911a166b842f8d76c6ade2165be03be7f2a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6ff9056c21b70d0cb7d218906ea402f8ede543649d4d41292a9f434271a3bfeccc6bccf02db87bca8c3526d69a9fdb99a34a7e084d332ddd4045a6d4ff39f736
|
|
7
|
+
data.tar.gz: be9ee1ee76ac7a5b2b9d346fe54a48205e164ee6d9e89a7e9794543f23a6ef1663c5e8ad598faf4483774ee846a34bb1beffad0b441551e0a28a708fc4461b54
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,18 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [1.1.8] - 2026-07-25
|
|
34
|
+
|
|
35
|
+
- TAG: [v1.1.8][1.1.8t]
|
|
36
|
+
- COVERAGE: 95.48% -- 3147/3296 lines in 25 files
|
|
37
|
+
- BRANCH COVERAGE: 77.42% -- 1169/1510 branches in 25 files
|
|
38
|
+
- 28.26% documented
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
|
|
42
|
+
- `kettle-family state` now reports the latest GitHub release tag in a `GH.rel`
|
|
43
|
+
column next to the local, changelog, and RubyGems version columns.
|
|
44
|
+
|
|
33
45
|
## [1.1.7] - 2026-07-25
|
|
34
46
|
|
|
35
47
|
- TAG: [v1.1.7][1.1.7t]
|
|
@@ -1031,7 +1043,9 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
1031
1043
|
- Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
|
|
1032
1044
|
- Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
|
|
1033
1045
|
|
|
1034
|
-
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.1.
|
|
1046
|
+
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.1.8...HEAD
|
|
1047
|
+
[1.1.8]: https://github.com/kettle-dev/kettle-family/compare/v1.1.7...v1.1.8
|
|
1048
|
+
[1.1.8t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.1.8
|
|
1035
1049
|
[1.1.7]: https://github.com/kettle-dev/kettle-family/compare/v1.1.6...v1.1.7
|
|
1036
1050
|
[1.1.7t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.1.7
|
|
1037
1051
|
[1.1.6]: https://github.com/kettle-dev/kettle-family/compare/v1.1.5...v1.1.6
|
data/README.md
CHANGED
|
@@ -669,7 +669,7 @@ Thanks for RTFM. ☺️
|
|
|
669
669
|
[📌gitmoji]: https://gitmoji.dev
|
|
670
670
|
[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
|
671
671
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
|
672
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-3.
|
|
672
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-3.296-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
|
673
673
|
[🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
|
|
674
674
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
|
675
675
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
|
@@ -13,6 +13,7 @@ module Kettle
|
|
|
13
13
|
def initialize(members:, config: nil)
|
|
14
14
|
@members = members
|
|
15
15
|
@config = config
|
|
16
|
+
@github_latest_release_by_repo = {}
|
|
16
17
|
end
|
|
17
18
|
|
|
18
19
|
def results
|
|
@@ -61,6 +62,7 @@ module Kettle
|
|
|
61
62
|
state = branch_filtered_state(member, state, branch) if success && branch
|
|
62
63
|
state = state_with_computed_booleans(state) if success
|
|
63
64
|
state = enrich_git_state(member.root, state) if success
|
|
65
|
+
state = enrich_github_release(member.root, state) if success
|
|
64
66
|
result(member: member, command: command, stdout: stdout, stderr: stderr, status: status.exitstatus, elapsed: elapsed, success: success, state: state, branch: branch)
|
|
65
67
|
rescue JSON::ParserError => error
|
|
66
68
|
result(member: member, command: command || release_state_command, stdout: stdout, stderr: stderr, status: 1, elapsed: elapsed || 0.0, success: false, state: {}, reason: "invalid release-state JSON: #{error.message}", branch: branch)
|
|
@@ -85,6 +87,7 @@ module Kettle
|
|
|
85
87
|
state = success ? JSON.parse(stdout) : {}
|
|
86
88
|
state = branch_filtered_state(member, state, branch) if success && branch
|
|
87
89
|
state = enrich_git_state(member.root, state) if success
|
|
90
|
+
state = enrich_github_release(member.root, state) if success
|
|
88
91
|
result(
|
|
89
92
|
member: member,
|
|
90
93
|
command: command,
|
|
@@ -280,7 +283,7 @@ module Kettle
|
|
|
280
283
|
unreleased_entries = unreleased_entries?(content)
|
|
281
284
|
prepared_release_pending = !version.to_s.empty? && latest_changelog_version == version
|
|
282
285
|
ahead = commits_ahead_of_release(root, latest_changelog_version)
|
|
283
|
-
state_with_computed_booleans(enrich_git_state(root, {
|
|
286
|
+
enrich_github_release(root, state_with_computed_booleans(enrich_git_state(root, {
|
|
284
287
|
"gem_name" => config.family_name,
|
|
285
288
|
"version" => version,
|
|
286
289
|
"latest_released" => nil,
|
|
@@ -289,7 +292,7 @@ module Kettle
|
|
|
289
292
|
"unreleased_entries" => unreleased_entries,
|
|
290
293
|
"prepared_release_pending" => prepared_release_pending,
|
|
291
294
|
"pending_release" => unreleased_entries || prepared_release_pending
|
|
292
|
-
}))
|
|
295
|
+
})))
|
|
293
296
|
end
|
|
294
297
|
|
|
295
298
|
def state_with_computed_booleans(state)
|
|
@@ -302,6 +305,62 @@ module Kettle
|
|
|
302
305
|
state["unreleased_entries"] == true && state["version"].to_s == state["latest_released"].to_s
|
|
303
306
|
end
|
|
304
307
|
|
|
308
|
+
def enrich_github_release(root, state)
|
|
309
|
+
tag = github_latest_release(root)
|
|
310
|
+
return state unless tag
|
|
311
|
+
|
|
312
|
+
state.merge("github_latest_release" => tag)
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
def github_latest_release(root)
|
|
316
|
+
repo = github_repo_slug(root)
|
|
317
|
+
return nil unless repo
|
|
318
|
+
|
|
319
|
+
@github_latest_release_by_repo.fetch(repo) do
|
|
320
|
+
stdout, _stderr, status = Open3.capture3("gh", "release", "view", "--repo", repo, "--json", "tagName", "--jq", ".tagName")
|
|
321
|
+
tag = status.success? ? normalize_github_release_tag(stdout) : nil
|
|
322
|
+
@github_latest_release_by_repo[repo] = tag
|
|
323
|
+
end
|
|
324
|
+
rescue SystemCallError
|
|
325
|
+
nil
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
def normalize_github_release_tag(value)
|
|
329
|
+
tag = value.to_s.strip
|
|
330
|
+
return nil if tag.empty?
|
|
331
|
+
|
|
332
|
+
tag.start_with?("v") ? tag : "v#{tag}"
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def github_repo_slug(root)
|
|
336
|
+
stdout, _stderr, status = Open3.capture3("git", "remote", "-v", chdir: root)
|
|
337
|
+
return nil unless status.success?
|
|
338
|
+
|
|
339
|
+
stdout.each_line.filter_map do |line|
|
|
340
|
+
remote_url = line.split.fetch(1, nil)
|
|
341
|
+
github_slug_from_remote_url(remote_url)
|
|
342
|
+
end.first
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def github_slug_from_remote_url(remote_url)
|
|
346
|
+
return nil unless remote_url&.include?("github.com")
|
|
347
|
+
|
|
348
|
+
# Git remote URLs support scp-like SSH syntax as well as URI syntax, so
|
|
349
|
+
# string slicing is more reliable than URI parsing for the full set.
|
|
350
|
+
slug = if remote_url.start_with?("git@github.com:")
|
|
351
|
+
remote_url.delete_prefix("git@github.com:")
|
|
352
|
+
elsif remote_url.include?("github.com/")
|
|
353
|
+
remote_url.split("github.com/", 2).last
|
|
354
|
+
end
|
|
355
|
+
return nil unless slug
|
|
356
|
+
|
|
357
|
+
slug = slug.delete_suffix(".git").split(/[?#]/, 2).first.to_s
|
|
358
|
+
parts = slug.split("/")
|
|
359
|
+
return nil if parts.length < 2 || parts.fetch(0).empty? || parts.fetch(1).empty?
|
|
360
|
+
|
|
361
|
+
"#{parts.fetch(0)}/#{parts.fetch(1)}"
|
|
362
|
+
end
|
|
363
|
+
|
|
305
364
|
def root_changelog_version(root)
|
|
306
365
|
version_file = config.changelog_version_file
|
|
307
366
|
return nil unless version_file
|
data/lib/kettle/family/report.rb
CHANGED
|
@@ -442,8 +442,9 @@ module Kettle
|
|
|
442
442
|
state.fetch("gem_name", result.member_name).to_s,
|
|
443
443
|
release_state_checkout(state),
|
|
444
444
|
state.fetch("version", "unknown").to_s,
|
|
445
|
-
state.fetch("latest_released", nil).to_s.empty? ? "unknown" : state.fetch("latest_released").to_s,
|
|
446
445
|
state.fetch("latest_changelog_version", nil).to_s.empty? ? "none" : state.fetch("latest_changelog_version").to_s,
|
|
446
|
+
state.fetch("latest_released", nil).to_s.empty? ? "unknown" : state.fetch("latest_released").to_s,
|
|
447
|
+
state.fetch("github_latest_release", nil).to_s.empty? ? "unknown" : state.fetch("github_latest_release").to_s,
|
|
447
448
|
release_state_ahead_behind(state),
|
|
448
449
|
yes_no(state.fetch("unreleased_entries", nil)),
|
|
449
450
|
yes_no(state.fetch("prepared_release_pending", nil)),
|
|
@@ -456,7 +457,7 @@ module Kettle
|
|
|
456
457
|
end
|
|
457
458
|
|
|
458
459
|
def release_state_header
|
|
459
|
-
header = [["gem", "checkout", "V.rb", "V.
|
|
460
|
+
header = [["gem", "checkout", "V.rb", "V.ch.md", "V.rel", "GH.rel", "🔼 / 🔽", "unrel", "prep", "pend", "bump"]]
|
|
460
461
|
return header unless release_state_has_branches?
|
|
461
462
|
|
|
462
463
|
[["branch", *header.first]]
|
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.1.
|
|
4
|
+
version: 1.1.8
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -319,10 +319,10 @@ licenses:
|
|
|
319
319
|
- AGPL-3.0-only
|
|
320
320
|
metadata:
|
|
321
321
|
homepage_uri: https://kettle-family.galtzo.com
|
|
322
|
-
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.1.
|
|
323
|
-
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.1.
|
|
322
|
+
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.1.8
|
|
323
|
+
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.1.8/CHANGELOG.md
|
|
324
324
|
bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
|
|
325
|
-
documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.1.
|
|
325
|
+
documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.1.8
|
|
326
326
|
funding_uri: https://github.com/sponsors/pboling
|
|
327
327
|
wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
|
|
328
328
|
news_uri: https://www.railsbling.com/tags/kettle-family
|
metadata.gz.sig
CHANGED
|
Binary file
|