ratatui_ruby 1.0.0 → 1.1.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 (88) 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 +3 -2
  7. data/CHANGELOG.md +33 -7
  8. data/Steepfile +1 -0
  9. data/doc/concepts/application_testing.md +5 -5
  10. data/doc/concepts/event_handling.md +1 -1
  11. data/doc/contributors/design/ruby_frontend.md +40 -12
  12. data/doc/contributors/design/rust_backend.md +13 -1
  13. data/doc/contributors/releasing.md +215 -0
  14. data/doc/contributors/todo/align/api_completeness_audit-finished.md +6 -0
  15. data/doc/contributors/todo/align/api_completeness_audit-unfinished.md +1 -7
  16. data/doc/contributors/todo/align/term.md +351 -0
  17. data/doc/contributors/upstream_requests/paragraph_span_rects.md +259 -0
  18. data/doc/getting_started/quickstart.md +1 -1
  19. data/doc/getting_started/why.md +3 -3
  20. data/doc/images/app_external_editor.gif +0 -0
  21. data/doc/index.md +1 -6
  22. data/examples/app_external_editor/README.md +62 -0
  23. data/examples/app_external_editor/app.rb +344 -0
  24. data/examples/widget_list/app.rb +2 -4
  25. data/examples/widget_table/app.rb +8 -2
  26. data/ext/ratatui_ruby/Cargo.lock +1 -1
  27. data/ext/ratatui_ruby/Cargo.toml +1 -1
  28. data/ext/ratatui_ruby/src/events.rs +171 -203
  29. data/ext/ratatui_ruby/src/lib.rs +36 -0
  30. data/ext/ratatui_ruby/src/lib_header.rs +11 -0
  31. data/ext/ratatui_ruby/src/terminal/capabilities.rs +46 -0
  32. data/ext/ratatui_ruby/src/terminal/init.rs +92 -0
  33. data/ext/ratatui_ruby/src/terminal/mod.rs +12 -3
  34. data/ext/ratatui_ruby/src/terminal/queries.rs +15 -0
  35. data/ext/ratatui_ruby/src/terminal/query.rs +64 -2
  36. data/lib/ratatui_ruby/backend/window_size.rb +50 -0
  37. data/lib/ratatui_ruby/backend.rb +59 -0
  38. data/lib/ratatui_ruby/event/key/navigation.rb +10 -1
  39. data/lib/ratatui_ruby/event/key.rb +84 -0
  40. data/lib/ratatui_ruby/event/mouse.rb +95 -3
  41. data/lib/ratatui_ruby/event/resize.rb +45 -3
  42. data/lib/ratatui_ruby/layout/alignment.rb +91 -0
  43. data/lib/ratatui_ruby/layout/layout.rb +1 -2
  44. data/lib/ratatui_ruby/layout/size.rb +10 -3
  45. data/lib/ratatui_ruby/layout.rb +4 -0
  46. data/lib/ratatui_ruby/terminal/capabilities.rb +316 -0
  47. data/lib/ratatui_ruby/terminal/viewport.rb +1 -1
  48. data/lib/ratatui_ruby/terminal.rb +66 -0
  49. data/lib/ratatui_ruby/test_helper/global_state.rb +111 -0
  50. data/lib/ratatui_ruby/test_helper.rb +3 -0
  51. data/lib/ratatui_ruby/version.rb +1 -1
  52. data/lib/ratatui_ruby/widgets/table.rb +2 -2
  53. data/lib/ratatui_ruby.rb +25 -4
  54. data/sig/examples/app_external_editor/app.rbs +12 -0
  55. data/sig/generated/event_key_predicates.rbs +1348 -0
  56. data/sig/ratatui_ruby/backend/window_size.rbs +17 -0
  57. data/sig/ratatui_ruby/backend.rbs +12 -0
  58. data/sig/ratatui_ruby/event.rbs +7 -0
  59. data/sig/ratatui_ruby/layout/alignment.rbs +26 -0
  60. data/sig/ratatui_ruby/ratatui_ruby.rbs +2 -0
  61. data/sig/ratatui_ruby/terminal/capabilities.rbs +38 -0
  62. data/sig/ratatui_ruby/terminal/viewport.rbs +15 -1
  63. data/tasks/bump/bump_workflow.rb +49 -0
  64. data/tasks/bump/changelog.rb +57 -0
  65. data/tasks/bump/patch_release.rb +19 -0
  66. data/tasks/bump/release_branch.rb +17 -0
  67. data/tasks/bump/release_from_trunk.rb +49 -0
  68. data/tasks/bump/repository.rb +54 -0
  69. data/tasks/bump/ruby_gem.rb +6 -26
  70. data/tasks/bump/sem_ver.rb +4 -0
  71. data/tasks/bump/unreleased_section.rb +17 -0
  72. data/tasks/bump.rake +21 -11
  73. data/tasks/doc/documentation.rb +59 -0
  74. data/tasks/doc/link/file_url.rb +30 -0
  75. data/tasks/doc/link/relative_path.rb +61 -0
  76. data/tasks/doc/link/web_url.rb +55 -0
  77. data/tasks/doc/link.rb +52 -0
  78. data/tasks/doc/link_audit.rb +116 -0
  79. data/tasks/doc/problem.rb +40 -0
  80. data/tasks/doc/source_file.rb +93 -0
  81. data/tasks/doc.rake +18 -0
  82. data/tasks/rbs_predicates/predicate_catalog.rb +52 -0
  83. data/tasks/rbs_predicates/predicate_tests.rb +124 -0
  84. data/tasks/rbs_predicates/rbs_signature.rb +63 -0
  85. data/tasks/rbs_predicates.rake +31 -0
  86. data/tasks/test.rake +3 -0
  87. data/tasks/website/version.rb +23 -28
  88. metadata +38 -1
