ratatui_ruby 0.8.0 → 0.9.0
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 +53 -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 +15 -175
- 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 +3 -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/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.rb +26 -2
- data/lib/ratatui_ruby/frame.rb +74 -2
- data/lib/ratatui_ruby/layout/constraint.rb +58 -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/table_state.rb +10 -2
- data/lib/ratatui_ruby/terminal_lifecycle.rb +18 -3
- data/lib/ratatui_ruby/test_helper/event_injection.rb +34 -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 +90 -2
- 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 +6 -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 +13 -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
|
|
@@ -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
|
|
@@ -82,8 +98,16 @@ module RatatuiRuby
|
|
|
82
98
|
#
|
|
83
99
|
# === Example
|
|
84
100
|
#
|
|
101
|
+
#--
|
|
102
|
+
# SPDX-SnippetBegin
|
|
103
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
104
|
+
# SPDX-License-Identifier: MIT-0
|
|
105
|
+
#++
|
|
85
106
|
# inject_mouse(x: 10, y: 5, kind: :down, button: :left)
|
|
86
107
|
#
|
|
108
|
+
#--
|
|
109
|
+
# SPDX-SnippetEnd
|
|
110
|
+
#++
|
|
87
111
|
# [x] Integer x-coordinate.
|
|
88
112
|
# [y] Integer y-coordinate.
|
|
89
113
|
# [kind] Symbol <tt>:down</tt>, <tt>:up</tt>, or <tt>:drag</tt>.
|
|
@@ -141,10 +165,18 @@ module RatatuiRuby
|
|
|
141
165
|
#
|
|
142
166
|
# === Examples
|
|
143
167
|
#
|
|
168
|
+
#--
|
|
169
|
+
# SPDX-SnippetBegin
|
|
170
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
171
|
+
# SPDX-License-Identifier: MIT-0
|
|
172
|
+
#++
|
|
144
173
|
# inject_keys("a", "b", "c")
|
|
145
174
|
# inject_keys(:enter, :esc)
|
|
146
175
|
# inject_keys(:ctrl_c, :alt_shift_left)
|
|
147
176
|
# inject_keys("j", { code: "k", modifiers: ["ctrl"] })
|
|
177
|
+
#--
|
|
178
|
+
# SPDX-SnippetEnd
|
|
179
|
+
#++
|
|
148
180
|
def inject_keys(*args)
|
|
149
181
|
args.each do |arg|
|
|
150
182
|
event = case arg
|
|
@@ -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)
|
|
@@ -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 "timeout"
|
|
@@ -23,6 +23,11 @@ module RatatuiRuby
|
|
|
23
23
|
#
|
|
24
24
|
# === Example
|
|
25
25
|
#
|
|
26
|
+
#--
|
|
27
|
+
# SPDX-SnippetBegin
|
|
28
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
29
|
+
# SPDX-License-Identifier: MIT-0
|
|
30
|
+
#++
|
|
26
31
|
# class MyTest < Minitest::Test
|
|
27
32
|
# include RatatuiRuby::TestHelper
|
|
28
33
|
#
|
|
@@ -33,6 +38,9 @@ module RatatuiRuby
|
|
|
33
38
|
# end
|
|
34
39
|
# end
|
|
35
40
|
# end
|
|
41
|
+
#--
|
|
42
|
+
# SPDX-SnippetEnd
|
|
43
|
+
#++
|
|
36
44
|
module Terminal
|
|
37
45
|
##
|
|
38
46
|
# Initializes a test terminal context with specified dimensions.
|
|
@@ -44,9 +52,17 @@ module RatatuiRuby
|
|
|
44
52
|
#
|
|
45
53
|
# === Example
|
|
46
54
|
#
|
|
55
|
+
#--
|
|
56
|
+
# SPDX-SnippetBegin
|
|
57
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
58
|
+
# SPDX-License-Identifier: MIT-0
|
|
59
|
+
#++
|
|
47
60
|
# with_test_terminal(120, 40) do
|
|
48
61
|
# # render and test your app
|
|
49
62
|
# end
|
|
63
|
+
#--
|
|
64
|
+
# SPDX-SnippetEnd
|
|
65
|
+
#++
|
|
50
66
|
def with_test_terminal(width = 80, height = 24, **opts)
|
|
51
67
|
# Defensive cleanup: reset any stale session state from previous test failures
|
|
52
68
|
RatatuiRuby.instance_variable_set(:@tui_session_active, false)
|
|
@@ -80,8 +96,16 @@ module RatatuiRuby
|
|
|
80
96
|
#
|
|
81
97
|
# === Example
|
|
82
98
|
#
|
|
99
|
+
#--
|
|
100
|
+
# SPDX-SnippetBegin
|
|
101
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
102
|
+
# SPDX-License-Identifier: MIT-0
|
|
103
|
+
#++
|
|
83
104
|
# buffer_content
|
|
84
105
|
# # => ["Row 1 text", "Row 2 text", ...]
|
|
106
|
+
#--
|
|
107
|
+
# SPDX-SnippetEnd
|
|
108
|
+
#++
|
|
85
109
|
def buffer_content
|
|
86
110
|
RatatuiRuby.get_buffer_content.split("\n")
|
|
87
111
|
end
|
|
@@ -91,8 +115,16 @@ module RatatuiRuby
|
|
|
91
115
|
#
|
|
92
116
|
# === Example
|
|
93
117
|
#
|
|
118
|
+
#--
|
|
119
|
+
# SPDX-SnippetBegin
|
|
120
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
121
|
+
# SPDX-License-Identifier: MIT-0
|
|
122
|
+
#++
|
|
94
123
|
# cursor_position
|
|
95
124
|
# # => { x: 0, y: 0 }
|
|
125
|
+
#--
|
|
126
|
+
# SPDX-SnippetEnd
|
|
127
|
+
#++
|
|
96
128
|
def cursor_position
|
|
97
129
|
x, y = RatatuiRuby.get_cursor_position
|
|
98
130
|
{ x:, y: }
|
|
@@ -108,8 +140,16 @@ module RatatuiRuby
|
|
|
108
140
|
#
|
|
109
141
|
# === Example
|
|
110
142
|
#
|
|
143
|
+
#--
|
|
144
|
+
# SPDX-SnippetBegin
|
|
145
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
146
|
+
# SPDX-License-Identifier: MIT-0
|
|
147
|
+
#++
|
|
111
148
|
# get_cell(0, 0)
|
|
112
149
|
# # => { "symbol" => "H", "fg" => :red, "bg" => nil }
|
|
150
|
+
#--
|
|
151
|
+
# SPDX-SnippetEnd
|
|
152
|
+
#++
|
|
113
153
|
def get_cell(x, y)
|
|
114
154
|
RatatuiRuby.get_cell_at(x, y)
|
|
115
155
|
end
|
|
@@ -120,10 +160,18 @@ module RatatuiRuby
|
|
|
120
160
|
#
|
|
121
161
|
# === Example
|
|
122
162
|
#
|
|
163
|
+
#--
|
|
164
|
+
# SPDX-SnippetBegin
|
|
165
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
166
|
+
# SPDX-License-Identifier: MIT-0
|
|
167
|
+
#++
|
|
123
168
|
# with_test_terminal do
|
|
124
169
|
# MyApp.new.render
|
|
125
170
|
# print_buffer # see exactly what would display
|
|
126
171
|
# end
|
|
172
|
+
#--
|
|
173
|
+
# SPDX-SnippetEnd
|
|
174
|
+
#++
|
|
127
175
|
def print_buffer
|
|
128
176
|
puts _render_buffer_with_ansi
|
|
129
177
|
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,12 +21,20 @@ module RatatuiRuby
|
|
|
21
21
|
#
|
|
22
22
|
# === Example
|
|
23
23
|
#
|
|
24
|
+
#--
|
|
25
|
+
# SPDX-SnippetBegin
|
|
26
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
27
|
+
# SPDX-License-Identifier: MIT-0
|
|
28
|
+
#++
|
|
24
29
|
# frame = MockFrame.new
|
|
25
30
|
# area = StubRect.new(width: 60, height: 20)
|
|
26
31
|
# MyView.new.call(state, tui, frame, area)
|
|
27
32
|
#
|
|
28
33
|
# widget = frame.rendered_widgets.first[:widget]
|
|
29
34
|
# assert_equal "Dashboard", widget.block.title
|
|
35
|
+
#--
|
|
36
|
+
# SPDX-SnippetEnd
|
|
37
|
+
#++
|
|
30
38
|
module TestDoubles
|
|
31
39
|
##
|
|
32
40
|
# Mock frame for view tests.
|
|
@@ -35,10 +43,18 @@ module RatatuiRuby
|
|
|
35
43
|
#
|
|
36
44
|
# === Example
|
|
37
45
|
#
|
|
46
|
+
#--
|
|
47
|
+
# SPDX-SnippetBegin
|
|
48
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
49
|
+
# SPDX-License-Identifier: MIT-0
|
|
50
|
+
#++
|
|
38
51
|
# frame = MockFrame.new
|
|
39
52
|
# View::Log.new.call(state, tui, frame, area)
|
|
40
53
|
# widget = frame.rendered_widgets.first[:widget]
|
|
41
54
|
# assert_equal "Event Log", widget.block.title
|
|
55
|
+
#--
|
|
56
|
+
# SPDX-SnippetEnd
|
|
57
|
+
#++
|
|
42
58
|
MockFrame = Data.define(:rendered_widgets) do
|
|
43
59
|
def initialize(rendered_widgets: [])
|
|
44
60
|
super
|
|
@@ -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"
|
|
@@ -33,6 +33,11 @@ module RatatuiRuby
|
|
|
33
33
|
#
|
|
34
34
|
# == Example
|
|
35
35
|
#
|
|
36
|
+
#--
|
|
37
|
+
# SPDX-SnippetBegin
|
|
38
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
39
|
+
# SPDX-License-Identifier: MIT-0
|
|
40
|
+
#++
|
|
36
41
|
# require "ratatui_ruby/test_helper"
|
|
37
42
|
#
|
|
38
43
|
# class TestMyApp < Minitest::Test
|
|
@@ -83,6 +88,9 @@ module RatatuiRuby
|
|
|
83
88
|
# assert_equal "Dashboard", widget.block.title
|
|
84
89
|
# end
|
|
85
90
|
# end
|
|
91
|
+
#--
|
|
92
|
+
# SPDX-SnippetEnd
|
|
93
|
+
#++
|
|
86
94
|
module TestHelper
|
|
87
95
|
include Terminal
|
|
88
96
|
include Snapshot
|