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 +4 -4
- data/README.md +5 -5
- data/lib/whirled_peas.rb +5 -1
- data/lib/whirled_peas/frame/consumer.rb +1 -2
- data/lib/whirled_peas/frame/event_loop.rb +1 -1
- data/lib/whirled_peas/frame/producer.rb +1 -2
- data/lib/whirled_peas/ui/element.rb +88 -62
- data/lib/whirled_peas/ui/settings.rb +10 -1
- data/lib/whirled_peas/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: caed061285ef515e70f20c18153a16eedb3876a98842f2029db069c4a14dcd7f
|
4
|
+
data.tar.gz: c07b7daeaa8c048d0068c1150ad248099c335a2a9e8fd70bd47ad8f9bfc99174
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
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
|
160
|
+
g.add_text { i }
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
164
|
template.add_grid do |g|
|
165
|
-
100.times.map(&:
|
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
|
341
|
+
num
|
342
342
|
end
|
343
343
|
end
|
344
344
|
end
|
data/lib/whirled_peas.rb
CHANGED
@@ -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
|
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' }
|
@@ -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
|
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
|
-
|
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
|
-
|
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? &&
|
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 ||=
|
121
|
-
|
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 ||=
|
138
|
-
|
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
|
-
|
173
|
-
|
174
|
-
settings.num_cols * (
|
175
|
-
|
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
|
-
|
187
|
-
|
188
|
-
num_rows * (
|
189
|
-
|
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
|
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
|
data/lib/whirled_peas/version.rb
CHANGED
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.
|
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-
|
11
|
+
date: 2021-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: highline
|