whirled_peas 0.1.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (155) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/CHANGELOG.md +32 -0
  4. data/Gemfile +1 -0
  5. data/README.md +240 -79
  6. data/Rakefile +37 -3
  7. data/bin/debug +35 -0
  8. data/exe/whirled_peas +7 -0
  9. data/lib/whirled_peas.rb +17 -37
  10. data/lib/whirled_peas/command_line.rb +263 -0
  11. data/lib/whirled_peas/config.rb +21 -0
  12. data/lib/whirled_peas/debugger.rb +80 -0
  13. data/lib/whirled_peas/errors.rb +7 -0
  14. data/lib/whirled_peas/frame.rb +0 -8
  15. data/lib/whirled_peas/frame/consumer.rb +14 -51
  16. data/lib/whirled_peas/frame/debug_consumer.rb +30 -0
  17. data/lib/whirled_peas/frame/event_loop.rb +68 -38
  18. data/lib/whirled_peas/frame/producer.rb +37 -34
  19. data/lib/whirled_peas/graphics.rb +5 -0
  20. data/lib/whirled_peas/graphics/box_painter.rb +100 -0
  21. data/lib/whirled_peas/graphics/canvas.rb +107 -0
  22. data/lib/whirled_peas/graphics/container_coords.rb +61 -0
  23. data/lib/whirled_peas/graphics/container_dimensions.rb +65 -0
  24. data/lib/whirled_peas/graphics/container_painter.rb +116 -0
  25. data/lib/whirled_peas/graphics/debugger.rb +43 -0
  26. data/lib/whirled_peas/graphics/grid_painter.rb +56 -0
  27. data/lib/whirled_peas/graphics/mock_screen.rb +26 -0
  28. data/lib/whirled_peas/graphics/painter.rb +24 -0
  29. data/lib/whirled_peas/graphics/renderer.rb +49 -0
  30. data/lib/whirled_peas/graphics/screen.rb +65 -0
  31. data/lib/whirled_peas/graphics/text_dimensions.rb +15 -0
  32. data/lib/whirled_peas/graphics/text_painter.rb +38 -0
  33. data/lib/whirled_peas/settings.rb +5 -0
  34. data/lib/whirled_peas/settings/bg_color.rb +22 -0
  35. data/lib/whirled_peas/settings/border.rb +101 -0
  36. data/lib/whirled_peas/settings/box_settings.rb +8 -0
  37. data/lib/whirled_peas/settings/color.rb +69 -0
  38. data/lib/whirled_peas/settings/container_settings.rb +128 -0
  39. data/lib/whirled_peas/settings/debugger.rb +87 -0
  40. data/lib/whirled_peas/settings/display_flow.rb +25 -0
  41. data/lib/whirled_peas/settings/element_settings.rb +61 -0
  42. data/lib/whirled_peas/settings/grid_settings.rb +11 -0
  43. data/lib/whirled_peas/settings/margin.rb +8 -0
  44. data/lib/whirled_peas/settings/padding.rb +8 -0
  45. data/lib/whirled_peas/settings/position.rb +15 -0
  46. data/lib/whirled_peas/settings/spacing.rb +24 -0
  47. data/lib/whirled_peas/settings/text_align.rb +19 -0
  48. data/lib/whirled_peas/settings/text_color.rb +19 -0
  49. data/lib/whirled_peas/settings/text_settings.rb +15 -0
  50. data/lib/whirled_peas/template.rb +5 -0
  51. data/lib/whirled_peas/template/box_element.rb +8 -0
  52. data/lib/whirled_peas/template/composer.rb +68 -0
  53. data/lib/whirled_peas/template/container.rb +28 -0
  54. data/lib/whirled_peas/template/debugger.rb +34 -0
  55. data/lib/whirled_peas/template/element.rb +13 -0
  56. data/lib/whirled_peas/template/grid_element.rb +8 -0
  57. data/lib/whirled_peas/template/text_element.rb +24 -0
  58. data/lib/whirled_peas/utils.rb +5 -0
  59. data/lib/whirled_peas/utils/ansi.rb +53 -0
  60. data/lib/whirled_peas/utils/formatted_string.rb +64 -0
  61. data/lib/whirled_peas/utils/title_font.rb +75 -0
  62. data/lib/whirled_peas/version.rb +1 -1
  63. data/screen_test/rendered/elements/box.frame +1 -0
  64. data/screen_test/rendered/elements/box.rb +20 -0
  65. data/screen_test/rendered/elements/grid.frame +1 -0
  66. data/screen_test/rendered/elements/grid.rb +13 -0
  67. data/screen_test/rendered/elements/screen_overflow.rb +9 -0
  68. data/screen_test/rendered/elements/text.frame +1 -0
  69. data/screen_test/rendered/elements/text.rb +9 -0
  70. data/screen_test/rendered/elements/text_multiline.frame +1 -0
  71. data/screen_test/rendered/elements/text_multiline.rb +9 -0
  72. data/screen_test/rendered/settings/align/box.frame +1 -0
  73. data/screen_test/rendered/settings/align/box.rb +20 -0
  74. data/screen_test/rendered/settings/align/children_center.frame +1 -0
  75. data/screen_test/rendered/settings/align/children_center.rb +13 -0
  76. data/screen_test/rendered/settings/align/children_left.frame +1 -0
  77. data/screen_test/rendered/settings/align/children_left.rb +13 -0
  78. data/screen_test/rendered/settings/align/children_right.frame +1 -0
  79. data/screen_test/rendered/settings/align/children_right.rb +13 -0
  80. data/screen_test/rendered/settings/align/grid.frame +1 -0
  81. data/screen_test/rendered/settings/align/grid.rb +20 -0
  82. data/screen_test/rendered/settings/ansi/bold.frame +1 -0
  83. data/screen_test/rendered/settings/ansi/bold.rb +15 -0
  84. data/screen_test/rendered/settings/ansi/color.frame +1 -0
  85. data/screen_test/rendered/settings/ansi/color.rb +37 -0
  86. data/screen_test/rendered/settings/ansi/underline.frame +1 -0
  87. data/screen_test/rendered/settings/ansi/underline.rb +15 -0
  88. data/screen_test/rendered/settings/border.frame +1 -0
  89. data/screen_test/rendered/settings/border.rb +13 -0
  90. data/screen_test/rendered/settings/flow/l2r.frame +1 -0
  91. data/screen_test/rendered/settings/flow/l2r.rb +24 -0
  92. data/screen_test/rendered/settings/flow/t2b.frame +1 -0
  93. data/screen_test/rendered/settings/flow/t2b.rb +24 -0
  94. data/screen_test/rendered/settings/height/box.frame +1 -0
  95. data/screen_test/rendered/settings/height/box.rb +13 -0
  96. data/screen_test/rendered/settings/height/grid.frame +1 -0
  97. data/screen_test/rendered/settings/height/grid.rb +14 -0
  98. data/screen_test/rendered/settings/height/overflow_box.frame +1 -0
  99. data/screen_test/rendered/settings/height/overflow_box.rb +13 -0
  100. data/screen_test/rendered/settings/height/overflow_box_l2r.frame +1 -0
  101. data/screen_test/rendered/settings/height/overflow_box_l2r.rb +15 -0
  102. data/screen_test/rendered/settings/height/overflow_box_t2b.frame +1 -0
  103. data/screen_test/rendered/settings/height/overflow_box_t2b.rb +14 -0
  104. data/screen_test/rendered/settings/height/overflow_grid.frame +1 -0
  105. data/screen_test/rendered/settings/height/overflow_grid.rb +16 -0
  106. data/screen_test/rendered/settings/margin.frame +1 -0
  107. data/screen_test/rendered/settings/margin.rb +14 -0
  108. data/screen_test/rendered/settings/padding.frame +1 -0
  109. data/screen_test/rendered/settings/padding.rb +11 -0
  110. data/screen_test/rendered/settings/position/box_left.frame +1 -0
  111. data/screen_test/rendered/settings/position/box_left.rb +17 -0
  112. data/screen_test/rendered/settings/position/box_left_negative.frame +1 -0
  113. data/screen_test/rendered/settings/position/box_left_negative.rb +17 -0
  114. data/screen_test/rendered/settings/position/box_top.frame +1 -0
  115. data/screen_test/rendered/settings/position/box_top.rb +17 -0
  116. data/screen_test/rendered/settings/position/box_top_negative.frame +1 -0
  117. data/screen_test/rendered/settings/position/box_top_negative.rb +17 -0
  118. data/screen_test/rendered/settings/position/grid_left.frame +1 -0
  119. data/screen_test/rendered/settings/position/grid_left.rb +18 -0
  120. data/screen_test/rendered/settings/position/grid_left_negative.frame +1 -0
  121. data/screen_test/rendered/settings/position/grid_left_negative.rb +18 -0
  122. data/screen_test/rendered/settings/position/grid_top.frame +1 -0
  123. data/screen_test/rendered/settings/position/grid_top.rb +18 -0
  124. data/screen_test/rendered/settings/position/grid_top_negative.frame +1 -0
  125. data/screen_test/rendered/settings/position/grid_top_negative.rb +18 -0
  126. data/screen_test/rendered/settings/title_font.frame +1 -0
  127. data/screen_test/rendered/settings/title_font.rb +12 -0
  128. data/screen_test/rendered/settings/width/box.frame +1 -0
  129. data/screen_test/rendered/settings/width/box.rb +13 -0
  130. data/screen_test/rendered/settings/width/grid.frame +1 -0
  131. data/screen_test/rendered/settings/width/grid.rb +14 -0
  132. data/screen_test/rendered/settings/width/overflow_box.frame +1 -0
  133. data/screen_test/rendered/settings/width/overflow_box.rb +11 -0
  134. data/screen_test/rendered/settings/width/overflow_box_l2r.frame +1 -0
  135. data/screen_test/rendered/settings/width/overflow_box_l2r.rb +14 -0
  136. data/screen_test/rendered/settings/width/overflow_box_t2b.frame +1 -0
  137. data/screen_test/rendered/settings/width/overflow_box_t2b.rb +15 -0
  138. data/screen_test/rendered/settings/width/overflow_grid.frame +1 -0
  139. data/screen_test/rendered/settings/width/overflow_grid.rb +14 -0
  140. data/screen_test/screen_tester.rb +191 -0
  141. data/whirled_peas.gemspec +4 -2
  142. metadata +136 -20
  143. data/lib/whirled_peas/ui.rb +0 -7
  144. data/lib/whirled_peas/ui/ansi.rb +0 -154
  145. data/lib/whirled_peas/ui/canvas.rb +0 -35
  146. data/lib/whirled_peas/ui/element.rb +0 -199
  147. data/lib/whirled_peas/ui/painter.rb +0 -283
  148. data/lib/whirled_peas/ui/screen.rb +0 -62
  149. data/lib/whirled_peas/ui/settings.rb +0 -512
  150. data/lib/whirled_peas/ui/stroke.rb +0 -29
  151. data/sandbox/auto.rb +0 -13
  152. data/sandbox/box.rb +0 -19
  153. data/sandbox/grid.rb +0 -13
  154. data/sandbox/sandbox.rb +0 -17
  155. data/sandbox/text.rb +0 -33
@@ -0,0 +1,13 @@
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
@@ -0,0 +1,8 @@
1
+ require_relative 'container'
2
+
3
+ module WhirledPeas
4
+ module Template
5
+ class GridElement < Container
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,24 @@
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
@@ -0,0 +1,5 @@
1
+ module WhirledPeas
2
+ module Utils
3
+ end
4
+ private_constant :Utils
5
+ end
@@ -0,0 +1,53 @@
1
+ module WhirledPeas
2
+ module Utils
3
+ # Helper module for working with ANSI escape codes. The most useful ANSI escape codes
4
+ # relate to text formatting.
5
+ #
6
+ # @see https://en.wikipedia.org/wiki/ANSI_escape_code
7
+ module Ansi
8
+ ESC = "\033"
9
+
10
+ END_FORMATTING = 0
11
+ private_constant :END_FORMATTING
12
+
13
+ # Text formatting constants
14
+ BOLD = 1
15
+ UNDERLINE = 4
16
+
17
+ # Text and background color constants
18
+ BLACK = 30
19
+ RED = 31
20
+ GREEN = 32
21
+ YELLOW = 33
22
+ BLUE = 34
23
+ MAGENTA = 35
24
+ CYAN = 36
25
+ WHITE = 37
26
+
27
+ # Bright colors are offset by this much from their standard versions
28
+ BRIGHT_OFFSET = 60
29
+
30
+ class << self
31
+ def cursor_pos(top: 0, left: 0)
32
+ "#{ESC}[#{top + 1};#{left + 1}H"
33
+ end
34
+
35
+ def cursor_visible(visible)
36
+ visible ? "#{ESC}[?25h" : "#{ESC}[?25l"
37
+ end
38
+
39
+ def clear_down
40
+ "#{ESC}[J"
41
+ end
42
+
43
+ def clear
44
+ esc_seq(END_FORMATTING)
45
+ end
46
+
47
+ def esc_seq(code)
48
+ "#{ESC}[#{code}m"
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,64 @@
1
+ require_relative 'ansi'
2
+
3
+ module WhirledPeas
4
+ module Utils
5
+ class FormattedString
6
+ def self.blank
7
+ new('')
8
+ end
9
+
10
+ def initialize(raw, formatting=nil)
11
+ @raw = raw
12
+ @formatting = [*formatting]
13
+ end
14
+
15
+ def length
16
+ raw.length
17
+ end
18
+
19
+ def [](index_or_range)
20
+ self.class.new(raw[index_or_range], foramtting)
21
+ end
22
+
23
+ def blank?
24
+ raw.empty?
25
+ end
26
+
27
+ def hash
28
+ [raw, formatting].hash
29
+ end
30
+
31
+ def ==(other)
32
+ case other
33
+ when self.class
34
+ hash == other.hash
35
+ when String
36
+ formatting.empty? && raw == other
37
+ else
38
+ false
39
+ end
40
+ end
41
+
42
+ def to_s
43
+ if raw.empty? || formatting.length == 0
44
+ raw
45
+ else
46
+ start_formatting = formatting.map { |code| Ansi.esc_seq(code) }.join
47
+ "#{start_formatting}#{raw}#{Ansi.clear}"
48
+ end
49
+ end
50
+
51
+ def inspect
52
+ if raw.empty? || formatting.length == 0
53
+ raw.inspect
54
+ else
55
+ "<#{formatting.join(', ')}>#{raw}<0>".inspect
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ attr_reader :raw, :formatting
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,75 @@
1
+ module WhirledPeas
2
+ module Utils
3
+ module TitleFont
4
+ PREFERRED_DEFAULT_FONT = :ansishadow
5
+ FONT_CACHE = File.join(ENV['HOME'] || '.', '.whirled_peas.fonts')
6
+
7
+ class << self
8
+ def validate!(font_key)
9
+ return unless font_key
10
+ return font_key if fonts.key?(font_key)
11
+ allowed = fonts.keys.map(&:inspect).sort
12
+ message = "Unrecognized font: '#{font_key.inspect}', expecting one of #{allowed.join(', ')}"
13
+ raise ArgumentError, message
14
+ end
15
+
16
+ def to_s(string, font_key)
17
+ require 'ruby_figlet'
18
+ RubyFiglet::Figlet.new(string, fonts[font_key]).to_s
19
+ end
20
+
21
+ def fonts
22
+ return @fonts if @fonts
23
+ File.exist?(FONT_CACHE) ? load_fonts_from_cache : load_fonts_from_figlet
24
+ @fonts
25
+ end
26
+
27
+ def load_fonts_from_cache
28
+ require 'json'
29
+ @fonts = {}
30
+ File.open(FONT_CACHE, 'r') do |fp|
31
+ JSON.parse(fp.read).each do |key, value|
32
+ @fonts[key.to_sym] = value
33
+ end
34
+ end
35
+ @fonts
36
+ end
37
+
38
+ def load_fonts_from_figlet
39
+ require 'ruby_figlet'
40
+ require 'json'
41
+ @fonts = {}
42
+ RubyFiglet::Figlet.available.strip.split("\n").each do |font|
43
+ # Load the font to be sure it exists on the system
44
+ next unless available?(font)
45
+ string_key = font.downcase.gsub(/\W/, '')
46
+ string_key = "_#{string_key}" if string_key[0] !~ /[a-z]/
47
+ string_key.gsub!(/\d+$/, '')
48
+ next if @fonts.key?(string_key)
49
+ @fonts[string_key.to_sym] = font
50
+ end
51
+ @fonts[:default] ||= @fonts[PREFERRED_DEFAULT_FONT] || @fonts.values.first
52
+ File.open(FONT_CACHE, 'w') { |fp| fp.write(JSON.generate(@fonts)) }
53
+ @fonts
54
+ end
55
+
56
+ private
57
+
58
+ def available?(font)
59
+ # Figlet's font loader prints to STDOUT if the font file is not found.
60
+ # Temporarily redirect STDOUT to /dev/null while the font file is loaded
61
+ # then remove the redirect in an ensure block. Also, if a font file is
62
+ # not available, a SystemExit is raise :/
63
+ original_stdout = $stdout.clone
64
+ $stdout.reopen(File.new('/dev/null', 'w'))
65
+ RubyFiglet::Figlet.new('Text', font)
66
+ true
67
+ rescue SystemExit, NoMethodError
68
+ false
69
+ ensure
70
+ $stdout.reopen(original_stdout)
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -1,3 +1,3 @@
1
1
  module WhirledPeas
2
- VERSION = '0.1.1'
2
+ VERSION = '0.5.0'
3
3
  end
@@ -0,0 +1 @@
1
+ [?25lTOP LEFTBOTTOM LEFT TOP RIGHT  BOTTOM RIGHT[?25h
@@ -0,0 +1,20 @@
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
+ composer.add_box do |composer, settings|
8
+ settings.flow = :t2b
9
+ composer.add_box('TopLeft') { "TOP LEFT" }
10
+ composer.add_box('BottomLeft') { "BOTTOM LEFT" }
11
+ end
12
+ composer.add_box do |composer, settings|
13
+ settings.flow = :t2b
14
+ composer.add_box('TopRight') { " TOP RIGHT " }
15
+ composer.add_box('BottomRight') { " BOTTOM RIGHT" }
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━┳━━━━━━┳━━━━━━┓┃ ┃ ┃ ┃┣━━━━━━╋━━━━━━╋━━━━━━┫┃ ┃ ┃ ┃┣━━━━━━╋━━━━━━╋━━━━━━┫┃ ┃ ┃ ┃┗━━━━━━┻━━━━━━┻━━━━━━┛Item 0Item 1Item 2Item 3Item 4Item 5Item 6[?25h
@@ -0,0 +1,13 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ composer.add_grid('Grid') do |_, settings|
7
+ settings.num_cols = 3
8
+ settings.full_border
9
+ 7.times.map { |i| "Item #{i}" }
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do
6
+ '-' * 1000
7
+ end
8
+ end
9
+ end
@@ -0,0 +1 @@
1
+ [?25lHello, World![?25h
@@ -0,0 +1,9 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ "Hello, World!"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1 @@
1
+ [?25lLine 1Line 2Line 3[?25h
@@ -0,0 +1,9 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ "Line 1\nLine 2\nLine 3"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxdefault┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxleft┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxcenter┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxright[?25h
@@ -0,0 +1,20 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ [nil, :left, :center, :right].each do |align|
7
+ composer.add_box("Alignment-#{align || :default}") do |composer, settings|
8
+ settings.flow = :t2b
9
+ settings.full_border
10
+ settings.align = align
11
+ # Keep the title long so grids below will be wide enough to use the
12
+ # alignment attribute. Don't rely on the `width` attribute to keep
13
+ # `align` isolated in this test.
14
+ composer.add_text('Title') { 'This is an aligned box' }
15
+ composer.add_text('Content') { align || :default }
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
@@ -0,0 +1,13 @@
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
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
@@ -0,0 +1,13 @@
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
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
@@ -0,0 +1,13 @@
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
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned griddefault┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridleft┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridcenter┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridright[?25h
@@ -0,0 +1,20 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ [nil, :left, :center, :right].each do |align|
7
+ composer.add_grid("Alignment-#{align || :default}") do |composer, settings|
8
+ settings.num_cols = 1
9
+ settings.full_border
10
+ settings.align = align
11
+ # Keep the title long so grids below will be wide enough to use the
12
+ # alignment attribute. Don't rely on the `width` attribute to keep
13
+ # `align` isolated in this test.
14
+ composer.add_text('Title') { 'This is an aligned grid' }
15
+ composer.add_text('Content') { align || :default }
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1 @@
1
+ [?25lThis is boldThis is not bold[?25h
@@ -0,0 +1,15 @@
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