ratatui_ruby 0.5.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 (234) 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 +6 -0
  7. data/CHANGELOG.md +44 -7
  8. data/README.md +11 -4
  9. data/REUSE.toml +2 -7
  10. data/doc/application_architecture.md +84 -10
  11. data/doc/application_testing.md +75 -29
  12. data/doc/contributors/design/ruby_frontend.md +39 -3
  13. data/doc/contributors/design/rust_backend.md +1 -0
  14. data/doc/contributors/developing_examples.md +129 -44
  15. data/doc/contributors/examples_audit/p1_high.md +21 -0
  16. data/doc/contributors/examples_audit/p2_moderate.md +81 -0
  17. data/doc/contributors/examples_audit.md +41 -0
  18. data/doc/event_handling.md +11 -3
  19. data/doc/images/app_all_events.png +0 -0
  20. data/doc/images/app_color_picker.png +0 -0
  21. data/doc/images/app_login_form.png +0 -0
  22. data/doc/images/app_stateful_interaction.png +0 -0
  23. data/doc/images/verify_quickstart_dsl.png +0 -0
  24. data/doc/images/verify_quickstart_layout.png +0 -0
  25. data/doc/images/verify_quickstart_lifecycle.png +0 -0
  26. data/doc/images/verify_readme_usage.png +0 -0
  27. data/doc/images/widget_barchart_demo.png +0 -0
  28. data/doc/images/widget_block_demo.png +0 -0
  29. data/doc/images/widget_canvas_demo.png +0 -0
  30. data/doc/images/widget_cell_demo.png +0 -0
  31. data/doc/images/widget_center_demo.png +0 -0
  32. data/doc/images/widget_chart_demo.png +0 -0
  33. data/doc/images/widget_list_demo.png +0 -0
  34. data/doc/images/widget_overlay_demo.png +0 -0
  35. data/doc/images/widget_render.png +0 -0
  36. data/doc/images/widget_rich_text.png +0 -0
  37. data/doc/images/widget_scroll_text.png +0 -0
  38. data/doc/images/widget_sparkline_demo.png +0 -0
  39. data/doc/images/widget_table_demo.png +0 -0
  40. data/doc/images/widget_tabs_demo.png +0 -0
  41. data/doc/images/widget_text_width.png +0 -0
  42. data/doc/quickstart.md +69 -76
  43. data/doc/terminal_limitations.md +92 -0
  44. data/examples/app_all_events/README.md +45 -27
  45. data/examples/app_all_events/app.rb +38 -35
  46. data/examples/app_all_events/model/app_model.rb +157 -0
  47. data/examples/app_all_events/model/event_entry.rb +17 -0
  48. data/examples/app_all_events/model/msg.rb +37 -0
  49. data/examples/app_all_events/update.rb +73 -0
  50. data/examples/app_all_events/view/app_view.rb +8 -8
  51. data/examples/app_all_events/view/controls_view.rb +8 -6
  52. data/examples/app_all_events/view/counts_view.rb +12 -8
  53. data/examples/app_all_events/view/live_view.rb +8 -7
  54. data/examples/app_all_events/view/log_view.rb +10 -15
  55. data/examples/app_color_picker/README.md +84 -44
  56. data/examples/app_color_picker/app.rb +24 -62
  57. data/examples/app_color_picker/controls.rb +90 -0
  58. data/examples/app_color_picker/copy_dialog.rb +45 -49
  59. data/examples/app_color_picker/export_pane.rb +126 -0
  60. data/examples/app_color_picker/input.rb +99 -67
  61. data/examples/app_color_picker/main_container.rb +178 -0
  62. data/examples/app_color_picker/palette.rb +55 -26
  63. data/examples/app_login_form/README.md +47 -0
  64. data/examples/app_login_form/app.rb +2 -3
  65. data/examples/app_stateful_interaction/README.md +31 -0
  66. data/examples/app_stateful_interaction/app.rb +272 -0
  67. data/examples/timeout_demo.rb +43 -0
  68. data/examples/verify_quickstart_dsl/README.md +48 -0
  69. data/examples/verify_quickstart_dsl/app.rb +2 -0
  70. data/examples/verify_quickstart_layout/README.md +71 -0
  71. data/examples/verify_quickstart_layout/app.rb +2 -0
  72. data/examples/verify_quickstart_lifecycle/README.md +56 -0
  73. data/examples/verify_quickstart_lifecycle/app.rb +8 -2
  74. data/examples/verify_readme_usage/README.md +43 -0
  75. data/examples/verify_readme_usage/app.rb +8 -2
  76. data/examples/widget_barchart_demo/README.md +49 -0
  77. data/examples/widget_barchart_demo/app.rb +5 -5
  78. data/examples/widget_block_demo/README.md +34 -0
  79. data/examples/widget_block_demo/app.rb +256 -0
  80. data/examples/widget_box_demo/README.md +45 -0
  81. data/examples/widget_calendar_demo/README.md +39 -0
  82. data/examples/widget_canvas_demo/README.md +27 -0
  83. data/examples/widget_canvas_demo/app.rb +123 -0
  84. data/examples/widget_cell_demo/README.md +36 -0
  85. data/examples/widget_cell_demo/app.rb +31 -24
  86. data/examples/widget_center_demo/README.md +29 -0
  87. data/examples/widget_center_demo/app.rb +116 -0
  88. data/examples/widget_chart_demo/README.md +41 -0
  89. data/examples/widget_chart_demo/app.rb +7 -2
  90. data/examples/widget_gauge_demo/README.md +41 -0
  91. data/examples/widget_layout_split/README.md +44 -0
  92. data/examples/widget_line_gauge_demo/README.md +41 -0
  93. data/examples/widget_list_demo/README.md +49 -0
  94. data/examples/widget_list_demo/app.rb +91 -107
  95. data/examples/widget_map_demo/README.md +39 -0
  96. data/examples/{app_map_demo → widget_map_demo}/app.rb +2 -2
  97. data/examples/widget_overlay_demo/app.rb +248 -0
  98. data/examples/widget_popup_demo/README.md +36 -0
  99. data/examples/widget_ratatui_logo_demo/README.md +34 -0
  100. data/examples/widget_ratatui_mascot_demo/README.md +34 -0
  101. data/examples/widget_rect/README.md +38 -0
  102. data/examples/widget_render/README.md +37 -0
  103. data/examples/widget_rich_text/README.md +35 -0
  104. data/examples/widget_rich_text/app.rb +62 -33
  105. data/examples/widget_scroll_text/README.md +37 -0
  106. data/examples/widget_scroll_text/app.rb +0 -1
  107. data/examples/widget_scrollbar_demo/README.md +37 -0
  108. data/examples/widget_sparkline_demo/README.md +42 -0
  109. data/examples/widget_sparkline_demo/app.rb +4 -3
  110. data/examples/widget_style_colors/README.md +34 -0
  111. data/examples/widget_table_demo/README.md +48 -0
  112. data/examples/{app_table_select → widget_table_demo}/app.rb +46 -8
  113. data/examples/widget_tabs_demo/README.md +41 -0
  114. data/examples/widget_tabs_demo/app.rb +15 -1
  115. data/examples/widget_text_width/README.md +35 -0
  116. data/examples/widget_text_width/app.rb +106 -0
  117. data/exe/.gitkeep +0 -0
  118. data/ext/ratatui_ruby/Cargo.lock +11 -4
  119. data/ext/ratatui_ruby/Cargo.toml +2 -1
  120. data/ext/ratatui_ruby/src/events.rs +238 -26
  121. data/ext/ratatui_ruby/src/frame.rs +113 -1
  122. data/ext/ratatui_ruby/src/lib.rs +34 -4
  123. data/ext/ratatui_ruby/src/string_width.rs +101 -0
  124. data/ext/ratatui_ruby/src/terminal.rs +39 -15
  125. data/ext/ratatui_ruby/src/text.rs +1 -1
  126. data/ext/ratatui_ruby/src/widgets/barchart.rs +24 -6
  127. data/ext/ratatui_ruby/src/widgets/gauge.rs +9 -2
  128. data/ext/ratatui_ruby/src/widgets/line_gauge.rs +9 -2
  129. data/ext/ratatui_ruby/src/widgets/list.rs +179 -3
  130. data/ext/ratatui_ruby/src/widgets/list_state.rs +137 -0
  131. data/ext/ratatui_ruby/src/widgets/mod.rs +3 -0
  132. data/ext/ratatui_ruby/src/widgets/scrollbar.rs +93 -1
  133. data/ext/ratatui_ruby/src/widgets/scrollbar_state.rs +169 -0
  134. data/ext/ratatui_ruby/src/widgets/table.rs +113 -1
  135. data/ext/ratatui_ruby/src/widgets/table_state.rs +121 -0
  136. data/lib/ratatui_ruby/cell.rb +4 -4
  137. data/lib/ratatui_ruby/event/key/character.rb +35 -0
  138. data/lib/ratatui_ruby/event/key/media.rb +44 -0
  139. data/lib/ratatui_ruby/event/key/modifier.rb +95 -0
  140. data/lib/ratatui_ruby/event/key/navigation.rb +55 -0
  141. data/lib/ratatui_ruby/event/key/system.rb +45 -0
  142. data/lib/ratatui_ruby/event/key.rb +111 -51
  143. data/lib/ratatui_ruby/event/mouse.rb +3 -3
  144. data/lib/ratatui_ruby/event/paste.rb +1 -1
  145. data/lib/ratatui_ruby/frame.rb +96 -0
  146. data/lib/ratatui_ruby/list_state.rb +88 -0
  147. data/lib/ratatui_ruby/schema/bar_chart/bar.rb +2 -2
  148. data/lib/ratatui_ruby/schema/cursor.rb +5 -0
  149. data/lib/ratatui_ruby/schema/gauge.rb +3 -1
  150. data/lib/ratatui_ruby/schema/line_gauge.rb +2 -2
  151. data/lib/ratatui_ruby/schema/list.rb +25 -4
  152. data/lib/ratatui_ruby/schema/list_item.rb +41 -0
  153. data/lib/ratatui_ruby/schema/rect.rb +43 -0
  154. data/lib/ratatui_ruby/schema/style.rb +24 -4
  155. data/lib/ratatui_ruby/schema/table.rb +21 -3
  156. data/lib/ratatui_ruby/schema/text.rb +69 -1
  157. data/lib/ratatui_ruby/scrollbar_state.rb +112 -0
  158. data/lib/ratatui_ruby/session/autodoc.rb +65 -0
  159. data/lib/ratatui_ruby/session.rb +22 -7
  160. data/lib/ratatui_ruby/table_state.rb +90 -0
  161. data/lib/ratatui_ruby/test_helper/event_injection.rb +169 -0
  162. data/lib/ratatui_ruby/test_helper/snapshot.rb +390 -0
  163. data/lib/ratatui_ruby/test_helper/style_assertions.rb +351 -0
  164. data/lib/ratatui_ruby/test_helper/terminal.rb +127 -0
  165. data/lib/ratatui_ruby/test_helper/test_doubles.rb +68 -0
  166. data/lib/ratatui_ruby/test_helper.rb +65 -358
  167. data/lib/ratatui_ruby/version.rb +1 -1
  168. data/lib/ratatui_ruby.rb +42 -19
  169. data/sig/examples/app_stateful_interaction/app.rbs +33 -0
  170. data/sig/examples/widget_block_demo/app.rbs +32 -0
  171. data/sig/examples/{app_map_demo → widget_map_demo}/app.rbs +2 -2
  172. data/sig/examples/{app_table_select → widget_table_demo}/app.rbs +2 -2
  173. data/sig/examples/{widget_table_flex → widget_text_width}/app.rbs +2 -3
  174. data/sig/ratatui_ruby/event.rbs +11 -1
  175. data/sig/ratatui_ruby/frame.rbs +2 -0
  176. data/sig/ratatui_ruby/list_state.rbs +13 -0
  177. data/sig/ratatui_ruby/ratatui_ruby.rbs +2 -2
  178. data/sig/ratatui_ruby/schema/bar_chart/bar.rbs +3 -3
  179. data/sig/ratatui_ruby/schema/gauge.rbs +2 -2
  180. data/sig/ratatui_ruby/schema/line_gauge.rbs +2 -2
  181. data/sig/ratatui_ruby/schema/list.rbs +4 -2
  182. data/sig/ratatui_ruby/schema/list_item.rbs +10 -0
  183. data/sig/ratatui_ruby/schema/rect.rbs +3 -0
  184. data/sig/ratatui_ruby/schema/style.rbs +3 -3
  185. data/sig/ratatui_ruby/schema/table.rbs +3 -1
  186. data/sig/ratatui_ruby/schema/text.rbs +8 -6
  187. data/sig/ratatui_ruby/scrollbar_state.rbs +18 -0
  188. data/sig/ratatui_ruby/session.rbs +13 -0
  189. data/sig/ratatui_ruby/table_state.rbs +15 -0
  190. data/sig/ratatui_ruby/test_helper/event_injection.rbs +16 -0
  191. data/sig/ratatui_ruby/test_helper/snapshot.rbs +12 -0
  192. data/sig/ratatui_ruby/test_helper/style_assertions.rbs +64 -0
  193. data/sig/ratatui_ruby/test_helper/terminal.rbs +14 -0
  194. data/sig/ratatui_ruby/test_helper/test_doubles.rbs +22 -0
  195. data/sig/ratatui_ruby/test_helper.rbs +5 -4
  196. data/tasks/autodoc/examples.rb +79 -0
  197. data/tasks/autodoc/inventory.rb +9 -7
  198. data/tasks/autodoc.rake +11 -5
  199. data/tasks/bump/changelog.rb +3 -3
  200. data/tasks/bump/links.rb +67 -0
  201. data/tasks/sourcehut.rake +61 -21
  202. data/tasks/terminal_preview/app_screenshot.rb +13 -3
  203. data/tasks/terminal_preview/saved_screenshot.rb +4 -3
  204. metadata +111 -37
  205. data/doc/images/app_table_select.png +0 -0
  206. data/doc/images/widget_block_padding.png +0 -0
  207. data/doc/images/widget_block_titles.png +0 -0
  208. data/doc/images/widget_list_styles.png +0 -0
  209. data/examples/app_all_events/model/events.rb +0 -180
  210. data/examples/app_all_events/model/highlight.rb +0 -57
  211. data/examples/app_all_events/test/snapshots/after_focus_lost.txt +0 -24
  212. data/examples/app_all_events/test/snapshots/after_focus_regained.txt +0 -24
  213. data/examples/app_all_events/test/snapshots/after_horizontal_resize.txt +0 -24
  214. data/examples/app_all_events/test/snapshots/after_key_a.txt +0 -24
  215. data/examples/app_all_events/test/snapshots/after_key_ctrl_x.txt +0 -24
  216. data/examples/app_all_events/test/snapshots/after_mouse_click.txt +0 -24
  217. data/examples/app_all_events/test/snapshots/after_mouse_drag.txt +0 -24
  218. data/examples/app_all_events/test/snapshots/after_multiple_events.txt +0 -24
  219. data/examples/app_all_events/test/snapshots/after_paste.txt +0 -24
  220. data/examples/app_all_events/test/snapshots/after_resize.txt +0 -24
  221. data/examples/app_all_events/test/snapshots/after_right_click.txt +0 -24
  222. data/examples/app_all_events/test/snapshots/after_vertical_resize.txt +0 -24
  223. data/examples/app_all_events/test/snapshots/initial_state.txt +0 -24
  224. data/examples/app_all_events/view_state.rb +0 -42
  225. data/examples/app_color_picker/scene.rb +0 -201
  226. data/examples/widget_block_padding/app.rb +0 -67
  227. data/examples/widget_block_titles/app.rb +0 -69
  228. data/examples/widget_list_styles/app.rb +0 -141
  229. data/examples/widget_table_flex/app.rb +0 -95
  230. data/sig/examples/widget_block_padding/app.rbs +0 -11
  231. data/sig/examples/widget_block_titles/app.rbs +0 -11
  232. data/sig/examples/widget_list_styles/app.rbs +0 -11
  233. data/tasks/bump/comparison_links.rb +0 -41
  234. /data/doc/images/{app_map_demo.png → widget_map_demo.png} +0 -0
