whirled_peas 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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: