vedeu 0.1.4 → 0.1.5

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
  SHA1:
3
- metadata.gz: 7c4536e9fdde25f748de839f9a992e805b97f308
4
- data.tar.gz: 0a951cfde4234e720dcbdf943bf6f91c2b95dc41
3
+ metadata.gz: 2ef9364bd8562905d44a580a1f6b9f0acb3820d6
4
+ data.tar.gz: 30849fc7340fbb1ab220e24834580bd0941e8545
5
5
  SHA512:
6
- metadata.gz: f92b9b9b3bdccb7a55df3aedddde6bd9ae67a88925c1c1584d274ebcdab52a98624377968ff91f8a1f61c854567cd363e848cb67d356665e4bf7be02b07ff8b2
7
- data.tar.gz: 839cbdab1f3b684e35874975b2dc6c2052487edb94cdbef65aa12c72282ab679b711fac9dc11743a85849d1e817e4992143760509541e1adaac65cc3ed283d8e
6
+ metadata.gz: 461240de809a3abd145c22eaea50bc32b5dfe56f41c16c35c407b6e13493f4d16e431d0fb9f2fdbb5111f847287d771f39fb7a239fe8f6c24f47677b930c4f44
7
+ data.tar.gz: e823ea6b126ea32dd259fdef8a58c3cd6c59c3a07bcaa8d51cb52bef0847226dbf69890d9b0e4c6ec064c5feffaaee17e48ccd91ea417dff7faf14579c5d2d83
data/deps.md CHANGED
@@ -50,7 +50,7 @@ Interface
50
50
  InterfaceCollection
51
51
  InterfaceStore
52
52
 
53
- InterfaceTemplate
53
+ API::Interface
54
54
  Geometry
55
55
  Interface
56
56
  InterfaceStore
@@ -129,7 +129,7 @@ Menu - orphaned
129
129
  Grouped
130
130
  ----------------------------------------------------------------------
131
131
 
132
- InterfaceTemplate
132
+ API::Interface
133
133
  Interface
134
134
  Geometry
135
135
  InterfaceStore
data/lib/vedeu.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  require 'vedeu/instrumentation'
2
- require 'vedeu/support/interface_template'
2
+ require 'vedeu/api/interface'
3
3
  require 'vedeu/support/events'
4
4
  require 'vedeu/support/interface_store'
5
-
5
+ require 'vedeu/api/view'
6
6
  require 'vedeu/models/geometry'
7
7
  require 'vedeu/support/menu'
8
8
  require 'vedeu/output/view'
@@ -20,7 +20,7 @@ module Vedeu
20
20
 
21
21
  module API
22
22
  def interface(name, &block)
23
- InterfaceTemplate.save(name, &block)
23
+ Interface.save(name, &block)
24
24
  end
25
25
 
26
26
  def on(name, delay = 0, &block)
@@ -33,9 +33,13 @@ module Vedeu
33
33
  end
34
34
  alias_method :run, :trigger
35
35
 
36
- def view(name)
36
+ def with(name, &block)
37
37
  InterfaceStore.query(name)
38
38
  end
39
+
40
+ def view(name = '', &block)
41
+ Vedeu::API::View.build(name, &block)
42
+ end
39
43
  end
40
44
 
41
45
  def self.events
