whirled_peas 0.2.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 (166) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -0
  3. data/CHANGELOG.md +38 -0
  4. data/Gemfile +1 -0
  5. data/README.md +275 -81
  6. data/Rakefile +38 -3
  7. data/examples/intro.rb +52 -0
  8. data/examples/scrolling.rb +53 -0
  9. data/exe/whirled_peas +7 -0
  10. data/lib/whirled_peas.rb +12 -42
  11. data/lib/whirled_peas/command_line.rb +255 -0
  12. data/lib/whirled_peas/config.rb +21 -0
  13. data/lib/whirled_peas/errors.rb +7 -0
  14. data/lib/whirled_peas/frame.rb +0 -8
  15. data/lib/whirled_peas/frame/consumer.rb +14 -50
  16. data/lib/whirled_peas/frame/debug_consumer.rb +30 -0
  17. data/lib/whirled_peas/frame/event_loop.rb +68 -38
  18. data/lib/whirled_peas/frame/producer.rb +36 -32
  19. data/lib/whirled_peas/graphics.rb +5 -0
  20. data/lib/whirled_peas/graphics/box_painter.rb +108 -0
  21. data/lib/whirled_peas/graphics/canvas.rb +107 -0
  22. data/lib/whirled_peas/graphics/composer.rb +80 -0
  23. data/lib/whirled_peas/graphics/container_coords.rb +71 -0
  24. data/lib/whirled_peas/graphics/container_dimensions.rb +75 -0
  25. data/lib/whirled_peas/graphics/container_painter.rb +234 -0
  26. data/lib/whirled_peas/graphics/debugger.rb +52 -0
  27. data/lib/whirled_peas/graphics/grid_painter.rb +68 -0
  28. data/lib/whirled_peas/graphics/mock_screen.rb +26 -0
  29. data/lib/whirled_peas/graphics/painter.rb +19 -0
  30. data/lib/whirled_peas/graphics/renderer.rb +21 -0
  31. data/lib/whirled_peas/graphics/screen.rb +70 -0
  32. data/lib/whirled_peas/graphics/text_dimensions.rb +15 -0
  33. data/lib/whirled_peas/graphics/text_painter.rb +40 -0
  34. data/lib/whirled_peas/settings.rb +5 -0
  35. data/lib/whirled_peas/settings/bg_color.rb +22 -0
  36. data/lib/whirled_peas/settings/border.rb +101 -0
  37. data/lib/whirled_peas/settings/box_settings.rb +8 -0
  38. data/lib/whirled_peas/settings/color.rb +69 -0
  39. data/lib/whirled_peas/settings/container_settings.rb +139 -0
  40. data/lib/whirled_peas/settings/debugger.rb +96 -0
  41. data/lib/whirled_peas/settings/display_flow.rb +25 -0
  42. data/lib/whirled_peas/settings/element_settings.rb +61 -0
  43. data/lib/whirled_peas/settings/grid_settings.rb +15 -0
  44. data/lib/whirled_peas/settings/margin.rb +8 -0
  45. data/lib/whirled_peas/settings/padding.rb +8 -0
  46. data/lib/whirled_peas/settings/position.rb +15 -0
  47. data/lib/whirled_peas/settings/scrollbar.rb +15 -0
  48. data/lib/whirled_peas/settings/spacing.rb +24 -0
  49. data/lib/whirled_peas/settings/text_align.rb +19 -0
  50. data/lib/whirled_peas/settings/text_color.rb +19 -0
  51. data/lib/whirled_peas/settings/text_settings.rb +15 -0
  52. data/lib/whirled_peas/utils.rb +5 -0
  53. data/lib/whirled_peas/utils/ansi.rb +53 -0
  54. data/lib/whirled_peas/utils/formatted_string.rb +64 -0
  55. data/lib/whirled_peas/utils/title_font.rb +75 -0
  56. data/lib/whirled_peas/version.rb +1 -1
  57. data/screen_test/rendered/elements/box.frame +1 -0
  58. data/screen_test/rendered/elements/box.rb +20 -0
  59. data/screen_test/rendered/elements/grid.frame +1 -0
  60. data/screen_test/rendered/elements/grid.rb +13 -0
  61. data/screen_test/rendered/elements/screen_overflow.frame +1 -0
  62. data/screen_test/rendered/elements/screen_overflow.rb +9 -0
  63. data/screen_test/rendered/elements/text.frame +1 -0
  64. data/screen_test/rendered/elements/text.rb +9 -0
  65. data/screen_test/rendered/elements/text_multiline.frame +1 -0
  66. data/screen_test/rendered/elements/text_multiline.rb +9 -0
  67. data/screen_test/rendered/settings/align/box.frame +1 -0
  68. data/screen_test/rendered/settings/align/box.rb +24 -0
  69. data/screen_test/rendered/settings/align/children_center.frame +1 -0
  70. data/screen_test/rendered/settings/align/children_center.rb +13 -0
  71. data/screen_test/rendered/settings/align/children_left.frame +1 -0
  72. data/screen_test/rendered/settings/align/children_left.rb +13 -0
  73. data/screen_test/rendered/settings/align/children_right.frame +1 -0
  74. data/screen_test/rendered/settings/align/children_right.rb +13 -0
  75. data/screen_test/rendered/settings/align/grid.frame +1 -0
  76. data/screen_test/rendered/settings/align/grid.rb +20 -0
  77. data/screen_test/rendered/settings/ansi/bold.frame +1 -0
  78. data/screen_test/rendered/settings/ansi/bold.rb +15 -0
  79. data/screen_test/rendered/settings/ansi/color.frame +1 -0
  80. data/screen_test/rendered/settings/ansi/color.rb +37 -0
  81. data/screen_test/rendered/settings/ansi/underline.frame +1 -0
  82. data/screen_test/rendered/settings/ansi/underline.rb +15 -0
  83. data/screen_test/rendered/settings/border.frame +1 -0
  84. data/screen_test/rendered/settings/border.rb +13 -0
  85. data/screen_test/rendered/settings/flow/box_b2t.frame +1 -0
  86. data/screen_test/rendered/settings/flow/box_b2t.rb +24 -0
  87. data/screen_test/rendered/settings/flow/box_l2r.frame +1 -0
  88. data/screen_test/rendered/settings/flow/box_l2r.rb +24 -0
  89. data/screen_test/rendered/settings/flow/box_r2l.frame +1 -0
  90. data/screen_test/rendered/settings/flow/box_r2l.rb +24 -0
  91. data/screen_test/rendered/settings/flow/box_t2b.frame +1 -0
  92. data/screen_test/rendered/settings/flow/box_t2b.rb +24 -0
  93. data/screen_test/rendered/settings/flow/grid_b2t.frame +1 -0
  94. data/screen_test/rendered/settings/flow/grid_b2t.rb +14 -0
  95. data/screen_test/rendered/settings/flow/grid_l2r.frame +1 -0
  96. data/screen_test/rendered/settings/flow/grid_l2r.rb +14 -0
  97. data/screen_test/rendered/settings/flow/grid_r2l.frame +1 -0
  98. data/screen_test/rendered/settings/flow/grid_r2l.rb +14 -0
  99. data/screen_test/rendered/settings/flow/grid_t2b.frame +1 -0
  100. data/screen_test/rendered/settings/flow/grid_t2b.rb +14 -0
  101. data/screen_test/rendered/settings/height/box.frame +1 -0
  102. data/screen_test/rendered/settings/height/box.rb +13 -0
  103. data/screen_test/rendered/settings/height/grid.frame +1 -0
  104. data/screen_test/rendered/settings/height/grid.rb +14 -0
  105. data/screen_test/rendered/settings/height/overflow_box.frame +1 -0
  106. data/screen_test/rendered/settings/height/overflow_box.rb +13 -0
  107. data/screen_test/rendered/settings/height/overflow_box_l2r.frame +1 -0
  108. data/screen_test/rendered/settings/height/overflow_box_l2r.rb +15 -0
  109. data/screen_test/rendered/settings/height/overflow_box_t2b.frame +1 -0
  110. data/screen_test/rendered/settings/height/overflow_box_t2b.rb +14 -0
  111. data/screen_test/rendered/settings/height/overflow_grid.frame +1 -0
  112. data/screen_test/rendered/settings/height/overflow_grid.rb +16 -0
  113. data/screen_test/rendered/settings/margin.frame +1 -0
  114. data/screen_test/rendered/settings/margin.rb +14 -0
  115. data/screen_test/rendered/settings/padding.frame +1 -0
  116. data/screen_test/rendered/settings/padding.rb +11 -0
  117. data/screen_test/rendered/settings/position/box_left.frame +1 -0
  118. data/screen_test/rendered/settings/position/box_left.rb +17 -0
  119. data/screen_test/rendered/settings/position/box_left_negative.frame +1 -0
  120. data/screen_test/rendered/settings/position/box_left_negative.rb +17 -0
  121. data/screen_test/rendered/settings/position/box_top.frame +1 -0
  122. data/screen_test/rendered/settings/position/box_top.rb +17 -0
  123. data/screen_test/rendered/settings/position/box_top_negative.frame +1 -0
  124. data/screen_test/rendered/settings/position/box_top_negative.rb +17 -0
  125. data/screen_test/rendered/settings/position/grid_left.frame +1 -0
  126. data/screen_test/rendered/settings/position/grid_left.rb +18 -0
  127. data/screen_test/rendered/settings/position/grid_left_negative.frame +1 -0
  128. data/screen_test/rendered/settings/position/grid_left_negative.rb +18 -0
  129. data/screen_test/rendered/settings/position/grid_top.frame +1 -0
  130. data/screen_test/rendered/settings/position/grid_top.rb +18 -0
  131. data/screen_test/rendered/settings/position/grid_top_negative.frame +1 -0
  132. data/screen_test/rendered/settings/position/grid_top_negative.rb +18 -0
  133. data/screen_test/rendered/settings/scroll/horiz_box.frame +1 -0
  134. data/screen_test/rendered/settings/scroll/horiz_box.rb +15 -0
  135. data/screen_test/rendered/settings/scroll/vert_box.frame +1 -0
  136. data/screen_test/rendered/settings/scroll/vert_box.rb +18 -0
  137. data/screen_test/rendered/settings/title_font.frame +1 -0
  138. data/screen_test/rendered/settings/title_font.rb +12 -0
  139. data/screen_test/rendered/settings/width/box.frame +1 -0
  140. data/screen_test/rendered/settings/width/box.rb +13 -0
  141. data/screen_test/rendered/settings/width/grid.frame +1 -0
  142. data/screen_test/rendered/settings/width/grid.rb +14 -0
  143. data/screen_test/rendered/settings/width/overflow_box.frame +1 -0
  144. data/screen_test/rendered/settings/width/overflow_box.rb +11 -0
  145. data/screen_test/rendered/settings/width/overflow_box_l2r.frame +1 -0
  146. data/screen_test/rendered/settings/width/overflow_box_l2r.rb +14 -0
  147. data/screen_test/rendered/settings/width/overflow_box_t2b.frame +1 -0
  148. data/screen_test/rendered/settings/width/overflow_box_t2b.rb +15 -0
  149. data/screen_test/rendered/settings/width/overflow_grid.frame +1 -0
  150. data/screen_test/rendered/settings/width/overflow_grid.rb +14 -0
  151. data/screen_test/screen_tester.rb +201 -0
  152. data/whirled_peas.gemspec +4 -2
  153. metadata +147 -20
  154. data/lib/whirled_peas/ui.rb +0 -7
  155. data/lib/whirled_peas/ui/ansi.rb +0 -154
  156. data/lib/whirled_peas/ui/canvas.rb +0 -35
  157. data/lib/whirled_peas/ui/element.rb +0 -225
  158. data/lib/whirled_peas/ui/painter.rb +0 -283
  159. data/lib/whirled_peas/ui/screen.rb +0 -62
  160. data/lib/whirled_peas/ui/settings.rb +0 -521
  161. data/lib/whirled_peas/ui/stroke.rb +0 -29
  162. data/sandbox/auto.rb +0 -13
  163. data/sandbox/box.rb +0 -19
  164. data/sandbox/grid.rb +0 -13
  165. data/sandbox/sandbox.rb +0 -17
  166. data/sandbox/text.rb +0 -33
@@ -18,11 +18,13 @@ Gem::Specification.new do |spec|
18
18
  # Specify which files should be added to the gem when it is released.
19
19
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
20
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
21
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec|sandbox)/}) }
22
22
  end
23
+ spec.bindir = 'exe'
24
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
25
  spec.require_paths = ['lib']
24
26
 
25
27
  spec.add_runtime_dependency 'highline', '~> 2.0'
26
28
  spec.add_runtime_dependency 'json', '~> 2.5'
27
- spec.add_runtime_dependency 'tty-cursor', '~> 0.7'
29
+ spec.add_runtime_dependency 'ruby_figlet', '~> 0.6'
28
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whirled_peas
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Collier
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-21 00:00:00.000000000 Z
11
+ date: 2021-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -39,23 +39,24 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2.5'
41
41
  - !ruby/object:Gem::Dependency
42
- name: tty-cursor
42
+ name: ruby_figlet
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.7'
47
+ version: '0.6'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.7'
54
+ version: '0.6'
55
55
  description:
56
56
  email:
57
57
  - tcollier@gmail.com
58
- executables: []
58
+ executables:
59
+ - whirled_peas
59
60
  extensions: []
60
61
  extra_rdoc_files: []
61
62
  files:
@@ -70,26 +71,152 @@ files:
70
71
  - Rakefile
