ratatui_ruby 0.4.0 → 0.6.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 (441) hide show
  1. checksums.yaml +4 -4
  2. data/.builds/ruby-3.2.yml +1 -1
  3. data/.builds/ruby-3.3.yml +1 -1
  4. data/.builds/ruby-3.4.yml +1 -1
  5. data/.builds/ruby-4.0.0.yml +1 -1
  6. data/AGENTS.md +98 -176
  7. data/CHANGELOG.md +80 -6
  8. data/README.md +19 -7
  9. data/REUSE.toml +15 -0
  10. data/doc/application_architecture.md +179 -45
  11. data/doc/application_testing.md +80 -32
  12. data/doc/contributors/design/ruby_frontend.md +48 -8
  13. data/doc/contributors/design/rust_backend.md +1 -0
  14. data/doc/contributors/developing_examples.md +191 -48
  15. data/doc/contributors/documentation_style.md +7 -0
  16. data/doc/contributors/examples_audit/p1_high.md +21 -0
  17. data/doc/contributors/examples_audit/p2_moderate.md +81 -0
  18. data/doc/contributors/examples_audit.md +41 -0
  19. data/doc/contributors/index.md +2 -0
  20. data/doc/event_handling.md +21 -7
  21. data/doc/images/app_all_events.png +0 -0
  22. data/doc/images/app_color_picker.png +0 -0
  23. data/doc/images/app_login_form.png +0 -0
  24. data/doc/images/app_stateful_interaction.png +0 -0
  25. data/doc/images/verify_quickstart_dsl.png +0 -0
  26. data/doc/images/verify_quickstart_layout.png +0 -0
  27. data/doc/images/verify_quickstart_lifecycle.png +0 -0
  28. data/doc/images/verify_readme_usage.png +0 -0
  29. data/doc/images/widget_barchart_demo.png +0 -0
  30. data/doc/images/widget_block_demo.png +0 -0
  31. data/doc/images/widget_box_demo.png +0 -0
  32. data/doc/images/widget_calendar_demo.png +0 -0
  33. data/doc/images/widget_canvas_demo.png +0 -0
  34. data/doc/images/widget_cell_demo.png +0 -0
  35. data/doc/images/widget_center_demo.png +0 -0
  36. data/doc/images/widget_chart_demo.png +0 -0
  37. data/doc/images/widget_gauge_demo.png +0 -0
  38. data/doc/images/widget_layout_split.png +0 -0
  39. data/doc/images/widget_line_gauge_demo.png +0 -0
  40. data/doc/images/widget_list_demo.png +0 -0
  41. data/doc/images/widget_overlay_demo.png +0 -0
  42. data/doc/images/widget_ratatui_logo_demo.png +0 -0
  43. data/doc/images/widget_ratatui_mascot_demo.png +0 -0
  44. data/doc/images/widget_render.png +0 -0
  45. data/doc/images/widget_rich_text.png +0 -0
  46. data/doc/images/widget_scroll_text.png +0 -0
  47. data/doc/images/widget_scrollbar_demo.png +0 -0
  48. data/doc/images/widget_sparkline_demo.png +0 -0
  49. data/doc/images/widget_style_colors.png +0 -0
  50. data/doc/images/widget_table_demo.png +0 -0
  51. data/doc/images/widget_table_flex.png +0 -0
  52. data/doc/images/widget_tabs_demo.png +0 -0
  53. data/doc/images/widget_text_width.png +0 -0
  54. data/doc/interactive_design.md +25 -30
  55. data/doc/quickstart.md +150 -130
  56. data/doc/terminal_limitations.md +92 -0
  57. data/examples/app_all_events/README.md +99 -0
  58. data/examples/app_all_events/app.rb +96 -0
  59. data/examples/app_all_events/model/app_model.rb +157 -0
  60. data/examples/app_all_events/model/event_color_cycle.rb +41 -0
  61. data/examples/app_all_events/model/event_entry.rb +92 -0
  62. data/examples/app_all_events/model/msg.rb +37 -0
  63. data/examples/app_all_events/model/timestamp.rb +54 -0
  64. data/examples/app_all_events/update.rb +73 -0
  65. data/examples/app_all_events/view/app_view.rb +78 -0
  66. data/examples/app_all_events/view/controls_view.rb +52 -0
  67. data/examples/app_all_events/view/counts_view.rb +59 -0
  68. data/examples/app_all_events/view/live_view.rb +70 -0
  69. data/examples/app_all_events/view/log_view.rb +55 -0
  70. data/examples/app_all_events/view.rb +7 -0
  71. data/examples/app_color_picker/README.md +134 -0
  72. data/examples/app_color_picker/app.rb +74 -0
  73. data/examples/app_color_picker/clipboard.rb +84 -0
  74. data/examples/app_color_picker/color.rb +191 -0
  75. data/examples/app_color_picker/controls.rb +90 -0
  76. data/examples/app_color_picker/copy_dialog.rb +166 -0
  77. data/examples/app_color_picker/export_pane.rb +126 -0
  78. data/examples/app_color_picker/harmony.rb +56 -0
  79. data/examples/app_color_picker/input.rb +174 -0
  80. data/examples/app_color_picker/main_container.rb +178 -0
  81. data/examples/app_color_picker/palette.rb +109 -0
  82. data/examples/app_login_form/README.md +47 -0
  83. data/examples/{login_form → app_login_form}/app.rb +38 -42
  84. data/examples/app_stateful_interaction/README.md +31 -0
  85. data/examples/app_stateful_interaction/app.rb +272 -0
  86. data/examples/timeout_demo.rb +43 -0
  87. data/examples/verify_quickstart_dsl/README.md +48 -0
  88. data/examples/{quickstart_dsl → verify_quickstart_dsl}/app.rb +17 -6
  89. data/examples/verify_quickstart_layout/README.md +71 -0
  90. data/examples/verify_quickstart_layout/app.rb +71 -0
  91. data/examples/verify_quickstart_lifecycle/README.md +56 -0
  92. data/examples/verify_quickstart_lifecycle/app.rb +54 -0
  93. data/examples/verify_readme_usage/README.md +43 -0
  94. data/examples/verify_readme_usage/app.rb +40 -0
  95. data/examples/widget_barchart_demo/README.md +49 -0
  96. data/examples/widget_barchart_demo/app.rb +238 -0
  97. data/examples/widget_block_demo/README.md +34 -0
  98. data/examples/widget_block_demo/app.rb +256 -0
  99. data/examples/widget_box_demo/README.md +45 -0
  100. data/examples/{box_demo → widget_box_demo}/app.rb +99 -65
  101. data/examples/widget_calendar_demo/README.md +39 -0
  102. data/examples/widget_calendar_demo/app.rb +109 -0
  103. data/examples/widget_canvas_demo/README.md +27 -0
  104. data/examples/widget_canvas_demo/app.rb +123 -0
  105. data/examples/widget_cell_demo/README.md +36 -0
  106. data/examples/widget_cell_demo/app.rb +111 -0
  107. data/examples/widget_center_demo/README.md +29 -0
  108. data/examples/widget_center_demo/app.rb +116 -0
  109. data/examples/widget_chart_demo/README.md +41 -0
  110. data/examples/widget_chart_demo/app.rb +218 -0
  111. data/examples/widget_gauge_demo/README.md +41 -0
  112. data/examples/widget_gauge_demo/app.rb +212 -0
  113. data/examples/widget_layout_split/README.md +44 -0
  114. data/examples/widget_layout_split/app.rb +246 -0
  115. data/examples/widget_line_gauge_demo/README.md +41 -0
  116. data/examples/widget_line_gauge_demo/app.rb +217 -0
  117. data/examples/widget_list_demo/README.md +49 -0
  118. data/examples/widget_list_demo/app.rb +366 -0
  119. data/examples/widget_map_demo/README.md +39 -0
  120. data/examples/{map_demo → widget_map_demo}/app.rb +24 -21
  121. data/examples/widget_overlay_demo/app.rb +248 -0
  122. data/examples/widget_popup_demo/README.md +36 -0
  123. data/examples/widget_popup_demo/app.rb +104 -0
  124. data/examples/widget_ratatui_logo_demo/README.md +34 -0
  125. data/examples/widget_ratatui_logo_demo/app.rb +103 -0
  126. data/examples/widget_ratatui_mascot_demo/README.md +34 -0
  127. data/examples/widget_ratatui_mascot_demo/app.rb +93 -0
  128. data/examples/widget_rect/README.md +38 -0
  129. data/examples/widget_rect/app.rb +205 -0
  130. data/examples/widget_render/README.md +37 -0
  131. data/examples/widget_render/app.rb +184 -0
  132. data/examples/widget_rich_text/README.md +35 -0
  133. data/examples/widget_rich_text/app.rb +166 -0
  134. data/examples/widget_scroll_text/README.md +37 -0
  135. data/examples/widget_scroll_text/app.rb +107 -0
  136. data/examples/widget_scrollbar_demo/README.md +37 -0
  137. data/examples/widget_scrollbar_demo/app.rb +153 -0
  138. data/examples/widget_sparkline_demo/README.md +42 -0
  139. data/examples/widget_sparkline_demo/app.rb +275 -0
  140. data/examples/widget_style_colors/README.md +34 -0
  141. data/examples/widget_style_colors/app.rb +19 -21
  142. data/examples/widget_table_demo/README.md +48 -0
  143. data/examples/widget_table_demo/app.rb +239 -0
  144. data/examples/widget_tabs_demo/README.md +41 -0
  145. data/examples/widget_tabs_demo/app.rb +181 -0
  146. data/examples/widget_text_width/README.md +35 -0
  147. data/examples/widget_text_width/app.rb +106 -0
  148. data/ext/ratatui_ruby/Cargo.lock +11 -4
  149. data/ext/ratatui_ruby/Cargo.toml +2 -1
  150. data/ext/ratatui_ruby/src/events.rs +359 -62
  151. data/ext/ratatui_ruby/src/frame.rs +227 -0
  152. data/ext/ratatui_ruby/src/lib.rs +110 -27
  153. data/ext/ratatui_ruby/src/rendering.rs +8 -4
  154. data/ext/ratatui_ruby/src/string_width.rs +101 -0
  155. data/ext/ratatui_ruby/src/style.rs +138 -57
  156. data/ext/ratatui_ruby/src/terminal.rs +42 -22
  157. data/ext/ratatui_ruby/src/text.rs +14 -7
  158. data/ext/ratatui_ruby/src/widgets/barchart.rs +74 -54
  159. data/ext/ratatui_ruby/src/widgets/block.rs +7 -6
  160. data/ext/ratatui_ruby/src/widgets/canvas.rs +21 -3
  161. data/ext/ratatui_ruby/src/widgets/chart.rs +20 -10
  162. data/ext/ratatui_ruby/src/widgets/gauge.rs +9 -2
  163. data/ext/ratatui_ruby/src/widgets/layout.rs +9 -4
  164. data/ext/ratatui_ruby/src/widgets/line_gauge.rs +9 -2
  165. data/ext/ratatui_ruby/src/widgets/list.rs +211 -12
  166. data/ext/ratatui_ruby/src/widgets/list_state.rs +137 -0
  167. data/ext/ratatui_ruby/src/widgets/mod.rs +3 -0
  168. data/ext/ratatui_ruby/src/widgets/overlay.rs +2 -1
  169. data/ext/ratatui_ruby/src/widgets/paragraph.rs +1 -1
  170. data/ext/ratatui_ruby/src/widgets/ratatui_logo.rs +19 -8
  171. data/ext/ratatui_ruby/src/widgets/ratatui_mascot.rs +17 -10
  172. data/ext/ratatui_ruby/src/widgets/scrollbar.rs +97 -3
  173. data/ext/ratatui_ruby/src/widgets/scrollbar_state.rs +169 -0
  174. data/ext/ratatui_ruby/src/widgets/sparkline.rs +14 -11
  175. data/ext/ratatui_ruby/src/widgets/table.rs +121 -5
  176. data/ext/ratatui_ruby/src/widgets/table_state.rs +121 -0
  177. data/ext/ratatui_ruby/src/widgets/tabs.rs +11 -11
  178. data/lib/ratatui_ruby/cell.rb +7 -7
  179. data/lib/ratatui_ruby/event/key/character.rb +35 -0
  180. data/lib/ratatui_ruby/event/key/media.rb +44 -0
  181. data/lib/ratatui_ruby/event/key/modifier.rb +95 -0
  182. data/lib/ratatui_ruby/event/key/navigation.rb +55 -0
  183. data/lib/ratatui_ruby/event/key/system.rb +45 -0
  184. data/lib/ratatui_ruby/event/key.rb +112 -52
  185. data/lib/ratatui_ruby/event/mouse.rb +3 -3
  186. data/lib/ratatui_ruby/event/none.rb +43 -0
  187. data/lib/ratatui_ruby/event/paste.rb +1 -1
  188. data/lib/ratatui_ruby/event.rb +56 -4
  189. data/lib/ratatui_ruby/frame.rb +183 -0
  190. data/lib/ratatui_ruby/list_state.rb +88 -0
  191. data/lib/ratatui_ruby/schema/bar_chart/bar.rb +13 -13
  192. data/lib/ratatui_ruby/schema/bar_chart/bar_group.rb +1 -5
  193. data/lib/ratatui_ruby/schema/bar_chart.rb +217 -217
  194. data/lib/ratatui_ruby/schema/block.rb +163 -168
  195. data/lib/ratatui_ruby/schema/calendar.rb +66 -67
  196. data/lib/ratatui_ruby/schema/canvas.rb +63 -63
  197. data/lib/ratatui_ruby/schema/center.rb +46 -46
  198. data/lib/ratatui_ruby/schema/chart.rb +135 -143
  199. data/lib/ratatui_ruby/schema/clear.rb +42 -42
  200. data/lib/ratatui_ruby/schema/constraint.rb +76 -76
  201. data/lib/ratatui_ruby/schema/cursor.rb +30 -25
  202. data/lib/ratatui_ruby/schema/gauge.rb +54 -52
  203. data/lib/ratatui_ruby/schema/layout.rb +87 -87
  204. data/lib/ratatui_ruby/schema/line_gauge.rb +62 -62
  205. data/lib/ratatui_ruby/schema/list.rb +103 -80
  206. data/lib/ratatui_ruby/schema/list_item.rb +41 -0
  207. data/lib/ratatui_ruby/schema/overlay.rb +31 -31
  208. data/lib/ratatui_ruby/schema/paragraph.rb +80 -80
  209. data/lib/ratatui_ruby/schema/ratatui_logo.rb +10 -6
  210. data/lib/ratatui_ruby/schema/ratatui_mascot.rb +10 -5
  211. data/lib/ratatui_ruby/schema/rect.rb +99 -56
  212. data/lib/ratatui_ruby/schema/scrollbar.rb +119 -119
  213. data/lib/ratatui_ruby/schema/shape/label.rb +1 -1
  214. data/lib/ratatui_ruby/schema/sparkline.rb +111 -110
  215. data/lib/ratatui_ruby/schema/style.rb +66 -46
  216. data/lib/ratatui_ruby/schema/table.rb +126 -115
  217. data/lib/ratatui_ruby/schema/tabs.rb +66 -67
  218. data/lib/ratatui_ruby/schema/text.rb +69 -1
  219. data/lib/ratatui_ruby/scrollbar_state.rb +112 -0
  220. data/lib/ratatui_ruby/session/autodoc.rb +482 -0
  221. data/lib/ratatui_ruby/session.rb +55 -23
  222. data/lib/ratatui_ruby/table_state.rb +90 -0
  223. data/lib/ratatui_ruby/test_helper/event_injection.rb +169 -0
  224. data/lib/ratatui_ruby/test_helper/snapshot.rb +390 -0
  225. data/lib/ratatui_ruby/test_helper/style_assertions.rb +351 -0
  226. data/lib/ratatui_ruby/test_helper/terminal.rb +127 -0
  227. data/lib/ratatui_ruby/test_helper/test_doubles.rb +68 -0
  228. data/lib/ratatui_ruby/test_helper.rb +66 -193
  229. data/lib/ratatui_ruby/version.rb +1 -1
  230. data/lib/ratatui_ruby.rb +100 -51
  231. data/{examples/sparkline_demo → sig/examples/app_all_events}/app.rbs +3 -2
  232. data/sig/examples/app_all_events/model/event_entry.rbs +16 -0
  233. data/sig/examples/app_all_events/model/events.rbs +15 -0
  234. data/sig/examples/app_all_events/model/timestamp.rbs +11 -0
  235. data/sig/examples/app_all_events/view/app_view.rbs +8 -0
  236. data/sig/examples/app_all_events/view/controls_view.rbs +6 -0
  237. data/sig/examples/app_all_events/view/counts_view.rbs +6 -0
  238. data/sig/examples/app_all_events/view/live_view.rbs +6 -0
  239. data/sig/examples/app_all_events/view/log_view.rbs +6 -0
  240. data/sig/examples/app_all_events/view.rbs +8 -0
  241. data/sig/examples/app_all_events/view_state.rbs +15 -0
  242. data/{examples/list_demo → sig/examples/app_color_picker}/app.rbs +2 -2
  243. data/sig/examples/app_login_form/app.rbs +11 -0
  244. data/sig/examples/app_stateful_interaction/app.rbs +33 -0
  245. data/sig/examples/verify_quickstart_dsl/app.rbs +11 -0
  246. data/sig/examples/verify_quickstart_lifecycle/app.rbs +11 -0
  247. data/sig/examples/verify_readme_usage/app.rbs +11 -0
  248. data/sig/examples/widget_block_demo/app.rbs +32 -0
  249. data/sig/examples/widget_box_demo/app.rbs +11 -0
  250. data/sig/examples/widget_calendar_demo/app.rbs +11 -0
  251. data/sig/examples/widget_cell_demo/app.rbs +11 -0
  252. data/sig/examples/widget_chart_demo/app.rbs +11 -0
  253. data/{examples/gauge_demo → sig/examples/widget_gauge_demo}/app.rbs +4 -0
  254. data/sig/examples/widget_layout_split/app.rbs +10 -0
  255. data/sig/examples/widget_line_gauge_demo/app.rbs +11 -0
  256. data/sig/examples/widget_list_demo/app.rbs +12 -0
  257. data/sig/examples/widget_map_demo/app.rbs +11 -0
  258. data/sig/examples/widget_popup_demo/app.rbs +11 -0
  259. data/sig/examples/widget_ratatui_logo_demo/app.rbs +11 -0
  260. data/sig/examples/widget_ratatui_mascot_demo/app.rbs +11 -0
  261. data/sig/examples/widget_rect/app.rbs +12 -0
  262. data/sig/examples/widget_render/app.rbs +10 -0
  263. data/sig/examples/widget_rich_text/app.rbs +11 -0
  264. data/sig/examples/widget_scroll_text/app.rbs +11 -0
  265. data/sig/examples/widget_scrollbar_demo/app.rbs +11 -0
  266. data/sig/examples/widget_sparkline_demo/app.rbs +10 -0
  267. data/{examples → sig/examples}/widget_style_colors/app.rbs +1 -1
  268. data/sig/examples/widget_table_demo/app.rbs +11 -0
  269. data/sig/examples/widget_text_width/app.rbs +10 -0
  270. data/sig/ratatui_ruby/event.rbs +11 -1
  271. data/sig/ratatui_ruby/frame.rbs +11 -0
  272. data/sig/ratatui_ruby/list_state.rbs +13 -0
  273. data/sig/ratatui_ruby/ratatui_ruby.rbs +5 -4
  274. data/sig/ratatui_ruby/schema/bar_chart/bar.rbs +3 -3
  275. data/sig/ratatui_ruby/schema/draw.rbs +4 -0
  276. data/sig/ratatui_ruby/schema/gauge.rbs +2 -2
  277. data/sig/ratatui_ruby/schema/layout.rbs +1 -1
  278. data/sig/ratatui_ruby/schema/line_gauge.rbs +2 -2
  279. data/sig/ratatui_ruby/schema/list.rbs +4 -2
  280. data/sig/ratatui_ruby/schema/list_item.rbs +10 -0
  281. data/sig/ratatui_ruby/schema/rect.rbs +3 -0
  282. data/sig/ratatui_ruby/schema/style.rbs +3 -3
  283. data/sig/ratatui_ruby/schema/table.rbs +3 -1
  284. data/sig/ratatui_ruby/schema/text.rbs +8 -6
  285. data/sig/ratatui_ruby/scrollbar_state.rbs +18 -0
  286. data/sig/ratatui_ruby/session.rbs +107 -0
  287. data/sig/ratatui_ruby/table_state.rbs +15 -0
  288. data/sig/ratatui_ruby/test_helper/event_injection.rbs +16 -0
  289. data/sig/ratatui_ruby/test_helper/snapshot.rbs +12 -0
  290. data/sig/ratatui_ruby/test_helper/style_assertions.rbs +64 -0
  291. data/sig/ratatui_ruby/test_helper/terminal.rbs +14 -0
  292. data/sig/ratatui_ruby/test_helper/test_doubles.rbs +22 -0
  293. data/sig/ratatui_ruby/test_helper.rbs +5 -4
  294. data/tasks/autodoc/examples.rb +79 -0
  295. data/tasks/autodoc/inventory.rb +63 -0
  296. data/tasks/autodoc/member.rb +56 -0
  297. data/tasks/autodoc/name.rb +19 -0
  298. data/tasks/autodoc/notice.rb +26 -0
  299. data/tasks/autodoc/rbs.rb +38 -0
  300. data/tasks/autodoc/rdoc.rb +45 -0
  301. data/tasks/autodoc.rake +53 -0
  302. data/tasks/bump/changelog.rb +3 -3
  303. data/tasks/bump/history.rb +2 -2
  304. data/tasks/bump/links.rb +67 -0
  305. data/tasks/doc.rake +600 -6
  306. data/tasks/example_viewer.html.erb +172 -0
  307. data/tasks/lint.rake +8 -4
  308. data/tasks/resources/index.html.erb +6 -0
  309. data/tasks/sourcehut.rake +70 -30
  310. data/tasks/terminal_preview/app_screenshot.rb +14 -6
  311. data/tasks/terminal_preview/crash_report.rb +7 -9
  312. data/tasks/terminal_preview/launcher_script.rb +4 -6
  313. data/tasks/terminal_preview/preview_collection.rb +4 -6
  314. data/tasks/terminal_preview/safety_confirmation.rb +3 -5
  315. data/tasks/terminal_preview/saved_screenshot.rb +10 -11
  316. data/tasks/terminal_preview/terminal_window.rb +7 -9
  317. data/tasks/test.rake +1 -1
  318. data/tasks/website/index_page.rb +3 -3
  319. data/tasks/website/version.rb +10 -10
  320. data/tasks/website/version_menu.rb +10 -12
  321. data/tasks/website/versioned_documentation.rb +49 -17
  322. data/tasks/website/website.rb +6 -8
  323. data/tasks/website.rake +4 -4
  324. metadata +232 -127
  325. data/LICENSES/BSD-2-Clause.txt +0 -9
  326. data/doc/contributors/better_dx.md +0 -543
  327. data/doc/contributors/example_analysis.md +0 -82
  328. data/doc/images/all_events.png +0 -0
  329. data/doc/images/block_padding.png +0 -0
  330. data/doc/images/block_titles.png +0 -0
  331. data/doc/images/box_demo.png +0 -0
  332. data/doc/images/calendar_demo.png +0 -0
  333. data/doc/images/cell_demo.png +0 -0
  334. data/doc/images/chart_demo.png +0 -0
  335. data/doc/images/flex_layout.png +0 -0
  336. data/doc/images/gauge_demo.png +0 -0
  337. data/doc/images/line_gauge_demo.png +0 -0
  338. data/doc/images/list_demo.png +0 -0
  339. data/doc/images/list_styles.png +0 -0
  340. data/doc/images/login_form.png +0 -0
  341. data/doc/images/quickstart_dsl.png +0 -0
  342. data/doc/images/quickstart_lifecycle.png +0 -0
  343. data/doc/images/readme_usage.png +0 -0
  344. data/doc/images/rich_text.png +0 -0
  345. data/doc/images/scroll_text.png +0 -0
  346. data/doc/images/scrollbar_demo.png +0 -0
  347. data/doc/images/sparkline_demo.png +0 -0
  348. data/doc/images/table_flex.png +0 -0
  349. data/doc/images/table_select.png +0 -0
  350. data/examples/all_events/app.rb +0 -169
  351. data/examples/all_events/app.rbs +0 -7
  352. data/examples/all_events/test_app.rb +0 -139
  353. data/examples/analytics/app.rb +0 -258
  354. data/examples/analytics/app.rbs +0 -7
  355. data/examples/analytics/test_app.rb +0 -132
  356. data/examples/block_padding/app.rb +0 -63
  357. data/examples/block_padding/app.rbs +0 -7
  358. data/examples/block_padding/test_app.rb +0 -31
  359. data/examples/block_titles/app.rb +0 -61
  360. data/examples/block_titles/app.rbs +0 -7
  361. data/examples/block_titles/test_app.rb +0 -34
  362. data/examples/box_demo/app.rbs +0 -7
  363. data/examples/box_demo/test_app.rb +0 -88
  364. data/examples/calendar_demo/app.rb +0 -101
  365. data/examples/calendar_demo/app.rbs +0 -7
  366. data/examples/calendar_demo/test_app.rb +0 -108
  367. data/examples/cell_demo/app.rb +0 -108
  368. data/examples/cell_demo/app.rbs +0 -7
  369. data/examples/cell_demo/test_app.rb +0 -36
  370. data/examples/chart_demo/app.rb +0 -203
  371. data/examples/chart_demo/app.rbs +0 -7
  372. data/examples/chart_demo/test_app.rb +0 -102
  373. data/examples/custom_widget/app.rb +0 -51
  374. data/examples/custom_widget/app.rbs +0 -7
  375. data/examples/custom_widget/test_app.rb +0 -30
  376. data/examples/flex_layout/app.rb +0 -156
  377. data/examples/flex_layout/app.rbs +0 -7
  378. data/examples/flex_layout/test_app.rb +0 -65
  379. data/examples/gauge_demo/app.rb +0 -182
  380. data/examples/gauge_demo/test_app.rb +0 -120
  381. data/examples/hit_test/app.rb +0 -175
  382. data/examples/hit_test/app.rbs +0 -7
  383. data/examples/hit_test/test_app.rb +0 -102
  384. data/examples/line_gauge_demo/app.rb +0 -190
  385. data/examples/line_gauge_demo/app.rbs +0 -7
  386. data/examples/line_gauge_demo/test_app.rb +0 -129
  387. data/examples/list_demo/app.rb +0 -253
  388. data/examples/list_demo/test_app.rb +0 -237
  389. data/examples/list_styles/app.rb +0 -140
  390. data/examples/list_styles/app.rbs +0 -7
  391. data/examples/list_styles/test_app.rb +0 -157
  392. data/examples/login_form/app.rbs +0 -7
  393. data/examples/login_form/test_app.rb +0 -51
  394. data/examples/map_demo/app.rbs +0 -7
  395. data/examples/map_demo/test_app.rb +0 -149
  396. data/examples/mouse_events/app.rb +0 -97
  397. data/examples/mouse_events/app.rbs +0 -7
  398. data/examples/mouse_events/test_app.rb +0 -53
  399. data/examples/popup_demo/app.rb +0 -103
  400. data/examples/popup_demo/app.rbs +0 -7
  401. data/examples/popup_demo/test_app.rb +0 -54
  402. data/examples/quickstart_dsl/app.rbs +0 -7
  403. data/examples/quickstart_dsl/test_app.rb +0 -29
  404. data/examples/quickstart_lifecycle/app.rb +0 -39
  405. data/examples/quickstart_lifecycle/app.rbs +0 -7
  406. data/examples/quickstart_lifecycle/test_app.rb +0 -29
  407. data/examples/ratatui_logo_demo/app.rb +0 -79
  408. data/examples/ratatui_logo_demo/app.rbs +0 -7
  409. data/examples/ratatui_logo_demo/test_app.rb +0 -51
  410. data/examples/ratatui_mascot_demo/app.rb +0 -84
  411. data/examples/ratatui_mascot_demo/app.rbs +0 -7
  412. data/examples/ratatui_mascot_demo/test_app.rb +0 -47
  413. data/examples/readme_usage/app.rb +0 -29
  414. data/examples/readme_usage/app.rbs +0 -7
  415. data/examples/readme_usage/test_app.rb +0 -29
  416. data/examples/rich_text/app.rb +0 -141
  417. data/examples/rich_text/app.rbs +0 -7
  418. data/examples/rich_text/test_app.rb +0 -166
  419. data/examples/scroll_text/app.rb +0 -103
  420. data/examples/scroll_text/app.rbs +0 -7
  421. data/examples/scroll_text/test_app.rb +0 -110
  422. data/examples/scrollbar_demo/app.rb +0 -143
  423. data/examples/scrollbar_demo/app.rbs +0 -7
  424. data/examples/scrollbar_demo/test_app.rb +0 -77
  425. data/examples/sparkline_demo/app.rb +0 -240
  426. data/examples/sparkline_demo/test_app.rb +0 -107
  427. data/examples/table_flex/app.rb +0 -65
  428. data/examples/table_flex/app.rbs +0 -7
  429. data/examples/table_flex/test_app.rb +0 -36
  430. data/examples/table_select/app.rb +0 -198
  431. data/examples/table_select/app.rbs +0 -7
  432. data/examples/table_select/test_app.rb +0 -180
  433. data/examples/widget_style_colors/test_app.rb +0 -48
  434. data/tasks/bump/comparison_links.rb +0 -41
  435. /data/doc/images/{analytics.png → app_analytics.png} +0 -0
  436. /data/doc/images/{custom_widget.png → app_custom_widget.png} +0 -0
  437. /data/doc/images/{mouse_events.png → app_mouse_events.png} +0 -0
  438. /data/doc/images/{map_demo.png → widget_map_demo.png} +0 -0
  439. /data/doc/images/{popup_demo.png → widget_popup_demo.png} +0 -0
  440. /data/doc/images/{hit_test.png → widget_rect.png} +0 -0
  441. /data/{doc/images/ratatui_logo_demo.png → exe/.gitkeep} +0 -0
