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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7b34c502c1d4158097fc4b57ee933d2192c8c524b55334f01b5c59673e6f4c1c
4
- data.tar.gz: 217f64284ba06e32f53c83e4c20dab2ac6fecbd3dab90c3d31aaf12b1e503452
3
+ metadata.gz: 168c6823b78ae99fcbe6066d6d923b4111ea9a01fb208e100addfad6914dfb06
4
+ data.tar.gz: ca1d7f9dda6ab6a9324db3fb0dfbb911a166b842f8d76c6ade2165be03be7f2a
5
5
  SHA512:
6
- metadata.gz: 51d9489dee525ae329a3362f1190f4fa6e83b238aa7cc8c2737507274ce4b37f2000b2d70f2fcff668541e740ae08adbf2b6f2dd003f2d29fbc69b7b7032920b
7
- data.tar.gz: 2db5f0e162c8a6b534917aef303b4728849ef83f061df8f5265176476c786c9d738449553562fb7fe362cd4aa02aa4a9d46acca44a3db2dd973bc015d40e7aa5
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.7...HEAD
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.259-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
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
@@ -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.rel", "V.ch.md", "🔼 / 🔽", "unrel", "prep", "pend", "bump"]]
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]]
@@ -3,7 +3,7 @@
3
3
  module Kettle
4
4
  module Family
5
5
  module Version
6
- VERSION = "1.1.7"
6
+ VERSION = "1.1.8"
7
7
  end
8
8
  VERSION = Version::VERSION # Traditional Constant Location
9
9
  end
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.7
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.7
323
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.1.7/CHANGELOG.md
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.7
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