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.
Files changed (352) hide show
  1. checksums.yaml +4 -4
  2. data/.builds/ruby-3.2.yml +2 -2
  3. data/.builds/ruby-3.3.yml +2 -2
  4. data/.builds/ruby-3.4.yml +2 -2
  5. data/.builds/ruby-4.0.0.yml +2 -2
  6. data/.pre-commit-config.yaml +1 -1
  7. data/AGENTS.md +3 -3
  8. data/CHANGELOG.md +53 -1
  9. data/LICENSES/LGPL-3.0-or-later.txt +304 -0
  10. data/LICENSES/MIT-0.txt +16 -0
  11. data/README.md +33 -5
  12. data/Rakefile +1 -1
  13. data/doc/concepts/application_architecture.md +44 -3
  14. data/doc/concepts/application_testing.md +43 -1
  15. data/doc/concepts/async.md +32 -2
  16. data/doc/concepts/custom_widgets.md +247 -0
  17. data/doc/concepts/event_handling.md +32 -3
  18. data/doc/concepts/interactive_design.md +32 -2
  19. data/doc/contributors/auditing/parity.md +7 -1
  20. data/doc/contributors/design/ruby_frontend.md +85 -1
  21. data/doc/contributors/design/rust_backend.md +67 -1
  22. data/doc/contributors/developing_examples.md +56 -2
  23. data/doc/contributors/documentation_style.md +20 -3
  24. data/doc/contributors/future_work.md +169 -0
  25. data/doc/contributors/index.md +1 -1
  26. data/doc/contributors/v1.0.0_blockers.md +15 -175
  27. data/doc/getting_started/quickstart.md +22 -4
  28. data/doc/getting_started/why.md +1 -1
  29. data/doc/index.md +2 -1
  30. data/doc/troubleshooting/debugging.md +32 -2
  31. data/doc/troubleshooting/terminal_limitations.md +8 -2
  32. data/doc/troubleshooting/tui_output.md +42 -0
  33. data/examples/app_all_events/README.md +14 -2
  34. data/examples/app_all_events/app.rb +1 -1
  35. data/examples/app_all_events/model/app_model.rb +1 -1
  36. data/examples/app_all_events/model/event_color_cycle.rb +1 -1
  37. data/examples/app_all_events/model/event_entry.rb +1 -1
  38. data/examples/app_all_events/model/msg.rb +1 -1
  39. data/examples/app_all_events/model/timestamp.rb +1 -1
  40. data/examples/app_all_events/update.rb +1 -1
  41. data/examples/app_all_events/view/app_view.rb +1 -1
  42. data/examples/app_all_events/view/controls_view.rb +1 -1
  43. data/examples/app_all_events/view/counts_view.rb +1 -1
  44. data/examples/app_all_events/view/live_view.rb +1 -1
  45. data/examples/app_all_events/view/log_view.rb +1 -1
  46. data/examples/app_all_events/view.rb +1 -1
  47. data/examples/app_color_picker/README.md +20 -2
  48. data/examples/app_color_picker/app.rb +1 -1
  49. data/examples/app_color_picker/clipboard.rb +1 -1
  50. data/examples/app_color_picker/color.rb +1 -1
  51. data/examples/app_color_picker/controls.rb +1 -1
  52. data/examples/app_color_picker/copy_dialog.rb +1 -1
  53. data/examples/app_color_picker/export_pane.rb +1 -1
  54. data/examples/app_color_picker/harmony.rb +1 -1
  55. data/examples/app_color_picker/input.rb +1 -1
  56. data/examples/app_color_picker/main_container.rb +1 -1
  57. data/examples/app_color_picker/palette.rb +1 -1
  58. data/examples/app_login_form/README.md +8 -2
  59. data/examples/app_login_form/app.rb +1 -1
  60. data/examples/app_stateful_interaction/README.md +2 -2
  61. data/examples/app_stateful_interaction/app.rb +71 -17
  62. data/examples/timeout_demo.rb +1 -1
  63. data/examples/verify_quickstart_dsl/README.md +6 -0
  64. data/examples/verify_quickstart_dsl/app.rb +3 -3
  65. data/examples/verify_quickstart_layout/README.md +6 -0
  66. data/examples/verify_quickstart_layout/app.rb +3 -3
  67. data/examples/verify_quickstart_lifecycle/README.md +6 -0
  68. data/examples/verify_quickstart_lifecycle/app.rb +3 -3
  69. data/examples/verify_readme_usage/README.md +6 -0
  70. data/examples/verify_readme_usage/app.rb +3 -3
  71. data/examples/widget_barchart/README.md +6 -0
  72. data/examples/widget_barchart/app.rb +2 -2
  73. data/examples/widget_block/README.md +7 -1
  74. data/examples/widget_block/app.rb +2 -2
  75. data/examples/widget_box/README.md +6 -0
  76. data/examples/widget_box/app.rb +9 -6
  77. data/examples/widget_calendar/README.md +6 -0
  78. data/examples/widget_calendar/app.rb +2 -2
  79. data/examples/widget_canvas/README.md +4 -0
  80. data/examples/widget_canvas/app.rb +2 -2
  81. data/examples/widget_cell/README.md +6 -0
  82. data/examples/widget_cell/app.rb +2 -3
  83. data/examples/widget_center/README.md +4 -0
  84. data/examples/widget_center/app.rb +2 -2
  85. data/examples/widget_chart/README.md +6 -0
  86. data/examples/widget_chart/app.rb +2 -2
  87. data/examples/widget_gauge/README.md +6 -0
  88. data/examples/widget_gauge/app.rb +2 -2
  89. data/examples/widget_layout_split/README.md +6 -0
  90. data/examples/widget_layout_split/app.rb +3 -3
  91. data/examples/widget_line_gauge/README.md +6 -0
  92. data/examples/widget_line_gauge/app.rb +2 -2
  93. data/examples/widget_list/README.md +6 -0
  94. data/examples/widget_list/app.rb +2 -2
  95. data/examples/widget_map/README.md +8 -2
  96. data/examples/widget_map/app.rb +2 -2
  97. data/examples/widget_overlay/README.md +7 -1
  98. data/examples/widget_overlay/app.rb +2 -2
  99. data/examples/widget_popup/README.md +6 -0
  100. data/examples/widget_popup/app.rb +2 -2
  101. data/examples/widget_ratatui_logo/README.md +6 -0
  102. data/examples/widget_ratatui_logo/app.rb +2 -3
  103. data/examples/widget_ratatui_mascot/README.md +6 -0
  104. data/examples/widget_ratatui_mascot/app.rb +2 -2
  105. data/examples/widget_rect/README.md +12 -0
  106. data/examples/widget_rect/app.rb +40 -26
  107. data/examples/widget_render/README.md +6 -0
  108. data/examples/widget_render/app.rb +2 -2
  109. data/examples/widget_render/app.rbs +41 -0
  110. data/examples/widget_rich_text/README.md +6 -0
  111. data/examples/widget_rich_text/app.rb +2 -2
  112. data/examples/widget_scroll_text/README.md +6 -0
  113. data/examples/widget_scroll_text/app.rb +2 -2
  114. data/examples/widget_scrollbar/README.md +6 -0
  115. data/examples/widget_scrollbar/app.rb +2 -2
  116. data/examples/widget_sparkline/README.md +6 -0
  117. data/examples/widget_sparkline/app.rb +2 -2
  118. data/examples/widget_style_colors/README.md +6 -0
  119. data/examples/widget_style_colors/app.rb +2 -2
  120. data/examples/widget_table/README.md +8 -2
  121. data/examples/widget_table/app.rb +2 -2
  122. data/examples/widget_tabs/README.md +6 -0
  123. data/examples/widget_tabs/app.rb +2 -2
  124. data/examples/widget_text_width/README.md +6 -0
  125. data/examples/widget_text_width/app.rb +4 -4
  126. data/ext/ratatui_ruby/Cargo.lock +1 -1
  127. data/ext/ratatui_ruby/Cargo.toml +1 -1
  128. data/ext/ratatui_ruby/extconf.rb +2 -2
  129. data/ext/ratatui_ruby/src/rendering.rs +1 -1
  130. data/ext/ratatui_ruby/src/style.rs +0 -8
  131. data/ext/ratatui_ruby/src/widgets/chart.rs +0 -118
  132. data/ext/ratatui_ruby/src/widgets/list_state.rs +36 -0
  133. data/lib/ratatui_ruby/buffer/cell.rb +34 -2
  134. data/lib/ratatui_ruby/buffer.rb +2 -2
  135. data/lib/ratatui_ruby/cell.rb +34 -2
  136. data/lib/ratatui_ruby/event/focus_gained.rb +26 -2
  137. data/lib/ratatui_ruby/event/focus_lost.rb +26 -2
  138. data/lib/ratatui_ruby/event/key/character.rb +18 -2
  139. data/lib/ratatui_ruby/event/key/media.rb +2 -2
  140. data/lib/ratatui_ruby/event/key/modifier.rb +10 -2
  141. data/lib/ratatui_ruby/event/key/navigation.rb +2 -2
  142. data/lib/ratatui_ruby/event/key/system.rb +2 -2
  143. data/lib/ratatui_ruby/event/key.rb +114 -2
  144. data/lib/ratatui_ruby/event/mouse.rb +42 -2
  145. data/lib/ratatui_ruby/event/none.rb +10 -2
  146. data/lib/ratatui_ruby/event/paste.rb +34 -2
  147. data/lib/ratatui_ruby/event/resize.rb +34 -2
  148. data/lib/ratatui_ruby/event.rb +26 -2
  149. data/lib/ratatui_ruby/frame.rb +74 -2
  150. data/lib/ratatui_ruby/layout/constraint.rb +58 -2
  151. data/lib/ratatui_ruby/layout/layout.rb +47 -2
  152. data/lib/ratatui_ruby/layout/rect.rb +403 -2
  153. data/lib/ratatui_ruby/layout.rb +2 -2
  154. data/lib/ratatui_ruby/list_state.rb +113 -2
  155. data/lib/ratatui_ruby/output_guard.rb +26 -3
  156. data/lib/ratatui_ruby/schema/bar_chart/bar.rb +2 -2
  157. data/lib/ratatui_ruby/schema/bar_chart/bar_group.rb +2 -2
  158. data/lib/ratatui_ruby/schema/bar_chart.rb +50 -2
  159. data/lib/ratatui_ruby/schema/block.rb +21 -15
  160. data/lib/ratatui_ruby/schema/calendar.rb +2 -2
  161. data/lib/ratatui_ruby/schema/canvas.rb +10 -2
  162. data/lib/ratatui_ruby/schema/center.rb +10 -2
  163. data/lib/ratatui_ruby/schema/chart.rb +2 -28
  164. data/lib/ratatui_ruby/schema/clear.rb +10 -2
  165. data/lib/ratatui_ruby/schema/constraint.rb +58 -2
  166. data/lib/ratatui_ruby/schema/cursor.rb +10 -2
  167. data/lib/ratatui_ruby/schema/draw.rb +10 -2
  168. data/lib/ratatui_ruby/schema/gauge.rb +2 -2
  169. data/lib/ratatui_ruby/schema/layout.rb +18 -2
  170. data/lib/ratatui_ruby/schema/line_gauge.rb +2 -2
  171. data/lib/ratatui_ruby/schema/list.rb +10 -2
  172. data/lib/ratatui_ruby/schema/list_item.rb +10 -2
  173. data/lib/ratatui_ruby/schema/overlay.rb +10 -2
  174. data/lib/ratatui_ruby/schema/paragraph.rb +10 -2
  175. data/lib/ratatui_ruby/schema/ratatui_logo.rb +2 -2
  176. data/lib/ratatui_ruby/schema/ratatui_mascot.rb +2 -2
  177. data/lib/ratatui_ruby/schema/rect.rb +58 -2
  178. data/lib/ratatui_ruby/schema/row.rb +10 -2
  179. data/lib/ratatui_ruby/schema/scrollbar.rb +2 -2
  180. data/lib/ratatui_ruby/schema/shape/label.rb +10 -2
  181. data/lib/ratatui_ruby/schema/sparkline.rb +10 -2
  182. data/lib/ratatui_ruby/schema/style.rb +18 -2
  183. data/lib/ratatui_ruby/schema/table.rb +2 -2
  184. data/lib/ratatui_ruby/schema/tabs.rb +2 -2
  185. data/lib/ratatui_ruby/schema/text.rb +34 -2
  186. data/lib/ratatui_ruby/scrollbar_state.rb +10 -2
  187. data/lib/ratatui_ruby/style/style.rb +18 -2
  188. data/lib/ratatui_ruby/style.rb +2 -2
  189. data/lib/ratatui_ruby/table_state.rb +10 -2
  190. data/lib/ratatui_ruby/terminal_lifecycle.rb +18 -3
  191. data/lib/ratatui_ruby/test_helper/event_injection.rb +34 -2
  192. data/lib/ratatui_ruby/test_helper/snapshot.rb +74 -9
  193. data/lib/ratatui_ruby/test_helper/style_assertions.rb +98 -2
  194. data/lib/ratatui_ruby/test_helper/terminal.rb +50 -2
  195. data/lib/ratatui_ruby/test_helper/test_doubles.rb +18 -2
  196. data/lib/ratatui_ruby/test_helper.rb +10 -2
  197. data/lib/ratatui_ruby/tui/buffer_factories.rb +2 -2
  198. data/lib/ratatui_ruby/tui/canvas_factories.rb +2 -2
  199. data/lib/ratatui_ruby/tui/core.rb +2 -2
  200. data/lib/ratatui_ruby/tui/layout_factories.rb +32 -2
  201. data/lib/ratatui_ruby/tui/state_factories.rb +2 -2
  202. data/lib/ratatui_ruby/tui/style_factories.rb +2 -2
  203. data/lib/ratatui_ruby/tui/text_factories.rb +2 -2
  204. data/lib/ratatui_ruby/tui/widget_factories.rb +2 -2
  205. data/lib/ratatui_ruby/tui.rb +11 -3
  206. data/lib/ratatui_ruby/version.rb +3 -3
  207. data/lib/ratatui_ruby/widgets/bar_chart/bar.rb +2 -2
  208. data/lib/ratatui_ruby/widgets/bar_chart/bar_group.rb +2 -2
  209. data/lib/ratatui_ruby/widgets/bar_chart.rb +58 -2
  210. data/lib/ratatui_ruby/widgets/block.rb +37 -15
  211. data/lib/ratatui_ruby/widgets/calendar.rb +2 -2
  212. data/lib/ratatui_ruby/widgets/canvas.rb +10 -2
  213. data/lib/ratatui_ruby/widgets/cell.rb +10 -2
  214. data/lib/ratatui_ruby/widgets/center.rb +10 -2
  215. data/lib/ratatui_ruby/widgets/chart.rb +2 -28
  216. data/lib/ratatui_ruby/widgets/clear.rb +10 -2
  217. data/lib/ratatui_ruby/widgets/cursor.rb +10 -2
  218. data/lib/ratatui_ruby/widgets/gauge.rb +16 -2
  219. data/lib/ratatui_ruby/widgets/line_gauge.rb +16 -2
  220. data/lib/ratatui_ruby/widgets/list.rb +41 -2
  221. data/lib/ratatui_ruby/widgets/list_item.rb +10 -2
  222. data/lib/ratatui_ruby/widgets/overlay.rb +10 -2
  223. data/lib/ratatui_ruby/widgets/paragraph.rb +10 -2
  224. data/lib/ratatui_ruby/widgets/ratatui_logo.rb +2 -2
  225. data/lib/ratatui_ruby/widgets/ratatui_mascot.rb +2 -2
  226. data/lib/ratatui_ruby/widgets/row.rb +10 -2
  227. data/lib/ratatui_ruby/widgets/scrollbar.rb +2 -2
  228. data/lib/ratatui_ruby/widgets/shape/label.rb +10 -2
  229. data/lib/ratatui_ruby/widgets/sparkline.rb +10 -2
  230. data/lib/ratatui_ruby/widgets/table.rb +62 -2
  231. data/lib/ratatui_ruby/widgets/tabs.rb +2 -2
  232. data/lib/ratatui_ruby/widgets.rb +2 -2
  233. data/lib/ratatui_ruby.rb +90 -2
  234. data/sig/examples/app_all_events/view.rbs +7 -1
  235. data/sig/examples/app_all_events/view_state.rbs +7 -1
  236. data/sig/examples/app_color_picker/app.rbs +5 -0
  237. data/sig/examples/app_stateful_interaction/app.rbs +7 -1
  238. data/sig/examples/verify_quickstart_dsl/app.rbs +7 -1
  239. data/sig/examples/verify_quickstart_lifecycle/app.rbs +7 -1
  240. data/sig/examples/verify_readme_usage/app.rbs +7 -1
  241. data/sig/examples/widget_block_demo/app.rbs +6 -0
  242. data/sig/examples/widget_box_demo/app.rbs +7 -1
  243. data/sig/examples/widget_calendar_demo/app.rbs +7 -1
  244. data/sig/examples/widget_cell_demo/app.rbs +7 -1
  245. data/sig/examples/widget_chart_demo/app.rbs +7 -1
  246. data/sig/examples/widget_gauge_demo/app.rbs +7 -1
  247. data/sig/examples/widget_layout_split/app.rbs +7 -1
  248. data/sig/examples/widget_line_gauge_demo/app.rbs +7 -1
  249. data/sig/examples/widget_list_demo/app.rbs +5 -0
  250. data/sig/examples/widget_map_demo/app.rbs +7 -1
  251. data/sig/examples/widget_popup_demo/app.rbs +7 -1
  252. data/sig/examples/widget_ratatui_logo_demo/app.rbs +7 -1
  253. data/sig/examples/widget_ratatui_mascot_demo/app.rbs +7 -1
  254. data/sig/examples/widget_rect/app.rbs +7 -1
  255. data/sig/examples/widget_render/app.rbs +7 -1
  256. data/sig/examples/widget_rich_text/app.rbs +7 -1
  257. data/sig/examples/widget_scroll_text/app.rbs +7 -1
  258. data/sig/examples/widget_scrollbar_demo/app.rbs +7 -1
  259. data/sig/examples/widget_sparkline_demo/app.rbs +7 -1
  260. data/sig/examples/widget_style_colors/app.rbs +7 -1
  261. data/sig/examples/widget_table_demo/app.rbs +7 -1
  262. data/sig/examples/widget_text_width/app.rbs +7 -1
  263. data/sig/ratatui_ruby/event.rbs +7 -1
  264. data/sig/ratatui_ruby/frame.rbs +15 -3
  265. data/sig/ratatui_ruby/list_state.rbs +11 -1
  266. data/sig/ratatui_ruby/ratatui_ruby.rbs +8 -2
  267. data/sig/ratatui_ruby/schema/bar_chart/bar.rbs +7 -1
  268. data/sig/ratatui_ruby/schema/bar_chart/bar_group.rbs +6 -0
  269. data/sig/ratatui_ruby/schema/bar_chart.rbs +6 -0
  270. data/sig/ratatui_ruby/schema/block.rbs +7 -1
  271. data/sig/ratatui_ruby/schema/calendar.rbs +6 -0
  272. data/sig/ratatui_ruby/schema/canvas.rbs +6 -0
  273. data/sig/ratatui_ruby/schema/center.rbs +6 -0
  274. data/sig/ratatui_ruby/schema/chart.rbs +6 -9
  275. data/sig/ratatui_ruby/schema/constraint.rbs +6 -0
  276. data/sig/ratatui_ruby/schema/cursor.rbs +6 -0
  277. data/sig/ratatui_ruby/schema/draw.rbs +6 -0
  278. data/sig/ratatui_ruby/schema/gauge.rbs +9 -1
  279. data/sig/ratatui_ruby/schema/layout.rbs +6 -0
  280. data/sig/ratatui_ruby/schema/line_gauge.rbs +9 -1
  281. data/sig/ratatui_ruby/schema/list.rbs +9 -1
  282. data/sig/ratatui_ruby/schema/list_item.rbs +7 -1
  283. data/sig/ratatui_ruby/schema/overlay.rbs +6 -0
  284. data/sig/ratatui_ruby/schema/paragraph.rbs +6 -0
  285. data/sig/ratatui_ruby/schema/ratatui_logo.rbs +6 -0
  286. data/sig/ratatui_ruby/schema/ratatui_mascot.rbs +5 -0
  287. data/sig/ratatui_ruby/schema/rect.rbs +30 -0
  288. data/sig/ratatui_ruby/schema/row.rbs +7 -1
  289. data/sig/ratatui_ruby/schema/scrollbar.rbs +6 -0
  290. data/sig/ratatui_ruby/schema/sparkline.rbs +6 -0
  291. data/sig/ratatui_ruby/schema/style.rbs +7 -1
  292. data/sig/ratatui_ruby/schema/table.rbs +11 -1
  293. data/sig/ratatui_ruby/schema/tabs.rbs +6 -0
  294. data/sig/ratatui_ruby/schema/text.rbs +7 -1
  295. data/sig/ratatui_ruby/scrollbar_state.rbs +7 -1
  296. data/sig/ratatui_ruby/session.rbs +7 -1
  297. data/sig/ratatui_ruby/table_state.rbs +7 -1
  298. data/sig/ratatui_ruby/test_helper/event_injection.rbs +7 -1
  299. data/sig/ratatui_ruby/test_helper/snapshot.rbs +7 -1
  300. data/sig/ratatui_ruby/test_helper/style_assertions.rbs +7 -1
  301. data/sig/ratatui_ruby/test_helper/terminal.rbs +7 -1
  302. data/sig/ratatui_ruby/test_helper/test_doubles.rbs +7 -1
  303. data/sig/ratatui_ruby/test_helper.rbs +7 -1
  304. data/sig/ratatui_ruby/tui/buffer_factories.rbs +7 -1
  305. data/sig/ratatui_ruby/tui/canvas_factories.rbs +7 -1
  306. data/sig/ratatui_ruby/tui/core.rbs +7 -1
  307. data/sig/ratatui_ruby/tui/layout_factories.rbs +7 -1
  308. data/sig/ratatui_ruby/tui/state_factories.rbs +7 -1
  309. data/sig/ratatui_ruby/tui/style_factories.rbs +7 -1
  310. data/sig/ratatui_ruby/tui/text_factories.rbs +7 -1
  311. data/sig/ratatui_ruby/tui/widget_factories.rbs +7 -1
  312. data/sig/ratatui_ruby/tui.rbs +7 -1
  313. data/sig/ratatui_ruby/version.rbs +6 -0
  314. data/tasks/autodoc/examples.rb +1 -1
  315. data/tasks/autodoc/member.rb +1 -1
  316. data/tasks/autodoc/name.rb +1 -1
  317. data/tasks/bump/cargo_lockfile.rb +1 -1
  318. data/tasks/bump/changelog.rb +1 -1
  319. data/tasks/bump/header.rb +1 -1
  320. data/tasks/bump/history.rb +1 -1
  321. data/tasks/bump/links.rb +1 -1
  322. data/tasks/bump/manifest.rb +1 -1
  323. data/tasks/bump/ruby_gem.rb +1 -1
  324. data/tasks/bump/sem_ver.rb +1 -1
  325. data/tasks/bump/unreleased_section.rb +1 -1
  326. data/tasks/license/headers_md.rb +223 -0
  327. data/tasks/license/headers_rb.rb +210 -0
  328. data/tasks/license/license_utils.rb +130 -0
  329. data/tasks/license/snippets_md.rb +315 -0
  330. data/tasks/license/snippets_rdoc.rb +150 -0
  331. data/tasks/license.rake +91 -0
  332. data/tasks/rdoc_config.rb +1 -1
  333. data/tasks/resources/build.yml.erb +13 -7
  334. data/tasks/sourcehut.rake +3 -1
  335. data/tasks/terminal_preview/app_screenshot.rb +1 -1
  336. data/tasks/terminal_preview/crash_report.rb +1 -1
  337. data/tasks/terminal_preview/example_app.rb +1 -1
  338. data/tasks/terminal_preview/launcher_script.rb +1 -1
  339. data/tasks/terminal_preview/preview_collection.rb +1 -1
  340. data/tasks/terminal_preview/preview_timing.rb +1 -1
  341. data/tasks/terminal_preview/safety_confirmation.rb +1 -1
  342. data/tasks/terminal_preview/saved_screenshot.rb +1 -1
  343. data/tasks/terminal_preview/system_appearance.rb +1 -1
  344. data/tasks/terminal_preview/terminal_window.rb +1 -1
  345. data/tasks/terminal_preview/window_id.rb +1 -1
  346. data/tasks/website/index_page.rb +1 -1
  347. data/tasks/website/version.rb +1 -1
  348. data/tasks/website/version_menu.rb +1 -1
  349. data/tasks/website/versioned_documentation.rb +1 -1
  350. data/tasks/website/website.rb +1 -1
  351. metadata +13 -3
  352. 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: 2025 Kerrick Long <me@kerricklong.com>
5
- # 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
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: 2025 Kerrick Long <me@kerricklong.com>
5
- # 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
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: 2025 Kerrick Long <me@kerricklong.com>
5
- # 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
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: 2025 Kerrick Long <me@kerricklong.com>
5
- # 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
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: 2025 Kerrick Long <me@kerricklong.com>
5
- # 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
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: 2025 Kerrick Long <me@kerricklong.com>
5
- # 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
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