@@ -0,0 +1,67 @@
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
+ # Manages the version comparison links at the botton of the changelog.
7
+ #
8
+ # Release automation needs to update links. Manually calculating git diff URLs
9
+ # for every release is tedious and error-prone. SourceHut does not have
10
+ # standard comparison views, complicating matters further.
11
+ #
12
+ # This class manages the collection of links. It parses them from the markdown.
13
+ # It generates the correct tree links for SourceHut. It properly shifts the
14
+ # "Unreleased" pointer.
15
+ #
16
+ # Use it to update the changelog during a release.
17
+ class Links
18
+ PATTERN = /^(\[Unreleased\]: .*)$/m
19
+ UNRELEASED_PATTERN = %r{^\[Unreleased\]: (.*?/refs/)HEAD$}
20
+
21
+ # Creates a Links object from the full markdown content.
22
+ #
23
+ # [content] String. The full text of the changelog.
24
+ def self.from_markdown(content)
25
+ match = content.match(PATTERN)
26
+ return unless match
27
+
28
+ new(match[1].strip)
29
+ end
30
+
31
+ # Returns the raw text of the links.
32
+ attr_reader :text
33
+
34
+ # Creates a new Links object.
35
+ #
36
+ # [text] String. The raw text of the links section.
37
+ def initialize(text)
38
+ @text = text.dup
39
+ end
40
+
41
+ # Releases a new version.
42
+ #
43
+ # Updates the "Unreleased" link to point to the new head. Adds a new link for
44
+ # the just-released version pointing to its specific tag.
45
+ #
46
+ # [version] String. The new version number (e.g., <tt>"0.5.0"</tt>).
47
+ def release(version)
48
+ return unless base_url
49
+
50
+ new_unreleased = "[Unreleased]: #{base_url}HEAD" # .../HEAD
51
+ new_version_link = "[#{version}]: #{base_url}v#{version}" # .../v1.0.0
52
+
53
+ @text.sub!(UNRELEASED_PATTERN, "#{new_unreleased}\n#{new_version_link}")
54
+ self
55
+ end
56
+
57
+ # Returns the string representation of the links.
58
+ def to_s
59
+ @text
60
+ end
61
+
62
+ # The base URL for the repository's references.
63
+ private def base_url
64
+ match = @text.match(UNRELEASED_PATTERN)
65
+ match[1] if match
66
+ end
67
+ end
data/tasks/sourcehut.rake CHANGED
@@ -4,35 +4,75 @@
4
4
  # SPDX-License-Identifier: AGPL-3.0-or-later
