whirled_peas 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6608e1e6c9505eefea5409bcdc0f8af117b5bcf390564d163315f05b9fe73323
4
- data.tar.gz: 713b7ff1c83c462b137e1a9203282ad74f8dc71e660237da35b40d472ae1d486
3
+ metadata.gz: caed061285ef515e70f20c18153a16eedb3876a98842f2029db069c4a14dcd7f
4
+ data.tar.gz: c07b7daeaa8c048d0068c1150ad248099c335a2a9e8fd70bd47ad8f9bfc99174
5
5
  SHA512:
6
- metadata.gz: 81d5ae8c86907fa5a32025be54fd4649d1c75c93726d0f581f0f63cd7182f8381285451cef1c2350b223c378ba98c00682b2a96ac65b31cabc05b5871cbaf1fc
7
- data.tar.gz: 52cdda8685d24cd1ad89c5a2acc70b7fb77c22cf6c21cb3d3eb20dce5df2660bc2e9d285e04fbb13018189f9b2f9700203e3915c13f678ecb4d92f2ce173bfab
6
+ metadata.gz: f4c3c1003793b47a99413aed446f0935da5a866819336c6b58e02f5b90ae1d69eeefae6b8ea92a8460fda3fcd89843faeeadf9824a4ba5502dd7ca5539a390d5
7
+ data.tar.gz: dccb23acdc4a580e3b319e17f8d0deeac981be86482c9426b5306c40dbed0691b0308bb5300a764830bb3832700b34db0f99beb98796992521294f295623bcda
data/README.md CHANGED
@@ -130,7 +130,7 @@ WhirledPeas.template do |template, template_settings|
130
130
  template.add_grid do |grid, grid_settings|
131
131
  grid_settings.num_cols = 10
132
132
  100.times do |i|
133
- grid.add_text { i.to_s }
133
+ grid.add_text { i }
134
134
  end
135
135
  end
136
136
  end
@@ -142,7 +142,7 @@ The above template can also be broken down into more manageable methods, e.g.
142
142
  def number_grid(grid, settings)
143
143
  settings.num_cols = 10
144
144
  100.times do |i|
145
- grid.add_text { i.to_s }
145
+ grid.add_text { i }
146
146
  end
147
147
  end
148
148
 
@@ -157,12 +157,12 @@ Additionally, if no child element is explicitly added to a `GridElement`, but th
157
157
  ```ruby
158
158
  template.add_grid do |g|
159
159
  100.times do |i|
160
- g.add_text { i.to_s }
160
+ g.add_text { i }
161
161
  end
162
162
  end
163
163
 
164
164
  template.add_grid do |g|
165
- 100.times.map(&:to_s)
165
+ 100.times.map(&:itself)
166
166
  end
167
167
  ```
168
168
 
@@ -338,7 +338,7 @@ class TemplateFactory
338
338
  @numbers.each.with_index do |num, index|
339
339
  g.add_text do |_, settings|
340
340
  settings.bg_color = (@low == index || @high == index) ? :cyan : :white
341
- num.to_s
341
+ num
342
342
  end
343
343
  end
344
344
  end
@@ -17,6 +17,9 @@ module WhirledPeas
17
17
  logger = Logger.new(File.open('whirled_peas.log', 'a'))
18
18
  logger.level = log_level
19
19
  logger.formatter = proc do |severity, datetime, progname, msg|
