ratatui_ruby 0.6.0 → 0.7.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 (171) 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 +4 -4
  7. data/CHANGELOG.md +35 -0
  8. data/README.md +26 -1
  9. data/doc/application_architecture.md +16 -16
  10. data/doc/application_testing.md +1 -1
  11. data/doc/contributors/architectural_overhaul/chat_conversations.md +4952 -0
  12. data/doc/contributors/architectural_overhaul/implementation_plan.md +60 -0
  13. data/doc/contributors/architectural_overhaul/task.md +37 -0
  14. data/doc/contributors/design/ruby_frontend.md +277 -81
  15. data/doc/contributors/design/rust_backend.md +349 -55
  16. data/doc/contributors/developing_examples.md +5 -5
  17. data/doc/contributors/index.md +7 -5
  18. data/doc/contributors/v1.0.0_blockers.md +1729 -0
  19. data/doc/index.md +11 -6
  20. data/doc/interactive_design.md +2 -2
  21. data/doc/quickstart.md +66 -97
  22. data/doc/v0.7.0_migration.md +236 -0
  23. data/doc/why.md +93 -0
  24. data/examples/app_all_events/README.md +6 -4
  25. data/examples/app_all_events/app.rb +1 -1
  26. data/examples/app_all_events/model/app_model.rb +1 -1
  27. data/examples/app_all_events/model/msg.rb +1 -1
  28. data/examples/app_all_events/update.rb +1 -1
  29. data/examples/app_all_events/view/app_view.rb +1 -1
  30. data/examples/app_all_events/view/controls_view.rb +1 -1
  31. data/examples/app_all_events/view/counts_view.rb +1 -1
  32. data/examples/app_all_events/view/live_view.rb +1 -1
  33. data/examples/app_all_events/view/log_view.rb +1 -1
  34. data/examples/app_color_picker/README.md +7 -5
  35. data/examples/app_color_picker/app.rb +1 -1
  36. data/examples/app_login_form/README.md +2 -0
  37. data/examples/app_stateful_interaction/README.md +2 -0
  38. data/examples/app_stateful_interaction/app.rb +1 -1
  39. data/examples/verify_quickstart_dsl/README.md +4 -3
  40. data/examples/verify_quickstart_dsl/app.rb +1 -1
  41. data/examples/verify_quickstart_layout/README.md +1 -1
  42. data/examples/verify_quickstart_lifecycle/README.md +3 -3
  43. data/examples/verify_quickstart_lifecycle/app.rb +2 -2
  44. data/examples/verify_readme_usage/README.md +1 -1
  45. data/examples/widget_barchart_demo/README.md +2 -1
  46. data/examples/widget_block_demo/README.md +2 -0
  47. data/examples/widget_box_demo/README.md +3 -3
  48. data/examples/widget_calendar_demo/README.md +3 -3
  49. data/examples/widget_calendar_demo/app.rb +5 -1
  50. data/examples/widget_canvas_demo/README.md +3 -3
  51. data/examples/widget_cell_demo/README.md +3 -3
  52. data/examples/widget_center_demo/README.md +3 -3
  53. data/examples/widget_chart_demo/README.md +3 -3
  54. data/examples/widget_gauge_demo/README.md +3 -3
  55. data/examples/widget_layout_split/README.md +3 -3
  56. data/examples/widget_line_gauge_demo/README.md +3 -3
  57. data/examples/widget_list_demo/README.md +3 -3
  58. data/examples/widget_map_demo/README.md +3 -3
  59. data/examples/widget_map_demo/app.rb +2 -2
  60. data/examples/widget_overlay_demo/README.md +36 -0
  61. data/examples/widget_popup_demo/README.md +3 -3
  62. data/examples/widget_ratatui_logo_demo/README.md +3 -3
  63. data/examples/widget_ratatui_logo_demo/app.rb +1 -1
  64. data/examples/widget_ratatui_mascot_demo/README.md +3 -3
  65. data/examples/widget_rect/README.md +3 -3
  66. data/examples/widget_render/README.md +3 -3
  67. data/examples/widget_render/app.rb +3 -3
  68. data/examples/widget_rich_text/README.md +3 -3
  69. data/examples/widget_scroll_text/README.md +3 -3
  70. data/examples/widget_scrollbar_demo/README.md +3 -3
  71. data/examples/widget_sparkline_demo/README.md +3 -3
  72. data/examples/widget_style_colors/README.md +3 -3
  73. data/examples/widget_table_demo/README.md +3 -3
  74. data/examples/widget_table_demo/app.rb +19 -4
  75. data/examples/widget_tabs_demo/README.md +3 -3
  76. data/examples/widget_text_width/README.md +3 -3
  77. data/examples/widget_text_width/app.rb +8 -1
  78. data/ext/ratatui_ruby/Cargo.lock +1 -1
  79. data/ext/ratatui_ruby/Cargo.toml +1 -1
  80. data/ext/ratatui_ruby/src/frame.rs +6 -5
  81. data/ext/ratatui_ruby/src/lib.rs +3 -2
  82. data/ext/ratatui_ruby/src/rendering.rs +22 -21
  83. data/ext/ratatui_ruby/src/text.rs +12 -3
  84. data/ext/ratatui_ruby/src/widgets/canvas.rs +5 -5
  85. data/ext/ratatui_ruby/src/widgets/table.rs +81 -36
  86. data/lib/ratatui_ruby/buffer/cell.rb +168 -0
  87. data/lib/ratatui_ruby/buffer.rb +15 -0
  88. data/lib/ratatui_ruby/frame.rb +8 -8
  89. data/lib/ratatui_ruby/layout/constraint.rb +95 -0
  90. data/lib/ratatui_ruby/layout/layout.rb +106 -0
  91. data/lib/ratatui_ruby/layout/rect.rb +118 -0
  92. data/lib/ratatui_ruby/layout.rb +19 -0
  93. data/lib/ratatui_ruby/list_state.rb +2 -2
  94. data/lib/ratatui_ruby/schema/layout.rb +1 -1
  95. data/lib/ratatui_ruby/schema/row.rb +66 -0
  96. data/lib/ratatui_ruby/schema/table.rb +10 -10
  97. data/lib/ratatui_ruby/schema/text.rb +27 -2
  98. data/lib/ratatui_ruby/style/style.rb +81 -0
  99. data/lib/ratatui_ruby/style.rb +15 -0
  100. data/lib/ratatui_ruby/table_state.rb +1 -1
  101. data/lib/ratatui_ruby/test_helper/snapshot.rb +24 -0
  102. data/lib/ratatui_ruby/test_helper/style_assertions.rb +1 -1
  103. data/lib/ratatui_ruby/tui/buffer_factories.rb +20 -0
  104. data/lib/ratatui_ruby/tui/canvas_factories.rb +44 -0
  105. data/lib/ratatui_ruby/tui/core.rb +38 -0
  106. data/lib/ratatui_ruby/tui/layout_factories.rb +74 -0
  107. data/lib/ratatui_ruby/tui/state_factories.rb +33 -0
  108. data/lib/ratatui_ruby/tui/style_factories.rb +20 -0
  109. data/lib/ratatui_ruby/tui/text_factories.rb +44 -0
  110. data/lib/ratatui_ruby/tui/widget_factories.rb +195 -0
  111. data/lib/ratatui_ruby/tui.rb +75 -0
  112. data/lib/ratatui_ruby/version.rb +1 -1
  113. data/lib/ratatui_ruby/widgets/bar_chart/bar.rb +47 -0
  114. data/lib/ratatui_ruby/widgets/bar_chart/bar_group.rb +25 -0
  115. data/lib/ratatui_ruby/widgets/bar_chart.rb +239 -0
  116. data/lib/ratatui_ruby/widgets/block.rb +192 -0
  117. data/lib/ratatui_ruby/widgets/calendar.rb +84 -0
  118. data/lib/ratatui_ruby/widgets/canvas.rb +231 -0
  119. data/lib/ratatui_ruby/widgets/cell.rb +47 -0
  120. data/lib/ratatui_ruby/widgets/center.rb +59 -0
  121. data/lib/ratatui_ruby/widgets/chart.rb +185 -0
  122. data/lib/ratatui_ruby/widgets/clear.rb +54 -0
  123. data/lib/ratatui_ruby/widgets/cursor.rb +42 -0
  124. data/lib/ratatui_ruby/widgets/gauge.rb +72 -0
  125. data/lib/ratatui_ruby/widgets/line_gauge.rb +80 -0
  126. data/lib/ratatui_ruby/widgets/list.rb +127 -0
  127. data/lib/ratatui_ruby/widgets/list_item.rb +43 -0
  128. data/lib/ratatui_ruby/widgets/overlay.rb +43 -0
  129. data/lib/ratatui_ruby/widgets/paragraph.rb +99 -0
  130. data/lib/ratatui_ruby/widgets/ratatui_logo.rb +31 -0
  131. data/lib/ratatui_ruby/widgets/ratatui_mascot.rb +36 -0
  132. data/lib/ratatui_ruby/widgets/row.rb +68 -0
  133. data/lib/ratatui_ruby/widgets/scrollbar.rb +143 -0
  134. data/lib/ratatui_ruby/widgets/shape/label.rb +68 -0
  135. data/lib/ratatui_ruby/widgets/sparkline.rb +134 -0
  136. data/lib/ratatui_ruby/widgets/table.rb +141 -0
  137. data/lib/ratatui_ruby/widgets/tabs.rb +85 -0
  138. data/lib/ratatui_ruby/widgets.rb +40 -0
  139. data/lib/ratatui_ruby.rb +23 -39
  140. data/sig/examples/app_all_events/view.rbs +1 -1
  141. data/sig/examples/app_all_events/view_state.rbs +1 -1
  142. data/sig/ratatui_ruby/schema/row.rbs +22 -0
  143. data/sig/ratatui_ruby/schema/table.rbs +1 -1
  144. data/sig/ratatui_ruby/schema/text.rbs +1 -0
  145. data/sig/ratatui_ruby/session.rbs +29 -49
  146. data/sig/ratatui_ruby/tui/buffer_factories.rbs +10 -0
  147. data/sig/ratatui_ruby/tui/canvas_factories.rbs +14 -0
  148. data/sig/ratatui_ruby/tui/core.rbs +14 -0
  149. data/sig/ratatui_ruby/tui/layout_factories.rbs +19 -0
  150. data/sig/ratatui_ruby/tui/state_factories.rbs +12 -0
  151. data/sig/ratatui_ruby/tui/style_factories.rbs +10 -0
  152. data/sig/ratatui_ruby/tui/text_factories.rbs +14 -0
  153. data/sig/ratatui_ruby/tui/widget_factories.rbs +39 -0
  154. data/sig/ratatui_ruby/tui.rbs +19 -0
  155. data/tasks/autodoc.rake +1 -35
  156. data/tasks/sourcehut.rake +4 -1
  157. metadata +62 -15
  158. data/doc/contributors/dwim_dx.md +0 -366
  159. data/doc/contributors/examples_audit/p1_high.md +0 -21
  160. data/doc/contributors/examples_audit/p2_moderate.md +0 -81
  161. data/doc/contributors/examples_audit.md +0 -41
  162. data/doc/images/app_analytics.png +0 -0
  163. data/doc/images/app_custom_widget.png +0 -0
  164. data/doc/images/app_mouse_events.png +0 -0
  165. data/doc/images/widget_table_flex.png +0 -0
  166. data/lib/ratatui_ruby/session/autodoc.rb +0 -482
  167. data/lib/ratatui_ruby/session.rb +0 -178
  168. data/tasks/autodoc/inventory.rb +0 -63
  169. data/tasks/autodoc/notice.rb +0 -26
  170. data/tasks/autodoc/rbs.rb +0 -38
  171. data/tasks/autodoc/rdoc.rb +0 -45