71
72
  - bin/console
72
73
  - bin/setup
74
+ - examples/intro.rb
75
+ - examples/scrolling.rb
76
+ - exe/whirled_peas
73
77
  - lib/whirled_peas.rb
78
+ - lib/whirled_peas/command_line.rb
79
+ - lib/whirled_peas/config.rb
80
+ - lib/whirled_peas/errors.rb
74
81
  - lib/whirled_peas/frame.rb
75
82
  - lib/whirled_peas/frame/consumer.rb
83
+ - lib/whirled_peas/frame/debug_consumer.rb
76
84
  - lib/whirled_peas/frame/event_loop.rb
77
85
  - lib/whirled_peas/frame/producer.rb
86
+ - lib/whirled_peas/graphics.rb
87
+ - lib/whirled_peas/graphics/box_painter.rb
88
+ - lib/whirled_peas/graphics/canvas.rb
89
+ - lib/whirled_peas/graphics/composer.rb
90
+ - lib/whirled_peas/graphics/container_coords.rb
91
+ - lib/whirled_peas/graphics/container_dimensions.rb
92
+ - lib/whirled_peas/graphics/container_painter.rb
93
+ - lib/whirled_peas/graphics/debugger.rb
94
+ - lib/whirled_peas/graphics/grid_painter.rb
95
+ - lib/whirled_peas/graphics/mock_screen.rb
96
+ - lib/whirled_peas/graphics/painter.rb
97
+ - lib/whirled_peas/graphics/renderer.rb
98
+ - lib/whirled_peas/graphics/screen.rb
99
+ - lib/whirled_peas/graphics/text_dimensions.rb
100
+ - lib/whirled_peas/graphics/text_painter.rb
78
101
  - lib/whirled_peas/null_logger.rb
