ratatui_ruby 0.7.2 → 0.7.4

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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.builds/ruby-3.2.yml +1 -1
  3. data/.builds/ruby-3.3.yml +1 -1
  4. data/.builds/ruby-3.4.yml +1 -1
  5. data/.builds/ruby-4.0.0.yml +1 -1
  6. data/AGENTS.md +4 -3
  7. data/CHANGELOG.md +39 -0
  8. data/README.md +2 -2
  9. data/doc/concepts/application_testing.md +4 -2
  10. data/doc/contributors/developing_examples.md +7 -7
  11. data/doc/contributors/upstream_requests/tab_rects.md +173 -0
  12. data/doc/contributors/upstream_requests/title_rects.md +132 -0
  13. data/doc/contributors/v1.0.0_blockers.md +46 -739
  14. data/doc/troubleshooting/tui_output.md +76 -0
  15. data/examples/widget_barchart/README.md +1 -1
  16. data/examples/widget_block/README.md +1 -1
  17. data/examples/widget_overlay/README.md +1 -1
  18. data/ext/ratatui_ruby/Cargo.lock +1 -1
  19. data/ext/ratatui_ruby/Cargo.toml +1 -1
  20. data/ext/ratatui_ruby/src/lib.rs +2 -2
  21. data/ext/ratatui_ruby/src/rendering.rs +9 -0
  22. data/ext/ratatui_ruby/src/style.rs +22 -2
  23. data/ext/ratatui_ruby/src/text.rs +26 -0
  24. data/ext/ratatui_ruby/src/widgets/chart.rs +5 -0
  25. data/lib/ratatui_ruby/style/style.rb +1 -0
  26. data/lib/ratatui_ruby/test_helper/snapshot.rb +60 -21
  27. data/lib/ratatui_ruby/test_helper/snapshots/axis_labels_alignment.ansi +24 -0
  28. data/lib/ratatui_ruby/test_helper/snapshots/axis_labels_alignment.txt +24 -0
  29. data/lib/ratatui_ruby/test_helper/snapshots/barchart_styled_label.ansi +5 -0
  30. data/lib/ratatui_ruby/test_helper/snapshots/barchart_styled_label.txt +5 -0
  31. data/lib/ratatui_ruby/test_helper/snapshots/chart_rendering.ansi +24 -0
  32. data/lib/ratatui_ruby/test_helper/snapshots/chart_rendering.txt +24 -0
  33. data/lib/ratatui_ruby/test_helper/snapshots/half_block_marker.ansi +12 -0
  34. data/lib/ratatui_ruby/test_helper/snapshots/half_block_marker.txt +12 -0
  35. data/lib/ratatui_ruby/test_helper/snapshots/legend_position_bottom.ansi +12 -0
  36. data/lib/ratatui_ruby/test_helper/snapshots/legend_position_bottom.txt +12 -0
  37. data/lib/ratatui_ruby/test_helper/snapshots/legend_position_left.ansi +12 -0
  38. data/lib/ratatui_ruby/test_helper/snapshots/legend_position_left.txt +12 -0
  39. data/lib/ratatui_ruby/test_helper/snapshots/legend_position_right.ansi +12 -0
  40. data/lib/ratatui_ruby/test_helper/snapshots/legend_position_right.txt +12 -0
  41. data/lib/ratatui_ruby/test_helper/snapshots/legend_position_top.ansi +12 -0
  42. data/lib/ratatui_ruby/test_helper/snapshots/legend_position_top.txt +12 -0
  43. data/lib/ratatui_ruby/test_helper/snapshots/my_snapshot.txt +1 -0
  44. data/lib/ratatui_ruby/test_helper/snapshots/styled_axis_title.ansi +10 -0
  45. data/lib/ratatui_ruby/test_helper/snapshots/styled_axis_title.txt +10 -0
  46. data/lib/ratatui_ruby/test_helper/snapshots/styled_dataset_name.ansi +10 -0
  47. data/lib/ratatui_ruby/test_helper/snapshots/styled_dataset_name.txt +10 -0
  48. data/lib/ratatui_ruby/test_helper/terminal.rb +3 -0
  49. data/lib/ratatui_ruby/test_helper.rb +1 -1
  50. data/lib/ratatui_ruby/version.rb +1 -1
  51. data/lib/ratatui_ruby/widgets/bar_chart.rb +3 -2
  52. data/lib/ratatui_ruby/widgets/block.rb +42 -0
  53. data/lib/ratatui_ruby/widgets/chart.rb +9 -4
  54. data/lib/ratatui_ruby/widgets/sparkline.rb +3 -2
  55. data/lib/ratatui_ruby.rb +128 -9
  56. metadata +26 -2
@@ -0,0 +1,12 @@
1
+  ┌──┐ ••
2
+  │DS│ •• 
3
+  └──┘ ••• 
4
+  ••• 
5
+  •• 
6
+  ••• 
7
+  ••• 
8
+  •• 
9
+  ••• 
10
+  ••• 
11
+  •• 
12
+ •• 
@@ -0,0 +1,12 @@
1
+ ┌──┐ ••
2
+ │DS│ ••
3
+ └──┘ •••
4
+ •••
5
+ ••
6
+ •••
7
+ •••
8
+ ••
9
+ •••
10
+ •••
11
+ ••
12
+ ••
@@ -0,0 +1 @@
1
+ Snapshot Content
@@ -0,0 +1,10 @@
1
+  ┌───┐
2
+  ••│DS1│
3
+  •••• └───┘
4
+  ••••• 
5
+  •••• 
6
+  •••• 
7
+  ••••• 
8
+  •••• 
9
+  •••• 
10
+ ••• StyledTime
@@ -0,0 +1,10 @@
1
+ ┌───┐
2
+ ••│DS1│
3
+ •••• └───┘
4
+ •••••
5
+ ••••
6
+ ••••
7
+ •••••
8
+ ••••
9
+ ••••
10
+ ••• StyledTime
@@ -0,0 +1,10 @@
1
+  ┌────────┐
2
+  │StyledDS│
3
+  •└────────┘
4
+  ••••• 
5
+  •••• 
6
+  •••• 
7
+  ••••• 
8
+  •••• 
9
+  •••• 
10
+ ••• 
@@ -0,0 +1,10 @@
1
+ ┌────────┐
2
+ │StyledDS│
3
+ •└────────┘
4
+ •••••
5
+ ••••
6
+ ••••
7
+ •••••
8
+ ••••
9
+ ••••
10
+ •••
@@ -48,6 +48,9 @@ module RatatuiRuby
48
48
  # # render and test your app
49
49
  # end
50
50
  def with_test_terminal(width = 80, height = 24, **opts)
51
+ # Defensive cleanup: reset any stale session state from previous test failures
52
+ RatatuiRuby.instance_variable_set(:@tui_session_active, false)
53
+
51
54
  RatatuiRuby.init_test_terminal(width, height)
52
55
  # Flush any lingering events from previous tests
53
56
  while (event = RatatuiRuby.poll_event) && !event.none?; end
@@ -41,7 +41,7 @@ module RatatuiRuby
41
41
  # def test_initial_render
42
42
  # with_test_terminal(80, 24) do
43
43
  # MyApp.new.run_once
44
- # assert_snapshot("initial")
44
+ # assert_snapshots("initial")
45
45
  # end
46
46
  # end
47
47
  #
@@ -8,5 +8,5 @@
8
8
  module RatatuiRuby
9
9
  # The version of the ratatui_ruby gem.
10
10
  # See https://semver.org/spec/v2.0.0.html
11
- VERSION = "0.7.2"
11
+ VERSION = "0.7.4"
12
12
  end
@@ -156,9 +156,10 @@ module RatatuiRuby
156
156
  # [value_style]
157
157
  # Style object for values (optional).
158
158
  # [bar_set]
159
- # Hash or Array: Custom characters for the bars.
159
+ # Symbol, Hash, or Array: Custom characters for bars.
160
+ # Symbols: <tt>:nine_levels</tt> (default gradient), <tt>:three_levels</tt> (simplified).
160
161
  def initialize(data:, bar_width: 3, bar_gap: 1, group_gap: 0, max: nil, style: nil, block: nil, direction: :vertical, label_style: nil, value_style: nil, bar_set: nil)
161
- if bar_set
162
+ if bar_set && !bar_set.is_a?(Symbol)
162
163
  if bar_set.is_a?(Array) && bar_set.size == 9
163
164
  # Convert Array to Hash using BAR_KEYS order
164
165
  bar_set = BAR_KEYS.zip(bar_set).to_h
@@ -189,6 +189,48 @@ module RatatuiRuby
189
189
  children:
190
190
  )
191
191
  end