5
5
 
6
6
  desc "Generate SourceHut build manifests from template"
7
- task :sourcehut do
8
- require "erb"
9
- require "yaml"
7
+ task sourcehut: "sourcehut:build"
10
8
 
11
- spec = Gem::Specification.load("ratatui_ruby.gemspec")
9
+ namespace :sourcehut do
10
+ desc "Build SourceHut manifests"
11
+ task build: "sourcehut:build:manifest"
12
12
 
13
- # Read version directly from file to ensure we get the latest version
14
- # even if it was just bumped in the same Rake execution
15
- version_content = File.read("lib/ratatui_ruby/version.rb")
16
- version = version_content.match(/VERSION = "(.+?)"/)[1]
13
+ namespace :build do
14
+ desc "Generate SourceHut build manifests from template"
15
+ task :manifest do
16
+ require "erb"
17
+ require "yaml"
17
18
 
18
- gem_filename = "#{spec.name}-#{version}.gem"
19
+ spec = Gem::Specification.load("ratatui_ruby.gemspec")
19
20
 
20
- rubies = YAML.load_file("tasks/resources/rubies.yml")
21
+ # Read version directly from file to ensure we get the latest version
22
+ # even if it was just bumped in the same Rake execution
23
+ version_content = File.read("lib/ratatui_ruby/version.rb")
24
+ version = version_content.match(/VERSION = "(.+?)"/)[1]
21
25
 
