whirled_peas 0.5.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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