192
+
193
+ # Computes the inner content area given an outer area.
194
+ #
195
+ # This method calculates where content should be placed within a block,
196
+ # accounting for borders and padding. Essential for layout calculations
197
+ # when you need to know the usable space inside a block.
198
+ #
199
+ # === Example
200
+ #
201
+ # block = Block.new(borders: [:all], padding: 1)
202
+ # outer = Layout::Rect.new(x: 0, y: 0, width: 20, height: 10)
203
+ # inner = block.inner(outer)
204
+ # # => Rect(x: 2, y: 2, width: 16, height: 6)
205
+ #
206
+ # [area]
207
+ # The outer Rect to compute the inner area for.
208
+ #
209
+ # Returns a new Rect representing the inner content area.
210
+ def inner(area)
211
+ # Calculate border offsets
212
+ has_border = -> (side) { borders.include?(:all) || borders.include?(side) }
213
+ left_border = has_border.call(:left) ? 1 : 0
214
+ right_border = has_border.call(:right) ? 1 : 0
215
+ top_border = has_border.call(:top) ? 1 : 0
216
+ bottom_border = has_border.call(:bottom) ? 1 : 0
217
+
218
+ # Calculate padding offsets
219
+ if padding.is_a?(Array)
220
+ # [left, right, top, bottom]
221
+ pad_left, pad_right, pad_top, pad_bottom = padding
222
+ else
223
+ pad_left = pad_right = pad_top = pad_bottom = padding
224
+ end
225
+
226
+ # Compute inner area
227
+ new_x = area.x + left_border + pad_left
228
+ new_y = area.y + top_border + pad_top
229
+ new_width = [area.width - left_border - right_border - pad_left - pad_right, 0].max
230
+ new_height = [area.height - top_border - bottom_border - pad_top - pad_bottom, 0].max
231
+
232
+ Layout::Rect.new(x: new_x, y: new_y, width: new_width, height: new_height)
233
+ end
192
234
  end
193
235
  end
194
236
  end
@@ -56,7 +56,7 @@ module RatatuiRuby
56
56
  # [name] The name of the dataset.
57
57
  # [data] Array of arrays [[x, y], [x, y]] (Floats).
58
58
  # [style] The style of the line.
59
- # [marker] Symbol (<tt>:dot</tt>, <tt>:braille</tt>, <tt>:block</tt>, <tt>:bar</tt>)
59
+ # [marker] Symbol (<tt>:dot</tt>, <tt>:braille</tt>, <tt>:block</tt>, <tt>:bar</tt>, <tt>:half_block</tt>)
60
60
  # [graph_type] Symbol (<tt>:line</tt>, <tt>:scatter</tt>)
61
61
  class Dataset < Data.define(:name, :data, :style, :marker, :graph_type)
62
62
  ##
@@ -81,7 +81,9 @@ module RatatuiRuby
81
81
 
82
82
  ##
83
83
  # :attr_reader: marker
84
- # Marker type (<tt>:dot</tt>, <tt>:braille</tt>).
84
+ # Marker type (<tt>:dot</tt>, <tt>:braille</tt>, <tt>:block</tt>, <tt>:bar</tt>, <tt>:half_block</tt>).
85
+ #
86
+ # <tt>:half_block</tt> uses ▀ and ▄ characters for higher resolution than <tt>:dot</tt>.
85
87
 
86
88
  ##
87
89
  # :attr_reader: graph_type
@@ -138,7 +140,10 @@ module RatatuiRuby
138
140
 
139
141
  ##
140
142
  # :attr_reader: legend_position
141
- # Position of the legend (<tt>:top_left</tt>, <tt>:top_right</tt>, <tt>:bottom_left</tt>, <tt>:bottom_right</tt>).
143
+ # Position of the legend.
144
+ #
145
+ # Corners: <tt>:top_left</tt>, <tt>:top_right</tt>, <tt>:bottom_left</tt>, <tt>:bottom_right</tt>.
146
+ # Edges: <tt>:top</tt>, <tt>:bottom</tt>, <tt>:left</tt>, <tt>:right</tt>.
142
147
 
143
148
  ##
144
149
  # :attr_reader: hidden_legend_constraints
@@ -151,7 +156,7 @@ module RatatuiRuby
151
156
  # [y_axis] Y Axis config.
152
157
  # [block] Wrapper (optional).
153
158
  # [style] Base style (optional).
