whirled_peas 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (242) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -1
  3. data/README.md +315 -43
  4. data/Rakefile +8 -18
  5. data/lib/whirled_peas/graphics.rb +14 -0
  6. data/lib/whirled_peas/graphics/box_painter.rb +39 -46
  7. data/lib/whirled_peas/graphics/canvas.rb +22 -11
  8. data/lib/whirled_peas/graphics/container_coords.rb +6 -5
  9. data/lib/whirled_peas/graphics/container_dimensions.rb +26 -8
  10. data/lib/whirled_peas/graphics/container_painter.rb +42 -4
  11. data/lib/whirled_peas/graphics/grid_painter.rb +11 -10
  12. data/lib/whirled_peas/graphics/painter.rb +5 -1
  13. data/lib/whirled_peas/graphics/renderer.rb +6 -1
  14. data/lib/whirled_peas/graphics/text_painter.rb +2 -2
  15. data/lib/whirled_peas/settings/alignment.rb +24 -0
  16. data/lib/whirled_peas/settings/bg_color.rb +2 -0
  17. data/lib/whirled_peas/settings/border.rb +16 -16
  18. data/lib/whirled_peas/settings/color.rb +13 -14
  19. data/lib/whirled_peas/settings/container_settings.rb +126 -42
  20. data/lib/whirled_peas/settings/display_flow.rb +13 -11
  21. data/lib/whirled_peas/settings/element_settings.rb +3 -3
  22. data/lib/whirled_peas/settings/grid_settings.rb +5 -1
  23. data/lib/whirled_peas/settings/sizing.rb +19 -0
  24. data/lib/whirled_peas/settings/spacing.rb +34 -0
  25. data/lib/whirled_peas/settings/text_color.rb +2 -0
  26. data/lib/whirled_peas/settings/vert_alignment.rb +24 -0
  27. data/lib/whirled_peas/utils/title_font.rb +1 -1
  28. data/lib/whirled_peas/version.rb +1 -1
  29. data/screen_test/{rendered/elements → elements}/box.frame +1 -1
  30. data/screen_test/{rendered/elements → elements}/box.rb +0 -0
  31. data/screen_test/elements/grid.frame +1 -0
  32. data/screen_test/{rendered/elements → elements}/grid.rb +0 -0
  33. data/screen_test/elements/screen_overflow_x.frame +1 -0
  34. data/screen_test/{rendered/elements/screen_overflow.rb → elements/screen_overflow_x.rb} +0 -0
  35. data/screen_test/elements/screen_overflow_y.frame +1 -0
  36. data/screen_test/elements/screen_overflow_y.rb +9 -0
  37. data/screen_test/elements/text.frame +1 -0
  38. data/screen_test/{rendered/elements → elements}/text.rb +0 -0
  39. data/screen_test/elements/text_multiline.frame +1 -0
  40. data/screen_test/{rendered/elements → elements}/text_multiline.rb +0 -0
  41. data/screen_test/settings/align/box_around.frame +1 -0
  42. data/screen_test/settings/align/box_around.rb +16 -0
  43. data/screen_test/settings/align/box_between.frame +1 -0
  44. data/screen_test/settings/align/box_between.rb +16 -0
  45. data/screen_test/settings/align/box_center.frame +1 -0
  46. data/screen_test/{rendered/settings/align/grid.rb → settings/align/box_center.rb} +7 -6
  47. data/screen_test/settings/align/box_default.frame +1 -0
  48. data/screen_test/settings/align/box_default.rb +20 -0
  49. data/screen_test/settings/align/box_evenly.frame +1 -0
  50. data/screen_test/settings/align/box_evenly.rb +16 -0
  51. data/screen_test/settings/align/box_left.frame +1 -0
  52. data/screen_test/settings/align/box_left.rb +21 -0
  53. data/screen_test/settings/align/box_right.frame +1 -0
  54. data/screen_test/settings/align/box_right.rb +21 -0
  55. data/screen_test/settings/align/children_center.frame +1 -0
  56. data/screen_test/settings/align/children_center.rb +15 -0
  57. data/screen_test/settings/align/children_left.frame +1 -0
  58. data/screen_test/settings/align/children_left.rb +15 -0
  59. data/screen_test/settings/align/children_right.frame +1 -0
  60. data/screen_test/settings/align/children_right.rb +15 -0
  61. data/screen_test/settings/align/grid_center.frame +1 -0
  62. data/screen_test/settings/align/grid_center.rb +18 -0
  63. data/screen_test/settings/align/grid_default.frame +1 -0
  64. data/screen_test/settings/align/grid_default.rb +17 -0
  65. data/screen_test/settings/align/grid_left.frame +1 -0
  66. data/screen_test/settings/align/grid_left.rb +18 -0
  67. data/screen_test/settings/align/grid_right.frame +1 -0
  68. data/screen_test/settings/align/grid_right.rb +18 -0
  69. data/screen_test/settings/ansi/bold.frame +1 -0
  70. data/screen_test/{rendered/settings/height/overflow_box_t2b.rb → settings/ansi/bold.rb} +4 -4
  71. data/screen_test/{rendered/settings → settings}/ansi/color.frame +1 -1
  72. data/screen_test/{rendered/settings → settings}/ansi/color.rb +0 -0
  73. data/screen_test/settings/ansi/underline.frame +1 -0
  74. data/screen_test/{rendered/settings → settings}/ansi/underline.rb +4 -5
  75. data/screen_test/{rendered/settings → settings}/border.frame +1 -1
  76. data/screen_test/{rendered/settings → settings}/border.rb +1 -1
  77. data/screen_test/settings/flow/box_b2t.frame +1 -0
  78. data/screen_test/settings/flow/box_b2t.rb +26 -0
  79. data/screen_test/settings/flow/box_l2r.frame +1 -0
  80. data/screen_test/settings/flow/box_l2r.rb +26 -0
  81. data/screen_test/settings/flow/box_r2l.frame +1 -0
  82. data/screen_test/settings/flow/box_r2l.rb +26 -0
  83. data/screen_test/settings/flow/box_t2b.frame +1 -0
  84. data/screen_test/settings/flow/box_t2b.rb +26 -0
  85. data/screen_test/settings/flow/grid_b2t.frame +1 -0
  86. data/screen_test/{rendered/settings → settings}/flow/grid_b2t.rb +0 -0
  87. data/screen_test/settings/flow/grid_l2r.frame +1 -0
  88. data/screen_test/{rendered/settings → settings}/flow/grid_l2r.rb +0 -0
  89. data/screen_test/settings/flow/grid_r2l.frame +1 -0
  90. data/screen_test/{rendered/settings → settings}/flow/grid_r2l.rb +0 -0
  91. data/screen_test/settings/flow/grid_t2b.frame +1 -0
  92. data/screen_test/{rendered/settings → settings}/flow/grid_t2b.rb +0 -0
  93. data/screen_test/settings/height/box.frame +1 -0
  94. data/screen_test/{rendered/settings → settings}/height/box.rb +0 -0
  95. data/screen_test/settings/height/box_border_sizing.frame +1 -0
  96. data/screen_test/settings/height/box_border_sizing.rb +15 -0
  97. data/screen_test/settings/height/grid.frame +1 -0
  98. data/screen_test/{rendered/settings → settings}/height/grid.rb +0 -0
  99. data/screen_test/settings/height/overflow_box.frame +1 -0
  100. data/screen_test/settings/height/overflow_box.rb +13 -0
  101. data/screen_test/settings/height/overflow_box_l2r.frame +1 -0
  102. data/screen_test/settings/height/overflow_box_l2r.rb +17 -0
  103. data/screen_test/settings/height/overflow_box_t2b.frame +1 -0
  104. data/screen_test/settings/height/overflow_box_t2b.rb +16 -0
  105. data/screen_test/settings/height/overflow_grid.frame +1 -0
  106. data/screen_test/{rendered/settings → settings}/height/overflow_grid.rb +0 -0
  107. data/screen_test/settings/margin.frame +1 -0
  108. data/screen_test/settings/margin.rb +16 -0
  109. data/screen_test/settings/padding.frame +1 -0
  110. data/screen_test/settings/padding.rb +13 -0
  111. data/screen_test/settings/position/box_left.frame +1 -0
  112. data/screen_test/{rendered/settings → settings}/position/box_left.rb +2 -2
  113. data/screen_test/settings/position/box_left_negative.frame +1 -0
  114. data/screen_test/{rendered/settings → settings}/position/box_left_negative.rb +2 -2
  115. data/screen_test/settings/position/box_top.frame +1 -0
  116. data/screen_test/{rendered/settings → settings}/position/box_top.rb +1 -1
  117. data/screen_test/settings/position/box_top_negative.frame +1 -0
  118. data/screen_test/{rendered/settings → settings}/position/box_top_negative.rb +2 -2
  119. data/screen_test/settings/position/grid_left.frame +1 -0
  120. data/screen_test/{rendered/settings → settings}/position/grid_left.rb +1 -1
  121. data/screen_test/settings/position/grid_left_negative.frame +1 -0
  122. data/screen_test/{rendered/settings → settings}/position/grid_left_negative.rb +1 -1
  123. data/screen_test/settings/position/grid_top.frame +1 -0
  124. data/screen_test/{rendered/settings → settings}/position/grid_top.rb +1 -1
  125. data/screen_test/settings/position/grid_top_negative.frame +1 -0
  126. data/screen_test/{rendered/settings → settings}/position/grid_top_negative.rb +1 -1
  127. data/screen_test/settings/scroll/horiz_box.frame +1 -0
  128. data/screen_test/settings/scroll/horiz_box.rb +17 -0
  129. data/screen_test/settings/scroll/horiz_box_align_center.rb +18 -0
  130. data/screen_test/settings/scroll/horiz_box_align_right.rb +18 -0
  131. data/screen_test/settings/scroll/vert_box.frame +1 -0
  132. data/screen_test/settings/scroll/vert_box.rb +20 -0
  133. data/screen_test/settings/title_font.frame +1 -0
  134. data/screen_test/{rendered/settings → settings}/title_font.rb +1 -1
  135. data/screen_test/settings/valign/box_around.frame +1 -0
  136. data/screen_test/settings/valign/box_around.rb +17 -0
  137. data/screen_test/settings/valign/box_between.frame +1 -0
  138. data/screen_test/settings/valign/box_between.rb +17 -0
  139. data/screen_test/settings/valign/box_bottom.frame +1 -0
  140. data/screen_test/settings/valign/box_bottom.rb +17 -0
  141. data/screen_test/settings/valign/box_default.frame +1 -0
  142. data/screen_test/settings/valign/box_default.rb +16 -0
  143. data/screen_test/settings/valign/box_evenly.frame +1 -0
  144. data/screen_test/settings/valign/box_evenly.rb +17 -0
  145. data/screen_test/settings/valign/box_middle.frame +1 -0
  146. data/screen_test/settings/valign/box_middle.rb +17 -0
  147. data/screen_test/settings/valign/box_top.frame +1 -0
  148. data/screen_test/settings/valign/box_top.rb +17 -0
  149. data/screen_test/settings/valign/grid_bottom.frame +1 -0
  150. data/screen_test/settings/valign/grid_bottom.rb +15 -0
  151. data/screen_test/settings/valign/grid_default.frame +1 -0
  152. data/screen_test/settings/valign/grid_default.rb +14 -0
  153. data/screen_test/settings/valign/grid_middle.frame +1 -0
  154. data/screen_test/settings/valign/grid_middle.rb +15 -0
  155. data/screen_test/settings/valign/grid_top.frame +1 -0
  156. data/screen_test/settings/valign/grid_top.rb +15 -0
  157. data/screen_test/settings/width/box_border_sizing.frame +1 -0
  158. data/screen_test/settings/width/box_border_sizing.rb +15 -0
  159. data/screen_test/settings/width/box_content.frame +1 -0
  160. data/screen_test/settings/width/box_content.rb +15 -0
  161. data/screen_test/settings/width/box_default.frame +1 -0
  162. data/screen_test/{rendered/settings/width/box.rb → settings/width/box_default.rb} +3 -2
  163. data/screen_test/settings/width/grid.frame +1 -0
  164. data/screen_test/{rendered/settings → settings}/width/grid.rb +2 -2
  165. data/screen_test/settings/width/overflow_align_center.frame +1 -0
  166. data/screen_test/settings/width/overflow_align_center.rb +14 -0
  167. data/screen_test/settings/width/overflow_align_right.frame +1 -0
  168. data/screen_test/settings/width/overflow_align_right.rb +14 -0
  169. data/screen_test/settings/width/overflow_box.frame +1 -0
  170. data/screen_test/settings/width/overflow_box.rb +13 -0
  171. data/screen_test/settings/width/overflow_box_l2r.frame +1 -0
  172. data/screen_test/settings/width/overflow_box_l2r.rb +16 -0
  173. data/screen_test/settings/width/overflow_box_t2b.frame +1 -0
  174. data/screen_test/settings/width/overflow_box_t2b.rb +17 -0
  175. data/screen_test/settings/width/overflow_grid.frame +1 -0
  176. data/screen_test/{rendered/settings → settings}/width/overflow_grid.rb +0 -0
  177. data/tools/whirled_peas/tools/screen_tester.rb +233 -0
  178. metadata +154 -98
  179. data/lib/whirled_peas/settings/text_align.rb +0 -19
  180. data/screen_test/rendered/elements/grid.frame +0 -1
  181. data/screen_test/rendered/elements/screen_overflow.frame +0 -1
  182. data/screen_test/rendered/elements/text.frame +0 -1
  183. data/screen_test/rendered/elements/text_multiline.frame +0 -1
  184. data/screen_test/rendered/settings/align/box.frame +0 -1
  185. data/screen_test/rendered/settings/align/box.rb +0 -24
  186. data/screen_test/rendered/settings/align/children_center.frame +0 -1
  187. data/screen_test/rendered/settings/align/children_center.rb +0 -13
  188. data/screen_test/rendered/settings/align/children_left.frame +0 -1
  189. data/screen_test/rendered/settings/align/children_left.rb +0 -13
  190. data/screen_test/rendered/settings/align/children_right.frame +0 -1
  191. data/screen_test/rendered/settings/align/children_right.rb +0 -13
  192. data/screen_test/rendered/settings/align/grid.frame +0 -1
  193. data/screen_test/rendered/settings/ansi/bold.frame +0 -1
  194. data/screen_test/rendered/settings/ansi/bold.rb +0 -15
  195. data/screen_test/rendered/settings/ansi/underline.frame +0 -1
  196. data/screen_test/rendered/settings/flow/box_b2t.frame +0 -1
  197. data/screen_test/rendered/settings/flow/box_b2t.rb +0 -24
  198. data/screen_test/rendered/settings/flow/box_l2r.frame +0 -1
  199. data/screen_test/rendered/settings/flow/box_l2r.rb +0 -24
  200. data/screen_test/rendered/settings/flow/box_r2l.frame +0 -1
  201. data/screen_test/rendered/settings/flow/box_r2l.rb +0 -24
  202. data/screen_test/rendered/settings/flow/box_t2b.frame +0 -1
  203. data/screen_test/rendered/settings/flow/box_t2b.rb +0 -24
  204. data/screen_test/rendered/settings/flow/grid_b2t.frame +0 -1
  205. data/screen_test/rendered/settings/flow/grid_l2r.frame +0 -1
  206. data/screen_test/rendered/settings/flow/grid_r2l.frame +0 -1
  207. data/screen_test/rendered/settings/flow/grid_t2b.frame +0 -1
  208. data/screen_test/rendered/settings/height/box.frame +0 -1
  209. data/screen_test/rendered/settings/height/grid.frame +0 -1
  210. data/screen_test/rendered/settings/height/overflow_box.frame +0 -1
  211. data/screen_test/rendered/settings/height/overflow_box.rb +0 -13
  212. data/screen_test/rendered/settings/height/overflow_box_l2r.frame +0 -1
  213. data/screen_test/rendered/settings/height/overflow_box_l2r.rb +0 -15
  214. data/screen_test/rendered/settings/height/overflow_box_t2b.frame +0 -1
  215. data/screen_test/rendered/settings/height/overflow_grid.frame +0 -1
  216. data/screen_test/rendered/settings/margin.frame +0 -1
  217. data/screen_test/rendered/settings/margin.rb +0 -14
  218. data/screen_test/rendered/settings/padding.frame +0 -1
  219. data/screen_test/rendered/settings/padding.rb +0 -11
  220. data/screen_test/rendered/settings/position/box_left.frame +0 -1
  221. data/screen_test/rendered/settings/position/box_left_negative.frame +0 -1
  222. data/screen_test/rendered/settings/position/box_top.frame +0 -1
  223. data/screen_test/rendered/settings/position/box_top_negative.frame +0 -1
  224. data/screen_test/rendered/settings/position/grid_left.frame +0 -1
  225. data/screen_test/rendered/settings/position/grid_left_negative.frame +0 -1
  226. data/screen_test/rendered/settings/position/grid_top.frame +0 -1
  227. data/screen_test/rendered/settings/position/grid_top_negative.frame +0 -1
  228. data/screen_test/rendered/settings/scroll/horiz_box.frame +0 -1
  229. data/screen_test/rendered/settings/scroll/horiz_box.rb +0 -15
  230. data/screen_test/rendered/settings/scroll/vert_box.frame +0 -1
  231. data/screen_test/rendered/settings/scroll/vert_box.rb +0 -18
  232. data/screen_test/rendered/settings/title_font.frame +0 -1
  233. data/screen_test/rendered/settings/width/box.frame +0 -1
  234. data/screen_test/rendered/settings/width/grid.frame +0 -1
  235. data/screen_test/rendered/settings/width/overflow_box.frame +0 -1
  236. data/screen_test/rendered/settings/width/overflow_box.rb +0 -11
  237. data/screen_test/rendered/settings/width/overflow_box_l2r.frame +0 -1
  238. data/screen_test/rendered/settings/width/overflow_box_l2r.rb +0 -14
  239. data/screen_test/rendered/settings/width/overflow_box_t2b.frame +0 -1
  240. data/screen_test/rendered/settings/width/overflow_box_t2b.rb +0 -15
  241. data/screen_test/rendered/settings/width/overflow_grid.frame +0 -1
  242. data/screen_test/screen_tester.rb +0 -201
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛15/default[?25h
@@ -5,8 +5,9 @@ class TemplateFactory
5
5
  WhirledPeas.template do |composer|
6
6
  composer.add_box('Wide') do |_, settings|
7
7
  settings.full_border
8
- settings.width = 50
9
- "How big is it?"
8
+ settings.set_padding(left: 3, right: 4)
9
+ settings.width = 15
10
+ '15/default'
10
11
  end
11
12
  end
12
13
  end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━┳━━━━━━┓┃ ┃ ┃┣━━━━━━╋━━━━━━┫┃ ┃ ┃┣━━━━━━╋━━━━━━┫┃ ┃ ┃┗━━━━━━┻━━━━━━┛666666[?25h
@@ -5,9 +5,9 @@ class TemplateFactory
5
5
  WhirledPeas.template do |composer|
6
6
  composer.add_grid('Wide') do |_, settings|
7
7
  settings.full_border
8
- settings.width = 30
8
+ settings.width = 6
9
9
  settings.num_cols = 2
10
- 6.times.map { "How big is it?" }
10
+ 6.times.map { '6' }
11
11
  end
12
12
  end
13
13
  end
@@ -0,0 +1 @@
1
+ [?25l┏━━━┓┃ ┃┗━━━┛345[?25h
@@ -0,0 +1,14 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ composer.add_box('Container') do |composer, settings|
7
+ settings.width = 3
8
+ settings.align = :center
9
+ settings.full_border
10
+ '123456'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━┓┃ ┃┗━━━┛456[?25h
@@ -0,0 +1,14 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ composer.add_box do |composer, settings|
7
+ settings.width = 3
8
+ settings.align = :right
9
+ settings.full_border
10
+ '123456'
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━┛ABCDEFGHIJ[?25h
@@ -0,0 +1,13 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ composer.add_box do |_, settings|
7
+ settings.width = 10
8
+ settings.full_border
9
+ "ABCDEFGHIJKLMNOPQRSTUVWZYZ"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━┛0|0|1|0|1|[?25h
@@ -0,0 +1,16 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ composer.add_box do |composer, settings|
7
+ settings.width = 10
8
+ settings.full_border
9
+ str = ''
10
+ 10.times do |i|
11
+ composer.add_text { str += "#{i}|" }
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━┛XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXO[?25h
@@ -0,0 +1,17 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ composer.add_box do |composer, settings|
7
+ settings.width = 10
8
+ settings.flow = :t2b
9
+ settings.full_border
10
+ str = ''
11
+ 10.times do
12
+ composer.add_text { str += 'XO' }
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━┛ABCDEFGHIJ[?25h
@@ -0,0 +1,233 @@
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
+ module Tools
13
+ # levels_up = 0 returns the directory of the current file. If the current file is a
14
+ # directory, then it will return a parent directory
15
+ def self.parent_directory(file, levels_up=0)
16
+ return File.dirname(file) if levels_up == 0
17
+ parent_directory(File.dirname(file), levels_up - 1)
18
+ end
19
+
20
+ class ScreenTester
21
+ SCREEN_WIDTH = 32
22
+ SCREEN_HEIGHT = 24
23
+
24
+ def self.base_dir
25
+ Tools.parent_directory(__FILE__, 3)
26
+ end
27
+
28
+ def self.test_files
29
+ Dir.glob(File.join(base_dir, 'screen_test', '**', '*.rb'))
30
+ end
31
+
32
+ def self.run_all
33
+ failures = {}
34
+ pendings = Set.new
35
+ puts "Running #{test_files.length} rendered screen test(s)"
36
+ puts
37
+ test_files.each do |file|
38
+ tester = new(file)
39
+ if tester.pending?
40
+ print Utils::FormattedString.new('.', Settings::TextColor::YELLOW)
41
+ pendings << file
42
+ elsif tester.failed?
43
+ print Utils::FormattedString.new('.', Settings::TextColor::RED)
44
+ failures[file] = tester.error
45
+ else
46
+ print Utils::FormattedString.new('.', Settings::TextColor::GREEN)
47
+ end
48
+ STDOUT.flush
49
+ end
50
+ puts
51
+ puts if pendings.count > 0
52
+ pendings.each do |file|
53
+ puts Utils::FormattedString.new("PENDING: #{file}", Settings::TextColor::YELLOW)
54
+ end
55
+ puts if failures.count > 0
56
+ failures.each do |file, error|
57
+ puts Utils::FormattedString.new("Failed: #{file}:\n\n #{error}\n", Settings::TextColor::RED)
58
+ end
59
+
60
+ if failures.count == 0
61
+ puts
62
+ puts Utils::FormattedString.new('No failures', Settings::TextColor::GREEN)
63
+ else
64
+ exit(1)
65
+ end
66
+ end
67
+
68
+ def self.update_all
69
+ num_attempted = 0
70
+ test_files.map do |file|
71
+ num_attempted += 1 if new(file).update(false)
72
+ end
73
+ if num_attempted == 0
74
+ puts 'All rendered output matched expected.'
75
+ end
76
+ end
77
+
78
+ attr_reader :error
79
+
80
+ def initialize(test_file)
81
+ @full_test_file = test_file[0] == '/' ? test_file : File.join(Dir.pwd, test_file)
82
+ raise ArgumentError, "File not found: #{test_file}" unless File.exist?(@full_test_file)
83
+ @test_file = @full_test_file.sub(self.class.base_dir, '').sub(/^\//, '')
84
+ @full_output_file = @full_test_file.sub(/\.rb$/, '.frame')
85
+ @output_file = @full_output_file.sub(self.class.base_dir, '').sub(/^\//, '')
86
+ end
87
+
88
+ def update(report_passing=true)
89
+ if pending?
90
+ ask_pending
91
+ return true
92
+ elsif failed?
93
+ ask_failed
94
+ return true
95
+ elsif report_passing
96
+ puts "Actual rendered output for #{test_file} matches expected."
97
+ end
98
+ false
99
+ end
100
+
101
+ def pending?
102
+ !File.exist?(full_output_file)
103
+ end
104
+
105
+ def failed?
106
+ if rendered != File.read(full_output_file)
107
+ @error = 'Rendered output does not match saved output'
108
+ end
109
+ !@error.nil?
110
+ end
111
+
112
+ def view
113
+ with_template_factory do |template_factory|
114
+ render_screen(template_factory, STDOUT)
115
+ end
116
+ end
117
+
118
+ def debug
119
+ with_template_factory do |template_factory|
120
+ orig_debug = Graphics.debug
121
+ Graphics.debug = true
122
+ render_screen(template_factory, StringIO.new)
123
+ Graphics.debug = orig_debug
124
+ end
125
+ end
126
+
127
+ def template
128
+ with_template_factory do |template_factory|
129
+ template = template_factory.build('Test', {})
130
+ puts Graphics::Debugger.new(template).debug
131
+ end
132
+ end
133
+
134
+ def save
135
+ if File.exist?(full_output_file)
136
+ puts "Existing output file found: #{full_output_file}"
137
+ puts "overwriting..."
138
+ else
139
+ puts "Writing output to file: #{full_output_file}"
140
+ end
141
+
142
+ with_template_factory do |template_factory|
143
+ File.open(full_output_file, 'w') do |file|
144
+ render_screen(template_factory, file)
145
+ end
146
+ end
147
+ end
148
+
149
+ def ask_pending
150
+ puts "File: #{test_file}"
151
+ puts Utils::FormattedString.new('Frame file does not exist', Settings::TextColor::YELLOW)
152
+ print 'View rendered frame? [Y/n/q] '
153
+ STDOUT.flush
154
+ response = STDIN.gets.strip.downcase
155
+ case response
156
+ when 'q'
157
+ exit
158
+ when 'n'
159
+ return
160
+ end
161
+ puts rendered
162
+ STDOUT.flush
163
+ ask_to_save
164
+ end
165
+
166
+ def ask_failed
167
+ puts "File: #{test_file}"
168
+ puts Utils::FormattedString.new('Output from test does not match saved output', Settings::TextColor::RED)
169
+ print 'View expected output? [Y/q] '
170
+ STDOUT.flush
171
+ exit if 'q' == STDIN.gets.strip.downcase
172
+ puts File.read(full_output_file)
173
+ puts "File: #{test_file}"
174
+ print 'View actual output? [Y/q] '
175
+ STDOUT.flush
176
+ exit if 'q' == STDIN.gets.strip.downcase
177
+ puts rendered
178
+ STDOUT.flush
179
+ ask_to_save
180
+ end
181
+
182
+ private
183
+
184
+ attr_reader :full_test_file, :test_file, :full_output_file, :output_file
185
+
186
+ def ask_to_save
187
+ puts "File: #{test_file}"
188
+ print 'Save actual as the expected test output? [y/N/q] '
189
+ STDOUT.flush
190
+ response = STDIN.gets.strip.downcase
191
+ print Utils::Ansi.cursor_pos(left: 0, top: 0)
192
+ print Utils::Ansi.clear_down
193
+ if response == 'y'
194
+ File.open(full_output_file, 'w') { |file| file.print(rendered) }
195
+ puts "Saved to #{output_file}"
196
+ elsif response == 'q'
197
+ puts 'Exiting'
198
+ exit
199
+ else
200
+ puts 'Skipped'
201
+ end
202
+ end
203
+
204
+ def rendered
205
+ @rendered ||= begin
206
+ string_io = StringIO.new
207
+ with_template_factory do |template_factory|
208
+ render_screen(template_factory, string_io)
209
+ end
210
+ string_io.string
211
+ end
212
+ end
213
+
214
+ def with_template_factory(&block)
215
+ require full_test_file
216
+ raise 'TemplateFactory must be defined' unless defined?(TemplateFactory)
217
+ yield TemplateFactory.new
218
+ ensure
219
+ Object.send(:remove_const, :TemplateFactory)
220
+ end
221
+
222
+ def render_screen(template_factory, output)
223
+ screen = Graphics::Screen.new(output: output, width: SCREEN_WIDTH, height: SCREEN_HEIGHT)
224
+ consumer = Frame::EventLoop.new(
225
+ template_factory, screen: screen, refresh_rate: 100000
226
+ )
227
+ Frame::Producer.produce(consumer) do |producer|
228
+ producer.send_frame('test', args: {})
229
+ end
230
+ end
231
+ end
232
+ end
233
+ 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.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Collier
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-26 00:00:00.000000000 Z
11
+ date: 2021-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -100,6 +100,7 @@ files:
100
100
  - lib/whirled_peas/graphics/text_painter.rb
101
101
  - lib/whirled_peas/null_logger.rb
102
102
  - lib/whirled_peas/settings.rb
103
+ - lib/whirled_peas/settings/alignment.rb
103
104
  - lib/whirled_peas/settings/bg_color.rb
104
105
  - lib/whirled_peas/settings/border.rb
105
106
  - lib/whirled_peas/settings/box_settings.rb
@@ -113,110 +114,165 @@ files:
113
114
  - lib/whirled_peas/settings/padding.rb
114
115
  - lib/whirled_peas/settings/position.rb
115
116
  - lib/whirled_peas/settings/scrollbar.rb
117
+ - lib/whirled_peas/settings/sizing.rb
116
118
  - lib/whirled_peas/settings/spacing.rb
117
- - lib/whirled_peas/settings/text_align.rb
118
119
  - lib/whirled_peas/settings/text_color.rb
119
120
  - lib/whirled_peas/settings/text_settings.rb
121
+ - lib/whirled_peas/settings/vert_alignment.rb
120
122
  - lib/whirled_peas/utils.rb
121
123
  - lib/whirled_peas/utils/ansi.rb
122
124
  - lib/whirled_peas/utils/formatted_string.rb
123
125
  - lib/whirled_peas/utils/title_font.rb
124
126
  - lib/whirled_peas/version.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
127
+ - screen_test/elements/box.frame
128
+ - screen_test/elements/box.rb
129
+ - screen_test/elements/grid.frame
130
+ - screen_test/elements/grid.rb
131
+ - screen_test/elements/screen_overflow_x.frame
132
+ - screen_test/elements/screen_overflow_x.rb
133
+ - screen_test/elements/screen_overflow_y.frame
134
+ - screen_test/elements/screen_overflow_y.rb
135
+ - screen_test/elements/text.frame
136
+ - screen_test/elements/text.rb
137
+ - screen_test/elements/text_multiline.frame
138
+ - screen_test/elements/text_multiline.rb
139
+ - screen_test/settings/align/box_around.frame
140
+ - screen_test/settings/align/box_around.rb
141
+ - screen_test/settings/align/box_between.frame
142
+ - screen_test/settings/align/box_between.rb
143
+ - screen_test/settings/align/box_center.frame
144
+ - screen_test/settings/align/box_center.rb
145
+ - screen_test/settings/align/box_default.frame
146
+ - screen_test/settings/align/box_default.rb
147
+ - screen_test/settings/align/box_evenly.frame
148
+ - screen_test/settings/align/box_evenly.rb
149
+ - screen_test/settings/align/box_left.frame
150
+ - screen_test/settings/align/box_left.rb
151
+ - screen_test/settings/align/box_right.frame
152
+ - screen_test/settings/align/box_right.rb
153
+ - screen_test/settings/align/children_center.frame
154
+ - screen_test/settings/align/children_center.rb
155
+ - screen_test/settings/align/children_left.frame
156
+ - screen_test/settings/align/children_left.rb
157
+ - screen_test/settings/align/children_right.frame
158
+ - screen_test/settings/align/children_right.rb
159
+ - screen_test/settings/align/grid_center.frame
160
+ - screen_test/settings/align/grid_center.rb
161
+ - screen_test/settings/align/grid_default.frame
162
+ - screen_test/settings/align/grid_default.rb
163
+ - screen_test/settings/align/grid_left.frame
164
+ - screen_test/settings/align/grid_left.rb
165
+ - screen_test/settings/align/grid_right.frame
166
+ - screen_test/settings/align/grid_right.rb
167
+ - screen_test/settings/ansi/bold.frame
168
+ - screen_test/settings/ansi/bold.rb
169
+ - screen_test/settings/ansi/color.frame
170
+ - screen_test/settings/ansi/color.rb
171
+ - screen_test/settings/ansi/underline.frame
172
+ - screen_test/settings/ansi/underline.rb
173
+ - screen_test/settings/border.frame
174
+ - screen_test/settings/border.rb
175
+ - screen_test/settings/flow/box_b2t.frame
176
+ - screen_test/settings/flow/box_b2t.rb
177
+ - screen_test/settings/flow/box_l2r.frame
178
+ - screen_test/settings/flow/box_l2r.rb
179
+ - screen_test/settings/flow/box_r2l.frame
180
+ - screen_test/settings/flow/box_r2l.rb
181
+ - screen_test/settings/flow/box_t2b.frame
182
+ - screen_test/settings/flow/box_t2b.rb
183
+ - screen_test/settings/flow/grid_b2t.frame
184
+ - screen_test/settings/flow/grid_b2t.rb
185
+ - screen_test/settings/flow/grid_l2r.frame
186
+ - screen_test/settings/flow/grid_l2r.rb
187
+ - screen_test/settings/flow/grid_r2l.frame
188
+ - screen_test/settings/flow/grid_r2l.rb
189
+ - screen_test/settings/flow/grid_t2b.frame
190
+ - screen_test/settings/flow/grid_t2b.rb
191
+ - screen_test/settings/height/box.frame
192
+ - screen_test/settings/height/box.rb
193
+ - screen_test/settings/height/box_border_sizing.frame
194
+ - screen_test/settings/height/box_border_sizing.rb
195
+ - screen_test/settings/height/grid.frame
196
+ - screen_test/settings/height/grid.rb
197
+ - screen_test/settings/height/overflow_box.frame
198
+ - screen_test/settings/height/overflow_box.rb
199
+ - screen_test/settings/height/overflow_box_l2r.frame
200
+ - screen_test/settings/height/overflow_box_l2r.rb
201
+ - screen_test/settings/height/overflow_box_t2b.frame
202
+ - screen_test/settings/height/overflow_box_t2b.rb
203
+ - screen_test/settings/height/overflow_grid.frame
204
+ - screen_test/settings/height/overflow_grid.rb
205
+ - screen_test/settings/margin.frame
206
+ - screen_test/settings/margin.rb
207
+ - screen_test/settings/padding.frame
208
+ - screen_test/settings/padding.rb
209
+ - screen_test/settings/position/box_left.frame
210
+ - screen_test/settings/position/box_left.rb
211
+ - screen_test/settings/position/box_left_negative.frame
212
+ - screen_test/settings/position/box_left_negative.rb
213
+ - screen_test/settings/position/box_top.frame
214
+ - screen_test/settings/position/box_top.rb
215
+ - screen_test/settings/position/box_top_negative.frame
216
+ - screen_test/settings/position/box_top_negative.rb
217
+ - screen_test/settings/position/grid_left.frame
218
+ - screen_test/settings/position/grid_left.rb
219
+ - screen_test/settings/position/grid_left_negative.frame
220
+ - screen_test/settings/position/grid_left_negative.rb
221
+ - screen_test/settings/position/grid_top.frame
222
+ - screen_test/settings/position/grid_top.rb
223
+ - screen_test/settings/position/grid_top_negative.frame
224
+ - screen_test/settings/position/grid_top_negative.rb
225
+ - screen_test/settings/scroll/horiz_box.frame
226
+ - screen_test/settings/scroll/horiz_box.rb
227
+ - screen_test/settings/scroll/horiz_box_align_center.rb
228
+ - screen_test/settings/scroll/horiz_box_align_right.rb
229
+ - screen_test/settings/scroll/vert_box.frame
230
+ - screen_test/settings/scroll/vert_box.rb
231
+ - screen_test/settings/title_font.frame
232
+ - screen_test/settings/title_font.rb
233
+ - screen_test/settings/valign/box_around.frame
234
+ - screen_test/settings/valign/box_around.rb
235
+ - screen_test/settings/valign/box_between.frame
236
+ - screen_test/settings/valign/box_between.rb
237
+ - screen_test/settings/valign/box_bottom.frame
238
+ - screen_test/settings/valign/box_bottom.rb
239
+ - screen_test/settings/valign/box_default.frame
240
+ - screen_test/settings/valign/box_default.rb
241
+ - screen_test/settings/valign/box_evenly.frame
242
+ - screen_test/settings/valign/box_evenly.rb
243
+ - screen_test/settings/valign/box_middle.frame
244
+ - screen_test/settings/valign/box_middle.rb
245
+ - screen_test/settings/valign/box_top.frame
246
+ - screen_test/settings/valign/box_top.rb
247
+ - screen_test/settings/valign/grid_bottom.frame
248
+ - screen_test/settings/valign/grid_bottom.rb
249
+ - screen_test/settings/valign/grid_default.frame
250
+ - screen_test/settings/valign/grid_default.rb
251
+ - screen_test/settings/valign/grid_middle.frame
252
+ - screen_test/settings/valign/grid_middle.rb
253
+ - screen_test/settings/valign/grid_top.frame
254
+ - screen_test/settings/valign/grid_top.rb
255
+ - screen_test/settings/width/box_border_sizing.frame
256
+ - screen_test/settings/width/box_border_sizing.rb
257
+ - screen_test/settings/width/box_content.frame
258
+ - screen_test/settings/width/box_content.rb
259
+ - screen_test/settings/width/box_default.frame
260
+ - screen_test/settings/width/box_default.rb
261
+ - screen_test/settings/width/grid.frame
262
+ - screen_test/settings/width/grid.rb
263
+ - screen_test/settings/width/overflow_align_center.frame
264
+ - screen_test/settings/width/overflow_align_center.rb
265
+ - screen_test/settings/width/overflow_align_right.frame
266
+ - screen_test/settings/width/overflow_align_right.rb
267
+ - screen_test/settings/width/overflow_box.frame
268
+ - screen_test/settings/width/overflow_box.rb
269
+ - screen_test/settings/width/overflow_box_l2r.frame
270
+ - screen_test/settings/width/overflow_box_l2r.rb
271
+ - screen_test/settings/width/overflow_box_t2b.frame
272
+ - screen_test/settings/width/overflow_box_t2b.rb
273
+ - screen_test/settings/width/overflow_grid.frame
274
+ - screen_test/settings/width/overflow_grid.rb
275
+ - tools/whirled_peas/tools/screen_tester.rb
220
276
  - whirled_peas.gemspec
221
277
  homepage: https://github.com/tcollier/whirled_peas
222
278
  licenses: