vedeu 0.1.7 → 0.1.8

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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +26 -23
  3. data/deps.md +15 -19
  4. data/lib/vedeu.rb +8 -54
  5. data/lib/vedeu/api/base.rb +5 -3
  6. data/lib/vedeu/api/events.rb +75 -0
  7. data/lib/vedeu/api/interface.rb +12 -2
  8. data/lib/vedeu/api/store.rb +37 -0
  9. data/lib/vedeu/api/view.rb +12 -4
  10. data/lib/vedeu/application.rb +7 -3
  11. data/lib/vedeu/configuration.rb +4 -0
  12. data/lib/vedeu/instrumentation.rb +1 -9
  13. data/lib/vedeu/launcher.rb +5 -3
  14. data/lib/vedeu/models/attributes/background.rb +11 -0
  15. data/lib/vedeu/models/attributes/collection.rb +1 -7
  16. data/lib/vedeu/{output → models/attributes}/colour_translator.rb +19 -3
  17. data/lib/vedeu/models/attributes/foreground.rb +11 -0
  18. data/lib/vedeu/models/attributes/interface_collection.rb +5 -5
  19. data/lib/vedeu/models/colour.rb +2 -18
  20. data/lib/vedeu/models/interface.rb +22 -13
  21. data/lib/vedeu/models/line.rb +1 -2
  22. data/lib/vedeu/models/stream.rb +21 -13
  23. data/lib/vedeu/output/{clear_interface.rb → clear.rb} +5 -5
  24. data/lib/vedeu/output/{render_interface.rb → render.rb} +4 -4
  25. data/lib/vedeu/support/esc.rb +3 -0
  26. data/lib/vedeu/support/menu.rb +1 -1
  27. data/lib/vedeu/support/terminal.rb +4 -10
  28. data/test/lib/vedeu/api/base_test.rb +1 -1
  29. data/test/lib/vedeu/api/events_test.rb +37 -0
  30. data/test/lib/vedeu/api/grid_test.rb +11 -9
  31. data/test/lib/vedeu/api/interface_test.rb +10 -13
  32. data/test/lib/vedeu/api/line_test.rb +0 -2
  33. data/test/lib/vedeu/api/store_test.rb +49 -0
  34. data/test/lib/vedeu/api/stream_test.rb +1 -1
  35. data/test/lib/vedeu/api/view_test.rb +1 -1
  36. data/test/lib/vedeu/models/attributes/background_test.rb +8 -0
  37. data/test/lib/vedeu/models/attributes/colour_translator_test.rb +78 -0
  38. data/test/lib/vedeu/models/attributes/foreground_test.rb +8 -0
  39. data/test/lib/vedeu/models/attributes/interface_collection_test.rb +22 -6
  40. data/test/lib/vedeu/models/attributes/line_collection_test.rb +1 -6
  41. data/test/lib/vedeu/models/attributes/stream_collection_test.rb +1 -1
  42. data/test/lib/vedeu/models/composition_test.rb +108 -62
  43. data/test/lib/vedeu/models/geometry_test.rb +48 -0
  44. data/test/lib/vedeu/models/interface_test.rb +26 -10
  45. data/test/lib/vedeu/models/line_test.rb +0 -5
  46. data/test/lib/vedeu/output/{clear_interface_test.rb → clear_test.rb} +8 -8
  47. data/test/lib/vedeu/output/{render_interface_test.rb → render_test.rb} +7 -7
  48. data/test/lib/vedeu/support/esc_test.rb +12 -0
  49. data/test/lib/vedeu/support/terminal_test.rb +2 -1
  50. data/test/lib/vedeu_test.rb +0 -38
  51. data/test/support/colours.rb +1 -1
  52. data/vedeu.gemspec +1 -1
  53. metadata +23 -23
  54. data/lib/vedeu/output/text_adaptor.rb +0 -35
  55. data/lib/vedeu/support/events.rb +0 -51
  56. data/lib/vedeu/support/interface_store.rb +0 -43
  57. data/lib/vedeu/support/queue.rb +0 -31
  58. data/test/lib/vedeu/output/colour_translator_test.rb +0 -42
  59. data/test/lib/vedeu/output/text_adaptor_test.rb +0 -73
  60. data/test/lib/vedeu/support/events_test.rb +0 -35
  61. data/test/lib/vedeu/support/interface_store_test.rb +0 -51
  62. data/test/lib/vedeu/support/queue_test.rb +0 -44
@@ -8,12 +8,7 @@ module Vedeu
8
8
 
9
9
  describe '#coerce' do
10
10
  it 'returns an empty collection when there are no lines' do
11
- Interface.new({ lines: {} }).lines.must_equal([])
12
- end
13
-
14
- it 'contains a single Line object when the line is just a String' do
15
- Interface.new({ lines: 'some text' }).lines.size
16
- .must_equal(1)
11
+ Interface.new({ lines: [] }).lines.must_equal([])
17
12
  end
18
13
 
19
14
  it 'contains a single Line object when there is a single line' do
@@ -10,7 +10,7 @@ module Vedeu
10
10
  end
11
11
 
12
12
  it 'contains a single Stream when there is a single stream' do
13
- Line.new({ streams: 'some text' }).streams.size
13
+ Line.new({ streams: [{ text: 'some text' }] }).streams.size
14
14
  .must_equal(1)
15
15
  end
16
16
 
@@ -3,59 +3,22 @@ require 'test_helper'
3
3
  require 'json'
4
4
 
5
5
  require 'vedeu/models/composition'
6
- require 'vedeu/support/interface_store'
6
+ require 'vedeu/api/store'
7
7
 
8
8
  module Vedeu
9
9
  describe Composition do
10
- describe '.enqueue' do
11
- it 'enqueues the interfaces for rendering' do
12
- attributes = {
13
- interfaces: [
14
- {
15
- name: 'Composition.enqueue_1',
16
- geometry: {
17
- width: 35,
18
- height: 5,
19
- },
20
- lines: {
21
- streams: {
22
- text: 'bd459118e6175689e4394e242debc2ae'
23
- }
24
- }
25
- }, {
26
- name: 'Composition.enqueue_2',
27
- geometry: {
28
- width: 35,
29
- height: 5,
30
- },
31
- lines: {
32
- streams: {
33
- text: '837acb2cb2ea3ef359257851142a7830'
34
- }
35
- }
36
- }
37
- ]
38
- }
39
-
40
- Composition.enqueue(attributes)
41
- InterfaceStore
42
- .query('Composition.enqueue_1').dequeue
43
- .must_match(/bd459118e6175689e4394e242debc2ae/)
44
- InterfaceStore
45
- .query('Composition.enqueue_2').dequeue
46
- .must_match(/837acb2cb2ea3ef359257851142a7830/)
47
- end
48
- end
10
+ before { API::Store.reset }
49
11
 
50
12
  describe '#interfaces' do
51
13
  it 'returns a collection of interfaces' do
14
+ Vedeu.interface('dummy') do
15
+ width 5
16
+ height 5
17
+ end
52
18
  Composition.new({
53
19
  interfaces: {
54
- name: 'dummy',
55
- geometry: {
56
- width: 5,
57
- height: 5
58
- }
20
+ name: 'dummy',
21
+ lines: []
59
22
  }
60
23
  }).interfaces.first.must_be_instance_of(Interface)
61
24
  end
@@ -67,7 +30,12 @@ module Vedeu
67
30
 
68
31
  describe '#to_s' do
69
32
  it 'returns the stringified content for a single interface, single line, single stream' do
70
- InterfaceStore.create({ name: 'int1_lin1_str1', geometry: { y: 3, x: 3, width: 15, height: 3 } })
33
+ Vedeu.interface('int1_lin1_str1') do
34
+ y 3
35
+ x 3
36
+ width 15
37
+ height 3
38
+ end
71
39
  json = File.read('test/support/json/int1_lin1_str1.json')
72
40
  attributes = JSON.load(json, nil, symbolize_names: true)
73
41
 
@@ -80,7 +48,12 @@ module Vedeu
80
48
  end
81
49
 
82
50
  it 'returns the stringified content for a single interface, single line, multiple streams' do
83
- InterfaceStore.create({ name: 'int1_lin1_str3', geometry: { y: 3, x: 3, width: 30, height: 3 } })
51
+ Vedeu.interface('int1_lin1_str3') do
52
+ y 3
53
+ x 3
54
+ width 30
55
+ height 3
56
+ end
84
57
  json = File.read('test/support/json/int1_lin1_str3.json')
85
58
  attributes = JSON.load(json, nil, symbolize_names: true)
86
59
 
@@ -93,7 +66,12 @@ module Vedeu
93
66
  end
94
67
 
95
68
  it 'returns the stringified content for a single interface, multiple lines, single stream' do
96
- InterfaceStore.create({ name: 'int1_lin2_str1', geometry: { y: 3, x: 3, width: 15, height: 3 } })
69
+ Vedeu.interface('int1_lin2_str1') do
70
+ y 3
71
+ x 3
72
+ width 15
73
+ height 3
74
+ end
97
75
  json = File.read('test/support/json/int1_lin2_str1.json')
98
76
  attributes = JSON.load(json, nil, symbolize_names: true)
99
77
 
@@ -107,7 +85,12 @@ module Vedeu
107
85
  end
108
86
 
109
87
  it 'returns the stringified content for a single interface, multiple lines, multiple streams' do
110
- InterfaceStore.create({ name: 'int1_lin2_str3', geometry: { y: 3, x: 3, width: 30, height: 3 } })
88
+ Vedeu.interface('int1_lin2_str3') do
89
+ y 3
90
+ x 3
91
+ width 30
92
+ height 3
93
+ end
111
94
  json = File.read('test/support/json/int1_lin2_str3.json')
112
95
  attributes = JSON.load(json, nil, symbolize_names: true)
113
96
 
@@ -121,10 +104,14 @@ module Vedeu
121
104
  end
122
105
 
123
106
  it 'returns the stringified content for a single interface, multiple lines, multiple streams, streams contain styles' do
107
+ Vedeu.interface('int1_lin2_str3_styles') do
108
+ y 3
109
+ x 3
110
+ width 30
111
+ height 3
112
+ end
124
113
  json = File.read('test/support/json/int1_lin2_str3_styles.json')
125
114
  attributes = JSON.load(json, nil, symbolize_names: true)