154
- # [legend_position] Symbol (<tt>:top_left</tt>, <tt>:top_right</tt>, <tt>:bottom_left</tt>, <tt>:bottom_right</tt>).
159
+ # [legend_position] Symbol — corners: <tt>:top_left</tt>, <tt>:top_right</tt>, <tt>:bottom_left</tt>, <tt>:bottom_right</tt>; edges: <tt>:top</tt>, <tt>:bottom</tt>, <tt>:left</tt>, <tt>:right</tt>.
155
160
  # [hidden_legend_constraints] Array of two Constraints [width, height] (optional).
156
161
  def initialize(datasets:, x_axis:, y_axis:, block: nil, style: nil, legend_position: nil, hidden_legend_constraints: [])
157
162
  super
@@ -103,9 +103,10 @@ module RatatuiRuby
103
103
  # [direction] +:left_to_right+ or +:right_to_left+ (default: +:left_to_right+).
104
104
  # [absent_value_symbol] Character for absent (nil) values (optional).
105
105
  # [absent_value_style] Style for absent (nil) values (optional).
106
- # [bar_set] Hash or Array of custom characters (optional).
106
+ # [bar_set] Symbol, Hash, or Array of custom characters (optional).
107
+ # Symbols: <tt>:nine_levels</tt> (default gradient), <tt>:three_levels</tt> (simplified).
107
108
  def initialize(data:, max: nil, style: nil, block: nil, direction: :left_to_right, absent_value_symbol: nil, absent_value_style: nil, bar_set: nil)
108
- if bar_set
109
+ if bar_set && !bar_set.is_a?(Symbol)
109
110
  if bar_set.is_a?(Array) && bar_set.size == 9
110
111
  # Convert Array to Hash using BAR_KEYS order
111
112
  bar_set = BAR_KEYS.zip(bar_set).to_h
data/lib/ratatui_ruby.rb CHANGED
@@ -42,13 +42,72 @@ end
42
42
  #
43
43
  # Use `RatatuiRuby.run` to start your application.
44
44
  module RatatuiRuby
45
- # Generic error class for RatatuiRuby.
45
+ # Base error class for RatatuiRuby.
46
+ #
47
+ # All library-specific exceptions inherit from this class.
48
+ # Catch this to handle any RatatuiRuby error generically.
49
+ #
50
+ # === Example
51
+ #
52
+ # begin
53
+ # RatatuiRuby.run { |tui| ... }
54
+ # rescue RatatuiRuby::Error => e
55
+ # puts "RatatuiRuby error: #{e.message}"
56
+ # end
46
57
  class Error < StandardError
47
- # Raised when a terminal operation fails (e.g., I/O error, backend failure).
58
+ # Operational failure during terminal I/O.
59
+ #
60
+ # Terminals are finnicky. I/O can fail. Backends can crash.
61
+ # These are runtime problems outside your control.
62
+ #
63
+ # This error signals the terminal operation itself failed.
64
+ # The library tried to do something with the terminal and couldn't.
65
+ #
66
+ # Catch this to handle terminal failures gracefully.
67
+ #
68
+ # === Example
69
+ #
70
+ # begin
71
+ # RatatuiRuby.init_terminal
72
+ # rescue RatatuiRuby::Error::Terminal => e
73
+ # puts "Terminal failed: #{e.message}"
74
+ # end
48
75
  class Terminal < Error; end
49
76
 
50
- # Raised when an API safety contract is violated (e.g., accessing a Frame outside its valid scope).
77
+ # Object lifetime violation.
78
+ #
79
+ # Some objects are only valid during specific scopes.
80
+ # Using them after their scope ends causes undefined behavior.
81
+ #
82
+ # This error prevents use-after-scope bugs.
83
+ # The object you're accessing is no longer valid.
84
+ #
85
+ # To resolve, ensure scoped objects are used only within their
86
+ # valid lifetime (e.g., inside the block where they're created).
87
+ #
88
+ # === Example
89
+ #
90
+ # stored_frame = nil
91
+ # RatatuiRuby.draw { |frame| stored_frame = frame }
92
+ # stored_frame.area # => raises Error::Safety
51
93
  class Safety < Error; end