22
- bundler_version = File.read("Gemfile.lock").match(/BUNDLED WITH\n\s+([\d.]+)/)[1]
26
+ gem_filename = "#{spec.name}-#{version}.gem"
23
27
 
24
- template = File.read("tasks/resources/build.yml.erb")
25
- erb = ERB.new(template, trim_mode: "-")
28
+ rubies = YAML.load_file("tasks/resources/rubies.yml")
26
29
 
27
- FileUtils.mkdir_p ".builds"
30
+ bundler_version = File.read("Gemfile.lock").match(/BUNDLED WITH\n\s+([\d.]+)/)[1]
28
31
 
29
- # Remove old generated files to ensure a clean state
30
- Dir.glob(".builds/*.yml").each { |f| File.delete(f) }
32
+ template = File.read("tasks/resources/build.yml.erb")
33
+ erb = ERB.new(template, trim_mode: "-")
31
34
 
32
- rubies.each do |ruby_version|
33
- filename = ".builds/ruby-#{ruby_version}.yml"
34
- puts "Generating #{filename}..."
35
- content = erb.result_with_hash(ruby_version:, gem_filename:, bundler_version:)
36
- File.write(filename, content)
35
+ FileUtils.mkdir_p ".builds"
36
+
37
+ # Remove old generated files to ensure a clean state
38
+ Dir.glob(".builds/*.yml").each { |f| File.delete(f) }
39
+
40
+ rubies.each do |ruby_version|
41
+ filename = ".builds/ruby-#{ruby_version}.yml"
42
+ puts "Generating #{filename}..."
43
+ content = erb.result_with_hash(ruby_version:, gem_filename:, bundler_version:)
44
+ File.write(filename, content)
45
+ end
46
+ end
47
+ end
48
+
49
+ desc "Update stable branch to match release and set as default"
50
+ task :update_stable do
51
+ # Read version to determine tag
52
+ version_content = File.read("lib/ratatui_ruby/version.rb")
53
+ version = version_content.match(/VERSION = "(.+?)"/)[1]
54
+ tag_name = "v#{version}"
55
+
56
+ # Verify that the version file matches the actual git tag
57
+ # This prevents updating stable to the wrong version if the release failed
58
+ latest_tag = `git describe --tags --abbrev=0`.strip
59
+ if latest_tag != tag_name
60
+ abort "Fatal: Version mismatch! 'lib/ratatui_ruby/version.rb' says #{tag_name}, but the latest git tag is #{latest_tag}."
61
+ end
62
+
63
+ puts "Updating stable branch to point to #{tag_name}..."
64
+ # Resolve the tag to a commit hash (peel annotated tags)
65
+ # This renders a commit SHA that can be pushed to a branch head
66
+ commit_sha = `git rev-parse #{tag_name}^{}`.strip
67
+
68
+ # Push the commit to stable branch
69
+ # This creates 'stable' if it doesn't exist, or fast-forwards it.
70
+ sh "git push origin #{commit_sha}:stable"
71
+ end
72
+ end
73
+
74
+ if Rake::Task.task_defined?("release")
75
+ Rake::Task["release"].enhance do
76
+ Rake::Task["sourcehut:update_stable"].invoke
37
77
  end