20
+ if msg.is_a?(Exception)
21
+ msg = %Q(#{msg.class}: #{msg.to_s}\n #{msg.backtrace.join("\n ")})
22
+ end
20
23
  "[#{severity}] #{datetime.strftime('%Y-%m-%dT%H:%M:%S.%L')} (#{progname}) - #{msg}\n"
21
24
  end
22
25
 
@@ -30,10 +33,11 @@ module WhirledPeas
30
33
  begin
31
34
  driver.start(producer)
32
35
  producer.stop
36
+ rescue Errno::EPIPE
37
+ logger.error(LOGGER_ID) { 'Producer cannot connect to consumer, exiting...' }
33
38
  rescue => e
34
39
  logger.warn(LOGGER_ID) { 'Driver exited with error, terminating producer...' }
35
40
  logger.error(LOGGER_ID) { e }
36
- logger.error(LOGGER_ID) { e.backtrace.join("\n") }
37
41
  producer.terminate
38
42
  raise
39
43
  end
@@ -46,8 +46,7 @@ module WhirledPeas
46
46
  rescue => e
47
47
  event_loop.stop if event_loop.running?
48
48
  logger.warn(LOGGER_ID) { 'Exited with error' }
49
- logger.error(LOGGER_ID) { e.message }
50
- logger.error(LOGGER_ID) { e.backtrace.join("\n") }
49
+ logger.error(LOGGER_ID) { e }
51
50
  raise
52
51
  ensure
53
52
  logger.info(LOGGER_ID) { 'Closing socket' }
@@ -35,7 +35,7 @@ module WhirledPeas
35
35
  template = template_factory.build(name, args)
36
36
  screen.paint(template)
37
37
  end
38
- sleep(next_frame_at - Time.now)
38
+ sleep([0, next_frame_at - Time.now].max)
39
39
  end
40
40
  logger.info('EVENT LOOP') { 'Exiting normally' }
41
41
  rescue
@@ -16,8 +16,7 @@ module WhirledPeas
16
16
  rescue => e
17
17
  producer.terminate
18
18
  logger.warn(LOGGER_ID) { 'Exited with error' }
19
- logger.error(LOGGER_ID) { e.message }
20
- logger.error(LOGGER_ID) { e.backtrace.join("\n") }
19
+ logger.error(LOGGER_ID) { e }
21
20
  raise
22
21
  ensure
23
22
  if client
@@ -2,11 +2,14 @@ require_relative 'settings'
2
2
 
3
3
  module WhirledPeas
4
4
  module UI
5
+ STRINGALBE_CLASSES = [FalseClass, Float, Integer, NilClass, String, Symbol, TrueClass]
6
+
5
7
  class Element
6
8
  attr_accessor :preferred_width, :preferred_height
7
- attr_reader :settings
9
+ attr_reader :name, :settings
8
10
 
9
- def initialize(settings)
11
+ def initialize(name, settings)
12
+ @name = name
10
13
  @settings = settings
11
14
  end
12
15
  end
@@ -15,31 +18,42 @@ module WhirledPeas
15
18
  class TextElement < Element
16
19
  attr_reader :value
17
20
 
18
- def initialize(settings)
19
- super(TextSettings.merge(settings))
21
+ def initialize(name, settings)
22
+ super(name, TextSettings.merge(settings))
20
23
  end
21
24
 
22
25
  def value=(val)
23
- @value = val
26
+ unless STRINGALBE_CLASSES.include?(val.class)
27
+ raise ArgmentError, "Unsupported type for TextElement: #{val.class}"
28
+ end
29
+ @value = val.to_s
24
30
  @preferred_width = settings.width || value.length
25
31
  @preferred_height = 1
26
32
  end
27
33
 
28
34
  def inspect(indent='')
29
35
  dims = unless preferred_width.nil?
30
- "#{indent + ' '}Dimensions: #{preferred_width}x#{preferred_height}"
36
+ "#{indent + ' '}- Dimensions: #{preferred_width}x#{preferred_height}"
31
37
  end
32
38
  [
33
- "#{indent}#{self.class.name}",
39
+ "#{indent}+ #{name} [#{self.class.name}]",
34
40
  dims,
35
- "#{indent + ' '}Settings",
41
+ "#{indent + ' '}- Settings",
36
42
  settings.inspect(indent + ' ')
37
43
  ].compact.join("\n")
38
44
  end
39
45
  end
40
46
 
41
47
  class ComposableElement < Element
42
- def initialize(settings)
48
+ class << self
49
+ def next_name
50
+ @counter ||= 0
51
+ @counter += 1
52
+ "Element-#{@counter}"
53
+ end
54
+ end
55
+
56
+ def initialize(name, settings)
43
57
  super
44
58
  end
45
59
 
@@ -47,61 +61,95 @@ module WhirledPeas
47
61
  @children ||= []
48
62
  end
49
63
 
50
- def add_text(&block)
51
- element = TextElement.new(settings)
64
+ def add_text(name=self.class.next_name, &block)
65
+ element = TextElement.new(name, settings)
52
66
  element.value = yield nil, element.settings
53
67
  children << element
54
68
  end
55
69
 
56
- def add_box(&block)
57
- element = BoxElement.new(settings)
70
+ def add_box(name=self.class.next_name, &block)
71
+ element = BoxElement.new(name, settings)
58
72
  value = yield element, element.settings
59
73
  children << element
60
- if element.children.empty? && value.is_a?(String)
61
- element.add_text { value }
74
+ if element.children.empty? && STRINGALBE_CLASSES.include?(value.class)
75
+ element.add_text { value.to_s }
62
76
  end
63
77
  end
64
78
 
65
- def add_grid(&block)
66
- element = GridElement.new(settings)
79
+ def add_grid(name=self.class.next_name, &block)
80
+ element = GridElement.new(name, settings)
67
81
  values = yield element, element.settings
68
82
  children << element
69
83
  if element.children.empty? && values.is_a?(Array)
70
- values.each { |v| element.add_text { v } }
84
+ values.each { |v| element.add_text { v.to_s } }
71
85
  end
72
86
  end
73
87
 
74
88
  def inspect(indent='')
75
89
  kids = children.map { |c| c.inspect(indent + ' ') }.join("\n")
76
90
  dims = unless preferred_width.nil?
77
- "#{indent + ' '}Dimensions: #{preferred_width}x#{preferred_height}"
91
+ "#{indent + ' '}- Dimensions: #{preferred_width}x#{preferred_height}"
78
92
  end
79
93
  [
80
- "#{indent}#{self.class.name}",
94
+ "#{indent}+ #{name} [#{self.class.name}]",
81
95
  dims,
82
- "#{indent + ' '}Settings",
96
+ "#{indent + ' '}- Settings",
83
97
  settings.inspect(indent + ' '),
84
- "#{indent + ' '}Children",
98
+ "#{indent + ' '}- Children",
85
99
  kids
86
100
  ].compact.join("\n")
87
101
  end
102
+
103
+ private
104
+
105
+ def margin_width
106
+ settings.margin.left + settings.margin.right
107
+ end
108
+
109
+ def margin_height
110
+ settings.margin.top + settings.margin.bottom
111
+ end
112
+
113
+ def outer_border_width
114
+ (settings.border.left? ? 1 : 0) + (settings.border.right? ? 1 : 0)
115
+ end
116
+
117
+ def outer_border_height
118
+ (settings.border.top? ? 1 : 0) + (settings.border.bottom? ? 1 : 0)
119
+ end
120
+
121
+ def inner_border_width
122
+ settings.border.inner_vert? ? 1 : 0
123
+ end
124
+
125
+ def inner_border_height
126
+ settings.border.inner_horiz? ? 1 : 0
127
+ end
128
+
129
+ def padding_width
130
+ settings.padding.left + settings.padding.right
131
+ end
132
+
133
+ def padding_height
134
+ settings.padding.top + settings.padding.bottom
135
+ end
88
136
  end
89
137
 
90
138
  class Template < ComposableElement
91
139
  def initialize(settings=TemplateSettings.new)
92
- super(settings)
140
+ super('TEMPLATE', settings)
93
141
  end
94
142
  end
95
143
 
96
144
  class BoxElement < ComposableElement
97
145
  attr_writer :content_width, :content_height
98
146
 
99
- def initialize(settings)
100
- super(BoxSettings.merge(settings))
147
+ def initialize(name, settings)
148
+ super(name, BoxSettings.merge(settings))
101
149
  end
102
150
 
103
151
  def self.from_template(template, width, height)
104
- box = new(template.settings)
152
+ box = new(template.name, template.settings)
105
153
  template.children.each { |c| box.children << c }
106
154
  box.content_width = box.preferred_width = width
107
155
  box.content_height = box.preferred_height = height
@@ -117,13 +165,8 @@ module WhirledPeas
117
165
  end
118
166
 
119
167
  def preferred_width
120
- @preferred_width ||= settings.margin.left +
121
- (settings.border.left? ? 1 : 0) +
122
- settings.padding.left +
123
- content_width +
124
- settings.padding.right +
125
- (settings.border.right? ? 1 : 0) +
126
- settings.margin.right
168
+ @preferred_width ||=
169
+ margin_width + outer_border_width + padding_width + content_width
127
170
  end
128
171
 
129
172
  def content_height
@@ -134,19 +177,14 @@ module WhirledPeas
134
177
  end
135
178
 
136
179
  def preferred_height
137
- @preferred_height ||= settings.margin.top +
138
- (settings.border.top? ? 1 : 0) +
139
- settings.padding.top +
140
- content_height +
141
- settings.padding.bottom +
142
- (settings.border.bottom? ? 1 : 0) +
143
- settings.margin.bottom
180
+ @preferred_height ||=
181
+ margin_height + outer_border_height + padding_height + content_height
144
182
  end
145
183
  end
146
184
 
147
185
  class GridElement < ComposableElement
148
- def initialize(settings)
149
- super(GridSettings.merge(settings))
186
+ def initialize(name, settings)
187
+ super(name, GridSettings.merge(settings))
150
188
  end
151
189
 
152
190
  def col_width
@@ -169,30 +207,18 @@ module WhirledPeas
169
207
 
170
208
 
171
209
  def preferred_width
172
- settings.margin.left +
173
- (settings.border.left? ? 1 : 0) +
174
- settings.num_cols * (
175
- settings.padding.left +
176
- col_width +
177
- settings.padding.right
178
- ) +
179
- (settings.num_cols - 1) * (settings.border.inner_vert? ? 1 : 0) +
180
- (settings.border.right? ? 1 : 0) +
181
- settings.margin.right
210
+ margin_width +
211
+ outer_border_width +
212
+ settings.num_cols * (padding_width + col_width) +
213
+ (settings.num_cols - 1) * inner_border_width
182
214
  end
183
215
 
184
216
  def preferred_height
185
217
  num_rows = (children.length / settings.num_cols).ceil
186
- settings.margin.top +
187
- (settings.border.top? ? 1 : 0) +
188
- num_rows * (
189
- settings.padding.top +
190
- row_height +
191
- settings.padding.bottom
192
- ) +
193
- (num_rows - 1) * (settings.border.inner_horiz? ? 1 : 0) +
194
- (settings.border.bottom? ? 1 : 0) +
195
- settings.margin.bottom
218
+ margin_height +
219
+ outer_border_height +
220
+ num_rows * (padding_height + row_height) +
221
+ (num_rows - 1) * inner_border_height
196
222
  end
197
223
  end
198
224
  end
@@ -342,6 +342,11 @@ module WhirledPeas
342
342
  @_margin.bottom = bottom if bottom
343
343
  end
344
344
 
345
+ def clear_margin
346
+ set_margin(left: 0, top: 0, right: 0, bottom: 0)
347
+ @_auto_margin = nil
348
+ end
349
+
345
350
  def margin
346
351
  @_margin || Margin.new
347
352
  end
@@ -387,7 +392,7 @@ module WhirledPeas
387
392
  @_border.color = color unless color.nil?
388
393
  end
389
394
 
390
- def no_border
395
+ def clear_border
391
396
  set_border(
392
397
  left: false, top: false, right: false, bottom: false, inner_horiz: false, inner_vert: false
393
398
  )
@@ -424,6 +429,10 @@ module WhirledPeas
424
429
  @_padding.bottom = bottom if bottom
425
430
  end
426
431
 
432
+ def clear_padding
433
+ set_padding(left: 0, top: 0, right: 0, bottom: 0)
434
+ end
435
+
427
436
  def padding
428
437
  @_padding || Padding.new
429
438
  end
@@ -1,3 +1,3 @@
1
1
  module WhirledPeas
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  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.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Collier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-20 00:00:00.000000000 Z
11
+ date: 2021-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline