kettle-family 1.2.26 → 1.2.27

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: adb17c73e9c486d45768f2d1c7fc6a5b3fa1c6ec6e7c55051a0f8eddce3c22a3
4
- data.tar.gz: 61bfbb1584ae7b9bccd62879ce4f931c79790dfa3268e4295869d8b76894fa7d
3
+ metadata.gz: 7eb22e412099103ce6ac398ea2fc72f6a0ff8a9bf73834207deb5bcf3b66ba15
4
+ data.tar.gz: '09f4b61f9a2cae67da04bbd532d7955c57bdcf33699f68d497d044e87c4964d4'
5
5
  SHA512:
6
- metadata.gz: 68bf18901ceaae72877b79b1453b1d4295fc96ac13ef973f53510b4a0fb9d5a27f8ba726952c06f45f5a867ba3641fb636a6ccd19b5c557838d1b1f0e1b42db8
7
- data.tar.gz: 828a8d9d910fb9eab4b1fbdd4cfe162c2d49a5dc0fbf2246fd0536b35cbf70ee24f9cc77b6a6fefe30476c0c7b92a655542c731d62e40ea2a5319089288dd763
6
+ metadata.gz: 4db2cc116774e175b9ac032f2f786dc787d9c42b3a141a4669f9a55ec5eae582525fc3974f3f15d36936c6513f5b2278af0ecf1ac1b1520708dd07cfe7f07beb
7
+ data.tar.gz: 6091f9b45eaa9d9d32480a0c92e22b51238992e920fade590cedf1c5e3ce6ca44a773c540a1f419dbdecc3c65dca96f9c3eab80ddb48993adf4b328a7033414d
checksums.yaml.gz.sig CHANGED
@@ -1,4 +1,2 @@
1
- X�q��#����?
2
- ���"���<��>)߶���5q
3
- ���L
4
- ����/뱊�U�?��'K?��v� d�����@�2�v�,��'��ـŲ@� ���L�i���B�឵�j�@��t�����a�
1
+ )�Ky�I�qȘׂ�a�| 9�X�z�x��&�\�������c�ݔ���,�5٢/���x�F�`�K��"�
2
+ �ƚ��ۡg�C��_�y�仁E����p�"x �V�R�T�ͧ��%���c8�T3(xݺU�a�'DT�<]-��.����+i��z�'��yQ~���3{��:r�9�f݂��:K5�u@ hV�zVP��5��I���7d`q�Y�
data/CHANGELOG.md CHANGED
@@ -30,6 +30,21 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [1.2.27] - 2026-08-03
34
+
35
+ - TAG: [v1.2.27][1.2.27t]
36
+ - COVERAGE: 93.95% -- 4720/5024 lines in 31 files
37
+ - BRANCH COVERAGE: 76.57% -- 1853/2420 branches in 31 files
38
+ - 29.31% documented
39
+
40
+ ### Fixed
41
+
42
+ - Clear shortened release progress statuses on TTY redraws
43
+
44
+ - Redraw concurrent TTY progress rows from a stable block anchor.
45
+
46
+ - List release members in deterministic release-wave order.
47
+
33
48
  ## [1.2.26] - 2026-08-03
34
49
 
35
50
  - TAG: [v1.2.26][1.2.26t]
@@ -1705,7 +1720,9 @@ Please file a bug if you notice a violation of semantic versioning.
1705
1720
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
1706
1721
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
1707
1722
 
