kettle-family 1.2.28 → 1.2.29

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: 322f67630e4e287d60db074744b6604a64b4f1cdd05fc14771550c86326da3b6
4
- data.tar.gz: 781f8cb3ed7728612781190c657ed1098cc907568cf8fee487dfb8e60c036ccb
3
+ metadata.gz: a59d676b17391390f1887d2dce0aeaf28da50217dd0e31fd36ee6a44cac34c46
4
+ data.tar.gz: 22667d4505dc471ac6b8ea0cb10d97c636316ea97103e2b4b411a18aefaf3155
5
5
  SHA512:
6
- metadata.gz: 9a3c345bbee93b360f52c9cb3de7c3f50876dfd7101d86d5482b4e3610f81068e2313fc07018e3716757690a0cc8eead8530ad80429f938d38070ca322638f15
7
- data.tar.gz: b0c250bc32489a0da162878f9e23a66b66aec6ed6a637498e80e8fb2b952405f75090ec2631927dc6fe9ad2668f49174ce91fe12b7f4dd2c173c38707b1ec938
6
+ metadata.gz: 24f2c25f781d82b4fefc119b3ff04a07ff5fcc95396f624c8f42dbb33fd4f0fd5d51c66089ac8cd5e740e3df18d645c4c35cac837f73d3a3710b477a06ca4745
7
+ data.tar.gz: cf0e8f529773c0d8550f19e824dd572c716085eb07d3ac13e5938e8d5c8fff69a20862e17be6252bc1f8ae5212e064017836ea666ffcb7a87d56ea88b69e4bc0
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,17 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [1.2.29] - 2026-08-03
34
+
35
+ - TAG: [v1.2.29][1.2.29t]
36
+ - COVERAGE: 94.13% -- 4766/5063 lines in 31 files
37
+ - BRANCH COVERAGE: 76.61% -- 1873/2445 branches in 31 files
38
+ - 29.23% documented
39
+
40
+ ### Fixed
41
+
42
+ - Keep release notifications above the live progress tape without allowing wide Unicode labels to wrap rows.
43
+
33
44
  ## [1.2.28] - 2026-08-03
34
45
 
35
46
  - TAG: [v1.2.28][1.2.28t]
@@ -1731,7 +1742,9 @@ Please file a bug if you notice a violation of semantic versioning.
1731
1742
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
1732
1743
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
1733
1744
 