79
- - lib/whirled_peas/ui.rb
80
- - lib/whirled_peas/ui/ansi.rb
81
- - lib/whirled_peas/ui/canvas.rb
82
- - lib/whirled_peas/ui/element.rb
83
- - lib/whirled_peas/ui/painter.rb
84
- - lib/whirled_peas/ui/screen.rb
85
- - lib/whirled_peas/ui/settings.rb
86
- - lib/whirled_peas/ui/stroke.rb
102
+ - lib/whirled_peas/settings.rb
103
+ - lib/whirled_peas/settings/bg_color.rb
104
+ - lib/whirled_peas/settings/border.rb
105
+ - lib/whirled_peas/settings/box_settings.rb
106
+ - lib/whirled_peas/settings/color.rb
107
+ - lib/whirled_peas/settings/container_settings.rb
108
+ - lib/whirled_peas/settings/debugger.rb
109
+ - lib/whirled_peas/settings/display_flow.rb
110
+ - lib/whirled_peas/settings/element_settings.rb
111
+ - lib/whirled_peas/settings/grid_settings.rb
112
+ - lib/whirled_peas/settings/margin.rb
113
+ - lib/whirled_peas/settings/padding.rb
114
+ - lib/whirled_peas/settings/position.rb
115
+ - lib/whirled_peas/settings/scrollbar.rb
116
+ - lib/whirled_peas/settings/spacing.rb
117
+ - lib/whirled_peas/settings/text_align.rb
118
+ - lib/whirled_peas/settings/text_color.rb
119
+ - lib/whirled_peas/settings/text_settings.rb
120
+ - lib/whirled_peas/utils.rb
121
+ - lib/whirled_peas/utils/ansi.rb
122
+ - lib/whirled_peas/utils/formatted_string.rb
123
+ - lib/whirled_peas/utils/title_font.rb
87
124
  - lib/whirled_peas/version.rb
88
- - sandbox/auto.rb
89
- - sandbox/box.rb
90
- - sandbox/grid.rb
91
- - sandbox/sandbox.rb
92
- - sandbox/text.rb
125
+ - screen_test/rendered/elements/box.frame
126
+ - screen_test/rendered/elements/box.rb
127
+ - screen_test/rendered/elements/grid.frame
128
+ - screen_test/rendered/elements/grid.rb
129
+ - screen_test/rendered/elements/screen_overflow.frame
130
+ - screen_test/rendered/elements/screen_overflow.rb
131
+ - screen_test/rendered/elements/text.frame
132
+ - screen_test/rendered/elements/text.rb
133
+ - screen_test/rendered/elements/text_multiline.frame
134
+ - screen_test/rendered/elements/text_multiline.rb
135
+ - screen_test/rendered/settings/align/box.frame
136
+ - screen_test/rendered/settings/align/box.rb
137
+ - screen_test/rendered/settings/align/children_center.frame
138
+ - screen_test/rendered/settings/align/children_center.rb
139
+ - screen_test/rendered/settings/align/children_left.frame
140
+ - screen_test/rendered/settings/align/children_left.rb
141
+ - screen_test/rendered/settings/align/children_right.frame
142
+ - screen_test/rendered/settings/align/children_right.rb
143
+ - screen_test/rendered/settings/align/grid.frame
144
+ - screen_test/rendered/settings/align/grid.rb
145
+ - screen_test/rendered/settings/ansi/bold.frame
146
+ - screen_test/rendered/settings/ansi/bold.rb
147
+ - screen_test/rendered/settings/ansi/color.frame
148
+ - screen_test/rendered/settings/ansi/color.rb
149
+ - screen_test/rendered/settings/ansi/underline.frame
150
+ - screen_test/rendered/settings/ansi/underline.rb
151
+ - screen_test/rendered/settings/border.frame
152
+ - screen_test/rendered/settings/border.rb
153
+ - screen_test/rendered/settings/flow/box_b2t.frame
154
+ - screen_test/rendered/settings/flow/box_b2t.rb
155
+ - screen_test/rendered/settings/flow/box_l2r.frame
156
+ - screen_test/rendered/settings/flow/box_l2r.rb
157
+ - screen_test/rendered/settings/flow/box_r2l.frame
158
+ - screen_test/rendered/settings/flow/box_r2l.rb
159
+ - screen_test/rendered/settings/flow/box_t2b.frame
160
+ - screen_test/rendered/settings/flow/box_t2b.rb
161
+ - screen_test/rendered/settings/flow/grid_b2t.frame
162
+ - screen_test/rendered/settings/flow/grid_b2t.rb
163
+ - screen_test/rendered/settings/flow/grid_l2r.frame
164
+ - screen_test/rendered/settings/flow/grid_l2r.rb
165
+ - screen_test/rendered/settings/flow/grid_r2l.frame
166
+ - screen_test/rendered/settings/flow/grid_r2l.rb
167
+ - screen_test/rendered/settings/flow/grid_t2b.frame
168
+ - screen_test/rendered/settings/flow/grid_t2b.rb
169
+ - screen_test/rendered/settings/height/box.frame
170
+ - screen_test/rendered/settings/height/box.rb
171
+ - screen_test/rendered/settings/height/grid.frame
172
+ - screen_test/rendered/settings/height/grid.rb
173
+ - screen_test/rendered/settings/height/overflow_box.frame
174
+ - screen_test/rendered/settings/height/overflow_box.rb
175
+ - screen_test/rendered/settings/height/overflow_box_l2r.frame
176
+ - screen_test/rendered/settings/height/overflow_box_l2r.rb
177
+ - screen_test/rendered/settings/height/overflow_box_t2b.frame
178
+ - screen_test/rendered/settings/height/overflow_box_t2b.rb
179
+ - screen_test/rendered/settings/height/overflow_grid.frame
180
+ - screen_test/rendered/settings/height/overflow_grid.rb
181
+ - screen_test/rendered/settings/margin.frame
182
+ - screen_test/rendered/settings/margin.rb
183
+ - screen_test/rendered/settings/padding.frame
184
+ - screen_test/rendered/settings/padding.rb
185
+ - screen_test/rendered/settings/position/box_left.frame
186
+ - screen_test/rendered/settings/position/box_left.rb
187
+ - screen_test/rendered/settings/position/box_left_negative.frame
188
+ - screen_test/rendered/settings/position/box_left_negative.rb
189
+ - screen_test/rendered/settings/position/box_top.frame
190
+ - screen_test/rendered/settings/position/box_top.rb
191
+ - screen_test/rendered/settings/position/box_top_negative.frame
192
+ - screen_test/rendered/settings/position/box_top_negative.rb
193
+ - screen_test/rendered/settings/position/grid_left.frame
194
+ - screen_test/rendered/settings/position/grid_left.rb
195
+ - screen_test/rendered/settings/position/grid_left_negative.frame
196
+ - screen_test/rendered/settings/position/grid_left_negative.rb
197
+ - screen_test/rendered/settings/position/grid_top.frame
198
+ - screen_test/rendered/settings/position/grid_top.rb
199
+ - screen_test/rendered/settings/position/grid_top_negative.frame
200
+ - screen_test/rendered/settings/position/grid_top_negative.rb
201
+ - screen_test/rendered/settings/scroll/horiz_box.frame
202
+ - screen_test/rendered/settings/scroll/horiz_box.rb
203
+ - screen_test/rendered/settings/scroll/vert_box.frame
204
+ - screen_test/rendered/settings/scroll/vert_box.rb
205
+ - screen_test/rendered/settings/title_font.frame
206
+ - screen_test/rendered/settings/title_font.rb
207
+ - screen_test/rendered/settings/width/box.frame
208
+ - screen_test/rendered/settings/width/box.rb
209
+ - screen_test/rendered/settings/width/grid.frame
210
+ - screen_test/rendered/settings/width/grid.rb
211
+ - screen_test/rendered/settings/width/overflow_box.frame
212
+ - screen_test/rendered/settings/width/overflow_box.rb
213
+ - screen_test/rendered/settings/width/overflow_box_l2r.frame
214
+ - screen_test/rendered/settings/width/overflow_box_l2r.rb
215
+ - screen_test/rendered/settings/width/overflow_box_t2b.frame
216
+ - screen_test/rendered/settings/width/overflow_box_t2b.rb
217
+ - screen_test/rendered/settings/width/overflow_grid.frame
218
+ - screen_test/rendered/settings/width/overflow_grid.rb
219
+ - screen_test/screen_tester.rb
93
220
  - whirled_peas.gemspec
