whirled_peas 0.5.0 → 0.9.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 (291) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +1 -0
  4. data/CHANGELOG.md +31 -0
  5. data/README.md +748 -137
  6. data/Rakefile +4 -32
  7. data/bin/easing +33 -0
  8. data/bin/reset_cursor +11 -0
  9. data/bin/screen_test +68 -0
  10. data/examples/graph.rb +54 -0
  11. data/examples/intro.rb +52 -0
  12. data/examples/scrolling.rb +54 -0
  13. data/lib/whirled_peas.rb +4 -12
  14. data/lib/whirled_peas/animator.rb +5 -0
  15. data/lib/whirled_peas/animator/debug_consumer.rb +17 -0
  16. data/lib/whirled_peas/animator/easing.rb +72 -0
  17. data/lib/whirled_peas/animator/frame.rb +5 -0
  18. data/lib/whirled_peas/animator/frameset.rb +33 -0
  19. data/lib/whirled_peas/animator/producer.rb +35 -0
  20. data/lib/whirled_peas/animator/renderer_consumer.rb +31 -0
  21. data/lib/whirled_peas/command.rb +5 -0
  22. data/lib/whirled_peas/command/base.rb +86 -0
  23. data/lib/whirled_peas/command/config_command.rb +44 -0
  24. data/lib/whirled_peas/command/debug.rb +21 -0
  25. data/lib/whirled_peas/command/fonts.rb +22 -0
  26. data/lib/whirled_peas/command/frame_command.rb +34 -0
  27. data/lib/whirled_peas/command/frames.rb +24 -0
  28. data/lib/whirled_peas/command/help.rb +38 -0
  29. data/lib/whirled_peas/command/play.rb +108 -0
  30. data/lib/whirled_peas/command/record.rb +57 -0
  31. data/lib/whirled_peas/command/still.rb +29 -0
  32. data/lib/whirled_peas/command_line.rb +22 -220
  33. data/lib/whirled_peas/config.rb +56 -6
  34. data/lib/whirled_peas/device.rb +5 -0
  35. data/lib/whirled_peas/device/null_device.rb +8 -0
  36. data/lib/whirled_peas/device/output_file.rb +19 -0
  37. data/lib/whirled_peas/device/screen.rb +26 -0
  38. data/lib/whirled_peas/graphics.rb +14 -0
  39. data/lib/whirled_peas/graphics/box_painter.rb +48 -47
  40. data/lib/whirled_peas/graphics/canvas.rb +22 -11
  41. data/lib/whirled_peas/graphics/composer.rb +98 -0
  42. data/lib/whirled_peas/graphics/container_coords.rb +24 -13
  43. data/lib/whirled_peas/graphics/container_dimensions.rb +37 -9
  44. data/lib/whirled_peas/graphics/container_painter.rb +283 -36
  45. data/lib/whirled_peas/graphics/content_dimensions.rb +19 -0
  46. data/lib/whirled_peas/graphics/content_painter.rb +20 -0
  47. data/lib/whirled_peas/graphics/debugger.rb +10 -1
  48. data/lib/whirled_peas/graphics/graph_dimensions.rb +12 -0
  49. data/lib/whirled_peas/graphics/graph_painter.rb +95 -0
  50. data/lib/whirled_peas/graphics/grid_painter.rb +25 -15
  51. data/lib/whirled_peas/graphics/mock_screen.rb +1 -1
  52. data/lib/whirled_peas/graphics/painter.rb +15 -6
  53. data/lib/whirled_peas/graphics/renderer.rb +13 -30
  54. data/lib/whirled_peas/graphics/text_painter.rb +11 -13
  55. data/lib/whirled_peas/settings/alignment.rb +24 -0
  56. data/lib/whirled_peas/settings/bg_color.rb +2 -0
  57. data/lib/whirled_peas/settings/border.rb +16 -16
  58. data/lib/whirled_peas/settings/color.rb +13 -14
  59. data/lib/whirled_peas/settings/container_settings.rb +133 -40
  60. data/lib/whirled_peas/settings/debugger.rb +9 -0
  61. data/lib/whirled_peas/settings/display_flow.rb +13 -11
  62. data/lib/whirled_peas/settings/element_settings.rb +8 -3
  63. data/lib/whirled_peas/settings/graph_settings.rb +21 -0
  64. data/lib/whirled_peas/settings/grid_settings.rb +15 -0
  65. data/lib/whirled_peas/settings/scrollbar.rb +15 -0
  66. data/lib/whirled_peas/settings/sizing.rb +19 -0
  67. data/lib/whirled_peas/settings/spacing.rb +34 -0
  68. data/lib/whirled_peas/settings/text_color.rb +2 -0
  69. data/lib/whirled_peas/settings/vert_alignment.rb +24 -0
  70. data/lib/whirled_peas/utils/ansi.rb +13 -0
  71. data/lib/whirled_peas/utils/file_handler.rb +57 -0
  72. data/lib/whirled_peas/utils/title_font.rb +1 -1
  73. data/lib/whirled_peas/version.rb +1 -1
  74. data/screen_test/{rendered/elements → elements}/box.frame +1 -1
  75. data/screen_test/{rendered/elements → elements}/box.rb +0 -0
  76. data/screen_test/elements/graph.frame +1 -0
  77. data/screen_test/elements/graph.rb +12 -0
  78. data/screen_test/elements/grid.frame +1 -0
  79. data/screen_test/{rendered/elements → elements}/grid.rb +0 -0
  80. data/screen_test/elements/screen_overflow_x.frame +1 -0
  81. data/screen_test/{rendered/elements/screen_overflow.rb → elements/screen_overflow_x.rb} +0 -0
  82. data/screen_test/elements/screen_overflow_y.frame +1 -0
  83. data/screen_test/elements/screen_overflow_y.rb +9 -0
  84. data/screen_test/elements/text.frame +1 -0
  85. data/screen_test/{rendered/elements → elements}/text.rb +0 -0
  86. data/screen_test/elements/text_multiline.frame +1 -0
  87. data/screen_test/{rendered/elements → elements}/text_multiline.rb +0 -0
  88. data/screen_test/settings/align/box_around.frame +1 -0
  89. data/screen_test/settings/align/box_around.rb +16 -0
  90. data/screen_test/settings/align/box_between.frame +1 -0
  91. data/screen_test/settings/align/box_between.rb +16 -0
  92. data/screen_test/settings/align/box_center.frame +1 -0
  93. data/screen_test/{rendered/settings/align/box.rb → settings/align/box_center.rb} +5 -4
  94. data/screen_test/settings/align/box_default.frame +1 -0
  95. data/screen_test/{rendered/settings/align/grid.rb → settings/align/box_default.rb} +6 -6
  96. data/screen_test/settings/align/box_evenly.frame +1 -0
  97. data/screen_test/settings/align/box_evenly.rb +16 -0
  98. data/screen_test/settings/align/box_left.frame +1 -0
  99. data/screen_test/settings/align/box_left.rb +21 -0
  100. data/screen_test/settings/align/box_right.frame +1 -0
  101. data/screen_test/settings/align/box_right.rb +21 -0
  102. data/screen_test/settings/align/children_center.frame +1 -0
  103. data/screen_test/settings/align/children_center.rb +15 -0
  104. data/screen_test/settings/align/children_left.frame +1 -0
  105. data/screen_test/settings/align/children_left.rb +15 -0
  106. data/screen_test/settings/align/children_right.frame +1 -0
  107. data/screen_test/settings/align/children_right.rb +15 -0
  108. data/screen_test/settings/align/grid_center.frame +1 -0
  109. data/screen_test/settings/align/grid_center.rb +18 -0
  110. data/screen_test/settings/align/grid_default.frame +1 -0
  111. data/screen_test/settings/align/grid_default.rb +17 -0
  112. data/screen_test/settings/align/grid_left.frame +1 -0
  113. data/screen_test/settings/align/grid_left.rb +18 -0
  114. data/screen_test/settings/align/grid_right.frame +1 -0
  115. data/screen_test/settings/align/grid_right.rb +18 -0
  116. data/screen_test/settings/ansi/bold.frame +1 -0
  117. data/screen_test/{rendered/settings/width/overflow_box_t2b.rb → settings/ansi/bold.rb} +4 -5
  118. data/screen_test/{rendered/settings → settings}/ansi/color.frame +1 -1
  119. data/screen_test/{rendered/settings → settings}/ansi/color.rb +0 -0
  120. data/screen_test/settings/ansi/underline.frame +1 -0
  121. data/screen_test/{rendered/settings → settings}/ansi/underline.rb +4 -5
  122. data/screen_test/{rendered/settings → settings}/border.frame +1 -1
  123. data/screen_test/{rendered/settings → settings}/border.rb +1 -1
  124. data/screen_test/settings/flow/box_b2t.frame +1 -0
  125. data/screen_test/settings/flow/box_b2t.rb +26 -0
  126. data/screen_test/settings/flow/box_l2r.frame +1 -0
  127. data/screen_test/settings/flow/box_l2r.rb +26 -0
  128. data/screen_test/settings/flow/box_r2l.frame +1 -0
  129. data/screen_test/settings/flow/box_r2l.rb +26 -0
  130. data/screen_test/settings/flow/box_t2b.frame +1 -0
  131. data/screen_test/settings/flow/box_t2b.rb +26 -0
  132. data/screen_test/settings/flow/grid_b2t.frame +1 -0
  133. data/screen_test/settings/flow/grid_b2t.rb +14 -0
  134. data/screen_test/settings/flow/grid_l2r.frame +1 -0
  135. data/screen_test/{rendered/settings/margin.rb → settings/flow/grid_l2r.rb} +4 -4
  136. data/screen_test/settings/flow/grid_r2l.frame +1 -0
  137. data/screen_test/settings/flow/grid_r2l.rb +14 -0
  138. data/screen_test/settings/flow/grid_t2b.frame +1 -0
  139. data/screen_test/settings/flow/grid_t2b.rb +14 -0
  140. data/screen_test/settings/height/box.frame +1 -0
  141. data/screen_test/{rendered/settings → settings}/height/box.rb +0 -0
  142. data/screen_test/settings/height/box_border_sizing.frame +1 -0
  143. data/screen_test/settings/height/box_border_sizing.rb +15 -0
  144. data/screen_test/settings/height/grid.frame +1 -0
  145. data/screen_test/{rendered/settings → settings}/height/grid.rb +0 -0
  146. data/screen_test/settings/height/overflow_box.frame +1 -0
  147. data/screen_test/settings/height/overflow_box.rb +13 -0
  148. data/screen_test/settings/height/overflow_box_l2r.frame +1 -0
  149. data/screen_test/settings/height/overflow_box_l2r.rb +17 -0
  150. data/screen_test/settings/height/overflow_box_t2b.frame +1 -0
  151. data/screen_test/settings/height/overflow_box_t2b.rb +16 -0
  152. data/screen_test/settings/height/overflow_grid.frame +1 -0
  153. data/screen_test/{rendered/settings → settings}/height/overflow_grid.rb +0 -0
  154. data/screen_test/settings/margin.frame +1 -0
  155. data/screen_test/settings/margin.rb +16 -0
  156. data/screen_test/settings/padding.frame +1 -0
  157. data/screen_test/settings/padding.rb +13 -0
  158. data/screen_test/settings/position/box_left.frame +1 -0
  159. data/screen_test/{rendered/settings → settings}/position/box_left.rb +2 -2
  160. data/screen_test/settings/position/box_left_negative.frame +1 -0
  161. data/screen_test/{rendered/settings → settings}/position/box_left_negative.rb +2 -2
  162. data/screen_test/settings/position/box_top.frame +1 -0
  163. data/screen_test/{rendered/settings → settings}/position/box_top.rb +1 -1
  164. data/screen_test/settings/position/box_top_negative.frame +1 -0
  165. data/screen_test/{rendered/settings → settings}/position/box_top_negative.rb +2 -2
  166. data/screen_test/settings/position/grid_left.frame +1 -0
  167. data/screen_test/{rendered/settings → settings}/position/grid_left.rb +1 -1
  168. data/screen_test/settings/position/grid_left_negative.frame +1 -0
  169. data/screen_test/{rendered/settings → settings}/position/grid_left_negative.rb +1 -1
  170. data/screen_test/settings/position/grid_top.frame +1 -0
  171. data/screen_test/{rendered/settings → settings}/position/grid_top.rb +1 -1
  172. data/screen_test/settings/position/grid_top_negative.frame +1 -0
  173. data/screen_test/{rendered/settings → settings}/position/grid_top_negative.rb +1 -1
  174. data/screen_test/settings/scroll/horiz_box.frame +1 -0
  175. data/screen_test/settings/scroll/horiz_box.rb +17 -0
  176. data/screen_test/settings/scroll/horiz_box_align_center.rb +18 -0
  177. data/screen_test/settings/scroll/horiz_box_align_right.rb +18 -0
  178. data/screen_test/settings/scroll/vert_box.frame +1 -0
  179. data/screen_test/settings/scroll/vert_box.rb +20 -0
  180. data/screen_test/settings/title_font.frame +1 -0
  181. data/screen_test/{rendered/settings → settings}/title_font.rb +1 -1
  182. data/screen_test/settings/valign/box_around.frame +1 -0
  183. data/screen_test/settings/valign/box_around.rb +17 -0
  184. data/screen_test/settings/valign/box_between.frame +1 -0
  185. data/screen_test/settings/valign/box_between.rb +17 -0
  186. data/screen_test/settings/valign/box_bottom.frame +1 -0
  187. data/screen_test/settings/valign/box_bottom.rb +17 -0
  188. data/screen_test/settings/valign/box_default.frame +1 -0
  189. data/screen_test/settings/valign/box_default.rb +16 -0
  190. data/screen_test/settings/valign/box_evenly.frame +1 -0
  191. data/screen_test/settings/valign/box_evenly.rb +17 -0
  192. data/screen_test/settings/valign/box_middle.frame +1 -0
  193. data/screen_test/settings/valign/box_middle.rb +17 -0
  194. data/screen_test/settings/valign/box_top.frame +1 -0
  195. data/screen_test/settings/valign/box_top.rb +17 -0
  196. data/screen_test/settings/valign/grid_bottom.frame +1 -0
  197. data/screen_test/settings/valign/grid_bottom.rb +15 -0
  198. data/screen_test/settings/valign/grid_default.frame +1 -0
  199. data/screen_test/settings/valign/grid_default.rb +14 -0
  200. data/screen_test/settings/valign/grid_middle.frame +1 -0
  201. data/screen_test/settings/valign/grid_middle.rb +15 -0
  202. data/screen_test/settings/valign/grid_top.frame +1 -0
  203. data/screen_test/settings/valign/grid_top.rb +15 -0
  204. data/screen_test/settings/width/box_border_sizing.frame +1 -0
  205. data/screen_test/settings/width/box_border_sizing.rb +15 -0
  206. data/screen_test/settings/width/box_content.frame +1 -0
  207. data/screen_test/settings/width/box_content.rb +15 -0
  208. data/screen_test/settings/width/box_default.frame +1 -0
  209. data/screen_test/{rendered/settings/width/box.rb → settings/width/box_default.rb} +3 -2
  210. data/screen_test/settings/width/grid.frame +1 -0
  211. data/screen_test/{rendered/settings → settings}/width/grid.rb +2 -2
  212. data/screen_test/settings/width/overflow_align_center.frame +1 -0
  213. data/screen_test/settings/width/overflow_align_center.rb +14 -0
  214. data/screen_test/settings/width/overflow_align_right.frame +1 -0
  215. data/screen_test/settings/width/overflow_align_right.rb +14 -0
  216. data/screen_test/settings/width/overflow_box.frame +1 -0
  217. data/screen_test/settings/width/overflow_box.rb +13 -0
  218. data/screen_test/settings/width/overflow_box_l2r.frame +1 -0
  219. data/screen_test/settings/width/overflow_box_l2r.rb +16 -0
  220. data/screen_test/settings/width/overflow_box_t2b.frame +1 -0
  221. data/screen_test/settings/width/overflow_box_t2b.rb +17 -0
  222. data/screen_test/settings/width/overflow_grid.frame +1 -0
  223. data/screen_test/{rendered/settings → settings}/width/overflow_grid.rb +0 -0
  224. data/tools/whirled_peas/tools/screen_tester.rb +285 -0
  225. metadata +192 -98
  226. data/bin/debug +0 -35
  227. data/lib/whirled_peas/debugger.rb +0 -80
  228. data/lib/whirled_peas/frame.rb +0 -6
  229. data/lib/whirled_peas/frame/consumer.rb +0 -30
  230. data/lib/whirled_peas/frame/debug_consumer.rb +0 -30
  231. data/lib/whirled_peas/frame/event_loop.rb +0 -90
  232. data/lib/whirled_peas/frame/producer.rb +0 -67
  233. data/lib/whirled_peas/graphics/screen.rb +0 -65
  234. data/lib/whirled_peas/graphics/text_dimensions.rb +0 -15
  235. data/lib/whirled_peas/settings/text_align.rb +0 -19
  236. data/lib/whirled_peas/template.rb +0 -5
  237. data/lib/whirled_peas/template/box_element.rb +0 -8
  238. data/lib/whirled_peas/template/composer.rb +0 -68
  239. data/lib/whirled_peas/template/container.rb +0 -28
  240. data/lib/whirled_peas/template/debugger.rb +0 -34
  241. data/lib/whirled_peas/template/element.rb +0 -13
  242. data/lib/whirled_peas/template/grid_element.rb +0 -8
  243. data/lib/whirled_peas/template/text_element.rb +0 -24
  244. data/screen_test/rendered/elements/grid.frame +0 -1
  245. data/screen_test/rendered/elements/text.frame +0 -1
  246. data/screen_test/rendered/elements/text_multiline.frame +0 -1
  247. data/screen_test/rendered/settings/align/box.frame +0 -1
  248. data/screen_test/rendered/settings/align/children_center.frame +0 -1
  249. data/screen_test/rendered/settings/align/children_center.rb +0 -13
  250. data/screen_test/rendered/settings/align/children_left.frame +0 -1
  251. data/screen_test/rendered/settings/align/children_left.rb +0 -13
  252. data/screen_test/rendered/settings/align/children_right.frame +0 -1
  253. data/screen_test/rendered/settings/align/children_right.rb +0 -13
  254. data/screen_test/rendered/settings/align/grid.frame +0 -1
  255. data/screen_test/rendered/settings/ansi/bold.frame +0 -1
  256. data/screen_test/rendered/settings/ansi/bold.rb +0 -15
  257. data/screen_test/rendered/settings/ansi/underline.frame +0 -1
  258. data/screen_test/rendered/settings/flow/l2r.frame +0 -1
  259. data/screen_test/rendered/settings/flow/l2r.rb +0 -24
  260. data/screen_test/rendered/settings/flow/t2b.frame +0 -1
  261. data/screen_test/rendered/settings/flow/t2b.rb +0 -24
  262. data/screen_test/rendered/settings/height/box.frame +0 -1
  263. data/screen_test/rendered/settings/height/grid.frame +0 -1
  264. data/screen_test/rendered/settings/height/overflow_box.frame +0 -1
  265. data/screen_test/rendered/settings/height/overflow_box.rb +0 -13
  266. data/screen_test/rendered/settings/height/overflow_box_l2r.frame +0 -1
  267. data/screen_test/rendered/settings/height/overflow_box_l2r.rb +0 -15
  268. data/screen_test/rendered/settings/height/overflow_box_t2b.frame +0 -1
  269. data/screen_test/rendered/settings/height/overflow_box_t2b.rb +0 -14
  270. data/screen_test/rendered/settings/height/overflow_grid.frame +0 -1
  271. data/screen_test/rendered/settings/margin.frame +0 -1
  272. data/screen_test/rendered/settings/padding.frame +0 -1
  273. data/screen_test/rendered/settings/padding.rb +0 -11
  274. data/screen_test/rendered/settings/position/box_left.frame +0 -1
  275. data/screen_test/rendered/settings/position/box_left_negative.frame +0 -1
  276. data/screen_test/rendered/settings/position/box_top.frame +0 -1
  277. data/screen_test/rendered/settings/position/box_top_negative.frame +0 -1
  278. data/screen_test/rendered/settings/position/grid_left.frame +0 -1
  279. data/screen_test/rendered/settings/position/grid_left_negative.frame +0 -1
  280. data/screen_test/rendered/settings/position/grid_top.frame +0 -1
  281. data/screen_test/rendered/settings/position/grid_top_negative.frame +0 -1
  282. data/screen_test/rendered/settings/title_font.frame +0 -1
  283. data/screen_test/rendered/settings/width/box.frame +0 -1
  284. data/screen_test/rendered/settings/width/grid.frame +0 -1
  285. data/screen_test/rendered/settings/width/overflow_box.frame +0 -1
  286. data/screen_test/rendered/settings/width/overflow_box.rb +0 -11
  287. data/screen_test/rendered/settings/width/overflow_box_l2r.frame +0 -1
  288. data/screen_test/rendered/settings/width/overflow_box_l2r.rb +0 -14
  289. data/screen_test/rendered/settings/width/overflow_box_t2b.frame +0 -1
  290. data/screen_test/rendered/settings/width/overflow_grid.frame +0 -1
  291. data/screen_test/screen_tester.rb +0 -191
@@ -1,34 +0,0 @@
1
- require 'whirled_peas/settings/debugger'
2
-
3
- require_relative 'container'
4
- require_relative 'text_element'
5
-
6
- module WhirledPeas
7
- module Template
8
- class Debugger
9
- def initialize(element)
10
- @element = element
11
- end
12
-
13
- def debug(indent='')
14
- info = [
15
- "#{indent}* #{element.class}(#{element.name})",
16
- ]
17
- if element.is_a?(TextElement)
18
- info << "#{indent + ' '}- Content: #{element.content}"
19
- end
20
- info << "#{indent + ' '}- Settings"
21
- info << Settings::Debugger.new(element.settings).debug(indent + ' ')
22
- if element.is_a?(Container)
23
- info << "#{indent + ' '}- Children"
24
- info += element.each_child.map { |c| Debugger.new(c).debug(indent + ' ') }
25
- end
26
- info.join("\n")
27
- end
28
-
29
- private
30
-
31
- attr_reader :element
32
- end
33
- end
34
- end
@@ -1,13 +0,0 @@
1
- module WhirledPeas
2
- module Template
3
- class Element
4
- attr_reader :name, :settings
5
-
6
- def initialize(name, settings)
7
- @name = name
8
- @settings = settings
9
- end
10
- end
11
- private_constant :Element
12
- end
13
- end
@@ -1,8 +0,0 @@
1
- require_relative 'container'
2
-
3
- module WhirledPeas
4
- module Template
5
- class GridElement < Container
6
- end
7
- end
8
- end
@@ -1,24 +0,0 @@
1
- require_relative 'element'
2
-
3
- module WhirledPeas
4
- module Template
5
- class TextElement < Element
6
- # List of classes that convert nicely to a string
7
- STRINGALBE_CLASSES = [FalseClass, Float, Integer, NilClass, String, Symbol, TrueClass]
8
- private_constant :STRINGALBE_CLASSES
9
-
10
- def self.stringable?(value)
11
- STRINGALBE_CLASSES.include?(value.class)
12
- end
13
-
14
- attr_reader :content
15
-
16
- def content=(val)
17
- unless self.class.stringable?(val)
18
- raise ArgumentError, "Unsupported type for TextElement: #{val.class}"
19
- end
20
- @content = val.to_s
21
- end
22
- end
23
- end
24
- end
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━┳━━━━━━┳━━━━━━┓┃ ┃ ┃ ┃┣━━━━━━╋━━━━━━╋━━━━━━┫┃ ┃ ┃ ┃┣━━━━━━╋━━━━━━╋━━━━━━┫┃ ┃ ┃ ┃┗━━━━━━┻━━━━━━┻━━━━━━┛Item 0Item 1Item 2Item 3Item 4Item 5Item 6[?25h
@@ -1 +0,0 @@
1
- [?25lHello, World![?25h
@@ -1 +0,0 @@
1
- [?25lLine 1Line 2Line 3[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxdefault┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxleft┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxcenter┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxright[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
@@ -1,13 +0,0 @@
1
- require 'whirled_peas'
2
-
3
- class TemplateFactory
4
- def build(*)
5
- WhirledPeas.template do |composer, settings|
6
- settings.align = :center
7
- settings.width = 50
8
- settings.full_border
9
- composer.add_text('Text1') { 'Thing 1' }
10
- composer.add_text('Text2') { 'Thing 2' }
11
- end
12
- end
13
- end
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
@@ -1,13 +0,0 @@
1
- require 'whirled_peas'
2
-
3
- class TemplateFactory
4
- def build(*)
5
- WhirledPeas.template do |composer, settings|
6
- settings.align = :left
7
- settings.width = 50
8
- settings.full_border
9
- composer.add_text('Text1') { 'Thing 1' }
10
- composer.add_text('Text2') { 'Thing 2' }
11
- end
12
- end
13
- end
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
@@ -1,13 +0,0 @@
1
- require 'whirled_peas'
2
-
3
- class TemplateFactory
4
- def build(*)
5
- WhirledPeas.template do |composer, settings|
6
- settings.align = :right
7
- settings.width = 50
8
- settings.full_border
9
- composer.add_text('Text1') { 'Thing 1' }
10
- composer.add_text('Text2') { 'Thing 2' }
11
- end
12
- end
13
- end
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned griddefault┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridleft┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridcenter┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridright[?25h
@@ -1 +0,0 @@
1
- [?25lThis is boldThis is not bold[?25h
@@ -1,15 +0,0 @@
1
- require 'whirled_peas'
2
-
3
- class TemplateFactory
4
- def build(*)
5
- WhirledPeas.template do |composer|
6
- composer.add_text('Bold') do |_, settings|
7
- settings.bold = true
8
- "This is bold"
9
- end
10
- composer.add_text('NotBold') do |_, settings|
11
- "This is not bold"
12
- end
13
- end
14
- end
15
- end
@@ -1 +0,0 @@
1
- [?25lThis is underlinedThis is not underlined[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━┛1. MEDIUM┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛2. TALL┏━━━━━━━━┓┃ ┃┗━━━━━━━━┛3. SHORT[?25h
@@ -1,24 +0,0 @@
1
- require 'whirled_peas'
2
-
3
- class TemplateFactory
4
- def build(*)
5
- WhirledPeas.template do |composer, settings|
6
- settings.flow = :l2r
7
- settings.full_border
8
- composer.add_box('Medium') do |composer, settings|
9
- settings.set_padding(top: 2, bottom: 2)
10
- settings.full_border
11
- '1. MEDIUM'
12
- end
13
- composer.add_box('Tall') do |composer, settings|
14
- settings.set_padding(top: 4, bottom: 4)
15
- settings.full_border
16
- '2. TALL'
17
- end
18
- composer.add_box('Short') do |composer, settings|
19
- settings.full_border
20
- '3. SHORT'
21
- end
22
- end
23
- end
24
- end
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━┛1. MEDIUM┏━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━┛2. WIDE┏━━━━━━━━━┓┃ ┃┗━━━━━━━━━┛3. NARROW[?25h
@@ -1,24 +0,0 @@
1
- require 'whirled_peas'
2
-
3
- class TemplateFactory
4
- def build(*)
5
- WhirledPeas.template do |composer, settings|
6
- settings.flow = :t2b
7
- settings.full_border
8
- composer.add_box('Medium') do |composer, settings|
9
- settings.full_border
10
- settings.set_padding(left: 3, right: 3)
11
- '1. MEDIUM'
12
- end
13
- composer.add_box('Wide') do |composer, settings|
14
- settings.full_border
15
- settings.set_padding(left: 7, right: 7)
16
- '2. WIDE'
17
- end
18
- composer.add_box('Narrow') do |composer, settings|
19
- settings.full_border
20
- '3. NARROW'
21
- end
22
- end
23
- end
24
- end
@@ -1 +0,0 @@
1
- [?25l┏━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━┛MultiLine[?25h
@@ -1 +0,0 @@
1
- [?25l┏━┳━┳━┳━┓┃ ┃ ┃ ┃ ┃┃ ┃ ┃ ┃ ┃┃ ┃ ┃ ┃ ┃┃ ┃ ┃ ┃ ┃┃ ┃ ┃ ┃ ┃┣━╋━╋━╋━┫┃ ┃ ┃ ┃ ┃┃ ┃ ┃ ┃ ┃┃ ┃ ┃ ┃ ┃┃ ┃ ┃ ┃ ┃┃ ┃ ┃ ┃ ┃┣━╋━╋━╋━┫┃ ┃ ┃ ┃ ┃┃ ┃ ┃ ┃ ┃┃ ┃ ┃ ┃ ┃┃ ┃ ┃ ┃ ┃┃ ┃ ┃ ┃ ┃┗━┻━┻━┻━┛0123456789[?25h
@@ -1 +0,0 @@
1
- [?25l┏━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━┛01234[?25h
@@ -1,13 +0,0 @@
1
- require 'whirled_peas'
2
-
3
- class TemplateFactory
4
- TALL_STRING = 10.times.map(&:to_s).join("\n")
5
-
6
- def build(*)
7
- WhirledPeas.template do |_, settings|
8
- settings.full_border
9
- settings.height = 5
10
- TALL_STRING
11
- end
12
- end
13
- end
@@ -1 +0,0 @@
1
- [?25l┏━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━┛012340123401234[?25h
@@ -1,15 +0,0 @@
1
- require 'whirled_peas'
2
-
3
- class TemplateFactory
4
- TALL_STRING = 10.times.map(&:to_s).join("\n")
5
-
6
- def build(*)
7
- WhirledPeas.template do |composer, settings|
8
- settings.full_border
9
- settings.height = 5
10
- 3.times do |i|
11
- composer.add_text { TALL_STRING }
12
- end
13
- end
14
- end
15
- end
@@ -1 +0,0 @@
1
- [?25l┏━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━┛XOXOXOXOXO[?25h
@@ -1,14 +0,0 @@
1
- require 'whirled_peas'
2
-
3
- class TemplateFactory
4
- def build(*)
5
- WhirledPeas.template do |composer, settings|
6
- settings.flow = :t2b
7
- settings.height = 5
8
- settings.full_border
9
- 10.times do
10
- composer.add_text { 'XO' }
11
- end
12
- end
13
- end
14
- end
@@ -1 +0,0 @@
1
- [?25l┏━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━┛01234[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━━┓┃ ┃┗━━━━━━━━━┛Inner Box[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━┛Padded Room[?25h
@@ -1,11 +0,0 @@
1
- require 'whirled_peas'
2
-
3
- class TemplateFactory
4
- def build(*)
5
- WhirledPeas.template do |_, settings|
6
- settings.full_border
7
- settings.set_padding(left: 5, top: 2, right: 3, bottom: 1)
8
- "Padded Room"
9
- end
10
- end
11
- end
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛┏━━━┃ ┃ ┃ ┃ ┃ ┗━━━123223333443543[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛━━━┓ ┃ ┃ ┃ ┃ ┃━━━┛345344333322321[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛┏━━━━━┓┃ ┃┃ ┃┃ ┃123452234433333[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛┃ ┃┃ ┃┃ ┃┗━━━━━┛333334432254321[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛┏━━━┃ ┣━━━┃ ┣━━━┃ ┣━━━┃ ┣━━━┃ ┗━━━123223333443543[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛━━━┓ ┃━━━┫ ┃━━━┫ ┃━━━┫ ┃━━━┫ ┃━━━┛345344333322321[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛┏━━━━━┓┃ ┃┣━━━━━┫┃ ┃┣━━━━━┫┃ ┃┣━━━━━┫┃ ┃12345223443333344322[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛┃ ┃┣━━━━━┫┃ ┃┣━━━━━┫┃ ┃┣━━━━━┫┃ ┃┗━━━━━┛22344333334432254321[?25h
@@ -1 +0,0 @@
1
- [?25l████████╗███████╗███████╗████████╗╚══██╔══╝██╔════╝██╔════╝╚══██╔══╝ ██║ █████╗ ███████╗ ██║  ██║ ██╔══╝ ╚════██║ ██║  ██║ ███████╗███████║ ██║  ╚═╝ ╚══════╝╚══════╝ ╚═╝ [?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛How big is it?[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛How big is it?How big is it?How big is it?How big is it?How big is it?How big is it?[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━┛ABCDEFGHIJ[?25h
@@ -1,11 +0,0 @@
1
- require 'whirled_peas'
2
-
3
- class TemplateFactory
4
- def build(*)
5
- WhirledPeas.template do |composer, settings|
6
- settings.width = 10
7
- settings.full_border
8
- "ABCDEFGHIJKLMNOPQRSTUVWZYZ"
9
- end
10
- end
11
- end
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━┛0|0|1|0|1|[?25h
@@ -1,14 +0,0 @@
1
- require 'whirled_peas'
2
-
3
- class TemplateFactory
4
- def build(*)
5
- WhirledPeas.template do |composer, settings|
6
- settings.width = 10
7
- settings.full_border
8
- str = ''
9
- 10.times do |i|
10
- composer.add_text { str += "#{i}|" }
11
- end
12
- end
13
- end
14
- end
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━┛XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO[?25h
@@ -1 +0,0 @@
1
- [?25l┏━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━┛ABCDEFGHIJ[?25h
@@ -1,191 +0,0 @@
1
- require 'bundler/setup'
2
- require 'whirled_peas'
3
- require 'whirled_peas/frame/event_loop'
4
- require 'whirled_peas/frame/producer'
5
- require 'whirled_peas/graphics/debugger'
6
- require 'whirled_peas/graphics/renderer'
7
- require 'whirled_peas/graphics/screen'
8
- require 'whirled_peas/settings/text_color'
9
- require 'whirled_peas/utils/formatted_string'
10
-
11
- module WhirledPeas
12
- class ScreenTester
13
- def self.run_all
14
- base_dir = File.dirname(__FILE__)
15
- test_files = Dir.glob(File.join(base_dir, 'rendered', '**', '*.rb'))
16
- failures = {}
17
- pendings = Set.new
18
- test_files.each do |file|
19
- tester = new(file)
20
- if tester.pending?
21
- print Utils::FormattedString.new('.', Settings::TextColor::YELLOW)
22
- pendings << file
23
- elsif tester.failed?
24
- print Utils::FormattedString.new('.', Settings::TextColor::RED)
25
- failures[file] = tester.error
26
- else
27
- print Utils::FormattedString.new('.', Settings::TextColor::GREEN)
28
- end
29
- STDOUT.flush
30
- end
31
- puts
32
- puts if pendings.count > 0
33
- pendings.each do |file|
34
- puts Utils::FormattedString.new("PENDING: #{file}", Settings::TextColor::YELLOW)
35
- end
36
- puts if failures.count > 0
37
- failures.each do |file, error|
38
- puts Utils::FormattedString.new("Failed: #{file}:\n\n #{error}\n", Settings::TextColor::RED)
39
- end
40
-
41
- if failures.count == 0
42
- puts
43
- puts Utils::FormattedString.new('No failures', Settings::TextColor::GREEN)
44
- else
45
- exit(1)
46
- end
47
- end
48
-
49
- def self.update_all
50
- base_dir = File.dirname(__FILE__)
51
- test_files = Dir.glob(File.join(base_dir, 'rendered', '**', '*.rb'))
52
- test_files.each do |file|
53
- tester = new(file)
54
- if tester.pending?
55
- tester.ask_pending
56
- elsif tester.failed?
57
- tester.ask_failed
58
- end
59
- end
60
- end
61
-
62
- attr_reader :error
63
-
64
- def initialize(test_file)
65
- @full_test_file = test_file[0] == '/' ? test_file : File.join(Dir.pwd, test_file)
66
- raise ArgumentError, "File not found: #{test_file}" unless File.exist?(@full_test_file)
67
- @test_file = test_file.sub(File.dirname(__FILE__), '')[1..-1]
68
- @full_output_file = @full_test_file.sub(/\.rb$/, '.frame')
69
- @output_file = @full_output_file.sub(File.dirname(__FILE__), '')[1..-1]
70
- end
71
-
72
- def pending?
73
- !File.exist?(full_output_file)
74
- end
75
-
76
- def failed?
77
- if rendered != File.read(full_output_file)
78
- @error = 'Rendered output does not match saved output'
79
- end
80
- !@error.nil?
81
- end
82
-
83
- def view
84
- with_template_factory do |template_factory|
85
- render_screen(template_factory, STDOUT)
86
- end
87
- end
88
-
89
- def debug
90
- with_template_factory do |template_factory|
91
- template = template_factory.build('Test', {})
92
- painter = Graphics::Renderer.new(template, *Graphics::Screen.current_dimensions).painter
93
- puts Graphics::Debugger.new(painter).debug
94
- end
95
- end
96
-
97
- def save
98
- if File.exist?(full_output_file)
99
- puts "Existing output file found: #{full_output_file}"
100
- puts "overwriting..."
101
- else
102
- puts "Writing output to file: #{full_output_file}"
103
- end
104
-
105
- with_template_factory do |template_factory|
106
- File.open(full_output_file, 'w') do |file|
107
- render_screen(template_factory, file)
108
- end
109
- end
110
- end
111
-
112
- def ask_pending
113
- puts Utils::FormattedString.new("Frame file does not exist for #{test_file}", Settings::TextColor::YELLOW)
114
- print 'View rendered frame? [Y/n/q] '
115
- STDOUT.flush
116
- response = STDIN.gets.strip.downcase
117
- case response
118
- when 'q'
119
- exit
120
- when 'n'
121
- return
122
- end
123
- print rendered
124
- STDOUT.flush
125
- ask_to_save
126
- end
127
-
128
- def ask_failed
129
- puts Utils::FormattedString.new("Output from test does not match saved output for #{test_file}", Settings::TextColor::RED)
130
- print 'View expected output? [Y/q] '
131
- STDOUT.flush
132
- exit if 'q' == STDIN.gets.strip.downcase
133
- print File.read(full_output_file)
134
- print 'View actual output? [Y/q] '
135
- STDOUT.flush
136
- exit if 'q' == STDIN.gets.strip.downcase
137
- print rendered
138
- STDOUT.flush
139
- ask_to_save
140
- end
141
-
142
- private
143
-
144
- attr_reader :full_test_file, :test_file, :full_output_file, :output_file
145
-
146
- def ask_to_save
147
- print "Save actual as the expected test output (#{output_file})? [y/N/q] "
148
- STDOUT.flush
149
- response = STDIN.gets.strip.downcase
150
- print Utils::Ansi.cursor_pos(left: 0, top: 0)
151
- print Utils::Ansi.clear_down
152
- if response == 'y'
153
- File.open(full_output_file, 'w') { |file| file.print(rendered) }
154
- puts "Saved to #{output_file}"
155
- elsif response == 'q'
156
- puts 'Exiting'
157
- exit
158
- else
159
- puts 'Skipped'
160
- end
161
- end
162
-
163
- def rendered
164
- @rendered ||= begin
165
- string_io = StringIO.new
166
- with_template_factory do |template_factory|
167
- render_screen(template_factory, string_io)
168
- end
169
- string_io.string
170
- end
171
- end
172
-
173
- def with_template_factory(&block)
174
- require full_test_file
175
- raise 'TemplateFactory must be defined' unless defined?(TemplateFactory)
176
- yield TemplateFactory.new
177
- ensure
178
- Object.send(:remove_const, :TemplateFactory)
179
- end
180
-
181
- def render_screen(template_factory, output)
182
- screen = Graphics::Screen.new(output)
183
- consumer = Frame::EventLoop.new(
184
- template_factory, screen: screen, refresh_rate: 100000
185
- )
186
- Frame::Producer.produce(consumer) do |producer|
187
- producer.send_frame('test', args: {})
188
- end
189
- end
190
- end
191
- end