94
+
95
+ # State invariant violation.
96
+ #
97
+ # The library has rules about valid state transitions.
98
+ # Calling methods in the wrong order or state breaks invariants.
99
+ #
100
+ # This error signals you violated a state machine contract.
101
+ # The program state doesn't allow this operation right now.
102
+ #
103
+ # To resolve, check `terminal_active?` or restructure the
104
+ # code to ensure methods are called in the expected order.
105
+ #
106
+ # === Example
107
+ #
108
+ # RatatuiRuby.init_terminal
109
+ # RatatuiRuby.init_terminal # => raises Error::Invariant
110
+ class Invariant < Error; end
52
111
  end
53
112
 
54
113
  ##
@@ -58,23 +117,64 @@ module RatatuiRuby
58
117
  # [focus_events] whether to enable focus gain/loss events (default: true).
59
118
  # [bracketed_paste] whether to enable bracketed paste mode (default: true).
60
119
  def self.init_terminal(focus_events: true, bracketed_paste: true)
120
+ if @tui_session_active
121
+ raise Error::Invariant, "Cannot initialize terminal: TUI session already active"
122
+ end
123
+ @tui_session_active = true
61
124
  _init_terminal(focus_events, bracketed_paste)
62
125
  end
63
126
 
64
127
  @experimental_warnings = true
128
+ @tui_session_active = false
129
+ @deferred_warnings = []
130
+
131
+ ##
132
+ # Whether a TUI session is currently active.
133
+ #
134
+ # Writing to stdout/stderr during a TUI session corrupts the display.
135
+ # Use this to defer logging, warnings, or debug output until
136
+ # after the session ends.
137
+ #
138
+ # === Example
139
+ #
140
+ # def log(message)
141
+ # if RatatuiRuby.terminal_active?
142
+ # @deferred_logs << message
143
+ # else
144
+ # puts message
145
+ # end
146
+ # end
147
+ def self.terminal_active?
148
+ @tui_session_active
149
+ end
150
+
65
151
  class << self
66
152
  ##
67
153
  # :attr_accessor: experimental_warnings
68
154
  # Whether to show warnings when using experimental features (default: true).
69
155
  attr_accessor :experimental_warnings
156
+
157
+ private def queue_warning(message)
158
+ @deferred_warnings << message
159
+ end
160
+
161
+ private def flush_warnings
162
+ return if @deferred_warnings.empty?
163
+ @deferred_warnings.each { |msg| warn msg }
164
+ @deferred_warnings.clear
165
+ end
70
166
  end
71
167
 
72
168
  ##
73
- # :singleton-method: restore_terminal
74
169
  # Restores the terminal to its original state.
75
170
  # Leaves alternate screen and disables raw mode.
76
- #
77
- # (Native method implemented in Rust)
171
+ # Also flushes any deferred warnings that were queued during the session.
172
+ def self.restore_terminal
173
+ _restore_terminal
174
+ ensure
175
+ @tui_session_active = false
176
+ flush_warnings
177
+ end
78
178
 
79
179
  ##
80
180
  # :singleton-method: inject_test_event
@@ -98,12 +198,31 @@ module RatatuiRuby
98
198
  @warned_features ||= {}
99
199
  return if @warned_features[feature_name]
100
200
 
101
- warn "WARNING: #{feature_name} is an experimental feature and may change in future versions. Disable this warning with RatatuiRuby.experimental_warnings = false."
201
+ message = "WARNING: #{feature_name} is an experimental feature and may change in future versions. Disable this warning with RatatuiRuby.experimental_warnings = false."
202
+ if terminal_active?
203
+ queue_warning(message)
204
+ else
205
+ warn message
206
+ end
102
207
  @warned_features[feature_name] = true
103
208
  end
104
209
 
105
- # (Native method _init_terminal implemented in Rust)
106
- private_class_method :_init_terminal
210
+ ##
211
+ # Initializes a test terminal for unit testing.
212
+ # Sets session active state like init_terminal.
213
+ #
214
+ # [width] Integer width of the test terminal.
215
+ # [height] Integer height of the test terminal.
216
+ def self.init_test_terminal(width, height)
217
+ if @tui_session_active
218
+ raise Error::Invariant, "Cannot initialize terminal: TUI session already active"
219
+ end
220
+ @tui_session_active = true
221
+ _init_test_terminal(width, height)
222
+ end
223
+
224
+ # (Native methods implemented in Rust)
225
+ private_class_method :_init_terminal, :_restore_terminal, :_init_test_terminal
107
226
 
108
227
  ##
109
228
  # Draws the given UI node tree to the terminal.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ratatui_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.7.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kerrick Long
