ratatui_ruby 0.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 (119) hide show
  1. checksums.yaml +7 -0
  2. data/.build.yml +34 -0
  3. data/.pre-commit-config.yaml +9 -0
  4. data/.rubocop.yml +8 -0
  5. data/.ruby-version +1 -0
  6. data/AGENTS.md +119 -0
  7. data/CHANGELOG.md +15 -0
  8. data/CODE_OF_CONDUCT.md +30 -0
  9. data/CONTRIBUTING.md +40 -0
  10. data/LICENSE +15 -0
  11. data/LICENSES/AGPL-3.0-or-later.txt +661 -0
  12. data/LICENSES/BSD-2-Clause.txt +9 -0
  13. data/LICENSES/CC-BY-SA-4.0.txt +427 -0
  14. data/LICENSES/CC0-1.0.txt +121 -0
  15. data/LICENSES/MIT.txt +21 -0
  16. data/README.md +86 -0
  17. data/REUSE.toml +17 -0
  18. data/Rakefile +108 -0
  19. data/docs/application_testing.md +96 -0
  20. data/docs/contributors/design/ruby_frontend.md +100 -0
  21. data/docs/contributors/design/rust_backend.md +61 -0
  22. data/docs/contributors/design.md +11 -0
  23. data/docs/contributors/index.md +16 -0
  24. data/docs/images/examples-analytics.rb.png +0 -0
  25. data/docs/images/examples-box_demo.rb.png +0 -0
  26. data/docs/images/examples-dashboard.rb.png +0 -0
  27. data/docs/images/examples-login_form.rb.png +0 -0
  28. data/docs/images/examples-map_demo.rb.png +0 -0
  29. data/docs/images/examples-mouse_events.rb.png +0 -0
  30. data/docs/images/examples-scrollbar_demo.rb.png +0 -0
  31. data/docs/images/examples-stock_ticker.rb.png +0 -0
  32. data/docs/images/examples-system_monitor.rb.png +0 -0
  33. data/docs/index.md +18 -0
  34. data/docs/quickstart.md +126 -0
  35. data/examples/analytics.rb +87 -0
  36. data/examples/box_demo.rb +71 -0
  37. data/examples/dashboard.rb +72 -0
  38. data/examples/login_form.rb +114 -0
  39. data/examples/map_demo.rb +58 -0
  40. data/examples/mouse_events.rb +95 -0
  41. data/examples/scrollbar_demo.rb +75 -0
  42. data/examples/stock_ticker.rb +85 -0
  43. data/examples/system_monitor.rb +93 -0
  44. data/examples/test_analytics.rb +65 -0
  45. data/examples/test_box_demo.rb +38 -0
  46. data/examples/test_dashboard.rb +38 -0
  47. data/examples/test_login_form.rb +63 -0
  48. data/examples/test_map_demo.rb +100 -0
  49. data/examples/test_stock_ticker.rb +39 -0
  50. data/examples/test_system_monitor.rb +40 -0
  51. data/ext/ratatui_ruby/.cargo/config.toml +8 -0
  52. data/ext/ratatui_ruby/.gitignore +4 -0
  53. data/ext/ratatui_ruby/Cargo.lock +698 -0
  54. data/ext/ratatui_ruby/Cargo.toml +16 -0
  55. data/ext/ratatui_ruby/extconf.rb +12 -0
  56. data/ext/ratatui_ruby/src/events.rs +279 -0
  57. data/ext/ratatui_ruby/src/lib.rs +105 -0
  58. data/ext/ratatui_ruby/src/rendering.rs +31 -0
  59. data/ext/ratatui_ruby/src/style.rs +149 -0
  60. data/ext/ratatui_ruby/src/terminal.rs +131 -0
  61. data/ext/ratatui_ruby/src/widgets/barchart.rs +73 -0
  62. data/ext/ratatui_ruby/src/widgets/block.rs +12 -0
  63. data/ext/ratatui_ruby/src/widgets/canvas.rs +146 -0
  64. data/ext/ratatui_ruby/src/widgets/center.rs +81 -0
  65. data/ext/ratatui_ruby/src/widgets/cursor.rs +29 -0
  66. data/ext/ratatui_ruby/src/widgets/gauge.rs +50 -0
  67. data/ext/ratatui_ruby/src/widgets/layout.rs +82 -0
  68. data/ext/ratatui_ruby/src/widgets/linechart.rs +154 -0
  69. data/ext/ratatui_ruby/src/widgets/list.rs +62 -0
  70. data/ext/ratatui_ruby/src/widgets/mod.rs +18 -0
  71. data/ext/ratatui_ruby/src/widgets/overlay.rs +20 -0
  72. data/ext/ratatui_ruby/src/widgets/paragraph.rs +56 -0
  73. data/ext/ratatui_ruby/src/widgets/scrollbar.rs +68 -0
  74. data/ext/ratatui_ruby/src/widgets/sparkline.rs +59 -0
  75. data/ext/ratatui_ruby/src/widgets/table.rs +117 -0
  76. data/ext/ratatui_ruby/src/widgets/tabs.rs +51 -0
  77. data/lib/ratatui_ruby/output.rb +7 -0
  78. data/lib/ratatui_ruby/schema/bar_chart.rb +28 -0
  79. data/lib/ratatui_ruby/schema/block.rb +23 -0
  80. data/lib/ratatui_ruby/schema/canvas.rb +62 -0
  81. data/lib/ratatui_ruby/schema/center.rb +19 -0
  82. data/lib/ratatui_ruby/schema/constraint.rb +33 -0
  83. data/lib/ratatui_ruby/schema/cursor.rb +17 -0
  84. data/lib/ratatui_ruby/schema/gauge.rb +24 -0
  85. data/lib/ratatui_ruby/schema/layout.rb +22 -0
  86. data/lib/ratatui_ruby/schema/line_chart.rb +41 -0
  87. data/lib/ratatui_ruby/schema/list.rb +22 -0
  88. data/lib/ratatui_ruby/schema/overlay.rb +15 -0
  89. data/lib/ratatui_ruby/schema/paragraph.rb +37 -0
  90. data/lib/ratatui_ruby/schema/scrollbar.rb +33 -0
  91. data/lib/ratatui_ruby/schema/sparkline.rb +24 -0
  92. data/lib/ratatui_ruby/schema/style.rb +31 -0
  93. data/lib/ratatui_ruby/schema/table.rb +24 -0
  94. data/lib/ratatui_ruby/schema/tabs.rb +22 -0
  95. data/lib/ratatui_ruby/test_helper.rb +75 -0
  96. data/lib/ratatui_ruby/version.rb +10 -0
  97. data/lib/ratatui_ruby.rb +87 -0
  98. data/sig/ratatui_ruby/ratatui_ruby.rbs +16 -0
  99. data/sig/ratatui_ruby/schema/bar_chart.rbs +14 -0
  100. data/sig/ratatui_ruby/schema/block.rbs +11 -0
  101. data/sig/ratatui_ruby/schema/canvas.rbs +62 -0
  102. data/sig/ratatui_ruby/schema/center.rbs +11 -0
  103. data/sig/ratatui_ruby/schema/constraint.rbs +13 -0
  104. data/sig/ratatui_ruby/schema/cursor.rbs +10 -0
  105. data/sig/ratatui_ruby/schema/gauge.rbs +13 -0
  106. data/sig/ratatui_ruby/schema/layout.rbs +11 -0
  107. data/sig/ratatui_ruby/schema/line_chart.rbs +20 -0
  108. data/sig/ratatui_ruby/schema/list.rbs +11 -0
  109. data/sig/ratatui_ruby/schema/overlay.rbs +9 -0
  110. data/sig/ratatui_ruby/schema/paragraph.rbs +11 -0
  111. data/sig/ratatui_ruby/schema/scrollbar.rbs +20 -0
  112. data/sig/ratatui_ruby/schema/sparkline.rbs +12 -0
  113. data/sig/ratatui_ruby/schema/style.rbs +13 -0
  114. data/sig/ratatui_ruby/schema/table.rbs +13 -0
  115. data/sig/ratatui_ruby/schema/tabs.rbs +11 -0
  116. data/sig/ratatui_ruby/test_helper.rbs +11 -0
  117. data/sig/ratatui_ruby/version.rbs +6 -0
  118. data/vendor/goodcop/base.yml +1047 -0
  119. metadata +196 -0