@@ -1,65 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
4
- # SPDX-License-Identifier: AGPL-3.0-or-later
5
-
6
- $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
7
- require "ratatui_ruby"
8
-
9
- class TableFlexApp
10
- def run
11
- RatatuiRuby.run do |tui|
12
- loop do
13
- render(tui)
14
- break if handle_input(tui) == :quit
15
- end
16
- end
17
- end
18
-
19
- def render(tui)
20
- layout = tui.layout(
21
- direction: :vertical,
22
- constraints: [
23
- RatatuiRuby::Constraint.length(3),
24
- RatatuiRuby::Constraint.fill(1),
25
- RatatuiRuby::Constraint.fill(1),
26
- RatatuiRuby::Constraint.fill(1)
27
- ],
28
- children: [
29
- tui.paragraph(
30
- text: "Table Flex Layout (press 'q' to quit)",
31
- block: tui.block(title: "Header", borders: [:all])
32
- ),
33
- tui.table(
34
- header: ["Legacy (Default)", "Table"],
35
- rows: [["Item 1", "Item 2"], ["Item 3", "Item 4"]],
36
- widths: [RatatuiRuby::Constraint.length(20), RatatuiRuby::Constraint.length(20)],
37
- block: tui.block(title: "Flex: :legacy (Default)", borders: [:all])
38
- ),
39
- tui.table(
40
- header: ["Space", "Between"],
41
- rows: [["A", "B"], ["C", "D"]],
42
- widths: [RatatuiRuby::Constraint.length(20), RatatuiRuby::Constraint.length(20)],
43
- block: tui.block(title: "Flex: :space_between", borders: [:all]),
44
- flex: :space_between
45
- ),
46
- tui.table(
47
- header: ["Space", "Around"],
48
- rows: [["E", "F"], ["G", "H"]],
49
- widths: [RatatuiRuby::Constraint.length(20), RatatuiRuby::Constraint.length(20)],
50
- block: tui.block(title: "Flex: :space_around", borders: [:all]),
51
- flex: :space_around
52
- )
53
- ]
54
- )
55
- tui.draw(layout)
56
- end
57
-
58
- def handle_input(tui)
59
- event = tui.poll_event
60
- return unless event
61
- :quit if event == "q" || event == :ctrl_c
62
- end
63
- end
64
-
65
- TableFlexApp.new.run if __FILE__ == $0
@@ -1,7 +0,0 @@
1
- class TableFlexApp
2
- # @public
3
- def self.new: () -> TableFlexApp
4
-
5
- # @public
6
- def run: () -> void
7
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
4
- # SPDX-License-Identifier: AGPL-3.0-or-later
5
-
6
- $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
7
- require "ratatui_ruby"
8
- require "ratatui_ruby/test_helper"
9
- require "minitest/autorun"
10
- require_relative "app"
11
-
12
- class TestTableFlexApp < Minitest::Test
13
- include RatatuiRuby::TestHelper
14
-
15
- def setup
16
- @app = TableFlexApp.new
17
- end
18
-
19
- def test_render
20
- with_test_terminal do
21
- # Queue quit
22
- inject_key(:q)
23
-
24
- @app.run
25
-
26
- content = buffer_content.join("\n")
27
- assert_includes content, "Table Flex Layout"
28
- assert_includes content, "Flex: :space_between"
29
- assert_includes content, "Flex: :space_around"
30
-
31
- # Verify some table content
32
- assert_includes content, "Legacy (Default)"
33
- assert_includes content, "Item 1"
34
- end
35
- end
36
- end
@@ -1,198 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
6
-
7
- $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
8
- require "bundler/setup"
9
- require "ratatui_ruby"
10
-
11
- # Sample process data
12
- PROCESSES = [
13
- { pid: 1234, name: "ruby", cpu: 15.2 },
14
- { pid: 5678, name: "postgres", cpu: 8.7 },
15
- { pid: 9012, name: "nginx", cpu: 3.1 },
16
- { pid: 3456, name: "redis", cpu: 12.4 },
17
- { pid: 7890, name: "sidekiq", cpu: 22.8 },
18
- { pid: 2345, name: "webpack", cpu: 45.3 },
19
- { pid: 6789, name: "node", cpu: 18.9 }
20
- ].freeze
21
-
22
- class TableSelectApp
23
- attr_reader :selected_index, :selected_col, :current_style_index, :column_spacing, :highlight_spacing, :column_highlight_style, :cell_highlight_style
24
-
25
- STYLES = [
26
- { name: "Cyan", style: RatatuiRuby::Style.new(fg: :cyan) },
27
- { name: "Red", style: RatatuiRuby::Style.new(fg: :red) },
28
- { name: "Green", style: RatatuiRuby::Style.new(fg: :green) },
29
- { name: "Blue on White", style: RatatuiRuby::Style.new(fg: :blue, bg: :white) },
30
- { name: "Magenta", style: RatatuiRuby::Style.new(fg: :magenta, modifiers: [:bold]) }
31
- ].freeze
32
-
33
- HIGHLIGHT_SPACINGS = [
34
- { name: "When Selected", spacing: :when_selected },
35
- { name: "Always", spacing: :always },
36
- { name: "Never", spacing: :never }
37
- ].freeze
38
-
39
- def initialize
40
- @selected_index = 1
41
- @selected_col = 1
42
- @current_style_index = 0
43
- @column_spacing = 1
44
- @highlight_spacing_index = 0
45
- @column_highlight_style = RatatuiRuby::Style.new(fg: :magenta)
46
- @show_column_highlight = true
47
- @cell_highlight_style = RatatuiRuby::Style.new(fg: :white, bg: :red, modifiers: [:bold])
48
- @show_cell_highlight = true
49
- @hotkey_style = RatatuiRuby::Style.new(modifiers: [:bold, :underlined])
50
- end
51
-
52
- def run
53
- RatatuiRuby.run do
54
- loop do
55
- render
56
- break if handle_input == :quit
57
- end
58
- end
59
- end
60
-
61
- private
62
-
63
- def render
64
- # Create table rows from process data
65
- rows = PROCESSES.map { |p| [p[:pid].to_s, p[:name], "#{p[:cpu]}%"] }
66
-
67
- # Define column widths
68
- widths = [
69
- RatatuiRuby::Constraint.length(8),
70
- RatatuiRuby::Constraint.length(15),
71
- RatatuiRuby::Constraint.length(10)
72
- ]
73
-
74
- # Create highlight style (yellow text)
75
- highlight_style = RatatuiRuby::Style.new(fg: :yellow)
76
-
77
- current_style_entry = STYLES[@current_style_index]
78
- current_spacing_entry = HIGHLIGHT_SPACINGS[@highlight_spacing_index]
79
- selection_label = @selected_index.nil? ? "none" : @selected_index.to_s
80
-
81
- # Main table
82
- table = RatatuiRuby::Table.new(
83
- header: ["PID", "Name", "CPU"],
84
- rows: rows,
85
- widths: widths,
86
- selected_row: @selected_index,
87
- selected_column: @selected_col,
88
- highlight_style: highlight_style,
89
- highlight_symbol: "> ",
90
- highlight_spacing: current_spacing_entry[:spacing],
91
- column_highlight_style: @show_column_highlight ? @column_highlight_style : nil,
92
- cell_highlight_style: @show_cell_highlight ? @cell_highlight_style : nil,
93
- style: current_style_entry[:style],
94
- column_spacing: @column_spacing,
95
- block: RatatuiRuby::Block.new(
96
- title: "Processes",
97
- borders: :all
98
- ),
99
- footer: ["Total: #{PROCESSES.length}", "Total CPU: #{PROCESSES.sum { |p| p[:cpu] }}%", ""]
100
- )
101
-
102
- # Bottom control panel
103
- control_panel = RatatuiRuby::Block.new(
104
- title: "Controls",
105
- borders: [:all],
106
- children: [
107
- RatatuiRuby::Paragraph.new(
108
- text: [
109
- # Line 1: Navigation
110
- RatatuiRuby::Text::Line.new(spans: [
111
- RatatuiRuby::Text::Span.new(content: "↑/↓", style: @hotkey_style),
112
- RatatuiRuby::Text::Span.new(content: ": Nav Row "),
113
- RatatuiRuby::Text::Span.new(content: "←/→", style: @hotkey_style),
114
- RatatuiRuby::Text::Span.new(content: ": Nav Col "),
115
- RatatuiRuby::Text::Span.new(content: "x", style: @hotkey_style),
116
- RatatuiRuby::Text::Span.new(content: ": Toggle Row (#{selection_label}) "),
117
- RatatuiRuby::Text::Span.new(content: "q", style: @hotkey_style),
118
- RatatuiRuby::Text::Span.new(content: ": Quit")
119
- ]),
120
- # Line 2: Table Controls
121
- RatatuiRuby::Text::Line.new(spans: [
122
- RatatuiRuby::Text::Span.new(content: "s", style: @hotkey_style),
123
- RatatuiRuby::Text::Span.new(content: ": Style (#{current_style_entry[:name]}) "),
124
- RatatuiRuby::Text::Span.new(content: "p", style: @hotkey_style),
125
- RatatuiRuby::Text::Span.new(content: ": Spacing (#{current_spacing_entry[:name]}) ")
126
- ]),
127
- # Line 3: More Controls
128
- RatatuiRuby::Text::Line.new(spans: [
129
- RatatuiRuby::Text::Span.new(content: ": Col Space (#{@column_spacing}) "),
130
- RatatuiRuby::Text::Span.new(content: "c", style: @hotkey_style),
131
- RatatuiRuby::Text::Span.new(content: ": Col Highlight (#{@show_column_highlight ? 'On' : 'Off'}) "),
132
- RatatuiRuby::Text::Span.new(content: "z", style: @hotkey_style),
133
- RatatuiRuby::Text::Span.new(content: ": Cell Highlight (#{@show_cell_highlight ? 'On' : 'Off'})")
134
- ])
135
- ]
136
- )
137
- ]
138
- )
139
-
140
- # Layout
141
- layout = RatatuiRuby::Layout.new(
142
- direction: :vertical,
143
- constraints: [
144
- RatatuiRuby::Constraint.fill(1),
145
- RatatuiRuby::Constraint.length(5),
146
- ],
147
- children: [table, control_panel]
148
- )
149
-
150
- # Draw the table
151
- RatatuiRuby.draw(layout)
152
- end
153
-
154
- def handle_input
155
- event = RatatuiRuby.poll_event
156
- return unless event
157
-
158
- case event
159
- in {type: :key, code: "q"} | {type: :key, code: "c", modifiers: ["ctrl"]}
160
- :quit
161
- in type: :key, code: "down" | "j"
162
- @selected_index = ((@selected_index || -1) + 1) % PROCESSES.length
163
- in type: :key, code: "up" | "k"
164
- @selected_index = (@selected_index || 0) - 1
165
- @selected_index = PROCESSES.length - 1 if @selected_index.negative?
166
- in type: :key, code: "right" | "l"
167
- @selected_col = ((@selected_col || -1) + 1) % 3 # 3 columns
168
- in type: :key, code: "left" | "h"
169
- # 'h' is already used for highlight spacing, but let's override it or ignore vim keys for left/right?
170
- # Actually 'h' is used for spacing in this demo. Let's just use arrows for cols.
171
- # Or map 'h' to left if user meant vim keys.
172
- # The demo uses 'h' for "Spacing". Let's change Spacing key to 'p' (property/padding?) or something else.
173
- # Or just stick to arrows for columns to avoid conflict.
174
- @selected_col = (@selected_col || 0) - 1
175
- @selected_col = 2 if @selected_col.negative?
176
- in type: :key, code: "s"
177
- @current_style_index = (@current_style_index + 1) % STYLES.length
178
- in type: :key, code: "+"
179
- @column_spacing += 1
180
- in type: :key, code: "-"
181
- @column_spacing = [@column_spacing - 1, 0].max
182
- in type: :key, code: "p"
183
- @highlight_spacing_index = (@highlight_spacing_index + 1) % HIGHLIGHT_SPACINGS.length
184
- in type: :key, code: "x"
185
- @selected_index = @selected_index.nil? ? 0 : nil
186
- in type: :key, code: "c"
187
- @show_column_highlight = !@show_column_highlight
188
- in type: :key, code: "z"
189
- @show_cell_highlight = !@show_cell_highlight
190
- else
191
- nil
192
- end
193
- end
194
- end
195
-
196
- if __FILE__ == $0
197
- TableSelectApp.new.run
198
- end
@@ -1,7 +0,0 @@
1
- class TableSelectApp
2
- # @public
3
- def self.new: () -> TableSelectApp
4
-
5
- # @public
6
- def run: () -> void
7
- end
@@ -1,180 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
5
- # SPDX-License-Identifier: AGPL-3.0-or-later
6
-
7
- $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
8
- require "ratatui_ruby"
9
- require "ratatui_ruby/test_helper"
10
- require "minitest/autorun"
11
- require_relative "app"
12
-
13
- # Tests for the table_select example
14
- class TestTableSelectApp < Minitest::Test
15
- include RatatuiRuby::TestHelper
16
-
17
- def setup
18
- @app = TableSelectApp.new
19
- end
20
-
21
- def test_initial_render_no_selection
22
- with_test_terminal do
23
- # By default, selection is at index 1 and highlights are on.
24
- inject_key(:q)
25
- @app.run
26
-
27
- content = buffer_content.join("\n")
28
- # Row 1 (postgres) should be selected.
29
- # Default style is Cyan.
30
- # "Toggle Row (1)" should be visible in footer.
31
- assert_includes content, "Toggle Row (1)"
32
- assert_includes content, "Cyan"
33
- assert_includes content, "PID"
34
- end
35
- end
36
-
37
- def test_style_switching
38
- second_style_name = TableSelectApp::STYLES[1][:name]
39
-
40
- with_test_terminal do
41
- inject_keys(:s, :q)
42
- @app.run
43
-
44
- content = buffer_content
45
- assert content.any? { |line| line.include?(second_style_name) }
46
- end
47
- end
48
-
49
- def test_toggle_selection_on
50
- with_test_terminal do
51
- # Default is ON (1 selected).
52
- # Press x to toggle off (none), then quit
53
- inject_keys(:x, :q)
54
- @app.run
55
-
56
- content = buffer_content.join("\n")
57
- # "Toggle Row (none)" should be visible.
58
- assert_includes content, "Toggle Row (none)"
59
- end
60
- end
61
-
62
- def test_toggle_selection_off
63
- with_test_terminal do
64
- # Default is ON.
65
- # Press x to toggle off, x again to toggle on (0 selected now because toggle logic resets to 0 if nil?), then quit
66
- # Wait, app logic: @selected_index = @selected_index.nil? ? 0 : nil
67
- # If default is 1, toggling off makes it nil. Toggling on makes it 0.
68
- inject_keys(:x, :x, :q)
69
- @app.run
70
-
71
- content = buffer_content.join("\n")
72
- assert_includes content, "Toggle Row (0)"
73
- end
74
- end
75
-
76
- def test_navigation_selects_and_moves
77
- with_test_terminal do
78
- # Default is 1. Down -> 2.
79
- inject_keys(:down, :q)
80
- @app.run
81
-
82
- content = buffer_content.join("\n")
83
- assert_includes content, "Toggle Row (2)"
84
- end
85
- end
86
-
87
- def test_navigation_wrapping
88
- with_test_terminal do
89
- # Start 1, down->2... wrap around logic needs check.
90
- # Logic: (@selected_index + 1) % length.
91
- # To test wrap, need to go to end. Length is 7.
92
- # From 1, need 6 downs to wrap? No, just up from 0 wraps to last.
93
- # So: up (1->0), up (0->6).
94
- inject_keys(:up, :up, :q)
95
- @app.run
96
-
97
- content = buffer_content.join("\n")
98
- last_index = PROCESSES.length - 1
99
- assert_includes content, "Toggle Row (#{last_index})"
100
- end
101
- end
102
-
103
- def test_column_navigation
104
- with_test_terminal do
105
- # Default col 1. Right -> 2.
106
- inject_keys(:right, :q)
107
- @app.run
108
-
109
- content = buffer_content.join("\n")
110
- assert_includes content, "Nav Col"
111
- # We don't have a label for selected column in the footer anymore?
112
- # Wait, I added it in app.rb but removed it in previous step?
113
- # In Step 115 I added `col_label` but I didn't verify if I used it in the UI.
114
- # Let me check app.rb again. I might have missed adding it to the UI in Step 87 layout fix or Step 115.
115
- # Step 115 added `col_label = ...` but did NOT add it to the Paragraph text.
116
- # I need to check app.rb to see if `col_label` is rendered.
117
- end
118
- end
119
-
120
- def test_quit
121
- with_test_terminal do
122
- inject_key(:q)
123
- @app.run
124
- end
125
- end
126
-
127
- def test_highlight_spacing_cycles_to_next
128
- with_test_terminal do
129
- # Mode order: [:when_selected, :always, :never]
130
- # 'p' goes to :always
131
- inject_keys(:p, :q)
132
- @app.run
133
-
134
- content = buffer_content
135
- assert content.any? { |line| line.include?("Always") }
136
- end
137
- end
138
-
139
- def test_highlight_spacing_cycles_to_never
140
- with_test_terminal do
141
- # 'p' goes: when_selected -> always -> never
142
- inject_keys(:p, :p, :q)
143
- @app.run
144
-
145
- content = buffer_content
146
- assert content.any? { |line| line.include?("Never") }
147
- end
148
- end
149
-
150
- def test_highlight_spacing_cycles_back_to_when_selected
151
- with_test_terminal do
152
- # 'p' goes: when_selected -> always -> never -> when_selected
153
- inject_keys(:p, :p, :p, :q)
154
- @app.run
155
-
156
- content = buffer_content
157
- assert content.any? { |line| line.include?("When Selected") }
158
- end
159
- end
160
-
161
- def test_column_spacing_increases
162
- with_test_terminal do
163
- inject_keys("+", :q)
164
- @app.run
165
-
166
- content = buffer_content
167
- assert content.any? { |line| line.include?("Col Space (2)") }
168
- end
169
- end
170
-
171
- def test_column_spacing_decreases
172
- with_test_terminal do
173
- inject_keys("+", "-", :q)
174
- @app.run
175
-
176
- content = buffer_content
177
- assert content.any? { |line| line.include?("Col Space (1)") }
178
- end
179
- end
180
- end
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
4
- # SPDX-License-Identifier: AGPL-3.0-or-later
5
-
6
- $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
7
- require "ratatui_ruby"
8
- require "ratatui_ruby/test_helper"
9
- require "minitest/autorun"
10
- require_relative "app"
11
-
12
- class TestColorGradientDemo < Minitest::Test
13
- include RatatuiRuby::TestHelper
14
-
15
- def setup
16
- @app = ColorGradientDemo.new
17
- end
18
-
19
- def test_renders_with_title
20
- with_test_terminal do
21
- inject_key(:q)
22
- @app.run
23
-
24
- content = buffer_content.join("\n")
25
- assert_includes content, "Hex Color Gradient"
26
- end
27
- end
28
-
29
- def test_renders_gradient_cells
30
- with_test_terminal do
31
- inject_key(:q)
32
- @app.run
33
-
34
- content = buffer_content.join("\n")
35
- # Should have many spaces (gradient cells)
36
- assert content.length > 500
37
- end
38
- end
39
-
40
- def test_exit_on_q
41
- with_test_terminal do
42
- inject_key(:q)
43
- @app.run
44
- # If we get here without hanging, exit worked
45
- assert true
46
- end
47
- end
48
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
4
- # SPDX-License-Identifier: AGPL-3.0-or-later
5
-
6
- # ComparisonLinks manages the git comparison links at the bottom of the changelog.
7
- class ComparisonLinks
8
- PATTERN = /^(\[Unreleased\]: .*)$/m
9
-
10
- # Extracts the comparison links from the given content.
11
- def self.parse(content)
12
- match = content.match(PATTERN)
13
- new(match[1].strip) if match
14
- end
15
-
16
- # Creates a new ComparisonLinks from the given links text.
17
- def initialize(links)
18
- @links = links.dup
19
- end
20
-
21
- # Updates the comparison links for the new version.
22
- def update(new_version)
23
- pattern = %r{^\[Unreleased\]: (.*?/compare/)v(.*)\.\.\.HEAD$}
24
- match = @links.match(pattern)
25
- return unless match
26
-
27
- base_url = match[1]
28
- prev_version = match[2]
29
-
30
- new_unreleased = "[Unreleased]: #{base_url}v#{new_version}...HEAD"
31
- new_version_link = "[#{new_version}]: #{base_url}v#{prev_version}...v#{new_version}"
32
-
33
- @links.sub!(pattern, "#{new_unreleased}\n#{new_version_link}")
34
- nil
35
- end
36
-
37
- # Returns the current state of the links as a string.
38
- def to_s
39
- @links
40
- end
41
- end
File without changes
File without changes
File without changes
File without changes