38
78
  end
@@ -15,8 +15,18 @@ class AppScreenshot < Data.define(:app, :output_path)
15
15
  LauncherScript.new(app.app_path, Dir.pwd).run do |launcher|
16
16
  TerminalWindow.new(launcher.path, launcher.pid_file).open do |window|
17
17
  take_snapshot(window.window_id)
18
- puts " done."
19
- true
18
+
19
+ if File.size?(output_path)
20
+ puts " done."
21
+ true
22
+ else
23
+ FileUtils.rm_f(output_path)
24
+ puts " FAILED"
25
+ puts
26
+ puts " Window rendered nothing (app may have crashed before drawing)"
27
+ puts
28
+ false
29
+ end
20
30
  end
21
31
  end
22
32
  rescue => e
@@ -28,6 +38,6 @@ class AppScreenshot < Data.define(:app, :output_path)
28
38
  end
29
39
 
30
40
  private def take_snapshot(window_id)
31
- system("screencapture -l #{window_id} -o -x '#{output_path}'")
41
+ system("screencapture", "-l", window_id.to_s, "-o", "-x", output_path)
32
42
  end
33
43
  end
@@ -11,13 +11,14 @@ class SavedScreenshot < Data.define(:app, :path)
11
11
  end
12
12
 
13
13
  def stale?
14
- return true unless exists?
14
+ return true unless valid?
15
15
 
16
16
  app_last_modified > screenshot_last_commit_time
17
17
  end
18
18
 
19
- private def exists?
20
- File.exist?(path)
19
+ private def valid?
20
+ # File must exist and have content (not 0 bytes)
21
+ File.size?(path) || false
21
22
  end
22
23
 
23
24
  private def app_last_modified
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ratatui_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kerrick Long
@@ -65,11 +65,26 @@ dependencies:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
67
  version: '7.0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: faker
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: 3.5.3
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: 3.5.3
68
82
  description: ratatui_ruby is a wrapper for the Ratatui Rust crate <https://ratatui.rs>.
69
83
  It allows you to cook up Terminal User Interfaces in Ruby.
70
84
  email:
71
85
  - me@kerricklong.com
72
- executables: []
86
+ executables:
87
+ - ".gitkeep"
73
88
  extensions:
74
89
  - ext/ratatui_ruby/extconf.rb
75
90
  extra_rdoc_files: []
@@ -98,6 +113,9 @@ files:
98
113
  - doc/contributors/developing_examples.md
99
114
  - doc/contributors/documentation_style.md
100
115
  - doc/contributors/dwim_dx.md
116
+ - doc/contributors/examples_audit.md
117
+ - doc/contributors/examples_audit/p1_high.md
118
+ - doc/contributors/examples_audit/p2_moderate.md
101
119
  - doc/contributors/index.md
102
120
  - doc/custom.css
103
121
  - doc/event_handling.md
@@ -106,25 +124,26 @@ files:
106
124
  - doc/images/app_color_picker.png
107
125
  - doc/images/app_custom_widget.png
108
126
  - doc/images/app_login_form.png
109
- - doc/images/app_map_demo.png
110
127
  - doc/images/app_mouse_events.png
111
- - doc/images/app_table_select.png
128
+ - doc/images/app_stateful_interaction.png
112
129
  - doc/images/verify_quickstart_dsl.png
113
130
  - doc/images/verify_quickstart_layout.png
114
131
  - doc/images/verify_quickstart_lifecycle.png
115
132
  - doc/images/verify_readme_usage.png
116
133
  - doc/images/widget_barchart_demo.png
117
- - doc/images/widget_block_padding.png
118
- - doc/images/widget_block_titles.png
134
+ - doc/images/widget_block_demo.png
119
135
  - doc/images/widget_box_demo.png
120
136
  - doc/images/widget_calendar_demo.png
137
+ - doc/images/widget_canvas_demo.png
121
138
  - doc/images/widget_cell_demo.png
139
+ - doc/images/widget_center_demo.png
122
140
  - doc/images/widget_chart_demo.png
123
141
  - doc/images/widget_gauge_demo.png
124
142
  - doc/images/widget_layout_split.png
125
143
  - doc/images/widget_line_gauge_demo.png
126
144
  - doc/images/widget_list_demo.png
127
- - doc/images/widget_list_styles.png
145
+ - doc/images/widget_map_demo.png
146
+ - doc/images/widget_overlay_demo.png
128
147
  - doc/images/widget_popup_demo.png
129
148
  - doc/images/widget_ratatui_logo_demo.png
130
149
  - doc/images/widget_ratatui_mascot_demo.png
