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.
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