ratatui_ruby 0.8.0 → 0.9.1
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
- data/.builds/ruby-3.2.yml +2 -2
- data/.builds/ruby-3.3.yml +2 -2
- data/.builds/ruby-3.4.yml +2 -2
- data/.builds/ruby-4.0.0.yml +2 -2
- data/.pre-commit-config.yaml +1 -1
- data/AGENTS.md +3 -3
- data/CHANGELOG.md +77 -1
- data/LICENSES/LGPL-3.0-or-later.txt +304 -0
- data/LICENSES/MIT-0.txt +16 -0
- data/README.md +33 -5
- data/Rakefile +1 -1
- data/doc/concepts/application_architecture.md +44 -3
- data/doc/concepts/application_testing.md +43 -1
- data/doc/concepts/async.md +32 -2
- data/doc/concepts/custom_widgets.md +247 -0
- data/doc/concepts/event_handling.md +32 -3
- data/doc/concepts/interactive_design.md +32 -2
- data/doc/contributors/auditing/parity.md +7 -1
- data/doc/contributors/design/ruby_frontend.md +85 -1
- data/doc/contributors/design/rust_backend.md +67 -1
- data/doc/contributors/developing_examples.md +56 -2
- data/doc/contributors/documentation_style.md +20 -3
- data/doc/contributors/future_work.md +169 -0
- data/doc/contributors/index.md +1 -1
- data/doc/contributors/v1.0.0_blockers.md +19 -185
- data/doc/getting_started/quickstart.md +22 -4
- data/doc/getting_started/why.md +1 -1
- data/doc/index.md +2 -1
- data/doc/troubleshooting/debugging.md +32 -2
- data/doc/troubleshooting/terminal_limitations.md +8 -2
- data/doc/troubleshooting/tui_output.md +42 -0
- data/examples/app_all_events/README.md +14 -2
- data/examples/app_all_events/app.rb +1 -1
- data/examples/app_all_events/model/app_model.rb +1 -1
- data/examples/app_all_events/model/event_color_cycle.rb +1 -1
- data/examples/app_all_events/model/event_entry.rb +1 -1
- data/examples/app_all_events/model/msg.rb +1 -1
- data/examples/app_all_events/model/timestamp.rb +1 -1
- data/examples/app_all_events/update.rb +1 -1
- data/examples/app_all_events/view/app_view.rb +1 -1
- data/examples/app_all_events/view/controls_view.rb +1 -1
- data/examples/app_all_events/view/counts_view.rb +1 -1
- data/examples/app_all_events/view/live_view.rb +1 -1
- data/examples/app_all_events/view/log_view.rb +1 -1
- data/examples/app_all_events/view.rb +1 -1
- data/examples/app_color_picker/README.md +20 -2
- data/examples/app_color_picker/app.rb +1 -1
- data/examples/app_color_picker/clipboard.rb +1 -1
- data/examples/app_color_picker/color.rb +1 -1
- data/examples/app_color_picker/controls.rb +1 -1
- data/examples/app_color_picker/copy_dialog.rb +1 -1
- data/examples/app_color_picker/export_pane.rb +1 -1
- data/examples/app_color_picker/harmony.rb +1 -1
- data/examples/app_color_picker/input.rb +1 -1
- data/examples/app_color_picker/main_container.rb +1 -1
- data/examples/app_color_picker/palette.rb +1 -1
- data/examples/app_login_form/README.md +8 -2
- data/examples/app_login_form/app.rb +1 -1
- data/examples/app_stateful_interaction/README.md +2 -2
- data/examples/app_stateful_interaction/app.rb +71 -17
- data/examples/timeout_demo.rb +1 -1
- data/examples/verify_quickstart_dsl/README.md +6 -0
- data/examples/verify_quickstart_dsl/app.rb +3 -3
- data/examples/verify_quickstart_layout/README.md +6 -0
- data/examples/verify_quickstart_layout/app.rb +3 -3
- data/examples/verify_quickstart_lifecycle/README.md +6 -0
- data/examples/verify_quickstart_lifecycle/app.rb +3 -3
- data/examples/verify_readme_usage/README.md +6 -0
- data/examples/verify_readme_usage/app.rb +3 -3
- data/examples/widget_barchart/README.md +6 -0
- data/examples/widget_barchart/app.rb +2 -2
- data/examples/widget_block/README.md +7 -1
- data/examples/widget_block/app.rb +2 -2
- data/examples/widget_box/README.md +6 -0
- data/examples/widget_box/app.rb +9 -6
- data/examples/widget_calendar/README.md +6 -0
- data/examples/widget_calendar/app.rb +2 -2
- data/examples/widget_canvas/README.md +4 -0
- data/examples/widget_canvas/app.rb +2 -2
- data/examples/widget_cell/README.md +6 -0
- data/examples/widget_cell/app.rb +2 -3
- data/examples/widget_center/README.md +4 -0
- data/examples/widget_center/app.rb +2 -2
- data/examples/widget_chart/README.md +6 -0
- data/examples/widget_chart/app.rb +2 -2
- data/examples/widget_gauge/README.md +6 -0
- data/examples/widget_gauge/app.rb +2 -2
- data/examples/widget_layout_split/README.md +6 -0
- data/examples/widget_layout_split/app.rb +9 -3
- data/examples/widget_line_gauge/README.md +6 -0
- data/examples/widget_line_gauge/app.rb +2 -2
- data/examples/widget_list/README.md +6 -0
- data/examples/widget_list/app.rb +2 -2
- data/examples/widget_map/README.md +8 -2
- data/examples/widget_map/app.rb +2 -2
- data/examples/widget_overlay/README.md +7 -1
- data/examples/widget_overlay/app.rb +2 -2
- data/examples/widget_popup/README.md +6 -0
- data/examples/widget_popup/app.rb +2 -2
- data/examples/widget_ratatui_logo/README.md +6 -0
- data/examples/widget_ratatui_logo/app.rb +2 -3
- data/examples/widget_ratatui_mascot/README.md +6 -0
- data/examples/widget_ratatui_mascot/app.rb +2 -2
- data/examples/widget_rect/README.md +12 -0
- data/examples/widget_rect/app.rb +40 -26
- data/examples/widget_render/README.md +6 -0
- data/examples/widget_render/app.rb +2 -2
- data/examples/widget_render/app.rbs +41 -0
- data/examples/widget_rich_text/README.md +6 -0
- data/examples/widget_rich_text/app.rb +2 -2
- data/examples/widget_scroll_text/README.md +6 -0
- data/examples/widget_scroll_text/app.rb +2 -2
- data/examples/widget_scrollbar/README.md +6 -0
- data/examples/widget_scrollbar/app.rb +2 -2
- data/examples/widget_sparkline/README.md +6 -0
- data/examples/widget_sparkline/app.rb +2 -2
- data/examples/widget_style_colors/README.md +6 -0
- data/examples/widget_style_colors/app.rb +2 -2
- data/examples/widget_table/README.md +8 -2
- data/examples/widget_table/app.rb +2 -2
- data/examples/widget_tabs/README.md +6 -0
- data/examples/widget_tabs/app.rb +2 -2
- data/examples/widget_text_width/README.md +6 -0
- data/examples/widget_text_width/app.rb +4 -4
- data/ext/ratatui_ruby/Cargo.lock +1 -1
- data/ext/ratatui_ruby/Cargo.toml +1 -1
- data/ext/ratatui_ruby/extconf.rb +2 -2
- data/ext/ratatui_ruby/src/events.rs +1 -0
- data/ext/ratatui_ruby/src/rendering.rs +1 -1
- data/ext/ratatui_ruby/src/style.rs +0 -8
- data/ext/ratatui_ruby/src/widgets/chart.rs +0 -118
- data/ext/ratatui_ruby/src/widgets/list_state.rs +36 -0
- data/lib/ratatui_ruby/buffer/cell.rb +34 -2
- data/lib/ratatui_ruby/buffer.rb +2 -2
- data/lib/ratatui_ruby/cell.rb +34 -2
- data/lib/ratatui_ruby/event/focus_gained.rb +26 -2
- data/lib/ratatui_ruby/event/focus_lost.rb +26 -2
- data/lib/ratatui_ruby/event/key/character.rb +18 -2
- data/lib/ratatui_ruby/event/key/media.rb +2 -2
- data/lib/ratatui_ruby/event/key/modifier.rb +10 -2
- data/lib/ratatui_ruby/event/key/navigation.rb +2 -2
- data/lib/ratatui_ruby/event/key/system.rb +2 -2
- data/lib/ratatui_ruby/event/key.rb +114 -2
- data/lib/ratatui_ruby/event/mouse.rb +42 -2
- data/lib/ratatui_ruby/event/none.rb +10 -2
- data/lib/ratatui_ruby/event/paste.rb +34 -2
- data/lib/ratatui_ruby/event/resize.rb +34 -2
- data/lib/ratatui_ruby/event/sync.rb +52 -0
- data/lib/ratatui_ruby/event.rb +32 -2
- data/lib/ratatui_ruby/frame.rb +74 -2
- data/lib/ratatui_ruby/layout/constraint.rb +193 -2
- data/lib/ratatui_ruby/layout/layout.rb +47 -2
- data/lib/ratatui_ruby/layout/rect.rb +403 -2
- data/lib/ratatui_ruby/layout.rb +2 -2
- data/lib/ratatui_ruby/list_state.rb +113 -2
- data/lib/ratatui_ruby/output_guard.rb +26 -3
- data/lib/ratatui_ruby/schema/bar_chart/bar.rb +2 -2
- data/lib/ratatui_ruby/schema/bar_chart/bar_group.rb +2 -2
- data/lib/ratatui_ruby/schema/bar_chart.rb +50 -2
- data/lib/ratatui_ruby/schema/block.rb +21 -15
- data/lib/ratatui_ruby/schema/calendar.rb +2 -2
- data/lib/ratatui_ruby/schema/canvas.rb +10 -2
- data/lib/ratatui_ruby/schema/center.rb +10 -2
- data/lib/ratatui_ruby/schema/chart.rb +2 -28
- data/lib/ratatui_ruby/schema/clear.rb +10 -2
- data/lib/ratatui_ruby/schema/constraint.rb +58 -2
- data/lib/ratatui_ruby/schema/cursor.rb +10 -2
- data/lib/ratatui_ruby/schema/draw.rb +10 -2
- data/lib/ratatui_ruby/schema/gauge.rb +2 -2
- data/lib/ratatui_ruby/schema/layout.rb +18 -2
- data/lib/ratatui_ruby/schema/line_gauge.rb +2 -2
- data/lib/ratatui_ruby/schema/list.rb +10 -2
- data/lib/ratatui_ruby/schema/list_item.rb +10 -2
- data/lib/ratatui_ruby/schema/overlay.rb +10 -2
- data/lib/ratatui_ruby/schema/paragraph.rb +10 -2
- data/lib/ratatui_ruby/schema/ratatui_logo.rb +2 -2
- data/lib/ratatui_ruby/schema/ratatui_mascot.rb +2 -2
- data/lib/ratatui_ruby/schema/rect.rb +58 -2
- data/lib/ratatui_ruby/schema/row.rb +10 -2
- data/lib/ratatui_ruby/schema/scrollbar.rb +2 -2
- data/lib/ratatui_ruby/schema/shape/label.rb +10 -2
- data/lib/ratatui_ruby/schema/sparkline.rb +10 -2
- data/lib/ratatui_ruby/schema/style.rb +18 -2
- data/lib/ratatui_ruby/schema/table.rb +2 -2
- data/lib/ratatui_ruby/schema/tabs.rb +2 -2
- data/lib/ratatui_ruby/schema/text.rb +34 -2
- data/lib/ratatui_ruby/scrollbar_state.rb +10 -2
- data/lib/ratatui_ruby/style/style.rb +18 -2
- data/lib/ratatui_ruby/style.rb +2 -2
- data/lib/ratatui_ruby/synthetic_events.rb +86 -0
- data/lib/ratatui_ruby/table_state.rb +10 -2
- data/lib/ratatui_ruby/terminal_lifecycle.rb +18 -3
- data/lib/ratatui_ruby/test_helper/event_injection.rb +62 -2
- data/lib/ratatui_ruby/test_helper/snapshot.rb +74 -9
- data/lib/ratatui_ruby/test_helper/style_assertions.rb +98 -2
- data/lib/ratatui_ruby/test_helper/terminal.rb +50 -2
- data/lib/ratatui_ruby/test_helper/test_doubles.rb +18 -2
- data/lib/ratatui_ruby/test_helper.rb +10 -2
- data/lib/ratatui_ruby/tui/buffer_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/canvas_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/core.rb +2 -2
- data/lib/ratatui_ruby/tui/layout_factories.rb +32 -2
- data/lib/ratatui_ruby/tui/state_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/style_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/text_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/widget_factories.rb +2 -2
- data/lib/ratatui_ruby/tui.rb +11 -3
- data/lib/ratatui_ruby/version.rb +3 -3
- data/lib/ratatui_ruby/widgets/bar_chart/bar.rb +2 -2
- data/lib/ratatui_ruby/widgets/bar_chart/bar_group.rb +2 -2
- data/lib/ratatui_ruby/widgets/bar_chart.rb +58 -2
- data/lib/ratatui_ruby/widgets/block.rb +37 -15
- data/lib/ratatui_ruby/widgets/calendar.rb +2 -2
- data/lib/ratatui_ruby/widgets/canvas.rb +10 -2
- data/lib/ratatui_ruby/widgets/cell.rb +10 -2
- data/lib/ratatui_ruby/widgets/center.rb +10 -2
- data/lib/ratatui_ruby/widgets/chart.rb +2 -28
- data/lib/ratatui_ruby/widgets/clear.rb +10 -2
- data/lib/ratatui_ruby/widgets/cursor.rb +10 -2
- data/lib/ratatui_ruby/widgets/gauge.rb +16 -2
- data/lib/ratatui_ruby/widgets/line_gauge.rb +16 -2
- data/lib/ratatui_ruby/widgets/list.rb +41 -2
- data/lib/ratatui_ruby/widgets/list_item.rb +10 -2
- data/lib/ratatui_ruby/widgets/overlay.rb +10 -2
- data/lib/ratatui_ruby/widgets/paragraph.rb +10 -2
- data/lib/ratatui_ruby/widgets/ratatui_logo.rb +2 -2
- data/lib/ratatui_ruby/widgets/ratatui_mascot.rb +2 -2
- data/lib/ratatui_ruby/widgets/row.rb +10 -2
- data/lib/ratatui_ruby/widgets/scrollbar.rb +2 -2
- data/lib/ratatui_ruby/widgets/shape/label.rb +10 -2
- data/lib/ratatui_ruby/widgets/sparkline.rb +10 -2
- data/lib/ratatui_ruby/widgets/table.rb +62 -2
- data/lib/ratatui_ruby/widgets/tabs.rb +2 -2
- data/lib/ratatui_ruby/widgets.rb +2 -2
- data/lib/ratatui_ruby.rb +101 -9
- data/sig/examples/app_all_events/view.rbs +7 -1
- data/sig/examples/app_all_events/view_state.rbs +7 -1
- data/sig/examples/app_color_picker/app.rbs +5 -0
- data/sig/examples/app_stateful_interaction/app.rbs +7 -1
- data/sig/examples/verify_quickstart_dsl/app.rbs +7 -1
- data/sig/examples/verify_quickstart_lifecycle/app.rbs +7 -1
- data/sig/examples/verify_readme_usage/app.rbs +7 -1
- data/sig/examples/widget_block_demo/app.rbs +6 -0
- data/sig/examples/widget_box_demo/app.rbs +7 -1
- data/sig/examples/widget_calendar_demo/app.rbs +7 -1
- data/sig/examples/widget_cell_demo/app.rbs +7 -1
- data/sig/examples/widget_chart_demo/app.rbs +7 -1
- data/sig/examples/widget_gauge_demo/app.rbs +7 -1
- data/sig/examples/widget_layout_split/app.rbs +7 -1
- data/sig/examples/widget_line_gauge_demo/app.rbs +7 -1
- data/sig/examples/widget_list_demo/app.rbs +5 -0
- data/sig/examples/widget_map_demo/app.rbs +7 -1
- data/sig/examples/widget_popup_demo/app.rbs +7 -1
- data/sig/examples/widget_ratatui_logo_demo/app.rbs +7 -1
- data/sig/examples/widget_ratatui_mascot_demo/app.rbs +7 -1
- data/sig/examples/widget_rect/app.rbs +7 -1
- data/sig/examples/widget_render/app.rbs +7 -1
- data/sig/examples/widget_rich_text/app.rbs +7 -1
- data/sig/examples/widget_scroll_text/app.rbs +7 -1
- data/sig/examples/widget_scrollbar_demo/app.rbs +7 -1
- data/sig/examples/widget_sparkline_demo/app.rbs +7 -1
- data/sig/examples/widget_style_colors/app.rbs +7 -1
- data/sig/examples/widget_table_demo/app.rbs +7 -1
- data/sig/examples/widget_text_width/app.rbs +7 -1
- data/sig/ratatui_ruby/event.rbs +7 -1
- data/sig/ratatui_ruby/frame.rbs +15 -3
- data/sig/ratatui_ruby/list_state.rbs +11 -1
- data/sig/ratatui_ruby/ratatui_ruby.rbs +8 -2
- data/sig/ratatui_ruby/schema/bar_chart/bar.rbs +7 -1
- data/sig/ratatui_ruby/schema/bar_chart/bar_group.rbs +6 -0
- data/sig/ratatui_ruby/schema/bar_chart.rbs +6 -0
- data/sig/ratatui_ruby/schema/block.rbs +7 -1
- data/sig/ratatui_ruby/schema/calendar.rbs +6 -0
- data/sig/ratatui_ruby/schema/canvas.rbs +6 -0
- data/sig/ratatui_ruby/schema/center.rbs +6 -0
- data/sig/ratatui_ruby/schema/chart.rbs +6 -9
- data/sig/ratatui_ruby/schema/constraint.rbs +14 -0
- data/sig/ratatui_ruby/schema/cursor.rbs +6 -0
- data/sig/ratatui_ruby/schema/draw.rbs +6 -0
- data/sig/ratatui_ruby/schema/gauge.rbs +9 -1
- data/sig/ratatui_ruby/schema/layout.rbs +6 -0
- data/sig/ratatui_ruby/schema/line_gauge.rbs +9 -1
- data/sig/ratatui_ruby/schema/list.rbs +9 -1
- data/sig/ratatui_ruby/schema/list_item.rbs +7 -1
- data/sig/ratatui_ruby/schema/overlay.rbs +6 -0
- data/sig/ratatui_ruby/schema/paragraph.rbs +6 -0
- data/sig/ratatui_ruby/schema/ratatui_logo.rbs +6 -0
- data/sig/ratatui_ruby/schema/ratatui_mascot.rbs +5 -0
- data/sig/ratatui_ruby/schema/rect.rbs +30 -0
- data/sig/ratatui_ruby/schema/row.rbs +7 -1
- data/sig/ratatui_ruby/schema/scrollbar.rbs +6 -0
- data/sig/ratatui_ruby/schema/sparkline.rbs +6 -0
- data/sig/ratatui_ruby/schema/style.rbs +7 -1
- data/sig/ratatui_ruby/schema/table.rbs +11 -1
- data/sig/ratatui_ruby/schema/tabs.rbs +6 -0
- data/sig/ratatui_ruby/schema/text.rbs +7 -1
- data/sig/ratatui_ruby/scrollbar_state.rbs +7 -1
- data/sig/ratatui_ruby/session.rbs +7 -1
- data/sig/ratatui_ruby/table_state.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/event_injection.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/snapshot.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/style_assertions.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/terminal.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/test_doubles.rbs +7 -1
- data/sig/ratatui_ruby/test_helper.rbs +7 -1
- data/sig/ratatui_ruby/tui/buffer_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/canvas_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/core.rbs +7 -1
- data/sig/ratatui_ruby/tui/layout_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/state_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/style_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/text_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/widget_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui.rbs +7 -1
- data/sig/ratatui_ruby/version.rbs +6 -0
- data/tasks/autodoc/examples.rb +1 -1
- data/tasks/autodoc/member.rb +1 -1
- data/tasks/autodoc/name.rb +1 -1
- data/tasks/bump/cargo_lockfile.rb +1 -1
- data/tasks/bump/changelog.rb +1 -1
- data/tasks/bump/header.rb +1 -1
- data/tasks/bump/history.rb +1 -1
- data/tasks/bump/links.rb +1 -1
- data/tasks/bump/manifest.rb +1 -1
- data/tasks/bump/ruby_gem.rb +1 -1
- data/tasks/bump/sem_ver.rb +1 -1
- data/tasks/bump/unreleased_section.rb +1 -1
- data/tasks/license/headers_md.rb +223 -0
- data/tasks/license/headers_rb.rb +210 -0
- data/tasks/license/license_utils.rb +130 -0
- data/tasks/license/snippets_md.rb +315 -0
- data/tasks/license/snippets_rdoc.rb +150 -0
- data/tasks/license.rake +91 -0
- data/tasks/rdoc_config.rb +1 -1
- data/tasks/resources/build.yml.erb +13 -7
- data/tasks/sourcehut.rake +3 -1
- data/tasks/terminal_preview/app_screenshot.rb +1 -1
- data/tasks/terminal_preview/crash_report.rb +1 -1
- data/tasks/terminal_preview/example_app.rb +1 -1
- data/tasks/terminal_preview/launcher_script.rb +1 -1
- data/tasks/terminal_preview/preview_collection.rb +1 -1
- data/tasks/terminal_preview/preview_timing.rb +1 -1
- data/tasks/terminal_preview/safety_confirmation.rb +1 -1
- data/tasks/terminal_preview/saved_screenshot.rb +1 -1
- data/tasks/terminal_preview/system_appearance.rb +1 -1
- data/tasks/terminal_preview/terminal_window.rb +1 -1
- data/tasks/terminal_preview/window_id.rb +1 -1
- data/tasks/website/index_page.rb +1 -1
- data/tasks/website/version.rb +1 -1
- data/tasks/website/version_menu.rb +1 -1
- data/tasks/website/versioned_documentation.rb +1 -1
- data/tasks/website/website.rb +1 -1
- metadata +15 -3
- data/doc/migration/v0_7_0.md +0 -236
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -15,6 +15,11 @@ module RatatuiRuby
|
|
|
15
15
|
#
|
|
16
16
|
# == Example
|
|
17
17
|
#
|
|
18
|
+
#--
|
|
19
|
+
# SPDX-SnippetBegin
|
|
20
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
21
|
+
# SPDX-License-Identifier: MIT-0
|
|
22
|
+
#++
|
|
18
23
|
# @table_state = RatatuiRuby::TableState.new
|
|
19
24
|
# @table_state.select(1) # Select second row
|
|
20
25
|
# @table_state.select_column(0) # Select first column
|
|
@@ -24,6 +29,9 @@ module RatatuiRuby
|
|
|
24
29
|
# frame.render_stateful_widget(table, frame.area, @table_state)
|
|
25
30
|
# end
|
|
26
31
|
#
|
|
32
|
+
#--
|
|
33
|
+
# SPDX-SnippetEnd
|
|
34
|
+
#++
|
|
27
35
|
class TableState
|
|
28
36
|
##
|
|
29
37
|
# :method: new
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
#
|
|
6
|
-
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
7
6
|
#++
|
|
8
7
|
|
|
9
8
|
module RatatuiRuby
|
|
@@ -27,6 +26,11 @@ module RatatuiRuby
|
|
|
27
26
|
#
|
|
28
27
|
# === Example
|
|
29
28
|
#
|
|
29
|
+
#--
|
|
30
|
+
# SPDX-SnippetBegin
|
|
31
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
32
|
+
# SPDX-License-Identifier: MIT-0
|
|
33
|
+
#++
|
|
30
34
|
# def log(message)
|
|
31
35
|
# if RatatuiRuby.terminal_active?
|
|
32
36
|
# @deferred_logs << message
|
|
@@ -34,6 +38,9 @@ module RatatuiRuby
|
|
|
34
38
|
# puts message
|
|
35
39
|
# end
|
|
36
40
|
# end
|
|
41
|
+
#--
|
|
42
|
+
# SPDX-SnippetEnd
|
|
43
|
+
#++
|
|
37
44
|
def terminal_active?
|
|
38
45
|
@tui_session_active
|
|
39
46
|
end
|
|
@@ -112,11 +119,19 @@ module RatatuiRuby
|
|
|
112
119
|
#
|
|
113
120
|
# === Example
|
|
114
121
|
#
|
|
122
|
+
#--
|
|
123
|
+
# SPDX-SnippetBegin
|
|
124
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
125
|
+
# SPDX-License-Identifier: MIT-0
|
|
126
|
+
#++
|
|
115
127
|
# RatatuiRuby.run(focus_events: false) do |tui|
|
|
116
128
|
# tui.draw(tui.paragraph(text: "Hi"))
|
|
117
129
|
# sleep 1
|
|
118
130
|
# end
|
|
119
131
|
#
|
|
132
|
+
#--
|
|
133
|
+
# SPDX-SnippetEnd
|
|
134
|
+
#++
|
|
120
135
|
# @raise [Error::Invariant] if headless mode is enabled
|
|
121
136
|
# @see headless!
|
|
122
137
|
def run(focus_events: true, bracketed_paste: true)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -21,6 +21,11 @@ module RatatuiRuby
|
|
|
21
21
|
#
|
|
22
22
|
# === Examples
|
|
23
23
|
#
|
|
24
|
+
#--
|
|
25
|
+
# SPDX-SnippetBegin
|
|
26
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
27
|
+
# SPDX-License-Identifier: MIT-0
|
|
28
|
+
#++
|
|
24
29
|
# with_test_terminal do
|
|
25
30
|
# inject_keys("h", "e", "l", "l", "o")
|
|
26
31
|
# inject_keys(:enter, :ctrl_s)
|
|
@@ -30,6 +35,9 @@ module RatatuiRuby
|
|
|
30
35
|
# @app.run
|
|
31
36
|
# end
|
|
32
37
|
#
|
|
38
|
+
#--
|
|
39
|
+
# SPDX-SnippetEnd
|
|
40
|
+
#++
|
|
33
41
|
module EventInjection
|
|
34
42
|
##
|
|
35
43
|
# Injects an event into the test terminal's event queue.
|
|
@@ -41,10 +49,18 @@ module RatatuiRuby
|
|
|
41
49
|
#
|
|
42
50
|
# === Examples
|
|
43
51
|
#
|
|
52
|
+
#--
|
|
53
|
+
# SPDX-SnippetBegin
|
|
54
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
55
|
+
# SPDX-License-Identifier: MIT-0
|
|
56
|
+
#++
|
|
44
57
|
# inject_event(RatatuiRuby::Event::Key.new(code: "q"))
|
|
45
58
|
# inject_event(RatatuiRuby::Event::Mouse.new(kind: "down", button: "left", x: 10, y: 5))
|
|
46
59
|
# inject_event(RatatuiRuby::Event::Paste.new(content: "Hello"))
|
|
47
60
|
#
|
|
61
|
+
#--
|
|
62
|
+
# SPDX-SnippetEnd
|
|
63
|
+
#++
|
|
48
64
|
# [event] A <tt>RatatuiRuby::Event</tt> object.
|
|
49
65
|
def inject_event(event)
|
|
50
66
|
unless @_ratatui_test_terminal_active
|
|
@@ -72,6 +88,9 @@ module RatatuiRuby
|
|
|
72
88
|
RatatuiRuby.inject_test_event("focus_gained", {})
|
|
73
89
|
when RatatuiRuby::Event::FocusLost
|
|
74
90
|
RatatuiRuby.inject_test_event("focus_lost", {})
|
|
91
|
+
when RatatuiRuby::Event::Sync
|
|
92
|
+
# Sync events use the engine-level synthetic queue
|
|
93
|
+
RatatuiRuby::SyntheticEvents.push(event)
|
|
75
94
|
else
|
|
76
95
|
raise ArgumentError, "Unknown event type: #{event.class}"
|
|
77
96
|
end
|
|
@@ -82,8 +101,16 @@ module RatatuiRuby
|
|
|
82
101
|
#
|
|
83
102
|
# === Example
|
|
84
103
|
#
|
|
104
|
+
#--
|
|
105
|
+
# SPDX-SnippetBegin
|
|
106
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
107
|
+
# SPDX-License-Identifier: MIT-0
|
|
108
|
+
#++
|
|
85
109
|
# inject_mouse(x: 10, y: 5, kind: :down, button: :left)
|
|
86
110
|
#
|
|
111
|
+
#--
|
|
112
|
+
# SPDX-SnippetEnd
|
|
113
|
+
#++
|
|
87
114
|
# [x] Integer x-coordinate.
|
|
88
115
|
# [y] Integer y-coordinate.
|
|
89
116
|
# [kind] Symbol <tt>:down</tt>, <tt>:up</tt>, or <tt>:drag</tt>.
|
|
@@ -141,10 +168,18 @@ module RatatuiRuby
|
|
|
141
168
|
#
|
|
142
169
|
# === Examples
|
|
143
170
|
#
|
|
171
|
+
#--
|
|
172
|
+
# SPDX-SnippetBegin
|
|
173
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
174
|
+
# SPDX-License-Identifier: MIT-0
|
|
175
|
+
#++
|
|
144
176
|
# inject_keys("a", "b", "c")
|
|
145
177
|
# inject_keys(:enter, :esc)
|
|
146
178
|
# inject_keys(:ctrl_c, :alt_shift_left)
|
|
147
179
|
# inject_keys("j", { code: "k", modifiers: ["ctrl"] })
|
|
180
|
+
#--
|
|
181
|
+
# SPDX-SnippetEnd
|
|
182
|
+
#++
|
|
148
183
|
def inject_keys(*args)
|
|
149
184
|
args.each do |arg|
|
|
150
185
|
event = case arg
|
|
@@ -166,6 +201,31 @@ module RatatuiRuby
|
|
|
166
201
|
end
|
|
167
202
|
end
|
|
168
203
|
alias inject_key inject_keys
|
|
204
|
+
|
|
205
|
+
##
|
|
206
|
+
# Injects a Sync event.
|
|
207
|
+
#
|
|
208
|
+
# When a runtime (Tea, Kit) encounters this event, it should wait for all
|
|
209
|
+
# pending async operations to complete before processing the next event.
|
|
210
|
+
# This enables deterministic testing of async behavior.
|
|
211
|
+
#
|
|
212
|
+
# === Example
|
|
213
|
+
#
|
|
214
|
+
#--
|
|
215
|
+
# SPDX-SnippetBegin
|
|
216
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
217
|
+
# SPDX-License-Identifier: MIT-0
|
|
218
|
+
#++
|
|
219
|
+
# inject_key("s") # Triggers async command
|
|
220
|
+
# inject_sync # Wait for command to complete
|
|
221
|
+
# inject_key(:q) # Quit after seeing results
|
|
222
|
+
#
|
|
223
|
+
#--
|
|
224
|
+
# SPDX-SnippetEnd
|
|
225
|
+
#++
|
|
226
|
+
def inject_sync
|
|
227
|
+
inject_event(RatatuiRuby::Event::Sync.new)
|
|
228
|
+
end
|
|
169
229
|
end
|
|
170
230
|
end
|
|
171
231
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
require "fileutils"
|
|
@@ -26,21 +26,42 @@ module RatatuiRuby
|
|
|
26
26
|
#
|
|
27
27
|
# Snapshots live in a <tt>snapshots/</tt> subdirectory next to your test file:
|
|
28
28
|
#
|
|
29
|
+
#--
|
|
30
|
+
# SPDX-SnippetBegin
|
|
31
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
32
|
+
# SPDX-License-Identifier: MIT-0
|
|
33
|
+
#++
|
|
29
34
|
# test/examples/my_app/test_app.rb
|
|
30
35
|
# test/examples/my_app/snapshots/initial_render.txt
|
|
31
36
|
# test/examples/my_app/snapshots/initial_render.ansi
|
|
32
37
|
#
|
|
38
|
+
#--
|
|
39
|
+
# SPDX-SnippetEnd
|
|
40
|
+
#++
|
|
33
41
|
# === Creating and Updating Snapshots
|
|
34
42
|
#
|
|
35
43
|
# Run tests with <tt>UPDATE_SNAPSHOTS=1</tt> to create or refresh snapshots:
|
|
36
44
|
#
|
|
45
|
+
#--
|
|
46
|
+
# SPDX-SnippetBegin
|
|
47
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
48
|
+
# SPDX-License-Identifier: MIT-0
|
|
49
|
+
#++
|
|
37
50
|
# UPDATE_SNAPSHOTS=1 bundle exec rake test
|
|
38
51
|
#
|
|
52
|
+
#--
|
|
53
|
+
# SPDX-SnippetEnd
|
|
54
|
+
#++
|
|
39
55
|
# === Seeding Random Data
|
|
40
56
|
#
|
|
41
57
|
# Random data (scatter plots, generated content) breaks snapshot stability.
|
|
42
58
|
# Use a seeded <tt>Random</tt> instance instead of <tt>Kernel.rand</tt>:
|
|
43
59
|
#
|
|
60
|
+
#--
|
|
61
|
+
# SPDX-SnippetBegin
|
|
62
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
63
|
+
# SPDX-License-Identifier: MIT-0
|
|
64
|
+
#++
|
|
44
65
|
# class MyApp
|
|
45
66
|
# def initialize(seed: nil)
|
|
46
67
|
# @rng = seed ? Random.new(seed) : Random.new
|
|
@@ -56,6 +77,9 @@ module RatatuiRuby
|
|
|
56
77
|
# @app = MyApp.new(seed: 42)
|
|
57
78
|
# end
|
|
58
79
|
#
|
|
80
|
+
#--
|
|
81
|
+
# SPDX-SnippetEnd
|
|
82
|
+
#++
|
|
59
83
|
# For libraries like Faker, see their docs on deterministic random:
|
|
60
84
|
# https://github.com/faker-ruby/faker#deterministic-random
|
|
61
85
|
#
|
|
@@ -63,10 +87,18 @@ module RatatuiRuby
|
|
|
63
87
|
#
|
|
64
88
|
# Mask dynamic content (timestamps, IDs) with a normalization block:
|
|
65
89
|
#
|
|
90
|
+
#--
|
|
91
|
+
# SPDX-SnippetBegin
|
|
92
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
93
|
+
# SPDX-License-Identifier: MIT-0
|
|
94
|
+
#++
|
|
66
95
|
# assert_snapshots("dashboard") do |lines|
|
|
67
96
|
# lines.map { |l| l.gsub(/\d{4}-\d{2}-\d{2}/, "YYYY-MM-DD") }
|
|
68
97
|
# end
|
|
69
98
|
#
|
|
99
|
+
#--
|
|
100
|
+
# SPDX-SnippetEnd
|
|
101
|
+
#++
|
|
70
102
|
module Snapshot
|
|
71
103
|
##
|
|
72
104
|
# Asserts that the current screen content matches a stored plain text snapshot.
|
|
@@ -78,6 +110,11 @@ module RatatuiRuby
|
|
|
78
110
|
# Plain text snapshots are human-readable when viewed in any editor or diff tool. They
|
|
79
111
|
# pair well with rich snapshots for documentation. Use <tt>assert_snapshots</tt> to generate both.
|
|
80
112
|
#
|
|
113
|
+
#--
|
|
114
|
+
# SPDX-SnippetBegin
|
|
115
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
116
|
+
# SPDX-License-Identifier: MIT-0
|
|
117
|
+
#++
|
|
81
118
|
# assert_plain_snapshot("login_screen")
|
|
82
119
|
# # Compares against: test/snapshots/login_screen.txt
|
|
83
120
|
#
|
|
@@ -86,6 +123,9 @@ module RatatuiRuby
|
|
|
86
123
|
# actual.map { |l| l.gsub(/\d{2}:\d{2}/, "XX:XX") }
|
|
87
124
|
# end
|
|
88
125
|
#
|
|
126
|
+
#--
|
|
127
|
+
# SPDX-SnippetEnd
|
|
128
|
+
#++
|
|
89
129
|
# [name] String name of the snapshot (without extension).
|
|
90
130
|
# [msg] String optional failure message.
|
|
91
131
|
def assert_plain_snapshot(name, msg = nil, snapshot_dir: nil, &)
|
|
@@ -96,13 +136,6 @@ module RatatuiRuby
|
|
|
96
136
|
assert_screen_matches(snapshot_path, msg, &)
|
|
97
137
|
end
|
|
98
138
|
|
|
99
|
-
##
|
|
100
|
-
# @deprecated Use {#assert_plain_snapshot} instead.
|
|
101
|
-
def assert_snapshot(name, msg = nil, &)
|
|
102
|
-
warn "assert_snapshot is deprecated; use assert_plain_snapshot instead", uplevel: 1
|
|
103
|
-
assert_plain_snapshot(name, msg, &)
|
|
104
|
-
end
|
|
105
|
-
|
|
106
139
|
##
|
|
107
140
|
# Asserts that the current screen content matches the expected content.
|
|
108
141
|
#
|
|
@@ -117,6 +150,11 @@ module RatatuiRuby
|
|
|
117
150
|
#
|
|
118
151
|
# == Usage
|
|
119
152
|
#
|
|
153
|
+
#--
|
|
154
|
+
# SPDX-SnippetBegin
|
|
155
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
156
|
+
# SPDX-License-Identifier: MIT-0
|
|
157
|
+
#++
|
|
120
158
|
# # Direct comparison
|
|
121
159
|
# assert_screen_matches(["Line 1", "Line 2"])
|
|
122
160
|
#
|
|
@@ -128,6 +166,9 @@ module RatatuiRuby
|
|
|
128
166
|
# lines.map { |l| l.gsub(/User ID: \d+/, "User ID: XXX") }
|
|
129
167
|
# end
|
|
130
168
|
#
|
|
169
|
+
#--
|
|
170
|
+
# SPDX-SnippetEnd
|
|
171
|
+
#++
|
|
131
172
|
# [expected] String (file path) or Array<String> (content).
|
|
132
173
|
# [msg] String optional failure message.
|
|
133
174
|
#
|
|
@@ -204,6 +245,11 @@ module RatatuiRuby
|
|
|
204
245
|
# The <tt>.ansi</tt> snapshot files contain ANSI escape codes. You can <tt>cat</tt> them in a terminal
|
|
205
246
|
# to see exactly what the screen looked like.
|
|
206
247
|
#
|
|
248
|
+
#--
|
|
249
|
+
# SPDX-SnippetBegin
|
|
250
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
251
|
+
# SPDX-License-Identifier: MIT-0
|
|
252
|
+
#++
|
|
207
253
|
# assert_rich_snapshot("login_screen")
|
|
208
254
|
# # Compares against: test/snapshots/login_screen.ansi
|
|
209
255
|
#
|
|
@@ -212,6 +258,9 @@ module RatatuiRuby
|
|
|
212
258
|
# lines.map { |l| l.gsub(/\d{2}:\d{2}:\d{2}/, "HH:MM:SS") }
|
|
213
259
|
# end
|
|
214
260
|
#
|
|
261
|
+
#--
|
|
262
|
+
# SPDX-SnippetEnd
|
|
263
|
+
#++
|
|
215
264
|
# [name] String snapshot name.
|
|
216
265
|
# [msg] String optional failure message.
|
|
217
266
|
def assert_rich_snapshot(name, msg = nil, snapshot_dir: nil)
|
|
@@ -277,6 +326,11 @@ module RatatuiRuby
|
|
|
277
326
|
# human-readable in any editor or diff tool, making them valuable for documentation and
|
|
278
327
|
# code review. Together, they provide comprehensive coverage and discoverability.
|
|
279
328
|
#
|
|
329
|
+
#--
|
|
330
|
+
# SPDX-SnippetBegin
|
|
331
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
332
|
+
# SPDX-License-Identifier: MIT-0
|
|
333
|
+
#++
|
|
280
334
|
# assert_snapshots("login_screen")
|
|
281
335
|
# # Creates/compares: snapshots/login_screen.txt AND snapshots/login_screen.ansi
|
|
282
336
|
#
|
|
@@ -285,6 +339,9 @@ module RatatuiRuby
|
|
|
285
339
|
# lines.map { |l| l.gsub(/\d{2}:\d{2}:\d{2}/, "HH:MM:SS") }
|
|
286
340
|
# end
|
|
287
341
|
#
|
|
342
|
+
#--
|
|
343
|
+
# SPDX-SnippetEnd
|
|
344
|
+
#++
|
|
288
345
|
# [name] String snapshot name (without extension).
|
|
289
346
|
# [msg] String optional failure message.
|
|
290
347
|
def assert_snapshots(name, msg = nil, &)
|
|
@@ -304,6 +361,11 @@ module RatatuiRuby
|
|
|
304
361
|
#
|
|
305
362
|
# === Example
|
|
306
363
|
#
|
|
364
|
+
#--
|
|
365
|
+
# SPDX-SnippetBegin
|
|
366
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
367
|
+
# SPDX-License-Identifier: MIT-0
|
|
368
|
+
#++
|
|
307
369
|
# with_test_terminal(80, 25) do
|
|
308
370
|
# RatatuiRuby.run do |tui|
|
|
309
371
|
# tui.draw tui.paragraph(text: "Hello", block: tui.block(title: "Test"))
|
|
@@ -313,6 +375,9 @@ module RatatuiRuby
|
|
|
313
375
|
# puts ansi_output # Shows styled output with escape codes
|
|
314
376
|
# end
|
|
315
377
|
#
|
|
378
|
+
#--
|
|
379
|
+
# SPDX-SnippetEnd
|
|
380
|
+
#++
|
|
316
381
|
def render_rich_buffer
|
|
317
382
|
_render_buffer_with_ansi
|
|
318
383
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -21,6 +21,11 @@ module RatatuiRuby
|
|
|
21
21
|
#
|
|
22
22
|
# === Examples
|
|
23
23
|
#
|
|
24
|
+
#--
|
|
25
|
+
# SPDX-SnippetBegin
|
|
26
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
27
|
+
# SPDX-License-Identifier: MIT-0
|
|
28
|
+
#++
|
|
24
29
|
# # Single cell
|
|
25
30
|
# assert_cell_style(0, 0, fg: :red, modifiers: [:bold])
|
|
26
31
|
#
|
|
@@ -30,14 +35,25 @@ module RatatuiRuby
|
|
|
30
35
|
# # Entire header region
|
|
31
36
|
# assert_area_style({ x: 0, y: 0, w: 80, h: 1 }, bg: :blue)
|
|
32
37
|
#
|
|
38
|
+
#--
|
|
39
|
+
# SPDX-SnippetEnd
|
|
40
|
+
#++
|
|
33
41
|
module StyleAssertions
|
|
34
42
|
##
|
|
35
43
|
# Asserts that a cell has the expected style attributes.
|
|
36
44
|
#
|
|
37
45
|
# === Example
|
|
38
46
|
#
|
|
47
|
+
#--
|
|
48
|
+
# SPDX-SnippetBegin
|
|
49
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
50
|
+
# SPDX-License-Identifier: MIT-0
|
|
51
|
+
#++
|
|
39
52
|
# assert_cell_style(0, 0, char: "H", fg: :red)
|
|
40
53
|
#
|
|
54
|
+
#--
|
|
55
|
+
# SPDX-SnippetEnd
|
|
56
|
+
#++
|
|
41
57
|
# [x] Integer x-coordinate.
|
|
42
58
|
# [y] Integer y-coordinate.
|
|
43
59
|
# [expected_attributes] Hash of attribute names to expected values.
|
|
@@ -60,10 +76,18 @@ module RatatuiRuby
|
|
|
60
76
|
#
|
|
61
77
|
# === Examples
|
|
62
78
|
#
|
|
79
|
+
#--
|
|
80
|
+
# SPDX-SnippetBegin
|
|
81
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
82
|
+
# SPDX-License-Identifier: MIT-0
|
|
83
|
+
#++
|
|
63
84
|
# assert_color(:red, x: 10, y: 5)
|
|
64
85
|
# assert_color(5, x: 10, y: 5, layer: :bg)
|
|
65
86
|
# assert_color("#ff00ff", x: 10, y: 5)
|
|
66
87
|
#
|
|
88
|
+
#--
|
|
89
|
+
# SPDX-SnippetEnd
|
|
90
|
+
#++
|
|
67
91
|
# [expected] Symbol, Integer, or String (hex).
|
|
68
92
|
# [x] Integer x-coordinate.
|
|
69
93
|
# [y] Integer y-coordinate.
|
|
@@ -88,11 +112,19 @@ module RatatuiRuby
|
|
|
88
112
|
#
|
|
89
113
|
# === Examples
|
|
90
114
|
#
|
|
115
|
+
#--
|
|
116
|
+
# SPDX-SnippetBegin
|
|
117
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
118
|
+
# SPDX-License-Identifier: MIT-0
|
|
119
|
+
#++
|
|
91
120
|
# header = RatatuiRuby::Layout::Rect.new(x: 0, y: 0, width: 80, height: 1)
|
|
92
121
|
# assert_area_style(header, bg: :blue, modifiers: [:bold])
|
|
93
122
|
#
|
|
94
123
|
# assert_area_style({ x: 0, y: 0, w: 10, h: 1 }, fg: :red)
|
|
95
124
|
#
|
|
125
|
+
#--
|
|
126
|
+
# SPDX-SnippetEnd
|
|
127
|
+
#++
|
|
96
128
|
# [area] Rect-like object or Hash with x, y, width/w, height/h.
|
|
97
129
|
# [attributes] Style attributes to verify.
|
|
98
130
|
def assert_area_style(area, **attributes)
|
|
@@ -122,8 +154,16 @@ module RatatuiRuby
|
|
|
122
154
|
#
|
|
123
155
|
# === Example
|
|
124
156
|
#
|
|
157
|
+
#--
|
|
158
|
+
# SPDX-SnippetBegin
|
|
159
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
160
|
+
# SPDX-License-Identifier: MIT-0
|
|
161
|
+
#++
|
|
125
162
|
# assert_fg_color(:yellow, 0, 2)
|
|
126
163
|
#
|
|
164
|
+
#--
|
|
165
|
+
# SPDX-SnippetEnd
|
|
166
|
+
#++
|
|
127
167
|
# [expected] Symbol, Integer, or String (hex).
|
|
128
168
|
# [x] Integer x-coordinate.
|
|
129
169
|
# [y] Integer y-coordinate.
|
|
@@ -139,8 +179,16 @@ module RatatuiRuby
|
|
|
139
179
|
#
|
|
140
180
|
# === Example
|
|
141
181
|
#
|
|
182
|
+
#--
|
|
183
|
+
# SPDX-SnippetBegin
|
|
184
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
185
|
+
# SPDX-License-Identifier: MIT-0
|
|
186
|
+
#++
|
|
142
187
|
# assert_bg_color(:blue, 0, 2)
|
|
143
188
|
#
|
|
189
|
+
#--
|
|
190
|
+
# SPDX-SnippetEnd
|
|
191
|
+
#++
|
|
144
192
|
# [expected] Symbol, Integer, or String (hex).
|
|
145
193
|
# [x] Integer x-coordinate.
|
|
146
194
|
# [y] Integer y-coordinate.
|
|
@@ -154,8 +202,16 @@ module RatatuiRuby
|
|
|
154
202
|
#
|
|
155
203
|
# === Example
|
|
156
204
|
#
|
|
205
|
+
#--
|
|
206
|
+
# SPDX-SnippetBegin
|
|
207
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
208
|
+
# SPDX-License-Identifier: MIT-0
|
|
209
|
+
#++
|
|
157
210
|
# assert_bold(0, 2)
|
|
158
211
|
#
|
|
212
|
+
#--
|
|
213
|
+
# SPDX-SnippetEnd
|
|
214
|
+
#++
|
|
159
215
|
# [x] Integer x-coordinate.
|
|
160
216
|
# [y] Integer y-coordinate.
|
|
161
217
|
def assert_bold(x, y)
|
|
@@ -170,8 +226,16 @@ module RatatuiRuby
|
|
|
170
226
|
#
|
|
171
227
|
# === Example
|
|
172
228
|
#
|
|
229
|
+
#--
|
|
230
|
+
# SPDX-SnippetBegin
|
|
231
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
232
|
+
# SPDX-License-Identifier: MIT-0
|
|
233
|
+
#++
|
|
173
234
|
# assert_italic(0, 2)
|
|
174
235
|
#
|
|
236
|
+
#--
|
|
237
|
+
# SPDX-SnippetEnd
|
|
238
|
+
#++
|
|
175
239
|
# [x] Integer x-coordinate.
|
|
176
240
|
# [y] Integer y-coordinate.
|
|
177
241
|
def assert_italic(x, y)
|
|
@@ -186,8 +250,16 @@ module RatatuiRuby
|
|
|
186
250
|
#
|
|
187
251
|
# === Example
|
|
188
252
|
#
|
|
253
|
+
#--
|
|
254
|
+
# SPDX-SnippetBegin
|
|
255
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
256
|
+
# SPDX-License-Identifier: MIT-0
|
|
257
|
+
#++
|
|
189
258
|
# assert_underlined(0, 2)
|
|
190
259
|
#
|
|
260
|
+
#--
|
|
261
|
+
# SPDX-SnippetEnd
|
|
262
|
+
#++
|
|
191
263
|
# [x] Integer x-coordinate.
|
|
192
264
|
# [y] Integer y-coordinate.
|
|
193
265
|
def assert_underlined(x, y)
|
|
@@ -203,8 +275,16 @@ module RatatuiRuby
|
|
|
203
275
|
#
|
|
204
276
|
# === Example
|
|
205
277
|
#
|
|
278
|
+
#--
|
|
279
|
+
# SPDX-SnippetBegin
|
|
280
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
281
|
+
# SPDX-License-Identifier: MIT-0
|
|
282
|
+
#++
|
|
206
283
|
# assert_dim(0, 2)
|
|
207
284
|
#
|
|
285
|
+
#--
|
|
286
|
+
# SPDX-SnippetEnd
|
|
287
|
+
#++
|
|
208
288
|
# [x] Integer x-coordinate.
|
|
209
289
|
# [y] Integer y-coordinate.
|
|
210
290
|
def assert_dim(x, y)
|
|
@@ -219,8 +299,16 @@ module RatatuiRuby
|
|
|
219
299
|
#
|
|
220
300
|
# === Example
|
|
221
301
|
#
|
|
302
|
+
#--
|
|
303
|
+
# SPDX-SnippetBegin
|
|
304
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
305
|
+
# SPDX-License-Identifier: MIT-0
|
|
306
|
+
#++
|
|
222
307
|
# assert_reversed(0, 2)
|
|
223
308
|
#
|
|
309
|
+
#--
|
|
310
|
+
# SPDX-SnippetEnd
|
|
311
|
+
#++
|
|
224
312
|
# [x] Integer x-coordinate.
|
|
225
313
|
# [y] Integer y-coordinate.
|
|
226
314
|
def assert_reversed(x, y)
|
|
@@ -237,8 +325,16 @@ module RatatuiRuby
|
|
|
237
325
|
#
|
|
238
326
|
# === Example
|
|
239
327
|
#
|
|
328
|
+
#--
|
|
329
|
+
# SPDX-SnippetBegin
|
|
330
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
331
|
+
# SPDX-License-Identifier: MIT-0
|
|
332
|
+
#++
|
|
240
333
|
# assert_crossed_out(0, 2)
|
|
241
334
|
#
|
|
335
|
+
#--
|
|
336
|
+
# SPDX-SnippetEnd
|
|
337
|
+
#++
|
|
242
338
|
# [x] Integer x-coordinate.
|
|
243
339
|
# [y] Integer y-coordinate.
|
|
244
340
|
def assert_crossed_out(x, y)
|