@@ -135,78 +154,106 @@ files:
135
154
  - doc/images/widget_scrollbar_demo.png
136
155
  - doc/images/widget_sparkline_demo.png
137
156
  - doc/images/widget_style_colors.png
157
+ - doc/images/widget_table_demo.png
138
158
  - doc/images/widget_table_flex.png
139
159
  - doc/images/widget_tabs_demo.png
160
+ - doc/images/widget_text_width.png
140
161
  - doc/index.md
141
162
  - doc/interactive_design.md
142
163
  - doc/quickstart.md
164
+ - doc/terminal_limitations.md
143
165
  - examples/app_all_events/README.md
144
166
  - examples/app_all_events/app.rb
167
+ - examples/app_all_events/model/app_model.rb
145
168
  - examples/app_all_events/model/event_color_cycle.rb
146
169
  - examples/app_all_events/model/event_entry.rb
147
- - examples/app_all_events/model/events.rb
148
- - examples/app_all_events/model/highlight.rb
170
+ - examples/app_all_events/model/msg.rb
149
171
  - examples/app_all_events/model/timestamp.rb
150
- - examples/app_all_events/test/snapshots/after_focus_lost.txt
151
- - examples/app_all_events/test/snapshots/after_focus_regained.txt
152
- - examples/app_all_events/test/snapshots/after_horizontal_resize.txt
153
- - examples/app_all_events/test/snapshots/after_key_a.txt
154
- - examples/app_all_events/test/snapshots/after_key_ctrl_x.txt
155
- - examples/app_all_events/test/snapshots/after_mouse_click.txt
156
- - examples/app_all_events/test/snapshots/after_mouse_drag.txt
157
- - examples/app_all_events/test/snapshots/after_multiple_events.txt
158
- - examples/app_all_events/test/snapshots/after_paste.txt
159
- - examples/app_all_events/test/snapshots/after_resize.txt
160
- - examples/app_all_events/test/snapshots/after_right_click.txt
161
- - examples/app_all_events/test/snapshots/after_vertical_resize.txt
162
- - examples/app_all_events/test/snapshots/initial_state.txt
172
+ - examples/app_all_events/update.rb
163
173
  - examples/app_all_events/view.rb
164
174
  - examples/app_all_events/view/app_view.rb
165
175
  - examples/app_all_events/view/controls_view.rb
166
176
  - examples/app_all_events/view/counts_view.rb
167
177
  - examples/app_all_events/view/live_view.rb
168
178
  - examples/app_all_events/view/log_view.rb
169
- - examples/app_all_events/view_state.rb
170
179
  - examples/app_color_picker/README.md
171
180
  - examples/app_color_picker/app.rb
172
181
  - examples/app_color_picker/clipboard.rb
173
182
  - examples/app_color_picker/color.rb
183
+ - examples/app_color_picker/controls.rb
174
184
  - examples/app_color_picker/copy_dialog.rb
185
+ - examples/app_color_picker/export_pane.rb
175
186
  - examples/app_color_picker/harmony.rb
176
187
  - examples/app_color_picker/input.rb
188
+ - examples/app_color_picker/main_container.rb
177
189
  - examples/app_color_picker/palette.rb
178
- - examples/app_color_picker/scene.rb
190
+ - examples/app_login_form/README.md
179
191
  - examples/app_login_form/app.rb
180
- - examples/app_map_demo/app.rb
181
- - examples/app_table_select/app.rb
192
+ - examples/app_stateful_interaction/README.md
193
+ - examples/app_stateful_interaction/app.rb
194
+ - examples/timeout_demo.rb
195
+ - examples/verify_quickstart_dsl/README.md
182
196
  - examples/verify_quickstart_dsl/app.rb
197
+ - examples/verify_quickstart_layout/README.md
183
198
  - examples/verify_quickstart_layout/app.rb
199
+ - examples/verify_quickstart_lifecycle/README.md
184
200
  - examples/verify_quickstart_lifecycle/app.rb
201
+ - examples/verify_readme_usage/README.md
185
202
  - examples/verify_readme_usage/app.rb
203
+ - examples/widget_barchart_demo/README.md
186
204
  - examples/widget_barchart_demo/app.rb
187
- - examples/widget_block_padding/app.rb
188
- - examples/widget_block_titles/app.rb
205
+ - examples/widget_block_demo/README.md
206
+ - examples/widget_block_demo/app.rb
207
+ - examples/widget_box_demo/README.md
189
208
  - examples/widget_box_demo/app.rb
209
+ - examples/widget_calendar_demo/README.md
190
210
  - examples/widget_calendar_demo/app.rb
211
+ - examples/widget_canvas_demo/README.md
212
+ - examples/widget_canvas_demo/app.rb
213
+ - examples/widget_cell_demo/README.md
191
214
  - examples/widget_cell_demo/app.rb
215
+ - examples/widget_center_demo/README.md
216
+ - examples/widget_center_demo/app.rb
217
+ - examples/widget_chart_demo/README.md
192
218
  - examples/widget_chart_demo/app.rb
219
+ - examples/widget_gauge_demo/README.md
193
220
  - examples/widget_gauge_demo/app.rb
221
+ - examples/widget_layout_split/README.md
194
222
  - examples/widget_layout_split/app.rb
223
+ - examples/widget_line_gauge_demo/README.md
195
224
  - examples/widget_line_gauge_demo/app.rb
225
+ - examples/widget_list_demo/README.md
196
226
  - examples/widget_list_demo/app.rb
197
- - examples/widget_list_styles/app.rb
227
+ - examples/widget_map_demo/README.md
228
+ - examples/widget_map_demo/app.rb
229
+ - examples/widget_overlay_demo/app.rb
230
+ - examples/widget_popup_demo/README.md
198
231
  - examples/widget_popup_demo/app.rb
