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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +14 -1
- data/README.md +1 -1
- data/lib/kettle/family/command_runner.rb +19 -3
- data/lib/kettle/family/version.rb +1 -1
- data/lib/kettle/family/workflow.rb +15 -0
- data/lib/kettle/family/workflow_progress.rb +41 -4
- data.tar.gz.sig +0 -0
- metadata +18 -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: a59d676b17391390f1887d2dce0aeaf28da50217dd0e31fd36ee6a44cac34c46
|
|
4
|
+
data.tar.gz: 22667d4505dc471ac6b8ea0cb10d97c636316ea97103e2b4b411a18aefaf3155
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
238
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
349
|
-
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.
|
|
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.
|
|
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
|