1708
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.26...HEAD
1723
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.27...HEAD
1724
+ [1.2.27]: https://github.com/kettle-dev/kettle-family/compare/v1.2.26...v1.2.27
1725
+ [1.2.27t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.27
1709
1726
  [1.2.26]: https://github.com/kettle-dev/kettle-family/compare/v1.2.25...v1.2.26
1710
1727
  [1.2.26t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.26
1711
1728
  [1.2.25]: https://github.com/kettle-dev/kettle-family/compare/v1.2.24...v1.2.25
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.004-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
831
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.024-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
@@ -641,7 +641,9 @@ module Kettle
641
641
  release_state_results = release_state_results_for_selection(config: config, members: ordered, only: effective_only)
642
642
  selected = Selection.new(members: ordered, release_state_results: release_state_results).apply(only: effective_only, exclude: options[:exclude], start_at: start_at.member)
643
643
  result_members = selected
644
- print_execution_intent(command: command, config: config, members: result_members, options: options, start_at: start_at)
644
+ display_members = display_members_for(command: command, config: config, members: ordered, selected_members: selected)
645
+ display_selected_members = display_members_for(command: command, config: config, members: selected, selected_members: selected)
646
+ print_execution_intent(command: command, config: config, members: display_selected_members, options: options, start_at: start_at)
645
647
  started_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
646
648
  results = command_results(command: command, config: config, members: result_members, options: options, start_at: start_at)
647
649
  elapsed_seconds = Process.clock_gettime(Process::CLOCK_MONOTONIC) - started_at
@@ -649,7 +651,7 @@ module Kettle
649
651
  family_name: config.family_name,
650
652
  family_mode: config.family_mode,
651
653
  order_mode: config.order_mode,
652
- members: ordered,
654
+ members: display_members,
653
655
  selected_members: selected,
654
656
  config_path: config.path,
655
657
  branch_lanes: config.branch_lanes,
@@ -693,6 +695,23 @@ module Kettle
693
695
  names
694
696
  end
695
697
 
698
+ def display_members_for(command:, config:, members:, selected_members:)
699
+ return members unless command == "release"
700
+
701
+ require_relative "release_waves"
702
+ planned = ReleaseWaves.new(
703
+ members: selected_members,
704
+ configured_waves: config.release_waves,
705
+ strict_cycles: true
706
+ ).waves.flatten
707
+ planned_names = planned.map(&:name)
708
+ planned + members.reject { |member| planned_names.include?(member.name) }
709
+ rescue Error
710
+ # Let the workflow report invalid cycles or wave configuration. The
711
+ # display should not prevent that diagnostic from being produced.
712
+ members
713
+ end
714
+
696
715
  def command_results_for_current_branch(command:, config:, members:, options:, start_at: StartAt.new(nil, nil))
697
716
  return mise_trust_results(config: config, members: members) if command == "mise-trust"
698
717
  return bump_version_results(members: members, options: options, phase: command) if %w[bump bump-version].include?(command)
@@ -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.26"
8
+ VERSION = "1.2.27"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "tty-progressbar"
4
3
  require "tty-screen"
5
4
 
6
5
  module Kettle
@@ -9,7 +8,7 @@ module Kettle
9
8
  MEMBER_WIDTH = 24
10
9
  PROGRESS_WIDTH = 7
11
10
  ELAPSED_WIDTH = 7
12
- FORMAT = "%<member>-#{MEMBER_WIDTH}.#{MEMBER_WIDTH}s :progress :duration :events :status"
11
+ FORMAT = "%<member>-#{MEMBER_WIDTH}.#{MEMBER_WIDTH}s %<progress>s %<duration>s %<events>s %<status>s"
13
12
  EVENT_WIDTH = 20
14
13
  MIN_STATUS_WIDTH = 12
15
14
  DEFAULT_TERMINAL_WIDTH = 80
@@ -23,7 +22,6 @@ module Kettle
23
22
  @heading = heading
24
23
  @clock = clock || lambda { Process.clock_gettime(Process::CLOCK_MONOTONIC) }
25
24
  @enabled = enabled && !!io
26
- @bars = {}
27
25
  @line_order = members.map(&:name)
28
26
  @started = false
29
27
  @stopped = false
@@ -35,7 +33,8 @@ module Kettle
35
33
  @member_statuses = Hash.new("")
36
34
  @mutex = Mutex.new
37
35
  @tty = @enabled && io.respond_to?(:tty?) && io.tty?
38
- @multibar = @tty ? TTY::ProgressBar::Multi.new(output: io, frequency: 0) : nil
36
+ @tty_rendered = false
37
+ @tty_rows = 0
39
38
  end
40
39
 
41
40
  def start
@@ -46,7 +45,10 @@ module Kettle
46
45
 
47
46
  write_line(@heading || "#{@label} #{@total} member#{plural(@total)} with #{@jobs} job#{plural(@jobs)}:")
48
47
  @started = true
49
- @line_order.each { |member_name| render_name(member_name, status: "") } if @tty
48
+ if @tty
49
+ @line_order.each { |member_name| render_name(member_name, status: "") }
50
+ render_tty_block unless @line_order.empty?
51
+ end
50
52
  end
51
53
  end
52
54
 
@@ -114,7 +116,6 @@ module Kettle
114
116
  synchronize do
115
117
  next if @stopped
116
118
 
117
- @multibar&.stop
118
119
  @stopped = true
119
120
  end
120
121
  end
@@ -136,6 +137,7 @@ module Kettle
136
137
 
137
138
  def render(member, status:)
138
139
  render_name(member.name, status: status)
140
+ render_tty_block if @tty
139
141
  end
140
142
 
141
143
  def append_event(member, mark)
@@ -147,8 +149,30 @@ module Kettle
147
149
  def render_name(member_name, status:)
148
150
  @member_statuses[member_name] = truncate_status(status)
149
151
  @line_order << member_name unless @line_order.include?(member_name)
150
- bar_for(member_name).advance(
151
- 0,
152
+ end
153
+
154
+ # Redraw the complete block from a stable cursor position. TTY::ProgressBar::Multi
155
+ # saves and restores the cursor independently for each bar, which is unreliable
156
+ # across terminals that do not implement its legacy ESC 7/ESC 8 sequences.
157
+ def render_tty_block
158
+ rows = @line_order.map { |member_name| tty_line(member_name) }
159
+ return if rows.empty?
160
+
161
+ output = +""
162
+ output << "\e[#{@tty_rows}A" if @tty_rendered && @tty_rows.positive?
163
+ rows.each do |line|
164
+ output << "\e[1G\e[2K#{line}\n"
165
+ end
166
+ @io.write(output)
167
+ @io.flush if @io.respond_to?(:flush)
168
+ @tty_rendered = true
169
+ @tty_rows = rows.length
170
+ end
171
+
172
+ def tty_line(member_name)
173
+ Kernel.format(
174
+ FORMAT,
175
+ member: member_name,
152
176
  progress: progress_text(member_name),
153
177
  duration: elapsed_text(member_name),
154
178
  events: @member_events[member_name].rjust(EVENT_WIDTH),
@@ -156,10 +180,6 @@ module Kettle
156
180
  )
157
181
  end
158
182
 
159
- def bar_for(member_name)
160
- @bars[member_name] ||= @multibar.register(Kernel.format(FORMAT, member: member_name), total: nil)
161
- end
162
-
163
183
  def plural(count)
164
184
  "s" unless count == 1
165
185
  end
@@ -214,7 +234,7 @@ module Kettle
214
234
  def truncate_status(status)
215
235
  normalized = status.to_s.gsub(/\s+/, " ").strip
216
236
  width = status_width
217
- return normalized if normalized.length <= width
237
+ return normalized.ljust(width) if normalized.length <= width
218
238
  return normalized[0, width] if width <= ELLIPSIS.length
219
239
 
220
240
  "#{normalized[0, width - ELLIPSIS.length]}#{ELLIPSIS}"
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.26
4
+ version: 1.2.27
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -120,19 +120,19 @@ dependencies:
120
120
  - !ruby/object:Gem::Version
121
121
  version: '0.2'
122
122
  - !ruby/object:Gem::Dependency
123
- name: tty-progressbar
123
+ name: tty-screen
124
124
  requirement: !ruby/object:Gem::Requirement
125
125
  requirements:
126
126
  - - "~>"
127
127
  - !ruby/object:Gem::Version
128
- version: '0.18'
128
+ version: '0.8'
129
129
  type: :runtime
130
130
  prerelease: false
131
131
  version_requirements: !ruby/object:Gem::Requirement
132
132
  requirements:
133
133
  - - "~>"
134
134
  - !ruby/object:Gem::Version
135
- version: '0.18'
135
+ version: '0.8'
136
136
  - !ruby/object:Gem::Dependency
137
137
  name: bundler-audit
138
138
  requirement: !ruby/object:Gem::Requirement
@@ -345,10 +345,10 @@ licenses:
345
345
  - AGPL-3.0-only
346
346
  metadata:
347
347
  homepage_uri: https://kettle-family.galtzo.com
348
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.26
349
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.26/CHANGELOG.md
348
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.27
349
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.27/CHANGELOG.md
350
350
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
351
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.26
351
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.27
352
352
  funding_uri: https://github.com/sponsors/pboling
353
353
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
354
354
  news_uri: https://www.railsbling.com/tags/kettle-family
metadata.gz.sig CHANGED
Binary file