kettle-dev 2.2.6 → 2.2.7

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: b8c22a00d9dde1e8574e1b8018fcf356b683c5a0c558b304bfac6d4b307d2de1
4
- data.tar.gz: 69b132d5faa7e4d07f52344491295fb349e1453b2aa43b2de2ae25fbff21a9a2
3
+ metadata.gz: 3468f777c78fb3017468fbb76728ee056aa1924738b8935d1fd748d41c91f3ff
4
+ data.tar.gz: 10386b28122fb17e85f555c70784a398d0f8692f3b02d77ebafab8540ae74cc6
5
5
  SHA512:
6
- metadata.gz: 0f0c9b87d7bc0cf30712c3e6cbbedabd66d6af631ed39586fe7853f78970b3b8ea80e18c78130394c323f3d09d61cf7b5c39d9c1927ed71fe9fb30a3e1c7453d
7
- data.tar.gz: 7eb506783c68f81ac54ae37b54d4b415d996f1a2f50ce112c2733cd0726ca55088b3875c281743aa8eed389243d4049ca01f07f2a0211cc99b4f462ff17a4c5e
6
+ metadata.gz: 3de744ea449a1f6f738b6b19704bbf48a996a67c835201310bfd60b9127fa3b3a2634fd52c9f3d8f2ce45a571e6caf316f91d902f2f8fab8a8d3511bc21c13bc
7
+ data.tar.gz: 1efa9c2da744cdd3fa16d0676b06b78836df3d4194ee6908a756ad479d63c5c50e015a8dde67f416d0cd2e2da3e3c9bff4971c980840603db4613c9bf9f37cc3
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,23 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [2.2.7] - 2026-06-13
34
+
35
+ - TAG: [v2.2.7][2.2.7t]
36
+ - COVERAGE: 92.36% -- 3843/4161 lines in 28 files
37
+ - BRANCH COVERAGE: 73.54% -- 1520/2067 branches in 28 files
38
+ - 66.02% documented
39
+
40
+ ### Added
41
+
42
+ #### Changelog
43
+
44
+ - Added `kettle-changelog --release-state` / `--release-status` with optional
45
+ `--json` output for single-gem changelog release state reporting.
46
+ - Added a richer `Kettle::Dev::ChangelogCLI#release_state` API that reports the
47
+ latest released version, latest changelog release section, and pending
48
+ changelog sources.
49
+
33
50
  ## [2.2.6] - 2026-06-13
34
51
 
35
52
  - TAG: [v2.2.6][2.2.6t]
@@ -2075,7 +2092,9 @@ Please file a bug if you notice a violation of semantic versioning.
2075
2092
  - Selecting will run the selected workflow via `act`
2076
2093
  - This may move to its own gem in the future.
2077
2094
 
2078
- [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.6...HEAD
2095
+ [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.7...HEAD
2096
+ [2.2.7]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.6...v2.2.7
2097
+ [2.2.7t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v2.2.7
2079
2098
  [2.2.6]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.5...v2.2.6
2080
2099
  [2.2.6t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v2.2.6
2081
2100
  [2.2.5]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.4...v2.2.5
data/README.md CHANGED
@@ -854,7 +854,7 @@ Thanks for RTFM. ☺️
854
854
  [📌gitmoji]: https://gitmoji.dev
855
855
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
856
856
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
857
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-4.154-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
857
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-4.161-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
858
858
  [🔐security]: https://github.com/kettle-dev/kettle-dev/blob/main/SECURITY.md
859
859
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
860
860
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
data/exe/kettle-changelog CHANGED
@@ -41,7 +41,7 @@ begin
41
41
 
42
42
  # This library
43
43
  require "kettle/dev"
44
- puts "== #{script_basename} v#{Kettle::Dev::Version::VERSION} =="
44
+ puts "== #{script_basename} v#{Kettle::Dev::Version::VERSION} ==" unless ARGV.include?("--json")
45
45
  rescue LoadError => e
46
46
  warn("#{script_basename}: could not load dependency: #{e.class}: #{e.message}")
47
47
  warn("Hint: Ensure the host project has kettle-dev as a dependency and run bundle install.")
@@ -51,7 +51,7 @@ end
51
51
  begin
52
52
  if ARGV.include?("-h") || ARGV.include?("--help")
53
53
  puts <<~USAGE
54
- Usage: kettle-changelog [--update-prep] [--pending-release] [--no-strict] [--no-coverage-threshold]
54
+ Usage: kettle-changelog [--update-prep] [--pending-release] [--release-state] [--json] [--no-strict] [--no-coverage-threshold]
55
55
 
56
56
  Detects the current version from lib/**/version.rb, the latest live release, and
57
57
  the most recent CHANGELOG.md release section, then prompts to confirm the selected plan:
@@ -63,6 +63,9 @@ begin
63
63
  Options:
64
64
  --update-prep Force updating the most recent prepared release section in place
65
65
  --pending-release Query whether the changelog has release work pending; exits 0 for yes, 1 for no
66
+ --release-state,
67
+ --release-status Print changelog release state, including latest published release and pending sources
68
+ --json Print query output as JSON
66
69
  --no-strict Allow missing coverage and yard data (warnings only, no errors)
67
70
  --no-coverage-threshold Generate coverage without hard-failing below configured thresholds
68
71
 
@@ -92,14 +95,29 @@ begin
92
95
  strict_mode = !ARGV.include?("--no-strict") && ENV.fetch("K_CHANGELOG_STRICT", "true").downcase != "false"
93
96
  update_prep = ARGV.delete("--update-prep")
94
97
  pending_release_query = ARGV.delete("--pending-release")
98
+ release_state_query = ARGV.delete("--release-state") || ARGV.delete("--release-status")
99
+ json_output = ARGV.delete("--json")
95
100
  coverage_threshold_disabled = ARGV.include?("--no-coverage-threshold") || ARGV.include?("--no-coverage-thresholds")
96
101
  coverage_hard = !coverage_threshold_disabled && ENV.fetch("K_CHANGELOG_COVERAGE_HARD", "true").downcase != "false"
97
102
 
98
103
  cli = Kettle::Dev::ChangelogCLI.new(strict: strict_mode, enforce_coverage_thresholds: coverage_hard, update_prep: update_prep)
104
+ if release_state_query
105
+ state = cli.release_state
106
+ puts(json_output ? JSON.pretty_generate(state) : cli.release_state_table(state))
107
+ exit(0)
108
+ end
109
+
99
110
  if pending_release_query
100
- status = cli.pending_release_status
101
- puts status.fetch(:pending) ? "true" : "false"
102
- exit(status.fetch(:pending) ? 0 : 1)
111
+ state = cli.pending_release_status
112
+ output = if json_output
113
+ JSON.pretty_generate(state)
114
+ elsif state.fetch(:pending_release)
115
+ "true"
116
+ else
117
+ "false"
118
+ end
119
+ puts(output)
120
+ exit(state.fetch(:pending_release) ? 0 : 1)
103
121
  end
104
122
 
105
123
  cli.run
@@ -24,8 +24,8 @@ module Kettle
24
24
  # @param strict [Boolean] when true (default), require coverage and yard data; raise errors if unavailable
25
25
  # @param enforce_coverage_thresholds [Boolean] when true, fail strict coverage generation below project thresholds
26
26
  # @param update_prep [Boolean] when true, update the most recent prepared release section in place
27
- def initialize(strict: true, enforce_coverage_thresholds: true, update_prep: false)
28
- @root = Kettle::Dev::CIHelpers.project_root
27
+ def initialize(strict: true, enforce_coverage_thresholds: true, update_prep: false, root: Kettle::Dev::CIHelpers.project_root)
28
+ @root = root
29
29
  @changelog_path = File.join(@root, "CHANGELOG.md")
30
30
  @coverage_path = File.join(@root, "coverage", "coverage.json")
31
31
  @strict = strict
@@ -136,46 +136,70 @@ module Kettle
136
136
  end
137
137
 
138
138
  def pending_release_status
139
+ release_state
140
+ end
141
+
142
+ def release_state
139
143
  changelog = File.read(@changelog_path)
140
144
  unreleased_block, _before, after = extract_unreleased(changelog)
141
145
  unreleased_entries = unreleased_block_has_entries?(unreleased_block)
142
146
  latest_changelog_version = detect_previous_version(after.to_s)
143
- gem_name = nil
144
- latest_overall = nil
145
- latest_for_series = nil
146
- latest_target = nil
147
-
148
- if latest_changelog_version && !unreleased_entries
149
- begin
150
- gem_name = detect_gem_name
151
- latest_overall, latest_for_series = latest_released_versions(gem_name, latest_changelog_version)
152
- latest_target = latest_release_target(latest_changelog_version, latest_overall, latest_for_series)
153
- rescue => e
154
- warn("[kettle-changelog] gem.coop release check failed: #{e.class}: #{e.message}")
155
- warn("Treating the most recent CHANGELOG.md release section as pending because live release info is unavailable.")
156
- end
157
- end
158
-
159
- prepared_release_pending = !unreleased_entries && !!latest_changelog_version && latest_target != latest_changelog_version
147
+ version = detect_version
148
+ gem_name = detect_gem_name
149
+ release_lookup_version = latest_changelog_version || version
150
+ latest_overall, latest_for_series = latest_released_versions(gem_name, release_lookup_version)
151
+ latest_target = latest_release_target(release_lookup_version, latest_overall, latest_for_series)
152
+ prepared_release_pending = !!latest_changelog_version && latest_target != latest_changelog_version
160
153
 
161
154
  {
155
+ root: @root,
156
+ gem_name: gem_name,
157
+ version: version,
162
158
  pending: unreleased_entries || prepared_release_pending,
159
+ pending_release: unreleased_entries || prepared_release_pending,
163
160
  unreleased_entries: unreleased_entries,
164
161
  prepared_release_pending: prepared_release_pending,
165
162
  latest_changelog_version: latest_changelog_version,
166
163
  latest_released: latest_overall,
167
164
  latest_released_for_current_series: latest_for_series,
168
- latest_release_target: latest_target,
169
- gem_name: gem_name
165
+ latest_release_target: latest_target
170
166
  }
171
167
  end
172
168
 
169
+ def release_state_table(state = release_state)
170
+ rows = [
171
+ ["gem", "version.rb", "latest released", "latest changelog", "unreleased", "prepared", "pending"],
172
+ [
173
+ state.fetch(:gem_name),
174
+ state.fetch(:version),
175
+ state.fetch(:latest_released) || "unknown",
176
+ state.fetch(:latest_changelog_version) || "none",
177
+ yes_no(state.fetch(:unreleased_entries)),
178
+ yes_no(state.fetch(:prepared_release_pending)),
179
+ yes_no(state.fetch(:pending_release))
180
+ ]
181
+ ]
182
+ widths = rows.transpose.map { |column| column.map(&:length).max }
183
+ rows.map.with_index do |row, index|
184
+ line = row.each_with_index.map { |value, i| value.ljust(widths.fetch(i)) }.join(" ").rstrip
185
+ if index == 0
186
+ [line, widths.map { |width| "-" * width }.join(" ")].join("\n")
187
+ else
188
+ line
189
+ end
190
+ end.join("\n")
191
+ end
192
+
173
193
  private
174
194
 
175
195
  def abort(msg)
176
196
  Kettle::Dev::ExitAdapter.abort(msg)
177
197
  end
178
198
 
199
+ def yes_no(value)
200
+ value ? "yes" : "no"
201
+ end
202
+
179
203
  def detect_plan(changelog, version)
180
204
  latest_overall = nil
181
205
  latest_for_series = nil
@@ -3,7 +3,7 @@
3
3
  module Kettle
4
4
  module Dev
5
5
  module Version
6
- VERSION = "2.2.6"
6
+ VERSION = "2.2.7"
7
7
  end
8
8
  VERSION = Version::VERSION # Traditional Constant Location
9
9
  end
@@ -10,13 +10,17 @@ module Kettle
10
10
  @changelog_path: String
11
11
  @coverage_path: String
12
12
 
13
- def initialize: () -> void
13
+ def initialize: (?strict: bool, ?enforce_coverage_thresholds: bool, ?update_prep: bool, ?root: String) -> void
14
14
 
15
15
  # Main entry point that updates CHANGELOG.md
16
16
  def run: () -> void
17
17
 
18
18
  def pending_release_status: () -> Hash[Symbol, untyped]
19
19
 
20
+ def release_state: () -> Hash[Symbol, untyped]
21
+
22
+ def release_state_table: (?Hash[Symbol, untyped] state) -> String
23
+
20
24
  private
21
25
 
22
26
  # Abort with error message
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.2.6
4
+ version: 2.2.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -338,10 +338,10 @@ licenses:
338
338
  - AGPL-3.0-only
339
339
  metadata:
340
340
  homepage_uri: https://kettle-dev.galtzo.com
341
- source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v2.2.6
342
- changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v2.2.6/CHANGELOG.md
341
+ source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v2.2.7
342
+ changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v2.2.7/CHANGELOG.md
343
343
  bug_tracker_uri: https://github.com/kettle-dev/kettle-dev/issues
344
- documentation_uri: https://www.rubydoc.info/gems/kettle-dev/2.2.6
344
+ documentation_uri: https://www.rubydoc.info/gems/kettle-dev/2.2.7
345
345
  funding_uri: https://github.com/sponsors/pboling
346
346
  wiki_uri: https://github.com/kettle-dev/kettle-dev/wiki
347
347
  news_uri: https://www.railsbling.com/tags/kettle-dev
metadata.gz.sig CHANGED
Binary file