langrove 0.0.4.5 → 0.0.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. data/.rvmrc +29 -38
  2. data/Gemfile +13 -7
  3. data/Gemfile.lock +35 -32
  4. data/Guardfile +11 -0
  5. data/README.md +34 -0
  6. data/Rakefile +8 -6
  7. data/bin/README.md +3 -0
  8. data/bin/langrove +1 -2
  9. data/langrove.gemspec +35 -0
  10. data/lib/langrove/README.md +82 -0
  11. data/lib/langrove/adaptor/README.md +92 -0
  12. data/lib/langrove/adaptor/adaptor_base.rb +123 -0
  13. data/lib/langrove/adaptor/base.rb +12 -2
  14. data/lib/langrove/adaptor/default.rb +8 -0
  15. data/lib/langrove/adaptor/event_machine_adaptor.rb +152 -0
  16. data/lib/langrove/adaptor/query_adaptor.rb +271 -0
  17. data/lib/langrove/behaviour/README.md +170 -0
  18. data/lib/langrove/behaviour/assessable.rb +63 -0
  19. data/lib/langrove/behaviour/base.rb +16 -0
  20. data/lib/langrove/behaviour/behaviour_base.rb +341 -0
  21. data/lib/langrove/behaviour/enqueueable.rb +104 -0
  22. data/lib/langrove/behaviour/notifiable.rb +48 -0
  23. data/lib/langrove/behaviour/persistable.rb +89 -0
  24. data/lib/langrove/behaviour/preloadable.rb +63 -0
  25. data/lib/langrove/daemon/README.md +7 -0
  26. data/lib/langrove/daemon/base.rb +9 -2
  27. data/lib/langrove/daemon/daemon_base.rb +330 -0
  28. data/lib/langrove/daemon/default.rb +3 -0
  29. data/lib/langrove/ext/README.md +48 -0
  30. data/lib/langrove/ext/class_loader.rb +9 -66
  31. data/lib/langrove/ext/config_item.rb +31 -23
  32. data/lib/langrove/ext/config_loader.rb +42 -8
  33. data/lib/langrove/ext/fake_config.rb +121 -0
  34. data/lib/langrove/ext/fake_logger.rb +50 -7
  35. data/lib/langrove/ext/fake_root.rb +38 -0
  36. data/lib/langrove/ext/hash.rb +56 -0
  37. data/lib/langrove/ext/i.rb +43 -0
  38. data/lib/langrove/ext/log_monitor.rb +272 -0
  39. data/lib/langrove/ext/module_loader.rb +52 -0
  40. data/lib/langrove/ext/recursive_string.rb +94 -0
  41. data/lib/langrove/ext/spec_helper.rb +84 -0
  42. data/lib/langrove/ext.rb +8 -2
  43. data/lib/langrove/handler/README.md +161 -0
  44. data/lib/langrove/handler/base.rb +29 -2
  45. data/lib/langrove/handler/default.rb +4 -0
  46. data/lib/langrove/handler/deferred.rb +105 -0
  47. data/lib/langrove/handler/handler_base.rb +242 -0
  48. data/lib/langrove/handler/http_servlet.rb +58 -0
  49. data/lib/langrove/handler/socket.rb +21 -0
  50. data/lib/langrove/handler/socket_base.rb +127 -0
  51. data/lib/langrove/handler/socket_multiplexer.rb +438 -0
  52. data/lib/langrove/handler/web_socket.rb +41 -0
  53. data/lib/langrove/plugin/README.md +76 -0
  54. data/lib/langrove/plugin/assessor.rb +363 -0
  55. data/lib/langrove/plugin/base.rb +18 -0
  56. data/lib/langrove/plugin/buffered_persistor.rb +97 -0
  57. data/lib/langrove/plugin/enqueuer.rb +186 -0
  58. data/lib/langrove/plugin/notifier.rb +144 -0
  59. data/lib/langrove/plugin/persistor.rb +360 -0
  60. data/lib/langrove/plugin/plugin_base.rb +79 -0
  61. data/lib/langrove/plugin/yaml_file.md +5 -0
  62. data/lib/langrove/plugin/yaml_file.rb +261 -0
  63. data/lib/langrove/protocol/README.md +102 -0
  64. data/lib/langrove/protocol/base.rb +10 -2
  65. data/lib/langrove/protocol/default.rb +3 -0
  66. data/lib/langrove/protocol/protocol_base.rb +60 -0
  67. data/lib/langrove/protocol/syslog.rb +34 -27
  68. data/lib/langrove/root/README.md +17 -0
  69. data/lib/langrove/root/base.rb +11 -0
  70. data/lib/langrove/root/config.rb +163 -0
  71. data/lib/langrove/root/root_base.rb +259 -0
  72. data/lib/langrove/server/README.md +7 -0
  73. data/lib/langrove/server/base.rb +9 -0
  74. data/lib/langrove/server/default.rb +3 -0
  75. data/lib/langrove/server/server_base.rb +301 -0
  76. data/lib/langrove/version.rb +3 -1
  77. data/lib/langrove.rb +44 -1
  78. data/spec/langrove/adaptor/adaptor_base_spec.rb +33 -0
  79. data/spec/langrove/adaptor/event_machine_adaptor_spec.rb +62 -0
  80. data/spec/langrove/adaptor/query_adaptor_spec.rb +94 -0
  81. data/spec/langrove/behaviour/assessable_spec.rb +42 -0
  82. data/spec/langrove/behaviour/behaviour_base_spec.rb +396 -0
  83. data/spec/langrove/behaviour/enqueueable_spec.rb +19 -0
  84. data/spec/langrove/behaviour/notifiable_spec.rb +6 -0
  85. data/spec/langrove/behaviour/persistable_spec.rb +19 -0
  86. data/spec/langrove/behaviour/preloadable_spec.rb +19 -0
  87. data/spec/langrove/daemon/base_spec.rb +6 -0
  88. data/spec/langrove/daemon/daemon_base_spec.rb +253 -0
  89. data/spec/langrove/ext/class_loader_spec.rb +9 -12
  90. data/spec/langrove/ext/fake_config_spec.rb +50 -0
  91. data/spec/langrove/ext/fake_logger_spec.rb +12 -0
  92. data/spec/langrove/ext/fake_root_spec.rb +19 -0
  93. data/spec/langrove/ext/hash_spec.rb +54 -0
  94. data/spec/langrove/ext/i_spec.rb +11 -0
  95. data/spec/langrove/ext/log_monitor_spec.rb +254 -0
  96. data/spec/langrove/ext/module_loader_spec.rb +70 -0
  97. data/spec/langrove/ext/recursive_string_spec.rb +132 -0
  98. data/{functional/config/environments/development.rb → spec/langrove/ext/spec_helper_spec.rb} +0 -0
  99. data/spec/langrove/handler/deferred_spec.rb +9 -0
  100. data/spec/langrove/handler/handler_base_spec.rb +134 -0
  101. data/spec/langrove/handler/socket_base_spec.rb +76 -0
  102. data/spec/langrove/handler/socket_multiplexer_spec.rb +480 -0
  103. data/spec/langrove/handler/socket_spec.rb +6 -0
  104. data/spec/langrove/handler/web_socket_spec.rb +19 -0
  105. data/spec/langrove/plugin/assessor_spec.rb +278 -0
  106. data/spec/langrove/plugin/buffered_persistor_spec.rb +94 -0
  107. data/spec/langrove/plugin/enqueuer_spec.rb +136 -0
  108. data/spec/langrove/plugin/notifier_spec.rb +107 -0
  109. data/spec/langrove/plugin/persistor_spec.rb +300 -0
  110. data/spec/langrove/plugin/plugin_base_spec.rb +86 -0
  111. data/spec/langrove/plugin/yaml_file_spec.rb +348 -0
  112. data/spec/langrove/protocol/protocol_base_spec.rb +19 -0
  113. data/spec/langrove/protocol/syslog_spec.rb +5 -2
  114. data/spec/langrove/root/config_spec.rb +103 -0
  115. data/spec/langrove/root/root_base_spec.rb +93 -0
  116. data/spec/langrove/server/server_base_spec.rb +414 -0
  117. data/spec/spec_helper.rb +38 -0
  118. metadata +157 -92
  119. data/.watchr +0 -27
  120. data/functional/config/boot.rb +0 -64
  121. data/functional/config/daemons.yml +0 -13
  122. data/functional/config/environment.rb +0 -28
  123. data/functional/config/environments/production.rb +0 -0
  124. data/functional/config/environments/test.rb +0 -0
  125. data/functional/lib/client/socket_to_file.rb +0 -47
  126. data/functional/lib/daemon/datagram.rb +0 -21
  127. data/functional/lib/protocol/socket_to_file.rb +0 -55
  128. data/functional/libexec/daemon.rb +0 -68
  129. data/functional/tmp/README +0 -1
  130. data/lib/langrove/_base.rb +0 -28
  131. data/lib/langrove/adaptor_base.rb +0 -116
  132. data/lib/langrove/client/base.rb +0 -2
  133. data/lib/langrove/client/datagram.rb +0 -25
  134. data/lib/langrove/client_base.rb +0 -92
  135. data/lib/langrove/daemon_base.rb +0 -281
  136. data/lib/langrove/ext/find.rb +0 -90
  137. data/lib/langrove/ext/persistable.rb +0 -103
  138. data/lib/langrove/handler_base.rb +0 -148
  139. data/lib/langrove/job/base.rb +0 -1
  140. data/lib/langrove/job_base.rb +0 -24
  141. data/lib/langrove/protocol_base.rb +0 -32
  142. data/spec/functional/daemon/datagram_spec.rb +0 -121
  143. data/spec/langrove/adaptor_base_spec.rb +0 -63
  144. data/spec/langrove/client/datagram_spec.rb +0 -1
  145. data/spec/langrove/client_base_spec.rb +0 -5
  146. data/spec/langrove/daemon_base_spec.rb +0 -154
  147. data/spec/langrove/ext/find_spec.rb +0 -53
  148. data/spec/langrove/ext/persistable_spec.rb +0 -117
  149. data/spec/langrove/handler_base_spec.rb +0 -103
  150. data/spec/langrove/job_base_spec.rb +0 -28
  151. data/spec/langrove/protocol_base_spec.rb +0 -6
  152. data/spec/todo_spec.rb +0 -12
  153. data/tmp/README +0 -2
@@ -0,0 +1,480 @@
1
+ require 'spec_helper'
2
+
3
+ DEMUX = {
4
+ :proxy_to => {
5
+ :handler => {
6
+ :class => 'Base'
7
+ }
8
+ },
9
+ :proxy_by => :hostname
10
+ }
11
+
12
+ describe LanGrove::Handler::SocketMultiplexer do
13
+
14
+ before :each do
15
+
16
+ LOG.off
17
+
18
+ @palindrome1 = 'a man, a plan, a canal, panama'
19
+ @palindrome2 = 'able was i, ere i saw elba'
20
+
21
+ #
22
+ # palindrome |noun| ~ magic carpet port
23
+ #
24
+ # eg. Until learning of the palindrome on the outskirts
25
+ # of town - new residents of Constantinople were want
26
+ # to frequently report unidentified flying carpets to
27
+ # the sultanate. Etanatlus eht ot steprac gniylf deif-
28
+ # itnedinu troper yltneuqerf ot tnaw erew elponitnat-
29
+ # snoC fo stnediser wen - nwot fo striktuo eht no
30
+ # emordnilap eht fo gninrael litnU
31
+ #
32
+
33
+ #
34
+ # replace the demux routing keyname
35
+ #
36
+ DEMUX[:proxy_by] = :unique
37
+
38
+ @protocol_config = { :too => 'ALSO' }
39
+
40
+ class FakeProtocol < LanGrove::Protocol::Base
41
+
42
+ #
43
+ # Live replica Protocol
44
+ #
45
+ # So that the handing in of @protocol_config into the
46
+ # demultipled handlers can be tested.
47
+ #
48
+
49
+ def decode( data )
50
+
51
+ if data.split(',')[-1] == ' panama'
52
+
53
+ return {
54
+ #
55
+ # palindrome1 generates a proxyable decode
56
+ #
57
+ :unique => 'this will become the @handlers key',
58
+ :data => data
59
+ }
60
+
61
+ end
62
+
63
+ return {
64
+ #
65
+ # palindrome2 generates problematic decode
66
+ #
67
+
68
+ # missing unique key
69
+ :data => data
70
+
71
+ }
72
+
73
+ end
74
+
75
+ end
76
+
77
+ #
78
+ # Pending 3rd arg - Protcol has the last initializer
79
+ # with a non standard signature...
80
+ #
81
+ @protocol = FakeProtocol.new( ROOT, @protocol_config, nil )
82
+ # @protocol = FakeProtocol.new( @protocol_config, nil, LOG )
83
+
84
+ #
85
+ # Server for the bind
86
+ #
87
+ @server = double( 'Server' )
88
+
89
+ end
90
+
91
+ subject {
92
+
93
+ test = LanGrove::Handler::SocketMultiplexer.new nil
94
+
95
+ #
96
+ # Handlers dont share the LanGrove::Base superclass,
97
+ # so that they can be extended with functionality
98
+ # from the EventMachine::connection superclass.
99
+ #
100
+ # This means that they need the root inserted
101
+ # alternatively.
102
+ #
103
+
104
+ test.instance_variable_set( :@root, ROOT )
105
+ test.instance_variable_set( :@logger, ROOT.logger )
106
+
107
+ test
108
+
109
+ }
110
+
111
+ it 'recalls each Handler already being de-multiplexed' do
112
+
113
+ subject.config = DEMUX
114
+ subject.server = @server
115
+ subject.start_handler
116
+
117
+ subject.instance_variable_get(
118
+
119
+ :@handlers
120
+
121
+ ).should be_a(
122
+
123
+ Hash
124
+
125
+ )
126
+
127
+ end
128
+
129
+ it 'allows access to the handlers by attribute' do
130
+
131
+ subject.config = DEMUX
132
+ subject.server = @server
133
+ subject.start_handler
134
+ subject.handlers.should be_a(
135
+
136
+ Hash
137
+
138
+ )
139
+
140
+ end
141
+
142
+ it 'triggers the multiplexer_start event' do
143
+
144
+ subject.config = DEMUX
145
+ subject.server = @server
146
+
147
+ ROOT.should_receive(
148
+
149
+ :trigger
150
+
151
+ ).with(
152
+
153
+ subject, :multiplexer, :start
154
+
155
+ )
156
+
157
+ subject.start_handler
158
+
159
+ end
160
+
161
+ it 'triggers the handler_stop event' do
162
+
163
+ subject.config = DEMUX
164
+ subject.server = @server
165
+ subject.start_handler
166
+
167
+ ROOT.should_receive(
168
+
169
+ :trigger
170
+
171
+ ).with(
172
+
173
+ subject, :multiplexer, :stop
174
+
175
+ )
176
+
177
+ subject.stop_handler
178
+
179
+ end
180
+
181
+ it 'should raise and error if started without required config' do
182
+
183
+ badconfig = DEMUX.clone
184
+ badconfig.delete :proxy_by
185
+
186
+ subject.protocol = @protocol
187
+ subject.config = badconfig
188
+ subject.logger = LOG
189
+
190
+ expect {
191
+
192
+ subject.start_handler
193
+
194
+ }.to raise_error(
195
+
196
+ LanGrove::DaemonConfigException,
197
+
198
+ /requires :proxy_by: subconfig/
199
+
200
+ )
201
+
202
+ end
203
+
204
+ context 'demultiplexes' do
205
+
206
+ before :each do
207
+
208
+ subject.protocol = @protocol
209
+ subject.config = DEMUX
210
+ subject.logger = LOG
211
+ subject.server = @server
212
+ subject.start_handler
213
+
214
+ end
215
+
216
+
217
+ it 'by pre decoding data to collect :proxy_by: value' do
218
+
219
+ subject.protocol = @protocol
220
+ subject.config = DEMUX
221
+ subject.logger = LOG
222
+ subject.start_handler
223
+
224
+ @server.should_receive( :connect )
225
+
226
+ subject.protocol.should_receive(
227
+
228
+ :decode
229
+
230
+ ).with(
231
+
232
+ @palindrome1
233
+
234
+ ).and_return(
235
+
236
+ { :unique => 'key' }
237
+
238
+ )
239
+
240
+ subject.receive_data( @palindrome1 )
241
+
242
+ end
243
+
244
+
245
+ it 'with error logging on receiving data missing the :proxy_by: item' do
246
+
247
+ LOG.should_receive( :warn ).with(
248
+
249
+ "Malformed data received. Missing value for 'unique' in message: #{@palindrome2}"
250
+
251
+ )
252
+
253
+ subject.receive_data( @palindrome2 )
254
+
255
+ end
256
+
257
+ end
258
+
259
+ context 'creates handlers' do
260
+
261
+ before :each do
262
+
263
+ subject.protocol = @protocol
264
+ subject.logger = LOG
265
+ subject.server = @server
266
+
267
+ end
268
+
269
+ it 'according to config' do
270
+
271
+ DEMUX[:proxy_to][:handler][:class] = 'TroyTroyAgain'
272
+ subject.config = DEMUX
273
+
274
+ expect {
275
+
276
+ subject.start_handler
277
+
278
+ }.to raise_error(
279
+
280
+ LanGrove::ClassLoaderException,
281
+
282
+ "no such file to load -- handler/troy_troy_again.rb"
283
+
284
+ )
285
+
286
+ end
287
+
288
+ it 'as Handler::Base if unspecified' do
289
+
290
+ @server.should_receive( :connect )
291
+
292
+ DEMUX[:proxy_to].delete :handler
293
+ subject.config = DEMUX
294
+ subject.server = @server
295
+ subject.start_handler
296
+ subject.receive_data( @palindrome1 )
297
+
298
+ handler = subject.instance_variable_get(
299
+
300
+ :@handlers
301
+
302
+ )['this will become the @handlers key']
303
+
304
+ handler.should be_a( LanGrove::Handler::Base )
305
+
306
+ end
307
+
308
+ context 'routes message to the handlers' do
309
+
310
+ before :each do
311
+
312
+ @server.should_receive( :connect )
313
+
314
+ subject.config = DEMUX
315
+ subject.logger = LOG
316
+ subject.server = @server
317
+ subject.start_handler
318
+ subject.receive_data( @palindrome1 )
319
+ @handler = subject.instance_variable_get(
320
+
321
+ :@handlers
322
+
323
+ )['this will become the @handlers key']
324
+
325
+ end
326
+
327
+ it 'sends to the existing handler if already present' do
328
+
329
+ @handler.should_receive( :receive ).exactly(2).times
330
+
331
+ subject.receive_data( @palindrome1 )
332
+ subject.receive_data( @palindrome2 )
333
+ subject.receive_data( @palindrome1 )
334
+
335
+ end
336
+
337
+ it 'does not create handler on missing key' do
338
+
339
+ subject.receive_data( @palindrome1 )
340
+ subject.receive_data( @palindrome2 )
341
+ subject.receive_data( @palindrome1 )
342
+
343
+ subject.instance_variable_get(
344
+
345
+ :@handlers
346
+
347
+ ).size.should == 1
348
+
349
+ end
350
+
351
+ end
352
+
353
+ end
354
+
355
+ context 'it multiplexes' do
356
+
357
+ #
358
+ # thus far only DE-multiplexing,
359
+ #
360
+ # acting on inbound - receive_data()
361
+ #
362
+
363
+ #
364
+ # Exactly the same pattern would apply in the inverse.
365
+ #
366
+
367
+ #
368
+ # There will be no need for multiplexing until there are
369
+ # protocols at play that require ACK/NAC/REPLY type stuff.
370
+ #
371
+
372
+ end
373
+
374
+ context 'a multiplexed handler' do
375
+
376
+ #
377
+ # The same things as a direcly socket
378
+ # attached Handler
379
+ #
380
+ before :each do
381
+
382
+ @server.should_receive( :connect )
383
+
384
+ subject.config = DEMUX
385
+ subject.logger = LOG
386
+ subject.protocol = @protocol
387
+ subject.server = @server
388
+ subject.start_handler
389
+ subject.receive_data( @palindrome1 )
390
+ @handler = subject.instance_variable_get(
391
+
392
+ :@handlers
393
+
394
+ )['this will become the @handlers key']
395
+
396
+ end
397
+
398
+ #
399
+ # These are normally performed by the adaptor
400
+ # after connect, best to make that thread path
401
+ # more accessable, so that it can be used here.
402
+ #
403
+ it 'has the bind to server' do
404
+
405
+ #
406
+ # Bypassing this transparrent multiplexing layer.
407
+ #
408
+
409
+ @handler.server.should == @server
410
+
411
+ end
412
+
413
+ it 'has its config subtree' do
414
+
415
+ @handler.config.should == DEMUX[:proxy_to][:handler]
416
+
417
+ end
418
+
419
+ it 'has the logger' do
420
+
421
+ @handler.logger.should == LOG
422
+
423
+ end
424
+
425
+ it 'has the protocol and config' do
426
+
427
+ @handler.protocol.instance_variable_get(
428
+
429
+ :@config
430
+
431
+ )[ :too ].should == 'ALSO' #B .there()
432
+
433
+ end
434
+
435
+ it 'posses a data capsule' do
436
+
437
+ @handler.capsule.should be_a( Hash )
438
+
439
+ end
440
+
441
+ end
442
+
443
+ context 'fires events on behalf of the demultiplexed handler' do
444
+
445
+ before :each do
446
+
447
+ @server.should_receive( :connect )
448
+
449
+ subject.config = DEMUX
450
+ subject.logger = LOG
451
+ subject.protocol = @protocol
452
+ subject.server = @server
453
+ subject.instance_variable_set(
454
+
455
+ :@root, ROOT
456
+
457
+ )
458
+ subject.start_handler
459
+
460
+ end
461
+
462
+ it '[Dunno why...] first_message event (does not fire in test)' do
463
+
464
+ ROOT.should_receive(
465
+
466
+ :trigger
467
+
468
+ ).with(
469
+
470
+ anything(), :handler, :start
471
+
472
+ )
473
+
474
+ subject.receive_data( @palindrome1 )
475
+
476
+ end
477
+
478
+ end
479
+
480
+ end
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ describe LanGrove::Handler::Socket do
4
+
5
+
6
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe LanGrove::Handler::WebSocket do
4
+
5
+ subject {
6
+
7
+ LanGrove::Handler::WebSocket.new( {}, {} )
8
+
9
+ }
10
+
11
+ it 'inbound messages are passed into the receive pipeline' do
12
+
13
+ subject.should_receive( :handle_receive_data )
14
+
15
+ subject.trigger_on_message( "DATA" )
16
+
17
+ end
18
+
19
+ end