232
+ - examples/widget_ratatui_logo_demo/README.md
199
233
  - examples/widget_ratatui_logo_demo/app.rb
234
+ - examples/widget_ratatui_mascot_demo/README.md
200
235
  - examples/widget_ratatui_mascot_demo/app.rb
236
+ - examples/widget_rect/README.md
201
237
  - examples/widget_rect/app.rb
238
+ - examples/widget_render/README.md
202
239
  - examples/widget_render/app.rb
240
+ - examples/widget_rich_text/README.md
203
241
  - examples/widget_rich_text/app.rb
242
+ - examples/widget_scroll_text/README.md
204
243
  - examples/widget_scroll_text/app.rb
244
+ - examples/widget_scrollbar_demo/README.md
205
245
  - examples/widget_scrollbar_demo/app.rb
246
+ - examples/widget_sparkline_demo/README.md
206
247
  - examples/widget_sparkline_demo/app.rb
248
+ - examples/widget_style_colors/README.md
207
249
  - examples/widget_style_colors/app.rb
208
- - examples/widget_table_flex/app.rb
250
+ - examples/widget_table_demo/README.md
251
+ - examples/widget_table_demo/app.rb
252
+ - examples/widget_tabs_demo/README.md
209
253
  - examples/widget_tabs_demo/app.rb
254
+ - examples/widget_text_width/README.md
255
+ - examples/widget_text_width/app.rb
256
+ - exe/.gitkeep
210
257
  - ext/ratatui_ruby/.cargo/config.toml
211
258
  - ext/ratatui_ruby/.gitignore
212
259
  - ext/ratatui_ruby/Cargo.lock
@@ -217,6 +264,7 @@ files:
217
264
  - ext/ratatui_ruby/src/frame.rs
218
265
  - ext/ratatui_ruby/src/lib.rs
219
266
  - ext/ratatui_ruby/src/rendering.rs
267
+ - ext/ratatui_ruby/src/string_width.rs
220
268
  - ext/ratatui_ruby/src/style.rs
221
269
  - ext/ratatui_ruby/src/terminal.rs
222
270
  - ext/ratatui_ruby/src/text.rs
@@ -232,14 +280,17 @@ files:
232
280
  - ext/ratatui_ruby/src/widgets/layout.rs
233
281
  - ext/ratatui_ruby/src/widgets/line_gauge.rs
234
282
  - ext/ratatui_ruby/src/widgets/list.rs
283
+ - ext/ratatui_ruby/src/widgets/list_state.rs
235
284
  - ext/ratatui_ruby/src/widgets/mod.rs
236
285
  - ext/ratatui_ruby/src/widgets/overlay.rs
237
286
  - ext/ratatui_ruby/src/widgets/paragraph.rs
238
287
  - ext/ratatui_ruby/src/widgets/ratatui_logo.rs
239
288
  - ext/ratatui_ruby/src/widgets/ratatui_mascot.rs
240
289
  - ext/ratatui_ruby/src/widgets/scrollbar.rs
290
+ - ext/ratatui_ruby/src/widgets/scrollbar_state.rs
241
291
  - ext/ratatui_ruby/src/widgets/sparkline.rs
242
292
  - ext/ratatui_ruby/src/widgets/table.rs
293
+ - ext/ratatui_ruby/src/widgets/table_state.rs
243
294
  - ext/ratatui_ruby/src/widgets/tabs.rs
244
295
  - lib/ratatui_ruby.rb
245
296
  - lib/ratatui_ruby/cell.rb
@@ -247,11 +298,17 @@ files:
247
298
  - lib/ratatui_ruby/event/focus_gained.rb
248
299
  - lib/ratatui_ruby/event/focus_lost.rb
249
300
  - lib/ratatui_ruby/event/key.rb
301
+ - lib/ratatui_ruby/event/key/character.rb
302
+ - lib/ratatui_ruby/event/key/media.rb
303
+ - lib/ratatui_ruby/event/key/modifier.rb
304
+ - lib/ratatui_ruby/event/key/navigation.rb
305
+ - lib/ratatui_ruby/event/key/system.rb
250
306
  - lib/ratatui_ruby/event/mouse.rb
251
307
  - lib/ratatui_ruby/event/none.rb
252
308
  - lib/ratatui_ruby/event/paste.rb
253
309
  - lib/ratatui_ruby/event/resize.rb
254
310
  - lib/ratatui_ruby/frame.rb
311
+ - lib/ratatui_ruby/list_state.rb
255
312
  - lib/ratatui_ruby/schema/bar_chart.rb
256
313
  - lib/ratatui_ruby/schema/bar_chart/bar.rb
257
314
  - lib/ratatui_ruby/schema/bar_chart/bar_group.rb
@@ -268,6 +325,7 @@ files:
268
325
  - lib/ratatui_ruby/schema/layout.rb
269
326
  - lib/ratatui_ruby/schema/line_gauge.rb
270
327
  - lib/ratatui_ruby/schema/list.rb
328
+ - lib/ratatui_ruby/schema/list_item.rb
271
329
  - lib/ratatui_ruby/schema/overlay.rb
272
330
  - lib/ratatui_ruby/schema/paragraph.rb
273
331
  - lib/ratatui_ruby/schema/ratatui_logo.rb
@@ -280,9 +338,16 @@ files:
280
338
  - lib/ratatui_ruby/schema/table.rb
281
339
  - lib/ratatui_ruby/schema/tabs.rb
282
340
  - lib/ratatui_ruby/schema/text.rb
341
+ - lib/ratatui_ruby/scrollbar_state.rb
283
342
  - lib/ratatui_ruby/session.rb