@@ -117,6 +117,8 @@ files:
117
117
  - doc/contributors/developing_examples.md
118
118
  - doc/contributors/documentation_style.md
119
119
  - doc/contributors/index.md
120
+ - doc/contributors/upstream_requests/tab_rects.md
121
+ - doc/contributors/upstream_requests/title_rects.md
120
122
  - doc/contributors/v1.0.0_blockers.md
121
123
  - doc/custom.css
122
124
  - doc/getting_started/quickstart.md
@@ -160,6 +162,7 @@ files:
160
162
  - doc/migration/v0_7_0.md
161
163
  - doc/troubleshooting/debugging.md
162
164
  - doc/troubleshooting/terminal_limitations.md
165
+ - doc/troubleshooting/tui_output.md
163
166
  - examples/app_all_events/README.md
164
167
  - examples/app_all_events/app.rb
165
168
  - examples/app_all_events/model/app_model.rb
@@ -351,6 +354,27 @@ files:
351
354
  - lib/ratatui_ruby/test_helper.rb
352
355
  - lib/ratatui_ruby/test_helper/event_injection.rb
353
356
  - lib/ratatui_ruby/test_helper/snapshot.rb
357
+ - lib/ratatui_ruby/test_helper/snapshots/axis_labels_alignment.ansi
358
+ - lib/ratatui_ruby/test_helper/snapshots/axis_labels_alignment.txt
359
+ - lib/ratatui_ruby/test_helper/snapshots/barchart_styled_label.ansi
360
+ - lib/ratatui_ruby/test_helper/snapshots/barchart_styled_label.txt
361
+ - lib/ratatui_ruby/test_helper/snapshots/chart_rendering.ansi
362
+ - lib/ratatui_ruby/test_helper/snapshots/chart_rendering.txt
363
+ - lib/ratatui_ruby/test_helper/snapshots/half_block_marker.ansi
364
+ - lib/ratatui_ruby/test_helper/snapshots/half_block_marker.txt
365
+ - lib/ratatui_ruby/test_helper/snapshots/legend_position_bottom.ansi
366
+ - lib/ratatui_ruby/test_helper/snapshots/legend_position_bottom.txt
367
+ - lib/ratatui_ruby/test_helper/snapshots/legend_position_left.ansi
368
+ - lib/ratatui_ruby/test_helper/snapshots/legend_position_left.txt
369
+ - lib/ratatui_ruby/test_helper/snapshots/legend_position_right.ansi
370
+ - lib/ratatui_ruby/test_helper/snapshots/legend_position_right.txt
371
+ - lib/ratatui_ruby/test_helper/snapshots/legend_position_top.ansi
372
+ - lib/ratatui_ruby/test_helper/snapshots/legend_position_top.txt
373
+ - lib/ratatui_ruby/test_helper/snapshots/my_snapshot.txt
374
+ - lib/ratatui_ruby/test_helper/snapshots/styled_axis_title.ansi
375
+ - lib/ratatui_ruby/test_helper/snapshots/styled_axis_title.txt
376
+ - lib/ratatui_ruby/test_helper/snapshots/styled_dataset_name.ansi
377
+ - lib/ratatui_ruby/test_helper/snapshots/styled_dataset_name.txt
354
378
  - lib/ratatui_ruby/test_helper/style_assertions.rb
355
379
  - lib/ratatui_ruby/test_helper/terminal.rb
356
380
  - lib/ratatui_ruby/test_helper/test_doubles.rb
@@ -531,7 +555,7 @@ metadata:
531
555
  allowed_push_host: https://rubygems.org
532
556
  homepage_uri: https://sr.ht/~kerrick/ratatui_ruby/
533
557
  bug_tracker_uri: https://todo.sr.ht/~kerrick/ratatui_ruby
534
- changelog_uri: https://git.sr.ht/~kerrick/ratatui_ruby/tree/main/item/CHANGELOG.md
558
+ changelog_uri: https://git.sr.ht/~kerrick/ratatui_ruby/tree/stable/item/CHANGELOG.md
535
559
  mailing_list_uri: https://lists.sr.ht/~kerrick/ratatui_ruby-discuss
536
560
  source_code_uri: https://git.sr.ht/~kerrick/ratatui_ruby
537
561
  documentation_uri: https://git.sr.ht/~kerrick/ratatui_ruby/tree/HEAD/doc/index.md