vedeu 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -9
- data/docs/api.md +70 -42
- data/elements.txt +118 -0
- data/lib/vedeu.rb +14 -4
- data/lib/vedeu/api/api.rb +67 -24
- data/lib/vedeu/api/composition.rb +19 -0
- data/lib/vedeu/api/defined.rb +7 -0
- data/lib/vedeu/api/interface.rb +103 -75
- data/lib/vedeu/api/keymap.rb +62 -0
- data/lib/vedeu/api/menu.rb +3 -1
- data/lib/vedeu/configuration.rb +24 -6
- data/lib/vedeu/models/attributes/coercions.rb +18 -26
- data/lib/vedeu/models/attributes/colour_translator.rb +7 -7
- data/lib/vedeu/models/attributes/presentation.rb +12 -1
- data/lib/vedeu/models/geometry.rb +5 -1
- data/lib/vedeu/models/interface.rb +6 -47
- data/lib/vedeu/models/keymap.rb +66 -0
- data/lib/vedeu/models/line.rb +3 -1
- data/lib/vedeu/models/stream.rb +10 -1
- data/lib/vedeu/models/style.rb +10 -1
- data/lib/vedeu/output/compositor.rb +3 -0
- data/lib/vedeu/output/refresh.rb +16 -74
- data/lib/vedeu/output/render.rb +44 -17
- data/lib/vedeu/output/view.rb +3 -0
- data/lib/vedeu/repositories/buffers.rb +32 -42
- data/lib/vedeu/repositories/events.rb +8 -11
- data/lib/vedeu/repositories/focus.rb +15 -13
- data/lib/vedeu/repositories/groups.rb +20 -2
- data/lib/vedeu/repositories/interfaces.rb +22 -2
- data/lib/vedeu/repositories/keymap_validator.rb +104 -0
- data/lib/vedeu/repositories/keymaps.rb +239 -0
- data/lib/vedeu/repositories/menus.rb +12 -3
- data/lib/vedeu/support/common.rb +2 -2
- data/lib/vedeu/support/cursor.rb +3 -0
- data/lib/vedeu/support/event.rb +48 -7
- data/lib/vedeu/support/grid.rb +1 -1
- data/lib/vedeu/support/registrar.rb +66 -0
- data/lib/vedeu/support/trace.rb +71 -12
- data/test/lib/vedeu/api/api_test.rb +27 -9
- data/test/lib/vedeu/api/composition_test.rb +10 -0
- data/test/lib/vedeu/api/defined_test.rb +14 -0
- data/test/lib/vedeu/api/interface_test.rb +86 -85
- data/test/lib/vedeu/api/keymap_test.rb +61 -0
- data/test/lib/vedeu/configuration_test.rb +12 -0
- data/test/lib/vedeu/models/attributes/coercions_test.rb +3 -4
- data/test/lib/vedeu/models/interface_test.rb +0 -43
- data/test/lib/vedeu/models/keymap_test.rb +19 -0
- data/test/lib/vedeu/models/style_test.rb +10 -0
- data/test/lib/vedeu/output/refresh_test.rb +0 -12
- data/test/lib/vedeu/output/render_test.rb +51 -0
- data/test/lib/vedeu/repositories/buffers_test.rb +39 -12
- data/test/lib/vedeu/repositories/events_test.rb +6 -0
- data/test/lib/vedeu/repositories/focus_test.rb +12 -0
- data/test/lib/vedeu/repositories/keymap_validator_test.rb +81 -0
- data/test/lib/vedeu/repositories/keymaps_test.rb +254 -0
- data/test/lib/vedeu/support/common_test.rb +26 -0
- data/test/lib/vedeu/support/registrar_test.rb +68 -0
- data/vedeu.gemspec +1 -1
- metadata +18 -2
data/lib/vedeu/support/trace.rb
CHANGED
@@ -21,20 +21,63 @@ module Vedeu
|
|
21
21
|
@options = options
|
22
22
|
end
|
23
23
|
|
24
|
+
# Performs the trace operation. Building strings which include:
|
25
|
+
# - a count of classes registered with Vedeu,
|
26
|
+
# - the class name being traced,
|
27
|
+
# - the method name being traced,
|
28
|
+
# - any local variables belonging to the method.
|
29
|
+
#
|
24
30
|
# @return []
|
25
31
|
def trace
|
26
32
|
set_trace_func proc { |event, file, line, id, binding, classname|
|
27
|
-
if event == watched && classname.to_s
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
33
|
+
if event == watched && classes.include?(classname.to_s)
|
34
|
+
vars = variables(binding)
|
35
|
+
|
36
|
+
if vars.empty?
|
37
|
+
log_this(sprintf("(%s) %s %-25s #%-30s",
|
38
|
+
class_count, event, classname, id))
|
39
|
+
|
40
|
+
else
|
41
|
+
log_this(sprintf("(%s) %s %-25s #%-30s\n%s\n",
|
42
|
+
class_count, event, classname, id, vars))
|
43
|
+
|
44
|
+
end
|
32
45
|
end
|
33
|
-
}
|
46
|
+
} if trace?
|
34
47
|
end
|
35
48
|
|
36
49
|
private
|
37
50
|
|
51
|
+
# Writes the message to the log file.
|
52
|
+
#
|
53
|
+
# @api private
|
54
|
+
# @param message [String]
|
55
|
+
# @return [Boolean]
|
56
|
+
def log_this(message)
|
57
|
+
Vedeu::Log.logger.debug(message)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Provides inspection of the local variables set within the method being
|
61
|
+
# traced. Makes the log file extremely noisy, but very useful for hunting
|
62
|
+
# down bugs.
|
63
|
+
#
|
64
|
+
# @api private
|
65
|
+
# @param binding [Class]
|
66
|
+
# @return [String]
|
67
|
+
def variables(binding)
|
68
|
+
entries = []
|
69
|
+
binding.eval('local_variables').each do |var|
|
70
|
+
variable = var.to_s
|
71
|
+
value = binding.local_variable_get(var)
|
72
|
+
output = (value.is_a?(Proc)) ? '#<Proc:...' : value.inspect
|
73
|
+
|
74
|
+
entries << sprintf("\e[32m%57s %-10s\e[39m= \e[34m%s\e[39m", " ",
|
75
|
+
variable,
|
76
|
+
output)
|
77
|
+
end
|
78
|
+
entries.join("\n")
|
79
|
+
end
|
80
|
+
|
38
81
|
# @api private
|
39
82
|
# @return [String]
|
40
83
|
def watched
|
@@ -42,9 +85,9 @@ module Vedeu
|
|
42
85
|
end
|
43
86
|
|
44
87
|
# @api private
|
45
|
-
# @return [
|
46
|
-
def
|
47
|
-
options[:
|
88
|
+
# @return [Boolean]
|
89
|
+
def trace?
|
90
|
+
options[:trace]
|
48
91
|
end
|
49
92
|
|
50
93
|
# @api private
|
@@ -57,13 +100,29 @@ module Vedeu
|
|
57
100
|
# @return [Hash]
|
58
101
|
def defaults
|
59
102
|
{
|
103
|
+
trace: Vedeu::Configuration.trace?,
|
60
104
|
event: 'call',
|
61
|
-
klass: /^Vedeu::.*/
|
62
105
|
}
|
63
106
|
end
|
64
107
|
|
65
|
-
#
|
66
|
-
#
|
108
|
+
# Returns the number of Vedeu classes/modules. (Useful for debugging.)
|
109
|
+
#
|
110
|
+
# @api private
|
111
|
+
# @return [Fixnum]
|
112
|
+
def class_count
|
113
|
+
classes.size.to_s
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns all the classes defined within Vedeu.
|
117
|
+
#
|
118
|
+
# @api private
|
119
|
+
# @return [Set]
|
120
|
+
def classes
|
121
|
+
@_classes ||= Vedeu.constants.collect do |c|
|
122
|
+
Vedeu.const_get(c).to_s
|
123
|
+
end.to_set
|
124
|
+
end
|
67
125
|
end
|
68
126
|
# :nocov:
|
69
127
|
end
|
128
|
+
|
@@ -45,10 +45,22 @@ module Vedeu
|
|
45
45
|
end
|
46
46
|
|
47
47
|
describe '.keypress' do
|
48
|
-
before {
|
48
|
+
before { Vedeu::Focus.stubs(:current).returns('') }
|
49
49
|
|
50
|
-
it 'returns
|
51
|
-
Vedeu.keypress('k').must_equal(
|
50
|
+
it 'returns false when the key was not registered' do
|
51
|
+
Vedeu.keypress('k').must_equal(false)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '.keys' do
|
56
|
+
it 'returns an instance of API::Keymap' do
|
57
|
+
Vedeu.keys do
|
58
|
+
# ...
|
59
|
+
end.must_be_instance_of(API::Keymap)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'raises an exception when the block is not provided' do
|
63
|
+
proc { Vedeu.keys }.must_raise(InvalidSyntax)
|
52
64
|
end
|
53
65
|
end
|
54
66
|
|
@@ -73,12 +85,6 @@ module Vedeu
|
|
73
85
|
end
|
74
86
|
end
|
75
87
|
|
76
|
-
describe '.resize' do
|
77
|
-
it 'triggers the :_clear_ and :_refresh_ events' do
|
78
|
-
skip
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
88
|
describe '.menu' do
|
83
89
|
it 'creates and stores a new menu' do
|
84
90
|
Vedeu.menu('Vedeu.menu') do
|
@@ -87,6 +93,18 @@ module Vedeu
|
|
87
93
|
end
|
88
94
|
end
|
89
95
|
|
96
|
+
describe '.render' do
|
97
|
+
it 'directly writes the view buffer to the terminal' do
|
98
|
+
skip
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe '.resize' do
|
103
|
+
it 'triggers the :_clear_ and :_refresh_ events' do
|
104
|
+
skip
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
90
108
|
describe '.trigger' do
|
91
109
|
it 'triggers the specifed event and returns the collection of events' \
|
92
110
|
' which this trigger triggers' do
|
@@ -3,7 +3,17 @@ require 'test_helper'
|
|
3
3
|
module Vedeu
|
4
4
|
module API
|
5
5
|
describe Composition do
|
6
|
+
describe '.render' do
|
7
|
+
it 'directly writes a view buffer to the terminal' do
|
8
|
+
skip
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
|
6
13
|
describe '#view' do
|
14
|
+
it 'allows a single view to be defined' do
|
15
|
+
skip
|
16
|
+
end
|
7
17
|
end
|
8
18
|
|
9
19
|
describe '#views' do
|
@@ -44,6 +44,20 @@ module Vedeu
|
|
44
44
|
Defined.interfaces.must_equal(['hydrogen'])
|
45
45
|
end
|
46
46
|
end
|
47
|
+
|
48
|
+
describe '#menus' do
|
49
|
+
before { Vedeu::Menus.reset }
|
50
|
+
|
51
|
+
it 'returns no menus when none currently registered' do
|
52
|
+
Defined.menus.must_equal([])
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'returns all menus currently registered' do
|
56
|
+
Vedeu.menu('seaborgium') { items [:promethium, :astatine, :niobium] }
|
57
|
+
|
58
|
+
Defined.menus.must_equal(['seaborgium'])
|
59
|
+
end
|
60
|
+
end
|
47
61
|
end
|
48
62
|
end
|
49
63
|
end
|
@@ -135,11 +135,81 @@ module Vedeu
|
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
138
|
-
describe '#
|
139
|
-
it '
|
140
|
-
|
138
|
+
describe '#centred' do
|
139
|
+
it 'raises an exception if the value is invalid' do
|
140
|
+
proc {
|
141
|
+
Vedeu.interface 'boron' do
|
142
|
+
centred :invalid
|
143
|
+
end
|
144
|
+
}.must_raise(InvalidSyntax)
|
145
|
+
end
|
141
146
|
|
142
|
-
|
147
|
+
it 'sets the centred to true (visible)' do
|
148
|
+
Vedeu.interface 'boron' do
|
149
|
+
centred true
|
150
|
+
end
|
151
|
+
|
152
|
+
Vedeu.use('boron').attributes[:geometry][:centred].must_equal(true)
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'sets the centred to false (hidden)' do
|
156
|
+
Vedeu.interface 'boron' do
|
157
|
+
centred false
|
158
|
+
end
|
159
|
+
|
160
|
+
Vedeu.use('boron').attributes[:geometry][:centred].must_equal(false)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
describe '#cursor' do
|
165
|
+
it 'raises an exception if the value is invalid' do
|
166
|
+
proc {
|
167
|
+
Vedeu.interface 'beryllium' do
|
168
|
+
cursor :invalid
|
169
|
+
end
|
170
|
+
}.must_raise(InvalidSyntax)
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'sets the cursor to true (visible)' do
|
174
|
+
Vedeu.interface 'beryllium' do
|
175
|
+
cursor true
|
176
|
+
end
|
177
|
+
|
178
|
+
Vedeu.use('beryllium').attributes[:cursor].must_equal(true)
|
179
|
+
end
|
180
|
+
|
181
|
+
it 'sets the cursor to false (hidden)' do
|
182
|
+
Vedeu.interface 'beryllium' do
|
183
|
+
cursor false
|
184
|
+
end
|
185
|
+
|
186
|
+
Vedeu.use('beryllium').attributes[:cursor].must_equal(false)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
describe '#delay' do
|
191
|
+
it 'sets the delay attribute' do
|
192
|
+
Vedeu.interface 'cobalt' do
|
193
|
+
delay 0.25
|
194
|
+
end
|
195
|
+
|
196
|
+
Vedeu.use('cobalt').attributes[:delay].must_equal(0.25)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
describe '#group' do
|
201
|
+
it 'sets the group attribute' do
|
202
|
+
Vedeu.interface 'iron' do
|
203
|
+
group 'elements'
|
204
|
+
end
|
205
|
+
|
206
|
+
Vedeu.use('iron').attributes[:group].must_equal('elements')
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
describe '#height' do
|
211
|
+
it 'sets the attribute to the value' do
|
212
|
+
skip
|
143
213
|
end
|
144
214
|
end
|
145
215
|
|
@@ -236,52 +306,6 @@ module Vedeu
|
|
236
306
|
end
|
237
307
|
end
|
238
308
|
|
239
|
-
describe '#cursor' do
|
240
|
-
it 'raises an exception if the value is invalid' do
|
241
|
-
proc {
|
242
|
-
Vedeu.interface 'beryllium' do
|
243
|
-
cursor :invalid
|
244
|
-
end
|
245
|
-
}.must_raise(InvalidSyntax)
|
246
|
-
end
|
247
|
-
|
248
|
-
it 'sets the cursor to true (visible)' do
|
249
|
-
Vedeu.interface 'beryllium' do
|
250
|
-
cursor true
|
251
|
-
end
|
252
|
-
|
253
|
-
Vedeu.use('beryllium').attributes[:cursor].must_equal(true)
|
254
|
-
end
|
255
|
-
|
256
|
-
it 'sets the cursor to false (hidden)' do
|
257
|
-
Vedeu.interface 'beryllium' do
|
258
|
-
cursor false
|
259
|
-
end
|
260
|
-
|
261
|
-
Vedeu.use('beryllium').attributes[:cursor].must_equal(false)
|
262
|
-
end
|
263
|
-
end
|
264
|
-
|
265
|
-
describe '#delay' do
|
266
|
-
it 'sets the delay attribute' do
|
267
|
-
Vedeu.interface 'cobalt' do
|
268
|
-
delay 0.25
|
269
|
-
end
|
270
|
-
|
271
|
-
Vedeu.use('cobalt').attributes[:delay].must_equal(0.25)
|
272
|
-
end
|
273
|
-
end
|
274
|
-
|
275
|
-
describe '#group' do
|
276
|
-
it 'sets the group attribute' do
|
277
|
-
Vedeu.interface 'iron' do
|
278
|
-
group 'elements'
|
279
|
-
end
|
280
|
-
|
281
|
-
Vedeu.use('iron').attributes[:group].must_equal('elements')
|
282
|
-
end
|
283
|
-
end
|
284
|
-
|
285
309
|
describe '#name' do
|
286
310
|
it 'sets the name attribute' do
|
287
311
|
Vedeu.interface do
|
@@ -292,17 +316,21 @@ module Vedeu
|
|
292
316
|
end
|
293
317
|
end
|
294
318
|
|
295
|
-
describe '#
|
296
|
-
it '
|
297
|
-
|
319
|
+
describe '#use' do
|
320
|
+
it 'returns the interface by name' do
|
321
|
+
interface = Vedeu.interface('tungsten') {}
|
322
|
+
|
323
|
+
Interface.new.use('tungsten').must_be_instance_of(Vedeu::Interface)
|
298
324
|
end
|
325
|
+
end
|
299
326
|
|
300
|
-
|
327
|
+
describe '#width' do
|
328
|
+
it 'sets the attribute to the value' do
|
301
329
|
skip
|
302
330
|
end
|
303
331
|
end
|
304
332
|
|
305
|
-
describe '#
|
333
|
+
describe '#x' do
|
306
334
|
it 'sets the attribute to the block if a block is given' do
|
307
335
|
skip
|
308
336
|
end
|
@@ -312,43 +340,16 @@ module Vedeu
|
|
312
340
|
end
|
313
341
|
end
|
314
342
|
|
315
|
-
describe '#
|
316
|
-
it 'sets the attribute to the
|
343
|
+
describe '#y' do
|
344
|
+
it 'sets the attribute to the block if a block is given' do
|
317
345
|
skip
|
318
346
|
end
|
319
|
-
end
|
320
347
|
|
321
|
-
|
322
|
-
it 'sets the attribute to the value' do
|
348
|
+
it 'sets the attribute to the value if a block is not given' do
|
323
349
|
skip
|
324
350
|
end
|
325
351
|
end
|
326
352
|
|
327
|
-
describe '#centred' do
|
328
|
-
it 'raises an exception if the value is invalid' do
|
329
|
-
proc {
|
330
|
-
Vedeu.interface 'boron' do
|
331
|
-
centred :invalid
|
332
|
-
end
|
333
|
-
}.must_raise(InvalidSyntax)
|
334
|
-
end
|
335
|
-
|
336
|
-
it 'sets the centred to true (visible)' do
|
337
|
-
Vedeu.interface 'boron' do
|
338
|
-
centred true
|
339
|
-
end
|
340
|
-
|
341
|
-
Vedeu.use('boron').attributes[:geometry][:centred].must_equal(true)
|
342
|
-
end
|
343
|
-
|
344
|
-
it 'sets the centred to false (hidden)' do
|
345
|
-
Vedeu.interface 'boron' do
|
346
|
-
centred false
|
347
|
-
end
|
348
|
-
|
349
|
-
Vedeu.use('boron').attributes[:geometry][:centred].must_equal(false)
|
350
|
-
end
|
351
|
-
end
|
352
353
|
end
|
353
354
|
end
|
354
355
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
module API
|
5
|
+
|
6
|
+
describe Keymap do
|
7
|
+
|
8
|
+
describe '#key' do
|
9
|
+
it 'raises an exception when a block is not given' do
|
10
|
+
proc {
|
11
|
+
Vedeu.keys do
|
12
|
+
key 'q'
|
13
|
+
end
|
14
|
+
}.must_raise(InvalidSyntax)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'raises an exception when a key is not given' do
|
18
|
+
proc {
|
19
|
+
Vedeu.keys do
|
20
|
+
key('') { :some_action }
|
21
|
+
end
|
22
|
+
}.must_raise(InvalidSyntax)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'returns the instance of API::Keymap' do
|
26
|
+
Vedeu.keys do
|
27
|
+
key('f') { :some_action }
|
28
|
+
end.must_be_instance_of(API::Keymap)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'returns a collection of the keypresses' do
|
32
|
+
Keymap.new.key('v', 'd', 'u') do
|
33
|
+
:some_action
|
34
|
+
end.must_equal(['v', 'd', 'u'])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#interface' do
|
39
|
+
it 'returns the instance of API::Keymap' do
|
40
|
+
Vedeu.keys do
|
41
|
+
key('d') { :some_action }
|
42
|
+
interface 'neodymium'
|
43
|
+
end.must_be_instance_of(API::Keymap)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'returns the instance of API::Keymap' do
|
47
|
+
Vedeu.keys do
|
48
|
+
key('e') { :some_action }
|
49
|
+
interface ['neodymium', 'californium']
|
50
|
+
end.must_be_instance_of(API::Keymap)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'returnsa collection of the interfaces' do
|
54
|
+
Keymap.new.interface('americium').must_equal(['americium'])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|