284
343
  - lib/ratatui_ruby/session/autodoc.rb
344
+ - lib/ratatui_ruby/table_state.rb
285
345
  - lib/ratatui_ruby/test_helper.rb
346
+ - lib/ratatui_ruby/test_helper/event_injection.rb
347
+ - lib/ratatui_ruby/test_helper/snapshot.rb
348
+ - lib/ratatui_ruby/test_helper/style_assertions.rb
349
+ - lib/ratatui_ruby/test_helper/terminal.rb
350
+ - lib/ratatui_ruby/test_helper/test_doubles.rb
286
351
  - lib/ratatui_ruby/version.rb
287
352
  - mise.toml
288
353
  - sig/examples/app_all_events/app.rbs
@@ -298,13 +363,11 @@ files:
298
363
  - sig/examples/app_all_events/view_state.rbs
299
364
  - sig/examples/app_color_picker/app.rbs
300
365
  - sig/examples/app_login_form/app.rbs
301
- - sig/examples/app_map_demo/app.rbs
302
- - sig/examples/app_table_select/app.rbs
366
+ - sig/examples/app_stateful_interaction/app.rbs
303
367
  - sig/examples/verify_quickstart_dsl/app.rbs
304
368
  - sig/examples/verify_quickstart_lifecycle/app.rbs
305
369
  - sig/examples/verify_readme_usage/app.rbs
306
- - sig/examples/widget_block_padding/app.rbs
307
- - sig/examples/widget_block_titles/app.rbs
370
+ - sig/examples/widget_block_demo/app.rbs
308
371
  - sig/examples/widget_box_demo/app.rbs
309
372
  - sig/examples/widget_calendar_demo/app.rbs
310
373
  - sig/examples/widget_cell_demo/app.rbs
@@ -313,7 +376,7 @@ files:
313
376
  - sig/examples/widget_layout_split/app.rbs
314
377
  - sig/examples/widget_line_gauge_demo/app.rbs
315
378
  - sig/examples/widget_list_demo/app.rbs
316
- - sig/examples/widget_list_styles/app.rbs
379
+ - sig/examples/widget_map_demo/app.rbs
317
380
  - sig/examples/widget_popup_demo/app.rbs
318
381
  - sig/examples/widget_ratatui_logo_demo/app.rbs
319
382
  - sig/examples/widget_ratatui_mascot_demo/app.rbs
@@ -324,9 +387,11 @@ files:
324
387
  - sig/examples/widget_scrollbar_demo/app.rbs
325
388
  - sig/examples/widget_sparkline_demo/app.rbs
326
389
  - sig/examples/widget_style_colors/app.rbs
327
- - sig/examples/widget_table_flex/app.rbs
390
+ - sig/examples/widget_table_demo/app.rbs
391
+ - sig/examples/widget_text_width/app.rbs
328
392
  - sig/ratatui_ruby/event.rbs
329
393
  - sig/ratatui_ruby/frame.rbs
394
+ - sig/ratatui_ruby/list_state.rbs
330
395
  - sig/ratatui_ruby/ratatui_ruby.rbs
331
396
  - sig/ratatui_ruby/schema/bar_chart.rbs
332
397
  - sig/ratatui_ruby/schema/bar_chart/bar.rbs
@@ -343,6 +408,7 @@ files:
343
408
  - sig/ratatui_ruby/schema/layout.rbs
344
409
  - sig/ratatui_ruby/schema/line_gauge.rbs
345
410
  - sig/ratatui_ruby/schema/list.rbs
411
+ - sig/ratatui_ruby/schema/list_item.rbs
346
412
  - sig/ratatui_ruby/schema/overlay.rbs
347
413
  - sig/ratatui_ruby/schema/paragraph.rbs
348
414
  - sig/ratatui_ruby/schema/ratatui_logo.rbs
@@ -354,10 +420,18 @@ files:
354
420
  - sig/ratatui_ruby/schema/table.rbs
355
421
  - sig/ratatui_ruby/schema/tabs.rbs
356
422
  - sig/ratatui_ruby/schema/text.rbs
423
+ - sig/ratatui_ruby/scrollbar_state.rbs
357
424
  - sig/ratatui_ruby/session.rbs
425
+ - sig/ratatui_ruby/table_state.rbs
358
426
  - sig/ratatui_ruby/test_helper.rbs
427
+ - sig/ratatui_ruby/test_helper/event_injection.rbs
428
+ - sig/ratatui_ruby/test_helper/snapshot.rbs
429
+ - sig/ratatui_ruby/test_helper/style_assertions.rbs
430
+ - sig/ratatui_ruby/test_helper/terminal.rbs
431
+ - sig/ratatui_ruby/test_helper/test_doubles.rbs
359
432
  - sig/ratatui_ruby/version.rbs
360
433
  - tasks/autodoc.rake
434
+ - tasks/autodoc/examples.rb
361
435
  - tasks/autodoc/inventory.rb
362
436
  - tasks/autodoc/member.rb
363
437
  - tasks/autodoc/name.rb
@@ -367,9 +441,9 @@ files:
367
441
  - tasks/bump.rake
368
442
  - tasks/bump/cargo_lockfile.rb
369
443
  - tasks/bump/changelog.rb
370
- - tasks/bump/comparison_links.rb
371
444
  - tasks/bump/header.rb
372
445
  - tasks/bump/history.rb
446
+ - tasks/bump/links.rb
373
447
  - tasks/bump/manifest.rb
374
448
  - tasks/bump/ruby_gem.rb
375
449
  - tasks/bump/sem_ver.rb
Binary file
Binary file
Binary file
Binary file