126
- InterfaceStore.create({ name: 'int1_lin2_str3_styles', geometry: { y: 3, x: 3, width: 30, height: 3 } })
127
-
128
115
  Composition.new(attributes).to_s.must_equal(
129
116
  "\e[3;3H \e[3;3H" \
130
117
  "\e[4;3H \e[4;3H" \
@@ -134,8 +121,18 @@ module Vedeu
134
121
  end
135
122
 
136
123
  it 'returns the stringified content for multiple interfaces, single line, single stream' do
137
- InterfaceStore.create({ name: 'int2_lin1_str1_1', geometry: { y: 3, x: 3, width: 15, height: 3 } })
138
- InterfaceStore.create({ name: 'int2_lin1_str1_2', geometry: { y: 6, x: 6, width: 15, height: 3 } })
124
+ Vedeu.interface('int2_lin1_str1_1') do
125
+ y 3
126
+ x 3
127
+ width 15
128
+ height 3
129
+ end
130
+ Vedeu.interface('int2_lin1_str1_2') do
131
+ y 6
132
+ x 6
133
+ width 15
134
+ height 3
135
+ end
139
136
  json = File.read('test/support/json/int2_lin1_str1.json')
140
137
  attributes = JSON.load(json, nil, symbolize_names: true)
141
138
 
@@ -152,8 +149,18 @@ module Vedeu
152
149
  end
153
150
 
154
151
  it 'returns the stringified content for multiple interfaces, single line, multiple streams' do
155
- InterfaceStore.create({ name: 'int2_lin1_str3_1', geometry: { y: 3, x: 3, width: 30, height: 3 } })
156
- InterfaceStore.create({ name: 'int2_lin1_str3_2', geometry: { y: 6, x: 6, width: 30, height: 3 } })
152
+ Vedeu.interface('int2_lin1_str3_1') do
153
+ y 3
154
+ x 3
155
+ width 30
156
+ height 3
157
+ end
158
+ Vedeu.interface('int2_lin1_str3_2') do
159
+ y 6
160
+ x 6
161
+ width 30
162
+ height 3
163
+ end
157
164
  json = File.read('test/support/json/int2_lin1_str3.json')
158
165
  attributes = JSON.load(json, nil, symbolize_names: true)
159
166
 
@@ -170,8 +177,18 @@ module Vedeu
170
177
  end
171
178
 
172
179
  it 'returns the stringified content for multiple interfaces, multiple lines, single stream' do
173
- InterfaceStore.create({ name: 'int2_lin2_str1_1', geometry: { y: 3, x: 3, width: 15, height: 3 } })
174
- InterfaceStore.create({ name: 'int2_lin2_str1_2', geometry: { y: 6, x: 6, width: 15, height: 3 } })
180
+ Vedeu.interface('int2_lin2_str1_1') do
181
+ y 3
182
+ x 3
183
+ width 15
184
+ height 3
185
+ end
186
+ Vedeu.interface('int2_lin2_str1_2') do
187
+ y 6
188
+ x 6
189
+ width 15
190
+ height 3
191
+ end
175
192
  json = File.read('test/support/json/int2_lin2_str1.json')
176
193
  attributes = JSON.load(json, nil, symbolize_names: true)
177
194
 
@@ -190,8 +207,18 @@ module Vedeu
190
207
  end
191
208
 
192
209
  it 'returns the stringified content for multiple interfaces, multiple lines, multiple streams' do
193
- InterfaceStore.create({ name: 'int2_lin2_str3_1', geometry: { y: 3, x: 3, width: 30, height: 3 } })
194
- InterfaceStore.create({ name: 'int2_lin2_str3_2', geometry: { y: 6, x: 6, width: 30, height: 3 } })
210
+ Vedeu.interface('int2_lin2_str3_1') do
211
+ y 3
212
+ x 3
213
+ width 30
214
+ height 3
215
+ end
216
+ Vedeu.interface('int2_lin2_str3_2') do
217
+ y 6
218
+ x 6
219
+ width 30
220
+ height 3
221
+ end
195
222
  json = File.read('test/support/json/int2_lin2_str3.json')
196
223
  attributes = JSON.load(json, nil, symbolize_names: true)
197
224
 
@@ -210,13 +237,32 @@ module Vedeu
210
237
  end
211
238
 
212
239
  it 'returns the stringified content for multiple interfaces, multiple lines, multiple streams, streams contain styles' do
213
- InterfaceStore.create({ name: 'int2_lin2_str3_styles_1', geometry: { y: 3, x: 3, width: 30, height: 3 } })
214
- InterfaceStore.create({ name: 'int2_lin2_str3_styles_2', geometry: { y: 6, x: 6, width: 30, height: 3 } })
240
+ Vedeu.interface('int2_lin2_str3_styles_1') do
241
+ y 3
242
+ x 3
243
+ width 30
244
+ height 3
245
+ end
246
+ Vedeu.interface('int2_lin2_str3_styles_2') do
247
+ y 6
248
+ x 6
249
+ width 30
250
+ height 3
251
+ end
215
252
  json = File.read('test/support/json/int2_lin2_str3_styles.json')
216
253
  attributes = JSON.load(json, nil, symbolize_names: true)
217
254
 
218
255
  Composition.new(attributes).to_s.must_equal(
219
- "\e[3;3H \e[3;3H\e[4;3H \e[4;3H\e[5;3H \e[5;3H\e[3;3H\e[38;5;16m\e[48;5;21mSome text...\e[38;5;226m\e[48;5;46m \e[38;5;231m\e[48;5;201mmore text...\e[4;3H\e[38;5;16m\e[48;5;21mSome text...\e[38;5;226m\e[48;5;46m \e[38;5;231m\e[48;5;201mmore text...\e[6;6H \e[6;6H\e[7;6H \e[7;6H\e[8;6H \e[8;6H\e[6;6H\e[38;5;16m\e[48;5;21mSome text...\e[38;5;226m\e[48;5;46m \e[38;5;231m\e[48;5;201mmore text...\e[7;6H\e[38;5;16m\e[48;5;21mSome text...\e[38;5;226m\e[48;5;46m \e[38;5;231m\e[48;5;201mmore text..."
256
+ "\e[3;3H \e[3;3H" \
257
+ "\e[4;3H \e[4;3H" \
258
+ "\e[5;3H \e[5;3H" \
259
+ "\e[3;3H\e[38;5;16m\e[48;5;21mSome text...\e[38;5;226m\e[48;5;46m \e[38;5;231m\e[48;5;201mmore text..." \
260
+ "\e[4;3H\e[38;5;16m\e[48;5;21mSome text...\e[38;5;226m\e[48;5;46m \e[38;5;231m\e[48;5;201mmore text..." \
261
+ "\e[6;6H \e[6;6H" \
262
+ "\e[7;6H \e[7;6H" \
263
+ "\e[8;6H \e[8;6H" \
264
+ "\e[6;6H\e[38;5;16m\e[48;5;21mSome text...\e[38;5;226m\e[48;5;46m \e[38;5;231m\e[48;5;201mmore text..." \
265
+ "\e[7;6H\e[38;5;16m\e[48;5;21mSome text...\e[38;5;226m\e[48;5;46m \e[38;5;231m\e[48;5;201mmore text..."
220
266
  )
221
267
  end
222
268
  end
@@ -55,6 +55,18 @@ module Vedeu
55
55
  end
56
56
  end
57
57
 
58
+ describe '#north' do
59
+ it 'returns the top minus the value when the value is provided' do
60
+ geometry = Geometry.new({ height: 6, width: 18, y: 4 })
61
+ geometry.north(2).must_equal(2)
62
+ end
63
+
64
+ it 'returns the top minus 1 without a value' do
65
+ geometry = Geometry.new({ height: 6, width: 18, y: 4 })
66
+ geometry.north.must_equal(3)
67
+ end
68
+ end
69
+
58
70
  describe '#left' do
59
71
  it 'centred is true' do
60
72
  console = IO.console
@@ -75,6 +87,18 @@ module Vedeu
75
87
  end
76
88
  end
77
89
 
90
+ describe '#west' do
91
+ it 'returns the left minus the value when the value is provided' do
92
+ geometry = Geometry.new({ height: 6, width: 18, x: 7 })
93
+ geometry.west(2).must_equal(5)
94
+ end
95
+
96
+ it 'returns the left minus 1 without a value' do
97
+ geometry = Geometry.new({ height: 6, width: 18, x: 7 })
98
+ geometry.west.must_equal(6)
99
+ end
100
+ end
101
+
78
102
  describe '#bottom' do
79
103
  it 'centred is true' do
80
104
  console = IO.console
@@ -95,6 +119,18 @@ module Vedeu
95
119
  end
96
120
  end
97
121
 
122
+ describe '#south' do
123
+ it 'returns the bottom plus the value when the value is provided' do
124
+ geometry = Geometry.new({ height: 6, width: 18, y: 3 })
125
+ geometry.south(2).must_equal(11)
126
+ end
127
+
128
+ it 'returns the bottom plus 1 without a value' do
129
+ geometry = Geometry.new({ height: 6, width: 18, y: 3 })
130
+ geometry.south.must_equal(10)
131
+ end
132
+ end
133
+
98
134
  describe '#right' do
99
135
  it 'centred is true' do
100
136
  console = IO.console
@@ -115,6 +151,18 @@ module Vedeu
115
151
  end
116
152
  end
117
153
 
154
+ describe '#east' do
155
+ it 'returns the right plus the value when the value is provided' do
156
+ geometry = Geometry.new({ height: 6, width: 18, x: 7 })
157
+ geometry.east(2).must_equal(27)
158
+ end
159
+
160
+ it 'returns the right plus 1 without a value' do
161
+ geometry = Geometry.new({ height: 6, width: 18, x: 7 })
162
+ geometry.east.must_equal(26)
163
+ end
164
+ end
165
+
118
166
  describe '#position' do
119
167
  it 'centred is true' do
120
168
  console = IO.console
@@ -6,6 +6,7 @@ module Vedeu
6
6
  let(:interface) {
7
7
  Interface.new({
8
8
  name: '#initialize',
9
+ group: 'my_group',
9
10
  lines: [],
10
11
  colour: {
11
12
  foreground: '#ff0000',
@@ -25,6 +26,10 @@ module Vedeu
25
26
  interface.name.must_equal('#initialize')
26
27
  end
27
28
 
29
+ it 'has a name attribute' do
30
+ interface.group.must_equal('my_group')
31
+ end
32
+
28
33
  it 'has a lines attribute' do
29
34
  interface.lines.must_equal([])
30
35
  end
@@ -33,6 +38,14 @@ module Vedeu
33
38
  interface.colour.must_be_instance_of(Colour)
34
39
  end
35
40
 
41
+ it 'has a style attribute' do
42
+ interface.style.must_equal('')
43
+ end
44
+
45
+ it 'has a geometry attribute' do
46
+ interface.geometry.must_be_instance_of(Geometry)
47
+ end
48
+
36
49
  it 'has a current attribute' do
37
50
  interface.current.must_equal("\e[1;1H#initialize")
38
51
  end
@@ -42,9 +55,12 @@ module Vedeu
42
55
  Interface.new({ cursor: false }).cursor.must_equal(false)
43
56
  end
44
57
 
58
+ it 'has a delay attribute' do
59
+ interface.delay.must_equal(0.0)
60
+ end
61
+
45
62
  describe '#enqueue' do
46
63
  it 'delegates to the Queue class to enqueue itself' do
47
- Queue.reset
48
64
  interface = Interface.new({
49
65
  name: 'Interface#enqueue',
50
66
  geometry: {
@@ -93,9 +109,9 @@ module Vedeu
93
109
  attributes = {
94
110
  name: '#refresh',
95
111
  lines: [
96
- { streams: '#refresh' },
97
- { streams: '#refresh' },
98
- { streams: '#refresh' }
112
+ { streams: [{ text: '#refresh' }] },
113
+ { streams: [{ text: '#refresh' }] },
114
+ { streams: [{ text: '#refresh' }] }
99
115
  ],
100
116
  colour: {
101
117
  foreground: '#ff0000',
@@ -107,7 +123,7 @@ module Vedeu
107
123
  }
108
124
  }
109
125
  interface = Interface.new(attributes)
110
- interface.enqueue
126
+ diode = interface.enqueue
111
127
 
112
128
  Terminal.stub(:output, nil) do
113
129
  interface.refresh.must_equal(
@@ -159,7 +175,7 @@ module Vedeu
159
175
  end
160
176
 
161
177
  describe '#to_s' do
162
- it 'returns an String' do
178
+ it 'returns an string' do
163
179
  Interface.new({
164
180
  name: '#to_s',
165
181
  lines: [],
@@ -168,14 +184,14 @@ module Vedeu
168
184
  background: '#000000'
169
185
  },
170
186
  geometry: {
171
- width: 3,
187
+ width: 9,
172
188
  height: 3
173
189
  }
174
190
  }).to_s.must_equal(
175
191
  "\e[38;5;196m\e[48;5;16m" \
176
- "\e[1;1H \e[1;1H" \
177
- "\e[2;1H \e[2;1H" \
178
- "\e[3;1H \e[3;1H"
192
+ "\e[1;1H \e[1;1H" \
193
+ "\e[2;1H \e[2;1H" \
194
+ "\e[3;1H \e[3;1H"
179
195
  )
180
196
  end
181
197
  end