1734
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.28...HEAD
1745
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.29...HEAD
1746
+ [1.2.29]: https://github.com/kettle-dev/kettle-family/compare/v1.2.28...v1.2.29
1747
+ [1.2.29t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.29
1735
1748
  [1.2.28]: https://github.com/kettle-dev/kettle-family/compare/v1.2.27...v1.2.28
1736
1749
  [1.2.28t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.28
1737
1750
  [1.2.27]: https://github.com/kettle-dev/kettle-family/compare/v1.2.26...v1.2.27
data/README.md CHANGED
@@ -828,7 +828,7 @@ Thanks for RTFM. ☺️
828
828
  [📌gitmoji]: https://gitmoji.dev
829
829
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
830
830
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
831
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.026-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
831
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.063-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
832
832
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
833
833
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
834
834
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -132,15 +132,31 @@ module Kettle
132
132
  end
133
133
 
134
134
  manual_prompt = true
135
- @output.print("#{otp_prompt_label(chunk)} ")
135
+ prompt_label = otp_prompt_label(chunk)
136
+ prompted_by_event_handler = emit_event(
137
+ member_name: member_name,
138
+ action: "manual_prompt",
139
+ label: prompt_label,
140
+ status: "requested",
141
+ mark: ">"
142
+ )
143
+ @output.print("#{prompt_label} ") unless prompted_by_event_handler
136
144
  @output.flush if @output.respond_to?(:flush)
137
- if @input.respond_to?(:noecho) && @input.tty?
145
+ response = if @input.respond_to?(:noecho) && @input.tty?
138
146
  @input.noecho(&:gets)&.chomp.to_s
139
147
  else
140
148
  @input.gets&.chomp.to_s
141
149
  end
150
+ emit_event(
151
+ member_name: member_name,
152
+ action: "prompt_response",
153
+ label: "RubyGems MFA code",
154
+ status: response.empty? ? "failed" : "ok",
155
+ mark: response.empty? ? "F" : "."
156
+ )
157
+ response
142
158
  ensure
143
- @output.puts if manual_prompt && @output.respond_to?(:puts)
159
+ @output.puts if manual_prompt && !event_handler && @output.respond_to?(:puts)
144
160
  end
145
161
 
146
162
  def otp_prompt_label(chunk)
@@ -5,7 +5,7 @@ module Kettle
5
5
  # Version namespace for this gem.
6
6
  module Version
7
7
  # Current gem version.
8
- VERSION = "1.2.28"
8
+ VERSION = "1.2.29"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
@@ -1083,6 +1083,14 @@ module Kettle
1083
1083
 
1084
1084
  member = release_progress_member_for(member_name)
1085
1085
  if progress_io
1086
+ if event["type"] == "secret_provider"
1087
+ case event["action"].to_s
1088
+ when "prompt_request", "manual_prompt"
1089
+ progress.notification(secret_provider_notification_label(event))
1090
+ when "prompt_response"
1091
+ progress.notification("")
1092
+ end
1093
+ end
1086
1094
  if verbose || debug
1087
1095
  emit_release_event_progress(member, event)
1088
1096
  elsif progress.tty?
@@ -2529,6 +2537,13 @@ module Kettle
2529
2537
  parts.join(":")
2530
2538
  end
2531
2539
 
2540
+ def secret_provider_notification_label(event)
2541
+ action = event["action"].to_s
2542
+ return "👀 🔒 watch for authorization prompt" if action == "prompt_request"
2543
+
2544
+ event["label"].to_s
2545
+ end
2546
+
2532
2547
  def command_step_event_label(event)
2533
2548
  parts = [event["phase"], event["name"]].map(&:to_s).reject(&:empty?)
2534
2549
  summary = event["summary"].to_s
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "tty-screen"
4
+ require "unicode/display_width"
4
5
 
5
6
  module Kettle
6
7
  module Family
@@ -31,6 +32,7 @@ module Kettle
31
32
  @member_finished_elapsed = {}
32
33
  @member_events = Hash.new("")
33
34
  @member_statuses = Hash.new("")
35
+ @notification = ""
34
36
  @mutex = Mutex.new
35
37
  @tty = @enabled && io.respond_to?(:tty?) && io.tty?
36
38
  @tty_rendered = false
@@ -133,6 +135,19 @@ module Kettle
133
135
  end
134
136
  end
135
137
 
138
+ def notification(message)
139
+ return unless @enabled
140
+
141
+ synchronize do
142
+ @notification = message.to_s
143
+ if @tty
144
+ render_tty_block if @started && !@line_order.empty?
145
+ elsif !@notification.empty?
146
+ write_line("[notification] #{@notification}")
147
+ end
148
+ end
149
+ end
150
+
136
151
  private
137
152
 
138
153
  def render(member, status:)
@@ -160,13 +175,14 @@ module Kettle
160
175
 
161
176
  output = +""
162
177
  output << "\e[#{@tty_rows}A" if @tty_rendered && @tty_rows.positive?
178
+ output << "\e[1G\e[2K#{truncate_display(@notification, terminal_width)}\n"
163
179
  rows.each do |line|
164
180
  output << "\e[1G\e[2K#{line}\n"
165
181
  end
166
182
  @io.write(output)
167
183
  @io.flush if @io.respond_to?(:flush)
168
184
  @tty_rendered = true
169
- @tty_rows = rows.length
185
+ @tty_rows = rows.length + 1
170
186
  end
171
187
 
172
188
  def tty_line(member_name)
@@ -234,10 +250,31 @@ module Kettle
234
250
  def truncate_status(status)
235
251
  normalized = status.to_s.gsub(/\s+/, " ").strip
236
252
  width = status_width
237
- return normalized.ljust(width) if normalized.length <= width
238
- return normalized[0, width] if width <= ELLIPSIS.length
253
+ truncated = truncate_display(normalized, width)
254
+ truncated + (" " * [width - display_width(truncated), 0].max)
255
+ end
256
+
257
+ def truncate_display(value, width)
258
+ return "" if width <= 0
259
+
260
+ normalized = value.to_s
261
+ return normalized if display_width(normalized) <= width
262
+ return take_display_width(ELLIPSIS, width) if width <= display_width(ELLIPSIS)
263
+
264
+ "#{take_display_width(normalized, width - display_width(ELLIPSIS))}#{ELLIPSIS}"
265
+ end
266
+
267
+ def take_display_width(value, width)
268
+ value.to_s.each_char.each_with_object(+"") do |character, result|
269
+ candidate = result + character
270
+ break result if display_width(candidate) > width
271
+
272
+ result << character
273
+ end
274
+ end
239
275
 
240
- "#{normalized[0, width - ELLIPSIS.length]}#{ELLIPSIS}"
276
+ def display_width(value)
277
+ Unicode::DisplayWidth.of(value.to_s)
241
278
  end
242
279
 
243
280
  def status_width
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.2.28
4
+ version: 1.2.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -133,6 +133,20 @@ dependencies:
133
133
  - - "~>"
134
134
  - !ruby/object:Gem::Version
135
135
  version: '0.8'
136
+ - !ruby/object:Gem::Dependency
137
+ name: unicode-display_width
138
+ requirement: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: '2.6'
143
+ type: :runtime
144
+ prerelease: false
145
+ version_requirements: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - "~>"
148
+ - !ruby/object:Gem::Version
149
+ version: '2.6'
136
150
  - !ruby/object:Gem::Dependency
137
151
  name: bundler-audit
138
152
  requirement: !ruby/object:Gem::Requirement
@@ -345,10 +359,10 @@ licenses:
345
359
  - AGPL-3.0-only
346
360
  metadata:
347
361
  homepage_uri: https://kettle-family.galtzo.com
348
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.28
349
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.28/CHANGELOG.md
362
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.29
363
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.29/CHANGELOG.md
350
364
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
351
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.28
365
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.29
352
366
  funding_uri: https://github.com/sponsors/pboling
353
367
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
354
368
  news_uri: https://www.railsbling.com/tags/kettle-family
metadata.gz.sig CHANGED
Binary file