vedeu 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -9
  3. data/docs/api.md +70 -42
  4. data/elements.txt +118 -0
  5. data/lib/vedeu.rb +14 -4
  6. data/lib/vedeu/api/api.rb +67 -24
  7. data/lib/vedeu/api/composition.rb +19 -0
  8. data/lib/vedeu/api/defined.rb +7 -0
  9. data/lib/vedeu/api/interface.rb +103 -75
  10. data/lib/vedeu/api/keymap.rb +62 -0
  11. data/lib/vedeu/api/menu.rb +3 -1
  12. data/lib/vedeu/configuration.rb +24 -6
  13. data/lib/vedeu/models/attributes/coercions.rb +18 -26
  14. data/lib/vedeu/models/attributes/colour_translator.rb +7 -7
  15. data/lib/vedeu/models/attributes/presentation.rb +12 -1
  16. data/lib/vedeu/models/geometry.rb +5 -1
  17. data/lib/vedeu/models/interface.rb +6 -47
  18. data/lib/vedeu/models/keymap.rb +66 -0
  19. data/lib/vedeu/models/line.rb +3 -1
  20. data/lib/vedeu/models/stream.rb +10 -1
  21. data/lib/vedeu/models/style.rb +10 -1
  22. data/lib/vedeu/output/compositor.rb +3 -0
  23. data/lib/vedeu/output/refresh.rb +16 -74
  24. data/lib/vedeu/output/render.rb +44 -17
  25. data/lib/vedeu/output/view.rb +3 -0
  26. data/lib/vedeu/repositories/buffers.rb +32 -42
  27. data/lib/vedeu/repositories/events.rb +8 -11
  28. data/lib/vedeu/repositories/focus.rb +15 -13
  29. data/lib/vedeu/repositories/groups.rb +20 -2
  30. data/lib/vedeu/repositories/interfaces.rb +22 -2
  31. data/lib/vedeu/repositories/keymap_validator.rb +104 -0
  32. data/lib/vedeu/repositories/keymaps.rb +239 -0
  33. data/lib/vedeu/repositories/menus.rb +12 -3
  34. data/lib/vedeu/support/common.rb +2 -2
  35. data/lib/vedeu/support/cursor.rb +3 -0
  36. data/lib/vedeu/support/event.rb +48 -7
  37. data/lib/vedeu/support/grid.rb +1 -1
  38. data/lib/vedeu/support/registrar.rb +66 -0
  39. data/lib/vedeu/support/trace.rb +71 -12
  40. data/test/lib/vedeu/api/api_test.rb +27 -9
  41. data/test/lib/vedeu/api/composition_test.rb +10 -0
  42. data/test/lib/vedeu/api/defined_test.rb +14 -0
  43. data/test/lib/vedeu/api/interface_test.rb +86 -85
  44. data/test/lib/vedeu/api/keymap_test.rb +61 -0
  45. data/test/lib/vedeu/configuration_test.rb +12 -0
  46. data/test/lib/vedeu/models/attributes/coercions_test.rb +3 -4
  47. data/test/lib/vedeu/models/interface_test.rb +0 -43
  48. data/test/lib/vedeu/models/keymap_test.rb +19 -0
  49. data/test/lib/vedeu/models/style_test.rb +10 -0
  50. data/test/lib/vedeu/output/refresh_test.rb +0 -12
  51. data/test/lib/vedeu/output/render_test.rb +51 -0
  52. data/test/lib/vedeu/repositories/buffers_test.rb +39 -12
  53. data/test/lib/vedeu/repositories/events_test.rb +6 -0
  54. data/test/lib/vedeu/repositories/focus_test.rb +12 -0
  55. data/test/lib/vedeu/repositories/keymap_validator_test.rb +81 -0
  56. data/test/lib/vedeu/repositories/keymaps_test.rb +254 -0
  57. data/test/lib/vedeu/support/common_test.rb +26 -0
  58. data/test/lib/vedeu/support/registrar_test.rb +68 -0
  59. data/vedeu.gemspec +1 -1
  60. metadata +18 -2
@@ -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.match(klass)
28
- Vedeu.log(sprintf(" %s %-35s #%s", event, classname, id), true)
29
- # binding.eval('local_variables').each do |var|
30
- # print("#{var.to_s} = #{binding.local_variable_get(var).inspect}\n")
31
- # end
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 [Regexp]
46
- def klass
47
- options[:klass]
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
- # everything except Interface, Geometry and Terminal
66
- # klass: /^Vedeu::(?!.*Interface|Geometry|Terminal).*/
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 { event.stubs(:trigger).returns(nil) }
48
+ before { Vedeu::Focus.stubs(:current).returns('') }
49
49
 
50
- it 'returns nil' do
51
- Vedeu.keypress('k').must_equal(nil)
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 '#use' do
139
- it 'returns the interface by name' do
140
- interface = Vedeu.interface('tungsten') {}
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
- Interface.new.use('tungsten').must_be_instance_of(Vedeu::Interface)
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 '#x' do
296
- it 'sets the attribute to the block if a block is given' do
297
- skip
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
- it 'sets the attribute to the value if a block is not given' do
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 '#y' do
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 '#width' do
316
- it 'sets the attribute to the value' do
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
- describe '#height' do
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