@@ -16,13 +16,13 @@ module RatatuiRuby
16
16
  #
17
17
  # Use it to display database records, logs, or file lists.
18
18
  #
19
- # {rdoc-image:/doc/images/widget_table_flex.png}[link:/examples/widget_table_flex/app_rb.html]
19
+ # {rdoc-image:/doc/images/widget_table.png}[link:/examples/widget_table/app_rb.html]
20
20
  #
21
21
  # === Example
22
22
  #
23
23
  # Run the interactive demo from the terminal:
24
24
  #
25
- # ruby examples/widget_table_flex/app.rb
25
+ # ruby examples/widget_table/app.rb
26
26
  class Table < Data.define(:header, :rows, :widths, :row_highlight_style, :highlight_symbol, :highlight_spacing, :column_highlight_style, :cell_highlight_style, :selected_row, :selected_column, :offset, :block, :footer, :flex, :style, :column_spacing)
27
27
  include CoerceableWidget
28
28
 
data/lib/ratatui_ruby.rb CHANGED
@@ -15,7 +15,9 @@ require_relative "ratatui_ruby/buffer" # Buffer::Cell (for inspection)
15
15
  require_relative "ratatui_ruby/text" # Text::Span, Text::Line, Text.width
16
16
  require_relative "ratatui_ruby/draw" # Draw commands
17
17
  require_relative "ratatui_ruby/symbols" # Symbols::Shade, etc.
18
+ require_relative "ratatui_ruby/backend" # Backend::WindowSize
18
19
  require_relative "ratatui_ruby/terminal/viewport" # Terminal::Viewport
20
+ require_relative "ratatui_ruby/terminal" # Terminal class
19
21
 
20
22
  # Event types
21
23
  require_relative "ratatui_ruby/event"
@@ -138,8 +140,8 @@ module RatatuiRuby
138
140
  # Breaking these rules raises this error.
139
141
  #
140
142
  # Common causes:
141
- # - Calling methods in the wrong order (e.g., \`init_terminal\` twice)
142
- # - Callable return type mismatch (e.g., view returns \`nil\` instead of a widget)
143
+ # - Calling methods in the wrong order (e.g., <tt>init_terminal</tt> twice)
144
+ # - Callable return type mismatch (e.g., view returns <tt>nil</tt> instead of a widget)
143
145
  #
144
146
  # To resolve, check the method's documented contract. Ensure
145
147
  # state preconditions are met and return types are correct.
@@ -510,12 +512,31 @@ module RatatuiRuby
510
512
  alias viewport_size get_viewport_area
511
513
  end
512
514
 
513
- # (Native methods _get_cell_at and _get_terminal_size implemented in Rust)
514
- private_class_method :_get_cell_at, :_get_terminal_size
515
+ ##
516
+ # Number of frames drawn since terminal initialization.
517
+ #
518
+ # TUI applications track render cycles for animations, FPS counters, or
519
+ # debugging. Manually counting draws is error-prone and clutters app logic.
520
+ #
521
+ # This method queries the terminal's internal frame counter. It starts at 0
522
+ # when the terminal initializes and increments by 1 after each successful
523
+ # draw. Restoring and re-initializing resets the counter.
524
+ #
525
+ # Raises RatatuiRuby::Error::Invariant if terminal not initialized.
526
+ def self.frame_count
527
+ _frame_count
528
+ end
529
+
530
+ # (Native methods implemented in Rust)
531
+ private_class_method :_get_cell_at, :_get_terminal_size, :_frame_count
515
532
 
516
533
  # Hide native Layout._split helper
517
534
  Layout::Layout.singleton_class.__send__(:private, :_split)
518
535
 
536
+ # Raw Terminal bindings - use public wrappers (they have timeout guards)
537
+ Terminal.singleton_class.__send__(:private, :_available_color_count)
538
+ Terminal.singleton_class.__send__(:private, :_supports_keyboard_enhancement)
539
+
519
540
  # --- Terminal Safety Hooks ---
520
541
  # These ensure the terminal is restored even on unexpected exits.
521
542
 
@@ -0,0 +1,12 @@
1
+ #--
2
+ # SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
3
+ # SPDX-License-Identifier: MIT-0
4
+ #++
5
+
6
+ class AppExternalEditor
7
+ # @public
8
+ def self.new: () -> AppExternalEditor
9
+
10
+ # @public
11
+ def run: () -> void
12
+ end