@@ -0,0 +1,62 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Point < Data
6
+ attr_reader x: Float
7
+ attr_reader y: Float
8
+
9
+ def self.new: (x: Float, y: Float) -> Point
10
+ | (Float, Float) -> Point
11
+ end
12
+
13
+ class Line < Data
14
+ attr_reader x1: Float
15
+ attr_reader y1: Float
16
+ attr_reader x2: Float
17
+ attr_reader y2: Float
18
+ attr_reader color: String | Symbol
19
+
20
+ def self.new: (x1: Float, y1: Float, x2: Float, y2: Float, color: String | Symbol) -> Line
21
+ | (Float, Float, Float, Float, String | Symbol) -> Line
22
+ end
23
+
24
+ class Rectangle < Data
25
+ attr_reader x: Float
26
+ attr_reader y: Float
27
+ attr_reader width: Float
28
+ attr_reader height: Float
29
+ attr_reader color: String | Symbol
30
+
31
+ def self.new: (x: Float, y: Float, width: Float, height: Float, color: String | Symbol) -> Rectangle
32
+ | (Float, Float, Float, Float, String | Symbol) -> Rectangle
33
+ end
34
+
35
+ class Circle < Data
36
+ attr_reader x: Float
37
+ attr_reader y: Float
38
+ attr_reader radius: Float
39
+ attr_reader color: String | Symbol
40
+
41
+ def self.new: (x: Float, y: Float, radius: Float, color: String | Symbol) -> Circle
42
+ | (Float, Float, Float, String | Symbol) -> Circle
43
+ end
44
+
45
+ class Map < Data
46
+ attr_reader color: String | Symbol
47
+ attr_reader resolution: Symbol
48
+
49
+ def self.new: (color: String | Symbol, resolution: Symbol) -> Map
50
+ | (String | Symbol, Symbol) -> Map
51
+ end
52
+
53
+ class Canvas < Data
54
+ attr_reader shapes: Array[Line | Rectangle | Circle | Map]
55
+ attr_reader x_bounds: Array[Float]
56
+ attr_reader y_bounds: Array[Float]
57
+ attr_reader marker: Symbol
58
+ attr_reader block: Block?
59
+
60
+ def self.new: (?shapes: Array[Line | Rectangle | Circle | Map], ?x_bounds: Array[Float], ?y_bounds: Array[Float], ?marker: Symbol, ?block: Block?) -> Canvas
61
+ end
62
+ end
@@ -0,0 +1,11 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Center < Data
6
+ attr_reader child: widget
7
+ attr_reader width_percent: Integer
8
+ attr_reader height_percent: Integer
9
+ def self.new: (child: widget, width_percent: Integer, height_percent: Integer) -> Center
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Constraint < Data
6
+ attr_reader type: Symbol
7
+ attr_reader value: Integer
8
+ def self.length: (Integer) -> Constraint
9
+ def self.percentage: (Integer) -> Constraint
10
+ def self.min: (Integer) -> Constraint
11
+ def self.new: (type: Symbol, value: Integer) -> Constraint
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Cursor < Data
6
+ attr_reader x: Integer
7
+ attr_reader y: Integer
8
+ def self.new: (x: Integer, y: Integer) -> Cursor
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Gauge < Data
6
+ attr_reader ratio: Float
7
+ attr_reader label: String?
8
+ attr_reader style: Style
9
+ attr_reader block: Block?
10
+
11
+ def self.new: (?ratio: Float, ?label: String?, ?style: Style, ?block: Block?) -> Gauge
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Layout < Data
6
+ attr_reader direction: Symbol
7
+ attr_reader constraints: Array[Constraint]
8
+ attr_reader children: Array[widget]
9
+ def self.new: (?direction: Symbol, ?constraints: Array[Constraint], ?children: Array[widget]) -> Layout
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Dataset < Data
6
+ attr_reader name: String | Symbol
7
+ attr_reader data: Array[[Float, Float]]
8
+ attr_reader color: String | Symbol
9
+ def self.new: (name: String | Symbol, data: Array[[Float, Float]], ?color: String | Symbol) -> Dataset
10
+ end
11
+
12
+ class LineChart < Data
13
+ attr_reader datasets: Array[Dataset]
14
+ attr_reader x_labels: Array[String]
15
+ attr_reader y_labels: Array[String]
16
+ attr_reader y_bounds: [Float, Float]
17
+ attr_reader block: Block?
18
+ def self.new: (datasets: Array[Dataset], ?x_labels: Array[String], ?y_labels: Array[String], ?y_bounds: [Float, Float], ?block: Block?) -> LineChart
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class List < Data
6
+ attr_reader items: Array[String]
7
+ attr_reader selected_index: Integer?
8
+ attr_reader block: Block?
9
+ def self.new: (?items: Array[String], ?selected_index: Integer?, ?block: Block?) -> List
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Overlay < Data
6
+ attr_reader layers: Array[widget]
7
+ def self.new: (layers: Array[widget]) -> Overlay
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Paragraph < Data
6
+ attr_reader text: String
7
+ attr_reader style: Style
8
+ attr_reader block: Block?
9
+ def self.new: (text: String, ?style: Style?, ?fg: (String | Symbol)?, ?bg: (String | Symbol)?, ?block: Block?) -> Paragraph
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Scrollbar < Data
6
+ attr_reader content_length: Integer
7
+ attr_reader position: Integer
8
+ attr_reader orientation: Symbol
9
+ attr_reader thumb_symbol: String
10
+ attr_reader block: Block?
11
+
12
+ def self.new: (
13
+ content_length: Integer,
14
+ position: Integer,
15
+ ?orientation: Symbol,
16
+ ?thumb_symbol: String,
17
+ ?block: Block?
18
+ ) -> Scrollbar
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Sparkline < Data
6
+ attr_reader data: Array[Integer]
7
+ attr_reader max: Integer?
8
+ attr_reader style: Style?
9
+ attr_reader block: Block?
10
+ def self.new: (data: Array[Integer], ?max: Integer?, ?style: Style?, ?block: Block?) -> Sparkline
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Style < Data
6
+ attr_reader fg: (String | Symbol)?
7
+ attr_reader bg: (String | Symbol)?
8
+ attr_reader modifiers: Array[Symbol]
9
+
10
+ def self.new: (?fg: (String | Symbol)?, ?bg: (String | Symbol)?, ?modifiers: Array[Symbol]) -> Style
11
+ def self.default: () -> Style
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Table < Data
6
+ attr_reader header: Array[String | Paragraph]?
7
+ attr_reader rows: Array[Array[String | Paragraph | Style | _ToS]]
8
+ attr_reader widths: Array[Constraint]
9
+ attr_reader block: Block?
10
+
11
+ def self.new: (?header: Array[String | Paragraph]?, ?rows: Array[Array[String | Paragraph | Style | _ToS]], ?widths: Array[Constraint], ?block: Block?) -> Table
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ class Tabs < Data
6
+ attr_reader titles: Array[String | _ToS]
7
+ attr_reader selected_index: Integer
8
+ attr_reader block: Block?
9
+ def self.new: (?titles: Array[String | _ToS], ?selected_index: Integer, ?block: Block?) -> Tabs
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ module TestHelper
6
+ def with_test_terminal: (?Integer width, ?Integer height) { () -> void } -> void
7
+ def buffer_content: () -> Array[String]
8
+ def cursor_position: () -> { x: Integer, y: Integer }
9
+ def inject_event: (String event_type, Hash[Symbol, untyped] data) -> void
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ # SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
2
+ # SPDX-License-Identifier: AGPL-3.0-or-later
3
+
4
+ module RatatuiRuby
5
+ VERSION: String
6
+ end