kettle-dev 2.2.5 → 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: ba33ed9512e4bc65a82886c163c0c01c3b8c59895326fb64c64b01c97fbbbf77
4
- data.tar.gz: 9c14bb68844fd3c46315215b6e60a9f35b3ebd9c416a8fad96552e361e061f30
3
+ metadata.gz: 3468f777c78fb3017468fbb76728ee056aa1924738b8935d1fd748d41c91f3ff
4
+ data.tar.gz: 10386b28122fb17e85f555c70784a398d0f8692f3b02d77ebafab8540ae74cc6
5
5
  SHA512:
6
- metadata.gz: fd4cb6930f617bcbc033d1366a69a0f11911b6293145e37a30d149ecb7a3b54fc2c2cda287294105ca4a5d1b9598765318a9291e5999bafefe6a066be27b1ecb
7
- data.tar.gz: 9cf023ac4edeb2d13bb063e62f5fb73b61405e3e7d12e63b5350de1dab920ff5fa8a9bb3425f76648e4fa8bc1254392d1fb0a7b7dbfb13603cf8dc77415ad2d3
6
+ metadata.gz: 3de744ea449a1f6f738b6b19704bbf48a996a67c835201310bfd60b9127fa3b3a2634fd52c9f3d8f2ce45a571e6caf316f91d902f2f8fab8a8d3511bc21c13bc
7
+ data.tar.gz: 1efa9c2da744cdd3fa16d0676b06b78836df3d4194ee6908a756ad479d63c5c50e015a8dde67f416d0cd2e2da3e3c9bff4971c980840603db4613c9bf9f37cc3
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,38 @@ 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
+
50
+ ## [2.2.6] - 2026-06-13
51
+
52
+ - TAG: [v2.2.6][2.2.6t]
53
+ - COVERAGE: 92.27% -- 3833/4154 lines in 28 files
54
+ - BRANCH COVERAGE: 73.51% -- 1518/2065 branches in 28 files
55
+ - 66.67% documented
56
+
57
+ ### Added
58
+
59
+ #### Changelog
60
+
61
+ - Added `kettle-changelog --pending-release`, a non-mutating query that exits
62
+ successfully when `CHANGELOG.md` has unreleased entries or its most recent
63
+ release section has not been published yet.
64
+
33
65
  ## [2.2.5] - 2026-06-13
34
66
 
35
67
  - TAG: [v2.2.5][2.2.5t]
@@ -2060,7 +2092,11 @@ Please file a bug if you notice a violation of semantic versioning.
2060
2092
  - Selecting will run the selected workflow via `act`
2061
2093
  - This may move to its own gem in the future.
2062
2094
 
2063
- [Unreleased]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.5...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
2098
+ [2.2.6]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.5...v2.2.6
2099
+ [2.2.6t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v2.2.6
2064
2100
  [2.2.5]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.4...v2.2.5
2065
2101
  [2.2.5t]: https://github.com/kettle-dev/kettle-dev/releases/tag/v2.2.5
2066
2102
  [2.2.4]: https://github.com/kettle-dev/kettle-dev/compare/v2.2.3...v2.2.4
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.137-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] [--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:
@@ -62,6 +62,10 @@ begin
62
62
 
63
63
  Options:
64
64
  --update-prep Force updating the most recent prepared release section in place
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
65
69
  --no-strict Allow missing coverage and yard data (warnings only, no errors)
66
70
  --no-coverage-threshold Generate coverage without hard-failing below configured thresholds
67
71
 
@@ -89,11 +93,34 @@ end
89
93
  begin
90
94
  # Determine if strict mode is enabled (default: true)
91
95
  strict_mode = !ARGV.include?("--no-strict") && ENV.fetch("K_CHANGELOG_STRICT", "true").downcase != "false"
92
- update_prep = ARGV.include?("--update-prep")
96
+ update_prep = ARGV.delete("--update-prep")
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")
93
100
  coverage_threshold_disabled = ARGV.include?("--no-coverage-threshold") || ARGV.include?("--no-coverage-thresholds")
94
101
  coverage_hard = !coverage_threshold_disabled && ENV.fetch("K_CHANGELOG_COVERAGE_HARD", "true").downcase != "false"
95
102
 
96
- Kettle::Dev::ChangelogCLI.new(strict: strict_mode, enforce_coverage_thresholds: coverage_hard, update_prep: update_prep).run
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
+
110
+ if pending_release_query
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)
121
+ end
122
+
123
+ cli.run
97
124
  rescue LoadError => e
98
125
  warn("#{script_basename}: could not load dependency: #{e.class}: #{e.message}")
99
126
  warn(e.backtrace.join("\n")) if ENV["DEBUG"]
@@ -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
@@ -135,12 +135,71 @@ module Kettle
135
135
  puts "CHANGELOG.md updated with v#{version} section."
136
136
  end
137
137
 
138
+ def pending_release_status
139
+ release_state
140
+ end
141
+
142
+ def release_state
143
+ changelog = File.read(@changelog_path)
144
+ unreleased_block, _before, after = extract_unreleased(changelog)
145
+ unreleased_entries = unreleased_block_has_entries?(unreleased_block)
146
+ latest_changelog_version = detect_previous_version(after.to_s)
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
153
+
154
+ {
155
+ root: @root,
156
+ gem_name: gem_name,
157
+ version: version,
158
+ pending: unreleased_entries || prepared_release_pending,
159
+ pending_release: unreleased_entries || prepared_release_pending,
160
+ unreleased_entries: unreleased_entries,
161
+ prepared_release_pending: prepared_release_pending,
162
+ latest_changelog_version: latest_changelog_version,
163
+ latest_released: latest_overall,
164
+ latest_released_for_current_series: latest_for_series,
165
+ latest_release_target: latest_target
166
+ }
167
+ end
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
+
138
193
  private
139
194
 
140
195
  def abort(msg)
141
196
  Kettle::Dev::ExitAdapter.abort(msg)
142
197
  end
143
198
 
199
+ def yes_no(value)
200
+ value ? "yes" : "no"
201
+ end
202
+
144
203
  def detect_plan(changelog, version)
145
204
  latest_overall = nil
146
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.5"
6
+ VERSION = "2.2.7"
7
7
  end
8
8
  VERSION = Version::VERSION # Traditional Constant Location
9
9
  end
@@ -10,11 +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
+ def pending_release_status: () -> Hash[Symbol, untyped]
19
+
20
+ def release_state: () -> Hash[Symbol, untyped]
21
+
22
+ def release_state_table: (?Hash[Symbol, untyped] state) -> String
23
+
18
24
  private
19
25
 
20
26
  # Abort with error message
@@ -61,4 +67,3 @@ module Kettle
61
67
  end
62
68
  end
63
69
  end
64
-
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.5
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.5
342
- changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v2.2.5/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.5
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