@@ -0,0 +1,36 @@
1
+ module Vedeu
2
+ module API
3
+ class Base
4
+ def self.build(attributes = {}, &block)
5
+ new(attributes, &block).build
6
+ end
7
+
8
+ def initialize(attributes, &block)
9
+ @attributes = attributes
10
+
11
+ self.instance_eval(&block) if block_given?
12
+ end
13
+
14
+ def colour(*args)
15
+ if args.is_a?(Array) && args.size == 2
16
+ attributes[:colour] = { background: args.first, foreground: args.last }
17
+
18
+ elsif args.is_a?(Array) && args.size == 1 && args.first.is_a?(Hash)
19
+ attributes[:colour] = args.first
20
+
21
+ else
22
+ attributes[:colour] = {}
23
+
24
+ end
25
+ end
26
+
27
+ def style(values = [], &block)
28
+ if block_given?
29
+ attributes[:streams] << API::Stream.build({ style: [values] }, &block)
30
+ else
31
+ [values].flatten.each { |value| attributes[:style] << value }
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,76 @@
1
+ require 'vedeu/models/geometry'
2
+ require 'vedeu/support/interface_store'
3
+ require 'vedeu/support/terminal'
4
+
5
+ module Vedeu
6
+ module API
7
+ InvalidHeight = Class.new(StandardError)
8
+ InvalidWidth = Class.new(StandardError)
9
+ XOutOfBounds = Class.new(StandardError)
10
+ YOutOfBounds = Class.new(StandardError)
11
+
12
+ class Interface
13
+ def self.save(name, &block)
14
+ new(name).save(&block)
15
+ end
16
+
17
+ def initialize(name)
18
+ @name = name.to_s
19
+ end
20
+
21
+ def save(&block)
22
+ self.instance_eval(&block) if block_given?
23
+
24
+ InterfaceStore.create(attributes)
25
+ end
26
+
27
+ private
28
+
29
+ attr_reader :name
30
+
31
+ def x(value)
32
+ fail XOutOfBounds if x_out_of_bounds?(value)
33
+
34
+ attributes[:geometry][:x] = value
35
+ end
36
+
37
+ def y(value)
38
+ fail YOutOfBounds if y_out_of_bounds?(value)
39
+
40
+ attributes[:geometry][:y] = value
41
+ end
42
+
43
+ def width(value)
44
+ fail InvalidWidth if x_out_of_bounds?(value)
45
+
46
+ attributes[:geometry][:width] = value
47
+ end
48
+
49
+ def height(value)
50
+ fail InvalidHeight if y_out_of_bounds?(value)
51
+
52
+ attributes[:geometry][:height] = value
53
+ end
54
+
55
+ def centred(value)
56
+ attributes[:geometry][:centred] = value
57
+ end
58
+
59
+ def attributes
60
+ @attributes ||= { name: name, geometry: {} }
61
+ end
62
+
63
+ def method_missing(method_name, arg, &block)
64
+ attributes[method_name] = arg
65
+ end
66
+
67
+ def y_out_of_bounds?(value)
68
+ value < 1 || value > Terminal.height
69
+ end
70
+
71
+ def x_out_of_bounds?(value)
72
+ value < 1 || value > Terminal.width
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,41 @@
1
+ require 'vedeu/api/base'
2
+ require 'vedeu/api/stream'
3
+
4
+ module Vedeu
5
+ module API
6
+ class Line < Base
7
+ def build
8
+ attributes
9
+ end
10
+
11
+ def width(value)
12
+ #attributes[:streams][:width] = value
13
+ #attributes[:streams] << API::Stream.build({ width: value })
14
+ end
15
+
16
+ def align(value)
17
+ attributes[:align] = value
18
+ end
19
+
20
+ def stream(&block)
21
+ attributes[:streams] << API::Stream.build(&block)
22
+ end
23
+
24
+ def text(value)
25
+ attributes[:streams] << { text: value }
26
+ end
27
+
28
+ def foreground(value = '', &block)
29
+ attributes[:streams] << API::Stream.build({ colour: { foreground: value } }, &block)
30
+ end
31
+
32
+ def background(value = '', &block)
33
+ attributes[:streams] << API::Stream.build({ colour: { background: value } }, &block)
34
+ end
35
+
36
+ def attributes
37
+ @_attributes ||= { colour: {}, style: [], streams: [] }.merge!(@attributes)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,19 @@
1
+ require 'vedeu/api/base'
2
+
3
+ module Vedeu
4
+ module API
5
+ class Stream < Base
6
+ def build
7
+ attributes
8
+ end
9
+
10
+ def text(value)
11
+ attributes[:text] = value
12
+ end
13
+
14
+ def attributes
15
+ @_attributes ||= { colour: {}, style: [], text: '' }.merge!(@attributes)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,39 @@
1
+ require 'vedeu/api/base'
2
+ require 'vedeu/api/line'
3
+ require 'vedeu/support/interface_store'
4
+
5
+ module Vedeu
6
+ module API
7
+ InterfaceNotSpecified = Class.new(StandardError)
8
+
9
+ class View
10
+ def self.build(name = '', &block)
11
+ new(name).build(&block)
12
+ end
13
+
14
+ def initialize(name = '')
15
+ fail Vedeu::API::InterfaceNotSpecified if name.nil? || name.empty?
16
+
17
+ @name = name.to_s
18
+ end
19
+
20
+ def build(&block)
21
+ self.instance_eval(&block) if block_given?
22
+
23
+ attributes
24
+ end
25
+
26
+ def line(&block)
27
+ attributes[:lines] << API::Line.build(&block)
28
+ end
29
+
30
+ def attributes
31
+ @_attributes ||= { name: name, lines: [] }
32
+ end
33
+
34
+ def name
35
+ return @name if InterfaceStore.query(@name)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,11 +1,11 @@
1
1
  module Vedeu
2
2
  class MenuParser
3
- def self.parse(menu)
4
- new(menu).parse
3
+ def self.parse(args)
4
+ new(args).parse
5
5
  end
6
6
 
7
- def initialize(menu)
8
- @menu = menu
7
+ def initialize(args)
8
+ @args = args
9
9
  end
10
10
 
11
11
  def parse
@@ -14,7 +14,7 @@ module Vedeu
14
14
 
15
15
  private
16
16
 
17
- attr_reader :menu
17
+ attr_reader :args
18
18
 
19
19
  def interface
20
20
  { name: name, lines: lines }
@@ -41,11 +41,11 @@ module Vedeu
41
41
  end
42
42
 
43
43
  def items
44
- menu.last
44
+ args.last
45
45
  end
46
46
 
47
47
  def name
48
- menu.first
48
+ args.first
49
49
  end
50
50
  end
51
51
  end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ require 'vedeu/api/line'
4
+ require 'vedeu/api/interface'
5
+ require 'vedeu/support/interface_store'
6
+
7
+ module Vedeu
8
+ module API
9
+ describe Base do
10
+ before do
11
+ InterfaceStore.reset
12
+ Interface.save('testing_view') do
13
+ width 80
14
+ height 25
15
+ x 1
16
+ y 1
17
+ colour foreground: '#ffffff', background: '#000000'
18
+ centred false
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,77 @@
1
+ require 'test_helper'
2
+ require 'vedeu/api/interface'
3
+
4
+ module Vedeu
5
+ module API
6
+ describe Interface do
7
+ interface = Interface.new('widget')
8
+
9
+ it 'creates and stores a new interface' do
10
+ interface.save.must_be_instance_of(Vedeu::Interface)
11
+ end
12
+
13
+ it 'allows interfaces to share behaviour' do
14
+ IO.console.stub :winsize, [10, 40] do
15
+ main = Interface.save('main') do
16
+ colour foreground: '#ff0000', background: '#000000'
17
+ cursor false
18
+ centred true
19
+ width 10
20
+ height 2
21
+ end
22
+ status = Interface.save('status') do
23
+ colour foreground: 'aadd00', background: '#4040cc'
24
+ cursor true
25
+ centred true
26
+ width 10
27
+ height 1
28
+ y main.geometry.bottom
29
+ x main.geometry.left
30
+ end
31
+
32
+ main.geometry.left.must_equal(15)
33
+ main.geometry.top.must_equal(4)
34
+ status.geometry.left.must_equal(15)
35
+ status.geometry.top.must_equal(5)
36
+ end
37
+ end
38
+
39
+ it 'raises an exception when the value is out of bounds' do
40
+ proc { interface.save { x 0 } }.must_raise(XOutOfBounds)
41
+ end
42
+
43
+ it 'raises an exception when the value is out of bounds' do
44
+ proc { interface.save { x 999 } }.must_raise(XOutOfBounds)
45
+ end
46
+
47
+ it 'raises an exception when the value is out of bounds' do
48
+ proc { interface.save { y 0 } }.must_raise(YOutOfBounds)
49
+ end
50
+
51
+ it 'raises an exception when the value is out of bounds' do
52
+ proc { interface.save { y 999 } }.must_raise(YOutOfBounds)
53
+ end
54
+
55
+ it 'raises an exception when the value is out of bounds' do
56
+ proc { interface.save { width 0 } }.must_raise(InvalidWidth)
57
+ end
58
+
59
+ it 'raises an exception when the value is out of bounds' do
60
+ proc { interface.save { width 999 } }.must_raise(InvalidWidth)
61
+ end
62
+
63
+ it 'raises an exception when the value is out of bounds' do
64
+ proc { interface.save { height 0 } }.must_raise(InvalidHeight)
65
+ end
66
+
67
+ it 'raises an exception when the value is out of bounds' do
68
+ proc { interface.save { height 999 } }.must_raise(InvalidHeight)
69
+ end
70
+
71
+ it 'should have a valid spec, please write one.' do
72
+ skip
73
+ interface = Interface.new('widget')
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ require 'vedeu/api/line'
4
+ require 'vedeu/api/interface'
5
+ require 'vedeu/support/interface_store'
6
+
7
+ module Vedeu
8
+ module API
9
+ describe Line do
10
+ before do
11
+ InterfaceStore.reset
12
+ Interface.save('testing_view') do
13
+ width 80
14
+ height 25
15
+ x 1
16
+ y 1
17
+ colour foreground: '#ffffff', background: '#000000'
18
+ centred false
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ require 'vedeu/api/line'
4
+ require 'vedeu/api/interface'
5
+ require 'vedeu/support/interface_store'
6
+
7
+ module Vedeu
8
+ module API
9
+ describe Stream do
10
+ before do
11
+ InterfaceStore.reset
12
+ Interface.save('testing_view') do
13
+ width 80
14
+ height 25
15
+ x 1
16
+ y 1
17
+ colour foreground: '#ffffff', background: '#000000'
18
+ centred false
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,478 @@
1
+ require 'test_helper'
2
+
3
+ require 'vedeu/api/view'
4
+ require 'vedeu'
5
+
6
+ module Vedeu
7
+ module API
8
+ describe View do
9
+ before do
10
+ InterfaceStore.reset
11
+ Interface.save('testing_view') do
12
+ width 80
13
+ height 25
14
+ x 1
15
+ y 1
16
+ colour foreground: '#ffffff', background: '#000000'
17
+ centred false
18
+ end
19
+ end
20
+
21
+ it 'builds a basic view' do
22
+ Vedeu.view 'testing_view' do
23
+ line do
24
+ text '1. A line of text.'
25
+ text '2. Another line of text.'
26
+ end
27
+ end.must_equal(
28
+ {
29
+ name: 'testing_view',
30
+ lines: [
31
+ {
32
+ colour: {},
33
+ style: [],
34
+ streams: [
35
+ {
36
+ text: '1. A line of text.',
37
+ }, {
38
+ text: '2. Another line of text.',
39
+ }
40
+ ]
41
+ }
42
+ ]
43
+ }
44
+ )
45
+ end
46
+
47
+ it 'handles coloured lines' do
48
+ Vedeu.view 'testing_view' do
49
+ line do
50
+ text '1. Line without colours.'
51
+ end
52
+ end.must_equal(
53
+ {
54
+ name: 'testing_view',
55
+ lines: [
56
+ {
57
+ colour: {},
58
+ style: [],
59
+ streams: [{ text: '1. Line without colours.' }]
60
+ }
61
+ ]
62
+ }
63
+ )
64
+ end
65
+
66
+ it 'handles coloured lines' do
67
+ Vedeu.view 'testing_view' do
68
+ line do
69
+ colour '#ff0000', '#ffff00'
70
+ text '2. Line with colours.'
71
+ end
72
+ end.must_equal(
73
+ {
74
+ name: 'testing_view',
75
+ lines: [
76
+ {
77
+ colour: { background: '#ff0000', foreground: '#ffff00' },
78
+ style: [],
79
+ streams: [{ text: '2. Line with colours.' }]
80
+ }
81
+ ]
82
+ }
83
+ )
84
+ end
85
+
86
+ it 'handles coloured lines' do
87
+ Vedeu.view 'testing_view' do
88
+ line do
89
+ colour foreground: '#a7ff00', background: '#005700'
90
+ text '3. Line with explicit colour declaration.'
91
+ end
92
+ end.must_equal(
93
+ {
94
+ name: 'testing_view',
95
+ lines: [
96
+ {
97
+ colour: { background: '#005700', foreground: '#a7ff00' },
98
+ style: [],
99
+ streams: [{ text: '3. Line with explicit colour declaration.' }]
100
+ }
101
+ ]
102
+ }
103
+ )
104
+ end
105
+
106
+ it 'handles coloured lines' do
107
+ Vedeu.view 'testing_view' do
108
+ line do # actually uses streams
109
+ foreground '#ff00ff' do
110
+ text '4. Line with only foreground set.'
111
+ end
112
+ end
113
+ end.must_equal(
114
+ {
115
+ name: 'testing_view',
116
+ lines: [
117
+ {
118
+ colour: {},
119
+ style: [],
120
+ streams: [{
121
+ colour: { foreground: '#ff00ff' },
122
+ style: [],
123
+ text: '4. Line with only foreground set.'
124
+ }]
125
+ }
126
+ ]
127
+ }
128
+ )
129
+ end
130
+
131
+ it 'handles coloured lines' do
132
+ Vedeu.view 'testing_view' do
133
+ line do # actually uses streams
134
+ background '#00ff00' do
135
+ text '5. Line with only background set.'
136
+ end
137
+ end
138
+ end.must_equal(
139
+ {
140
+ name: 'testing_view',
141
+ lines: [
142
+ {
143
+ colour: {},
144
+ style: [],
145
+ streams: [{
146
+ colour: { background: '#00ff00' },
147
+ style: [],
148
+ text: '5. Line with only background set.'
149
+ }]
150
+ }
151
+ ]
152
+ }
153
+ )
154
+ end
155
+
156
+ it 'handles styles' do
157
+ Vedeu.view 'testing_view' do
158
+ line do
159
+ style 'normal'
160
+ text '1. Line with a normal style.'
161
+ end
162
+ end.must_equal(
163
+ {
164
+ name: 'testing_view',
165
+ lines: [
166
+ {
167
+ colour: {},
168
+ style: ['normal'],
169
+ streams: [{
170
+ text: '1. Line with a normal style.'
171
+ }]
172
+ }
173
+ ]
174
+ }
175
+ )
176
+ end
177
+
178
+ it 'handles styles' do
179
+ Vedeu.view 'testing_view' do
180
+ line do
181
+ style 'underline'
182
+ text '2. Line with an underline style.'
183
+ end
184
+ end.must_equal(
185
+ {
186
+ name: 'testing_view',
187
+ lines: [
188
+ {
189
+ colour: {},
190
+ style: ['underline'],
191
+ streams: [{
192
+ text: '2. Line with an underline style.'
193
+ }]
194
+ }
195
+ ]
196
+ }
197
+ )
198
+ end
199
+
200
+ it 'handles styles' do
201
+ Vedeu.view 'testing_view' do
202
+ line do # actually uses streams
203
+ style 'normal' do
204
+ text '3. Line with a normal style.'
205
+ end
206
+ end
207
+ end.must_equal(
208
+ {
209
+ name: 'testing_view',
210
+ lines: [
211
+ {
212
+ colour: {},
213
+ style: [],
214
+ streams: [{
215
+ colour: {},
216
+ style: ['normal'],
217
+ text: '3. Line with a normal style.'
218
+ }]
219
+ }
220
+ ]
221
+ }
222
+ )
223
+ end
224
+
225
+ it 'handles styles' do
226
+ Vedeu.view 'testing_view' do
227
+ line do # actually uses streams
228
+ style 'underline' do
229
+ text '4. Line with an underlined style.'
230
+ end
231
+ end
232
+ end.must_equal(
233
+ {
234
+ name: 'testing_view',
235
+ lines: [
236
+ {
237
+ colour: {},
238
+ style: [],
239
+ streams: [{
240
+ colour: {},
241
+ style: ['underline'],
242
+ text: '4. Line with an underlined style.'
243
+ }]
244
+ }
245
+ ]
246
+ }
247
+ )
248
+ end
249
+
250
+ it 'handles streams, which means sub-line colours and styles' do
251
+ Vedeu.view 'testing_view' do
252
+ line do
253
+ stream do
254
+ text 'A stream of text.'
255
+ end
256
+ end
257
+ end.must_equal(
258
+ {
259
+ name: 'testing_view',
260
+ lines: [
261
+ {
262
+ colour: {},
263
+ style: [],
264
+ streams: [
265
+ {
266
+ colour: {},
267
+ style: [],
268
+ text: 'A stream of text.'
269
+ }
270
+ ]
271
+ }
272
+ ]
273
+ }
274
+ )
275
+ end
276
+
277
+ it 'handles streams, which means sub-line colours and styles' do
278
+ Vedeu.view 'testing_view' do
279
+ line do
280
+ stream do # Stream is an 'explicit declaration'.
281
+ # We don't need it unless we want to add colours and styles.
282
+ # See below.
283
+ text '1. Two streams of text, these will be'
284
+ end
285
+
286
+ stream do
287
+ text ' on the same line- note the space.'
288
+ end
289
+ end
290
+ end.must_equal(
291
+ {
292
+ name: 'testing_view',
293
+ lines: [
294
+ {
295
+ colour: {},
296
+ style: [],
297
+ streams: [
298
+ {
299
+ colour: {},
300
+ style: [],
301
+ text: '1. Two streams of text, these will be'
302
+ }, {
303
+ colour: {},
304
+ style: [],
305
+ text: ' on the same line- note the space.'
306
+ }
307
+ ]
308
+ }
309
+ ]
310
+ }
311
+ )
312
+ end
313
+
314
+ it 'handles streams, which means sub-line colours and styles' do
315
+ Vedeu.view 'testing_view' do
316
+ line do
317
+ stream do
318
+ text '2. Streams can have'
319
+ end
320
+
321
+ stream do
322
+ colour foreground: '#ff0000', background: '#00ff00'
323
+ text ' colours too.'
324
+ end
325
+ end
326
+ end.must_equal(
327
+ {
328
+ name: 'testing_view',
329
+ lines: [
330
+ {
331
+ colour: {},
332
+ style: [],
333
+ streams: [
334
+ {
335
+ colour: {},
336
+ style: [],
337
+ text: '2. Streams can have'
338
+ }, {
339
+ colour: {
340
+ foreground: '#ff0000',
341
+ background: '#00ff00'
342
+ },
343
+ style: [],
344
+ text: ' colours too.'
345
+ }
346
+ ]
347
+ }
348
+ ]
349
+ }
350
+ )
351
+ end
352
+
353
+ it 'handles streams, which means sub-line colours and styles' do
354
+ Vedeu.view 'testing_view' do
355
+ line do
356
+ stream do
357
+ text '3. Streams can have'
358
+ end
359
+
360
+ stream do
361
+ style 'underline'
362
+ text ' styles too.'
363
+ end
364
+ end
365
+ end.must_equal(
366
+ {
367
+ name: 'testing_view',
368
+ lines: [
369
+ {
370
+ colour: {},
371
+ style: [],
372
+ streams: [
373
+ {
374
+ colour: {},
375
+ style: [],
376
+ text: '3. Streams can have'
377
+ }, {
378
+ colour: {},
379
+ style: ['underline'],
380
+ text: ' styles too.'
381
+ }
382
+ ]
383
+ }
384
+ ]
385
+ }
386
+ )
387
+ end
388
+
389
+ it 'handles alignment' do
390
+ skip
391
+ Vedeu.view 'testing_view' do
392
+ line do
393
+ width 80
394
+ text 'This is aligned left, and padded with spaces.'
395
+ end
396
+ end.must_equal(
397
+ {
398
+ name: 'testing_view',
399
+ lines: [{
400
+ colour: {},
401
+ style: [],
402
+ streams: [{
403
+ width: 80,
404
+ text: 'This is aligned left, and padded with spaces.'
405
+ }]
406
+ }]
407
+ }
408
+ )
409
+ end
410
+
411
+ it 'handles alignment' do
412
+ skip
413
+ Vedeu.view 'testing_view' do
414
+ line do
415
+ width 80
416
+ align :left # explicit
417
+ text 'This is aligned left, and padded with spaces.'
418
+ end
419
+ end.must_equal(
420
+ {
421
+ name: 'testing_view',
422
+ lines: [{
423
+ streams: [{
424
+ width: 80,
425
+ align: :left,
426
+ text: 'This is aligned left, and padded with spaces.'
427
+ }]
428
+ }]
429
+ }
430
+ )
431
+ end
432
+
433
+ it 'handles alignment' do
434
+ skip
435
+ Vedeu.view 'testing_view' do
436
+ line do
437
+ width 80
438
+ align :centre
439
+ text 'This is aligned centrally, and padded with spaces.'
440
+ end
441
+ end.must_equal(
442
+ {
443
+ name: 'testing_view',
444
+ lines: [{
445
+ streams: [{
446
+ width: 80,
447
+ align: :centre,
448
+ text: 'This is aligned right, and padded with spaces.'
449
+ }]
450
+ }]
451
+ }
452
+ )
453
+ end
454
+
455
+ it 'handles alignment' do
456
+ skip
457
+ Vedeu.view 'testing_view' do
458
+ line do
459
+ width 80
460
+ align :right
461
+ text 'This is aligned right, and padded with spaces.'
462
+ end
463
+ end.must_equal(
464
+ {
465
+ name: 'testing_view',
466
+ lines: [{
467
+ streams: [{
468
+ width: 80,
469
+ align: :right,
470
+ text: 'This is aligned right, and padded with spaces.'
471
+ }]
472
+ }]
473
+ }
474
+ )
475
+ end
476
+ end
477
+ end
478
+ end
@@ -1,9 +1,46 @@
1
1
  require 'test_helper'
2
+ require 'vedeu/support/menu'
2
3
  require 'vedeu/output/menu_parser'
3
4
 
4
5
  module Vedeu
5
6
  describe MenuParser do
6
7
  describe '.parse' do
8
+ it 'returns an interface' do
9
+ items = [
10
+ [false, true, 'Hydrogen'],
11
+ [true, false, 'Helium'],
12
+ [false, false, 'Lithium'],
13
+ [true, true, 'Beryllium']
14
+ ]
15
+ args = ['dummy', items]
16
+ parser = MenuParser.parse(args)
17
+ parser.must_equal(
18
+ {
19
+ interfaces: {
20
+ name: 'dummy',
21
+ lines: [
22
+ {
23
+ streams: {
24
+ text: ' > Hydrogen'
25
+ }
26
+ }, {
27
+ streams: {
28
+ text: '* Helium'
29
+ }
30
+ }, {
31
+ streams: {
32
+ text: ' Lithium'
33
+ }
34
+ }, {
35
+ streams: {
36
+ text: '*> Beryllium'
37
+ }
38
+ }
39
+ ]
40
+ }
41
+ }
42
+ )
43
+ end
7
44
  end
8
45
  end
9
46
  end
@@ -46,6 +46,26 @@ module Vedeu
46
46
  })
47
47
  end
48
48
 
49
+ it 'returns a Hash when the output is content is a Hash' do
50
+ RawParser.parse({ dummy: [{ streams: { text: 'Some content' } }] })
51
+ .must_equal(
52
+ {
53
+ interfaces: [
54
+ {
55
+ name: 'dummy',
56
+ lines: [
57
+ {
58
+ streams: {
59
+ text: 'Some content'
60
+ }
61
+ }
62
+ ]
63
+ }
64
+ ]
65
+ }
66
+ )
67
+ end
68
+
49
69
  it 'returns a Hash when the output is empty' do
50
70
  RawParser.parse({}).must_equal({ interfaces: [] })
51
71
  end
@@ -12,21 +12,21 @@ module Vedeu
12
12
  describe '.run' do
13
13
  end
14
14
 
15
- describe '.view' do
16
- it 'returns the interface referenced by name' do
17
- Vedeu.interface 'Vedeu.view' do
18
- width 5
19
- height 5
20
- end
21
-
22
- Vedeu.view('Vedeu.view').must_be_instance_of(Interface)
23
- Vedeu.view('Vedeu.view').name.must_equal('Vedeu.view')
24
- end
25
-
26
- it 'raises an exception if the interface does not exist' do
27
- proc { Vedeu.view('unknown') }.must_raise(EntityNotFound)
28
- end
29
- end
15
+ # describe '.view' do
16
+ # it 'returns the interface referenced by name' do
17
+ # Vedeu.interface 'Vedeu.view' do
18
+ # width 5
19
+ # height 5
20
+ # end
21
+
22
+ # Vedeu.view('Vedeu.view').must_be_instance_of(Interface)
23
+ # Vedeu.view('Vedeu.view').name.must_equal('Vedeu.view')
24
+ # end
25
+
26
+ # it 'raises an exception if the interface does not exist' do
27
+ # proc { Vedeu.view('unknown') }.must_raise(EntityNotFound)
28
+ # end
29
+ # end
30
30
  end
31
31
  end
32
32
 
data/vedeu.gemspec CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'vedeu'
7
- spec.version = '0.1.4'
7
+ spec.version = '0.1.5'
8
8
  spec.authors = ['Gavin Laking']
9
9
  spec.email = ['gavinlaking@gmail.com']
10
10
  spec.summary = %q{A terminal case of wonderland.}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vedeu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gavin Laking
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-04 00:00:00.000000000 Z
11
+ date: 2014-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -185,6 +185,11 @@ files:
185
185
  - bin/vedeu
186
186
  - deps.md
187
187
  - lib/vedeu.rb
188
+ - lib/vedeu/api/base.rb
189
+ - lib/vedeu/api/interface.rb
190
+ - lib/vedeu/api/line.rb
191
+ - lib/vedeu/api/stream.rb
192
+ - lib/vedeu/api/view.rb
188
193
  - lib/vedeu/application.rb
189
194
  - lib/vedeu/configuration.rb
190
195
  - lib/vedeu/instrumentation.rb
@@ -214,12 +219,16 @@ files:
214
219
  - lib/vedeu/support/helpers.rb
215
220
  - lib/vedeu/support/input.rb
216
221
  - lib/vedeu/support/interface_store.rb
217
- - lib/vedeu/support/interface_template.rb
218
222
  - lib/vedeu/support/menu.rb
219
223
  - lib/vedeu/support/queue.rb
220
224
  - lib/vedeu/support/terminal.rb
221
225
  - lib/vedeu/support/wordwrap.rb
222
226
  - logs/.gitkeep
227
+ - test/lib/vedeu/api/base_test.rb
228
+ - test/lib/vedeu/api/interface_test.rb
229
+ - test/lib/vedeu/api/line_test.rb
230
+ - test/lib/vedeu/api/stream_test.rb
231
+ - test/lib/vedeu/api/view_test.rb
223
232
  - test/lib/vedeu/application_test.rb
224
233
  - test/lib/vedeu/configuration_test.rb
225
234
  - test/lib/vedeu/launcher_test.rb
@@ -248,7 +257,6 @@ files:
248
257
  - test/lib/vedeu/support/helpers_test.rb
249
258
  - test/lib/vedeu/support/input_test.rb
250
259
  - test/lib/vedeu/support/interface_store_test.rb
251
- - test/lib/vedeu/support/interface_template_test.rb
252
260
  - test/lib/vedeu/support/menu_test.rb
253
261
  - test/lib/vedeu/support/queue_test.rb
254
262
  - test/lib/vedeu/support/terminal_test.rb
@@ -303,6 +311,11 @@ signing_key:
303
311
  specification_version: 4
304
312
  summary: A terminal case of wonderland.
305
313
  test_files:
314
+ - test/lib/vedeu/api/base_test.rb
315
+ - test/lib/vedeu/api/interface_test.rb
316
+ - test/lib/vedeu/api/line_test.rb
317
+ - test/lib/vedeu/api/stream_test.rb
318
+ - test/lib/vedeu/api/view_test.rb
306
319
  - test/lib/vedeu/application_test.rb
307
320
  - test/lib/vedeu/configuration_test.rb
308
321
  - test/lib/vedeu/launcher_test.rb
@@ -331,7 +344,6 @@ test_files:
331
344
  - test/lib/vedeu/support/helpers_test.rb
332
345
  - test/lib/vedeu/support/input_test.rb
333
346
  - test/lib/vedeu/support/interface_store_test.rb
334
- - test/lib/vedeu/support/interface_template_test.rb
335
347
  - test/lib/vedeu/support/menu_test.rb
336
348
  - test/lib/vedeu/support/queue_test.rb
337
349
  - test/lib/vedeu/support/terminal_test.rb
@@ -1,74 +0,0 @@
1
- require 'vedeu/models/geometry'
2
- require 'vedeu/support/interface_store'
3
- require 'vedeu/support/terminal'
4
-
5
- module Vedeu
6
- InvalidHeight = Class.new(StandardError)
7
- InvalidWidth = Class.new(StandardError)
8
- XOutOfBounds = Class.new(StandardError)
9
- YOutOfBounds = Class.new(StandardError)
10
-
11
- class InterfaceTemplate
12
- def self.save(name, &block)
13
- new(name).save(&block)
14
- end
15
-
16
- def initialize(name)
17
- @name = name.to_s
18
- end
19
-
20
- def save(&block)
21
- self.instance_eval(&block)
22
-
23
- InterfaceStore.create(attributes)
24
- end
25
-
26
- def x(value)
27
- fail XOutOfBounds if x_out_of_bounds?(value)
28
-
29
- attributes[:geometry][:x] = value
30
- end
31
-
32
- def y(value)
33
- fail YOutOfBounds if y_out_of_bounds?(value)
34
-
35
- attributes[:geometry][:y] = value
36
- end
37
-
38
- def width(value)
39
- fail InvalidWidth if x_out_of_bounds?(value)
40
-
41
- attributes[:geometry][:width] = value
42
- end
43
-
44
- def height(value)
45
- fail InvalidHeight if y_out_of_bounds?(value)
46
-
47
- attributes[:geometry][:height] = value
48
- end
49
-
50
- def centred(value)
51
- attributes[:geometry][:centred] = value
52
- end
53
-
54
- private
55
-
56
- attr_reader :name
57
-
58
- def attributes
59
- @attributes ||= { name: name, geometry: {} }
60
- end
61
-
62
- def method_missing(method_name, arg, &block)
63
- attributes[method_name] = arg
64
- end
65
-
66
- def y_out_of_bounds?(value)
67
- value < 1 || value > Terminal.height
68
- end
69
-
70
- def x_out_of_bounds?(value)
71
- value < 1 || value > Terminal.width
72
- end
73
- end
74
- end
@@ -1,97 +0,0 @@
1
- require 'test_helper'
2
- require 'vedeu/support/interface_template'
3
-
4
- module Vedeu
5
- describe InterfaceTemplate do
6
- it 'creates and stores a new interface' do
7
- interface = InterfaceTemplate.save('widget') do
8
- colour foreground: '#ff0000', background: '#5f0000'
9
- cursor false
10
- width 10
11
- height 2
12
- centred true
13
- end
14
- interface.must_be_instance_of(Interface)
15
- end
16
-
17
- it 'allows interfaces to share behaviour' do
18
- IO.console.stub :winsize, [10, 40] do
19
- main = InterfaceTemplate.save('main') do
20
- colour foreground: '#ff0000', background: '#000000'
21
- cursor false
22
- centred true
23
- width 10
24
- height 2
25
- end
26
- status = InterfaceTemplate.save('status') do
27
- colour foreground: 'aadd00', background: '#4040cc'
28
- cursor true
29
- centred true
30
- width 10
31
- height 1
32
- y main.geometry.bottom
33
- x main.geometry.left
34
- end
35
-
36
- main.geometry.left.must_equal(15)
37
- main.geometry.top.must_equal(4)
38
- status.geometry.left.must_equal(15)
39
- status.geometry.top.must_equal(5)
40
- end
41
- end
42
-
43
- describe '#x' do
44
- interface = InterfaceTemplate.new('widget')
45
-
46
- it 'raises an exception when the value is out of bounds' do
47
- proc { interface.x(0) }.must_raise(XOutOfBounds)
48
- end
49
-
50
- it 'raises an exception when the value is out of bounds' do
51
- proc { interface.x(999) }.must_raise(XOutOfBounds)
52
- end
53
- end
54
-
55
- describe '#y' do
56
- interface = InterfaceTemplate.new('widget')
57
-
58
- it 'raises an exception when the value is out of bounds' do
59
- proc { interface.y(0) }.must_raise(YOutOfBounds)
60
- end
61
-
62
- it 'raises an exception when the value is out of bounds' do
63
- proc { interface.y(999) }.must_raise(YOutOfBounds)
64
- end
65
- end
66
-
67
- describe '#width' do
68
- interface = InterfaceTemplate.new('widget')
69
-
70
- it 'raises an exception when the value is out of bounds' do
71
- proc { interface.width(0) }.must_raise(InvalidWidth)
72
- end
73
-
74
- it 'raises an exception when the value is out of bounds' do
75
- proc { interface.width(999) }.must_raise(InvalidWidth)
76
- end
77
- end
78
-
79
- describe '#height' do
80
- interface = InterfaceTemplate.new('widget')
81
-
82
- it 'raises an exception when the value is out of bounds' do
83
- proc { interface.height(0) }.must_raise(InvalidHeight)
84
- end
85
-
86
- it 'raises an exception when the value is out of bounds' do
87
- proc { interface.height(999) }.must_raise(InvalidHeight)
88
- end
89
- end
90
-
91
- describe '#centred' do
92
- it 'should hav a valid spec, please write one.' do
93
- skip
94
- end
95
- end
96
- end
97
- end