94
221
  homepage: https://github.com/tcollier/whirled_peas
95
222
  licenses:
@@ -1,7 +0,0 @@
1
- require_relative 'ui/element'
2
- require_relative 'ui/screen'
3
-
4
- module WhirledPeas
5
- module UI
6
- end
7
- end
@@ -1,154 +0,0 @@
1
- module WhirledPeas
2
- module UI
3
- DEBUG_COLOR = ARGV.include?('--debug-color')
4
-
5
- module Ansi
6
- BOLD = 1
7
- UNDERLINE = 4
8
-
9
- BLACK = 30
10
- RED = 31
11
- GREEN = 32
12
- YELLOW = 33
13
- BLUE = 34
14
- MAGENTA = 35
15
- CYAN = 36
16
- WHITE = 37
17
-
18
- END_FORMATTING = 0
19
-
20
- class << self
21
- def format(str, codes)
22
- if str.empty? || codes.length == 0
23
- str
24
- else
25
- start_formatting = codes.map(&method(:esc_seq)).join
26
- "#{start_formatting}#{str}#{esc_seq(END_FORMATTING)}"
27
- end
28
- end
29
-
30
- def clear
31
- esc_seq(END_FORMATTING)
32
- end
33
-
34
- def hidden_width(line)
35
- return 0 if DEBUG_COLOR
36
- width = 0
37
- line.scan(/\033\[\d+m/).each { |f| width += f.length }
38
- width
39
- end
40
-
41
- def close_formatting(line)
42
- codes = line.scan(DEBUG_COLOR ? /<(\d+)>/ : /\033\[(\d+)m/)
43
- if codes.length > 0 && codes.last[0] != END_FORMATTING.to_s
44
- "#{line}#{esc_seq(END_FORMATTING)}"
45
- else
46
- line
47
- end
48
- end
49
-
50
- def first(str, num_visible_chars)
51
- return str if str.length <= num_visible_chars + hidden_width(str)
52
- result = ''
53
- in_format = false
54
- visible_len = 0
55
- str.chars.each do |char|
56
- in_format = true if !in_format && char == "\033"
57
- result += char
58
- visible_len += 1 if !in_format
59
- in_format = false if in_format && char == 'm'
60
- break if visible_len == num_visible_chars
61
- end
62
- close_formatting(result)
63
- end
64
-
65
- private
66
-
67
- def esc_seq(code)
68
- DEBUG_COLOR ? "<#{code}>" : "\033[#{code}m"
69
- end
70
- end
71
- end
72
-
73
- class Color
74
- BRIGHT_OFFSET = 60
75
- private_constant :BRIGHT_OFFSET
76
-
77
- def self.validate!(color)
78
- return unless color
79
- if color.is_a?(Symbol)
80
- error_message = "Unsupported #{self.name.split('::').last}: #{color}"
81
- match = color.to_s.match(/^(bright_)?(\w+)$/)
82
- begin
83
- color = self.const_get(match[2].upcase)
84
- raise ArgumentError, error_message unless color.is_a?(Color)
85
- if match[1]
86
- raise ArgumentError, error_message if color.bright?
87
- color.bright
88
- else
89
- color
90
- end
91
- rescue NameError
92
- raise ArgumentError, error_message
93
- end
94
- else
95
- color
96
- end
97
- end
98
-
99
- def initialize(code, bright=false)
100
- @code = code
101
- @bright = bright
102
- end
103
-
104
- def bright?
105
- @bright
106
- end
107
-
108
- def bright
109
- bright? ? self : self.class.new(@code + BRIGHT_OFFSET, true)
110
- end
111
-
112
- def to_s
113
- @code.to_s
114
- end
115
-
116
- def inspect
117
- "#{self.class.name.split('::').last}(code=#{@code}, bright=#{@bright})"
118
- end
119
- end
120
- private_constant :Color
121
-
122
- class BgColor < Color
123
- BG_OFFSET = 10
124
- private_constant :BG_OFFSET
125
-
126
- BLACK = new(Ansi::BLACK + BG_OFFSET)
127
- RED = new(Ansi::RED + BG_OFFSET)
128
- GREEN = new(Ansi::GREEN + BG_OFFSET)
129
- YELLOW = new(Ansi::YELLOW + BG_OFFSET)
130
- BLUE = new(Ansi::BLUE + BG_OFFSET)
131
- MAGENTA = new(Ansi::MAGENTA + BG_OFFSET)
132
- CYAN = new(Ansi::CYAN + BG_OFFSET)
133
- WHITE = new(Ansi::WHITE + BG_OFFSET)
134
- GRAY = BLACK.bright
135
- end
136
-
137
- class TextColor < Color
138
- BLACK = new(Ansi::BLACK)
139
- RED = new(Ansi::RED)
140
- GREEN = new(Ansi::GREEN)
141
- YELLOW = new(Ansi::YELLOW)
142
- BLUE = new(Ansi::BLUE)
143
- MAGENTA = new(Ansi::MAGENTA)
144
- CYAN = new(Ansi::CYAN)
145
- WHITE = new(Ansi::WHITE)
146
- GRAY = BLACK.bright
147
- end
148
-
149
- module TextFormat
150
- BOLD = Ansi::BOLD
151
- UNDERLINE = Ansi::UNDERLINE
152
- end
153
- end
154
- end
@@ -1,35 +0,0 @@
1
- require_relative 'stroke'
2
-
3
- module WhirledPeas
4
- module UI
5
- class Canvas
6
- attr_reader :left, :top, :width, :height
7
-
8
- def initialize(left, top, width, height)
9
- @left = left
10
- @top = top
11
- @width = width
12
- @height = height
13
- end
14
-
15
- def stroke(left, top, chars)
16
- if left >= self.left + self.width || left + chars.length <= self.left
17
- Stroke::EMPTY
18
- elsif top < self.top || top >= self.top + self.height
19
- Stroke::EMPTY
20
- else
21
- if left < self.left
22
- chars = chars[self.left - left..-1]
23
- left = self.left
24
- end
25
- num_chars = [self.left + self.width, left + chars.length].min - left
26
- Stroke.new(left, top, Ansi.first(chars, num_chars))
27
- end
28
- end
29
-
30
- def inspect
31
- "Canvas(left=#{left}, top=#{top}, width=#{width}, height=#{height})"
32
- end
33
- end
34
- end
35
- end
@@ -1,225 +0,0 @@
1
- require_relative 'settings'
2
-
3
- module WhirledPeas
4
- module UI
5
- STRINGALBE_CLASSES = [FalseClass, Float, Integer, NilClass, String, Symbol, TrueClass]
6
-
7
- class Element
8
- attr_accessor :preferred_width, :preferred_height
9
- attr_reader :name, :settings
10
-
11
- def initialize(name, settings)
12
- @name = name
13
- @settings = settings
14
- end
15
- end
16
- private_constant :Element
17
-
18
- class TextElement < Element
19
- attr_reader :value
20
-
21
- def initialize(name, settings)
22
- super(name, TextSettings.merge(settings))
23
- end
24
-
25
- def value=(val)
26
- unless STRINGALBE_CLASSES.include?(val.class)
27
- raise ArgmentError, "Unsupported type for TextElement: #{val.class}"
28
- end
29
- @value = val.to_s
30
- @preferred_width = settings.width || value.length
31
- @preferred_height = 1
32
- end
33
-
34
- def inspect(indent='')
35
- dims = unless preferred_width.nil?
36
- "#{indent + ' '}- Dimensions: #{preferred_width}x#{preferred_height}"
37
- end
38
- [
39
- "#{indent}+ #{name} [#{self.class.name}]",
40
- dims,
41
- "#{indent + ' '}- Settings",
42
- settings.inspect(indent + ' ')
43
- ].compact.join("\n")
44
- end
45
- end
46
-
47
- class ComposableElement < Element
48
- class << self
49
- def next_name
50
- @counter ||= 0
51
- @counter += 1
52
- "Element-#{@counter}"
53
- end
54
- end
55
-
56
- def initialize(name, settings)
57
- super
58
- end
59
-
60
- def children
61
- @children ||= []
62
- end
63
-
64
- def add_text(name=self.class.next_name, &block)
65
- element = TextElement.new(name, settings)
66
- element.value = yield nil, element.settings
67
- children << element
68
- end
69
-
70
- def add_box(name=self.class.next_name, &block)
71
- element = BoxElement.new(name, settings)
72
- value = yield element, element.settings
73
- children << element
74
- if element.children.empty? && STRINGALBE_CLASSES.include?(value.class)
75
- element.add_text { value.to_s }
76
- end
77
- end
78
-
79
- def add_grid(name=self.class.next_name, &block)
80
- element = GridElement.new(name, settings)
81
- values = yield element, element.settings
82
- children << element
83
- if element.children.empty? && values.is_a?(Array)
84
- values.each { |v| element.add_text { v.to_s } }
85
- end
86
- end
87
-
88
- def inspect(indent='')
89
- kids = children.map { |c| c.inspect(indent + ' ') }.join("\n")
90
- dims = unless preferred_width.nil?
91
- "#{indent + ' '}- Dimensions: #{preferred_width}x#{preferred_height}"
92
- end
93
- [
94
- "#{indent}+ #{name} [#{self.class.name}]",
95
- dims,
96
- "#{indent + ' '}- Settings",
97
- settings.inspect(indent + ' '),
98
- "#{indent + ' '}- Children",
99
- kids
100
- ].compact.join("\n")
101
- end
102
-
103
- private
104
-
105
- def margin_width
106
- settings.margin.left + settings.margin.right
107
- end
108
-
109
- def margin_height
110
- settings.margin.top + settings.margin.bottom
111
- end
112
-
113
- def outer_border_width
114
- (settings.border.left? ? 1 : 0) + (settings.border.right? ? 1 : 0)
115
- end
116
-
117
- def outer_border_height
118
- (settings.border.top? ? 1 : 0) + (settings.border.bottom? ? 1 : 0)
119
- end
120
-
121
- def inner_border_width
122
- settings.border.inner_vert? ? 1 : 0
123
- end
124
-
125
- def inner_border_height
126
- settings.border.inner_horiz? ? 1 : 0
127
- end
128
-
129
- def padding_width
130
- settings.padding.left + settings.padding.right
131
- end
132
-
133
- def padding_height
134
- settings.padding.top + settings.padding.bottom
135
- end
136
- end
137
-
138
- class Template < ComposableElement
139
- def initialize(settings=TemplateSettings.new)
140
- super('TEMPLATE', settings)
141
- end
142
- end
143
-
144
- class BoxElement < ComposableElement
145
- attr_writer :content_width, :content_height
146
-
147
- def initialize(name, settings)
148
- super(name, BoxSettings.merge(settings))
149
- end
150
-
151
- def self.from_template(template, width, height)
152
- box = new(template.name, template.settings)
153
- template.children.each { |c| box.children << c }
154
- box.content_width = box.preferred_width = width
155
- box.content_height = box.preferred_height = height
156
- box
157
- end
158
-
159
- def content_width
160
- @content_width ||= begin
161
- child_widths = children.map(&:preferred_width)
162
- width = settings.horizontal_flow? ? child_widths.sum : (child_widths.max || 0)
163
- [width, *settings.width].max
164
- end
165
- end
166
-
167
- def preferred_width
168
- @preferred_width ||=
169
- margin_width + outer_border_width + padding_width + content_width
170
- end
171
-
172
- def content_height
173
- @content_height ||= begin
174
- child_heights = children.map(&:preferred_height)
175
- settings.vertical_flow? ? child_heights.sum : (child_heights.max || 0)
176
- end
177
- end
178
-
179
- def preferred_height
180
- @preferred_height ||=
181
- margin_height + outer_border_height + padding_height + content_height
182
- end
183
- end
184
-
185
- class GridElement < ComposableElement
186
- def initialize(name, settings)
187
- super(name, GridSettings.merge(settings))
188
- end
189
-
190
- def col_width
191
- return @col_width if @col_width
192
- @col_width = 0
193
- children.each do |child|
194
- @col_width = child.preferred_width if child.preferred_width > @col_width
195
- end
196
- @col_width
197
- end
198
-
199
- def row_height
200
- return @row_height if @row_height
201
- @row_height = 0
202
- children.each do |child|
203
- @row_height = child.preferred_height if child.preferred_height > @row_height
204
- end
205
- @row_height
206
- end
207
-
208
-
209
- def preferred_width
210
- margin_width +
211
- outer_border_width +
212
- settings.num_cols * (padding_width + col_width) +
213
- (settings.num_cols - 1) * inner_border_width
214
- end
215
-
216
- def preferred_height
217
- num_rows = (children.length / settings.num_cols).ceil
218
- margin_height +
219
- outer_border_height +
220
- num_rows * (padding_height + row_height) +
221
- (num_rows - 1) * inner_border_height
222
- end
223
- end
224
- end
225
- end