@@ -1,178 +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
- module RatatuiRuby
7
- # Manages the terminal lifecycle and provides a concise API for the render loop.
8
- #
9
- # Writing a TUI loop involves repetitive boilerplate. You constantly instantiate widgets (<tt>RatatuiRuby::Paragraph.new</tt>) and call global methods (<tt>RatatuiRuby.draw</tt>). This is verbose and hard to read.
10
- #
11
- # The Session object simplifies this. It acts as a factory and a facade. It provides short helper methods for every widget and delegates core commands to the main module.
12
- #
13
- # Use it within <tt>RatatuiRuby.run</tt> to build your interface cleanly.
14
- #
15
- # == Thread/Ractor Safety
16
- #
17
- # Session is an *I/O handle*, not a data object. It has side effects (draw,
18
- # poll_event) and is intentionally *not* Ractor-shareable. Caching it in
19
- # instance variables (<tt>@tui = tui</tt>) during your application's run loop
20
- # is fine. However, do not include it in immutable TEA Models/Messages or
21
- # pass it to other Ractors.
22
- #
23
- # == Available Methods
24
- #
25
- # The session dynamically defines factory methods for all RatatuiRuby constants.
26
- #
27
- # * <tt>draw(node)</tt> -> Delegates to <tt>RatatuiRuby.draw</tt>
28
- # * <tt>poll_event</tt> -> Delegates to <tt>RatatuiRuby.poll_event</tt>
29
- #
30
- # === Widget Factories
31
- #
32
- # The session acts as a dynamic factory. It creates a helper method for **every** class defined in the `RatatuiRuby` module.
33
- #
34
- # **The Rule:**
35
- # To instantiate a class like `RatatuiRuby::SomeWidget`, call `tui.some_widget(...)`.
36
- #
37
- # **Common Examples:**
38
- # * <tt>paragraph(...)</tt> -> <tt>RatatuiRuby::Paragraph.new(...)</tt>
39
- # * <tt>block(...)</tt> -> <tt>RatatuiRuby::Block.new(...)</tt>
40
- # * <tt>layout(...)</tt> -> <tt>RatatuiRuby::Layout.new(...)</tt>
41
- # * <tt>list(...)</tt> -> <tt>RatatuiRuby::List.new(...)</tt>
42
- # * <tt>table(...)</tt> -> <tt>RatatuiRuby::Table.new(...)</tt>
43
- # * <tt>style(...)</tt> -> <tt>RatatuiRuby::Style.new(...)</tt>
44
- #
45
- # If a new class is added to the library, it is automatically available here.
46
- #
47
- # === Nested Helpers
48
- #
49
- # * <tt>text_span(...)</tt> -> <tt>RatatuiRuby::Text::Span.new(...)</tt>
50
- # * <tt>text_line(...)</tt> -> <tt>RatatuiRuby::Text::Line.new(...)</tt>
51
- # * <tt>text_width(string)</tt> -> <tt>RatatuiRuby::Text.width(string)</tt>
52
- #
53
- # === Examples
54
- #
55
- # ==== Basic Usage (Recommended)
56
- #
57
- # RatatuiRuby.run do |tui|
58
- # loop do
59
- # tui.draw \
60
- # tui.paragraph \
61
- # text: "Hello, Ratatui! Press 'q' to quit.",
62
- # alignment: :center,
63
- # block: tui.block(
64
- # title: "My Ruby TUI App",
65
- # borders: [:all],
66
- # border_color: "cyan"
67
- # )
68
- # event = tui.poll_event
69
- # break if event == "q" || event == :ctrl_c
70
- # end
71
- # end
72
- #
73
- # ==== Raw API (Verbose)
74
- #
75
- # RatatuiRuby.run do
76
- # loop do
77
- # RatatuiRuby.draw \
78
- # RatatuiRuby::Paragraph.new(
79
- # text: "Hello, Ratatui! Press 'q' to quit.",
80
- # alignment: :center,
81
- # block: RatatuiRuby::Block.new(
82
- # title: "My Ruby TUI App",
83
- # borders: [:all],
84
- # border_color: "cyan"
85
- # )
86
- # )
87
- # event = RatatuiRuby.poll_event
88
- # break if event == "q" || event == :ctrl_c
89
- # end
90
- # end
91
- #
92
- # ==== Mixed Usage (Flexible)
93
- #
94
- # RatatuiRuby.run do |tui|
95
- # loop do
96
- # RatatuiRuby.draw \
97
- # tui.paragraph \
98
- # text: "Hello, Ratatui! Press 'q' to quit.",
99
- # alignment: :center,
100
- # block: tui.block(
101
- # title: "My Ruby TUI App",
102
- # borders: [:all],
103
- # border_color: "cyan"
104
- # )
105
- # event = RatatuiRuby.poll_event
106
- # break if event == "q" || event == :ctrl_c
107
- # end
108
- # end
109
- class Session
110
- # Wrap methods directly
111
- RatatuiRuby.singleton_methods(false).each do |method_name|
112
- define_method(method_name) do |*args, **kwargs, &block|
113
- RatatuiRuby.public_send(method_name, *args, **kwargs, &block)
114
- end
115
- end
116
-
117
- # Wrap classes and modules as snake_case factories
118
- RatatuiRuby.constants.each do |const_name|
119
- next if const_name == :Buffer
120
-
121
- const = RatatuiRuby.const_get(const_name)
122
- next unless const.is_a?(Module) # Class is a Module, so this catches both
123
-
124
- # 1. Top-level factories (for Classes only)
125
- # e.g. RatatuiRuby::Paragraph -> tui.paragraph(...)
126
- if const.is_a?(Class)
127
- method_name = const_name.to_s
128
- .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
129
- .gsub(/([a-z\d])([A-Z])/, '\1_\2')
130
- .downcase
131
-
132
- define_method(method_name) do |*args, **kwargs, &block|
133
- const.new(*args, **kwargs, &block)
134
- end
135
- end
136
-
137
- # 2. Singleton Method Helpers (for both Classes and Modules)
138
- # e.g. Layout.split -> layout_split
139
- # e.g. Text.width -> text_width
140
- const.singleton_methods(false).each do |class_method|
141
- parent_prefix = const_name.to_s
142
- .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
143
- .gsub(/([a-z\d])([A-Z])/, '\1_\2')
144
- .downcase
145
-
146
- session_method_name = "#{parent_prefix}_#{class_method}"
147
-
148
- define_method(session_method_name) do |*args, **kwargs, &block|
149
- const.public_send(class_method, *args, **kwargs, &block)
150
- end
151
- end
152
-
153
- # 3. Nested Class Factories (for both Modules and Classes)
154
- # e.g. RatatuiRuby::Text::Span -> tui.text_span(...)
155
- # e.g. RatatuiRuby::Shape::Line -> tui.shape_line(...)
156
- const.constants.each do |child_name|
157
- child = const.const_get(child_name)
158
- next unless child.is_a?(Class)
159
-
160
- parent_prefix = const_name.to_s
161
- .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
162
- .gsub(/([a-z\d])([A-Z])/, '\1_\2')
163
- .downcase
164
-
165
- child_suffix = child_name.to_s
166
- .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
167
- .gsub(/([a-z\d])([A-Z])/, '\1_\2')
168
- .downcase
169
-
170
- method_name = "#{parent_prefix}_#{child_suffix}"
171
-
172
- define_method(method_name) do |*args, **kwargs, &block|
173
- child.new(*args, **kwargs, &block)
174
- end
175
- end
176
- end
177
- end
178
- end
@@ -1,63 +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
- require_relative "name"
7
- require_relative "member"
8
-
9
- module Autodoc
10
- class Inventory
11
- include Enumerable
12
-
13
- def each(&)
14
- delegates.each(&)
15
- factories.each(&)
16
- end
17
-
18
- def delegates
19
- RatatuiRuby.singleton_methods(false).sort.map do |method_name|
20
- Member::Delegate.new(name: method_name)
21
- end
22
- end
23
-
24
- def factories
25
- members = []
26
- RatatuiRuby.constants.sort.each do |const_name|
27
- next if const_name == :Buffer
28
-
29
- const = RatatuiRuby.const_get(const_name)
30
- next unless const.is_a?(Module)
31
-
32
- if const.is_a?(Class)
33
- snake_name = Name.new(const_name).snake
34
- members << Member::Factory.new(name: snake_name, const_name:)
35
- end
36
-
37
- # Singleton methods (for both Classes and Modules)
38
- parent_prefix = Name.new(const_name).snake
39
- const.singleton_methods(false).sort.each do |class_method|
40
- members << Member::Helper.new(
41
- name: "#{parent_prefix}_#{class_method}",
42
- class_method:,
43
- const_name:
44
- )
45
- end
46
-
47
- const.constants.sort.each do |child_name|
48
- child = const.const_get(child_name)
49
- next unless child.is_a?(Class)
50
-
51
- parent_prefix = Name.new(const_name).snake
52
- child_suffix = Name.new(child_name).snake
53
-
54
- members << Member::Factory.new(
55
- name: "#{parent_prefix}_#{child_suffix}",
56
- const_name: "#{const_name}::#{child_name}"
57
- )
58
- end
59
- end
60
- members
61
- end
62
- end
63
- end
@@ -1,26 +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
- module Autodoc
7
- class Notice < Data.define(:task_name)
8
- def rbs
9
- [
10
- "# !!! DO NOT EDIT THIS FILE BY HAND !!!",
11
- "# This file is automatically generated by `rake #{task_name}`.",
12
- "# Any changes will be overwritten.",
13
- "",
14
- ]
15
- end
16
-
17
- def rdoc
18
- [
19
- "# !!! DO NOT EDIT THIS FILE BY HAND !!!",
20
- "# This file is automatically generated by `rake #{task_name}`.",
21
- "# Any changes will be overwritten.",
22
- "",
23
- ]
24
- end
25
- end
26
- end
data/tasks/autodoc/rbs.rb DELETED
@@ -1,38 +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
- module Autodoc
7
- class Rbs < Data.define(:path, :notice)
8
- def write(inventory)
9
- FileUtils.mkdir_p(File.dirname(path))
10
-
11
- # REUSE-IgnoreStart
12
- lines = [
13
- "# SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>",
14
- "# SPDX-License-Identifier: AGPL-3.0-or-later",
15
- "",
16
- ]
17
- # REUSE-IgnoreEnd
18
- lines += notice.rbs
19
- lines += [
20
- "module RatatuiRuby",
21
- " class Session",
22
- " def self.new: () -> Session",
23
- " | () { (Session) -> void } -> void",
24
- "",
25
- ]
26
-
27
- inventory.each do |member|
28
- lines << member.rbs
29
- end
30
-
31
- lines << " end"
32
- lines << "end"
33
-
34
- File.write(path, "#{lines.join("\n")}\n")
35
- puts "Generated #{path}"
36
- end
37
- end
38
- end
@@ -1,45 +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
- module Autodoc
7
- class Rdoc < Data.define(:path, :notice)
8
- def write(inventory)
9
- FileUtils.mkdir_p(File.dirname(path))
10
-
11
- # REUSE-IgnoreStart
12
- lines = [
13
- "# frozen_string_literal: true",
14
- "",
15
- "# SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>",
16
- "# SPDX-License-Identifier: AGPL-3.0-or-later",
17
- "",
18
- ]
19
- # REUSE-IgnoreEnd
20
- lines += notice.rdoc
21
- lines += [
22
- "module RatatuiRuby",
23
- " class Session",
24
- ]
25
-
26
- lines << " # == RatatuiRuby Delegates"
27
- lines << " #"
28
- inventory.delegates.each do |member|
29
- lines += member.rdoc
30
- end
31
-
32
- lines << " # == Widget Factories"
33
- lines << " #"
34
- inventory.factories.each do |member|
35
- lines += member.rdoc
36
- end
37
-
38
- lines << " end"
39
- lines << "end"
40
-
41
- File.write(path, "#{lines.join("\n")}\n")
42
- puts "Generated #{path}"
43
- end
44
- end
45
- end