whirled_peas 0.1.1 → 0.2.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.
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