vedeu 0.2.0 → 0.2.1
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 +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
|