langrove 0.0.4.5 → 0.0.5.3

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 (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,152 @@
1
+ require 'eventmachine'
2
+
3
+ module LanGrove
4
+
5
+ module Adaptor
6
+
7
+ class EventMachineAdaptor < Base
8
+
9
+ def stop
10
+
11
+ #
12
+ # OVERRIDE
13
+ #
14
+ # Daemon has been called to stop
15
+ #
16
+
17
+ end
18
+
19
+ def reload
20
+
21
+ #
22
+ # OVERRIDE
23
+ #
24
+ # Daemon has been called to HUP
25
+ #
26
+
27
+ end
28
+
29
+ def initialize( root, config, deamon_name )
30
+
31
+ super
32
+
33
+ end
34
+
35
+ def validate_config
36
+
37
+ @type = :event_machine_adaptor
38
+
39
+ @connect = :tcp
40
+ @iface = '127.0.0.1'
41
+ @port = 12701
42
+
43
+ if @config
44
+
45
+ @iface = @config[ :iface ] if @config.has_key? :iface
46
+ @port = @config[ :port ] if @config.has_key? :port
47
+ @connect = @config[ :connect ].to_sym if @config.has_key? :connect
48
+ @soc_opts = @config[ :socket_options ] if @config.has_key? :socket_options
49
+
50
+ end
51
+
52
+ unless @soc_opts.nil?
53
+
54
+ unless @soc_opts[ :tls_options ].nil?
55
+
56
+ validate_tls_options( @soc_opts[ :tls_options ] )
57
+
58
+ end
59
+
60
+ else
61
+
62
+ @soc_opts = {}
63
+
64
+ end
65
+
66
+ #
67
+ # Assign the call signature to eventmachine's
68
+ # TCP or UDP servers.
69
+ #
70
+ @em_server_type = case @connect
71
+
72
+ when :tcp
73
+
74
+ :start_server
75
+
76
+ when :udp
77
+
78
+ :open_datagram_socket
79
+
80
+ else
81
+
82
+ :start_server
83
+
84
+ end
85
+
86
+ end
87
+
88
+
89
+ def stop_adaptor
90
+
91
+ stop
92
+
93
+ end
94
+
95
+ def reload_adaptor
96
+
97
+ reload
98
+
99
+ end
100
+
101
+ def validate_tls_options( options )
102
+
103
+ unless options[ :private_key_file ].nil?
104
+
105
+ options[ :private_key_file ] = path( options[ :private_key_file ] )
106
+
107
+ end
108
+
109
+ unless options[ :cert_chain_file ].nil?
110
+
111
+ options[ :cert_chain_file ] = path( options[ :cert_chain_file ] )
112
+
113
+ end
114
+
115
+ end
116
+
117
+ def connector( params, &block )
118
+
119
+ handler = params[ :handler ]
120
+
121
+ handler_class = handler[:class]
122
+ handler_class = @demux.handler unless @demux.nil?
123
+
124
+ @logger.info "Starting listen at #{@connect} #{@iface}:#{@port}"
125
+
126
+ EventMachine::send(
127
+
128
+ @em_server_type,
129
+ @iface,
130
+ @port,
131
+ handler_class,
132
+ @soc_opts
133
+
134
+ ) do |connected_handler|
135
+
136
+ yield connected_handler if block
137
+
138
+ end
139
+
140
+ end
141
+
142
+ def path( partial )
143
+
144
+ return "#{DAEMON_ROOT}/#{partial}"
145
+
146
+ end
147
+
148
+ end
149
+
150
+ end
151
+
152
+ end
@@ -0,0 +1,271 @@
1
+ module LanGrove
2
+
3
+ module Adaptor
4
+
5
+ class QueryAdaptor < LanGrove::Adaptor::EventMachineAdaptor
6
+
7
+ #
8
+ # Used to periodically query a datasource,
9
+ # Yields rows as handlers into the daemon's
10
+ # event pipeline
11
+ #
12
+
13
+ def stop
14
+
15
+ #
16
+ # OVERRIDE
17
+ #
18
+ # Daemon has been called to stop
19
+ #
20
+
21
+ end
22
+
23
+ def reload
24
+
25
+ #
26
+ # OVERRIDE
27
+ #
28
+ # Daemon has been called to HUP
29
+ #
30
+
31
+ end
32
+
33
+ def validate_config
34
+
35
+ #
36
+ # OVERRIDE
37
+ #
38
+ # To validate implementation specific config
39
+ #
40
+
41
+ end
42
+
43
+ def connect
44
+
45
+ #
46
+ # OVERRIDE
47
+ #
48
+ # To connect to the DataSource
49
+ #
50
+
51
+ end
52
+
53
+ def running?
54
+
55
+ #
56
+ # OVERRIDE
57
+ #
58
+ # (optional)
59
+ #
60
+ # Because the query may run asyncronously and
61
+ # emply callbacks, this flag should be set so
62
+ # that it can be determined if a query is active
63
+ # in the background.
64
+ #
65
+ # Only required if it is necessary to ensure that
66
+ # never more than 1 concurrent query is running.
67
+ #
68
+ false
69
+
70
+ end
71
+
72
+ def stop_adaptor
73
+
74
+ stop
75
+
76
+ end
77
+
78
+ def reload_adaptor
79
+
80
+ reload
81
+
82
+ end
83
+
84
+ def query( &block )
85
+
86
+ #
87
+ # OVERRIDE
88
+ #
89
+ # To perform the query and yield resulting 'rows'
90
+ #
91
+ # - Should yield one hash of key/value pairs
92
+ # per 'row'
93
+ #
94
+
95
+ raise LanGrove::PluginException.new(
96
+
97
+ "#{self.class}.query( ... ) - missing implementation."
98
+
99
+ )
100
+
101
+ end
102
+
103
+
104
+
105
+ def initialize( root, config, deamon_name )
106
+
107
+ super
108
+
109
+ #
110
+ # :run_interval:
111
+ #
112
+ # A value in seconds between calling the query.
113
+ #
114
+ # If the previous run is not finished a new run
115
+ # will not start if the running?() method is
116
+ # implemented.
117
+ #
118
+ # The run will be skipped and another :interval:
119
+ # period will pass before the next run is
120
+ # attempted.
121
+ #
122
+ @run_interval = @config[:run_interval]
123
+
124
+
125
+ #
126
+ # :run_once:
127
+ #
128
+ # If true will run the query only once and then
129
+ # exit the Daemon.
130
+ #
131
+ @run_once = false
132
+ @run_once = @config[:run_once]
133
+ @done_once = false
134
+
135
+ #
136
+ # :run_immediately:
137
+ #
138
+ # If true (the default) will run the query at Daemon
139
+ # start. Otherwise the run will wait :interval: seconds
140
+ # after daemon start.
141
+ #
142
+ @run_immediately = @config[:run_immediately]
143
+ @run_immediately = true if @run_immediately.nil?
144
+
145
+
146
+ config_exception(
147
+
148
+ "#{self.class} requires subconfig with :run_interval:"
149
+
150
+ ) if (
151
+
152
+ @run_interval.nil? or
153
+ not @run_interval.is_a?( Integer )
154
+
155
+ )
156
+
157
+ @query = @config[:query]
158
+
159
+ config_exception(
160
+
161
+ "#{self.class} requires :query: subconfig"
162
+
163
+ ) if @query.nil?
164
+
165
+ validate_config
166
+
167
+ connect
168
+
169
+ end
170
+
171
+ def connector( params, &block )
172
+
173
+ #
174
+ # Override Handler type if it
175
+ # is the default (Handler::Socket)
176
+ #
177
+ # Does not override if the Handler
178
+ # is user specified.
179
+ #
180
+ if params[:handler][:class] == LanGrove::Handler::Socket
181
+
182
+ params[:handler][:class] = LanGrove::Handler::Base
183
+
184
+ end
185
+
186
+ if @run_immediately
187
+
188
+ do_query( params, &block )
189
+
190
+ end
191
+
192
+ EM.add_periodic_timer( @run_interval ) do
193
+
194
+ do_query( params, &block )
195
+
196
+ end
197
+
198
+ end
199
+
200
+ def do_query( params, &block )
201
+
202
+ if running?
203
+
204
+ @logger.info "#{self.class} already running query"
205
+
206
+ return
207
+
208
+ end
209
+
210
+ if @run_once and @done_once
211
+
212
+ @logger.warn "#{self.class} set to :run_once:"
213
+ Process.kill( 'TERM', Process.pid )
214
+ return
215
+
216
+ end
217
+
218
+ #
219
+ # The query may be long blocking
220
+ # so defer to allow the reactor
221
+ # to proceed
222
+ #
223
+ operation = proc do
224
+
225
+ query do |record|
226
+
227
+ #
228
+ # Initialize a new Handler
229
+ #
230
+ handler = params[:handler][:class].new
231
+
232
+ #
233
+ # Yield the handler into the daemon,
234
+ # this will traverse the assignment
235
+ # pipeline resulting in the handler
236
+ # interacting with all configured
237
+ # server behaviours
238
+ #
239
+ yield handler if block
240
+
241
+ #
242
+ # Pass the record in along the 'reveive'
243
+ # along with associated event triggers.
244
+ #
245
+ # (For behaviours)
246
+ #
247
+ @root.trigger( handler, :handler, :receive )
248
+
249
+ handler.receive( record )
250
+
251
+ @root.trigger( handler, :handler, :after_receive )
252
+
253
+ end
254
+
255
+ end
256
+
257
+ callback = proc do |result|
258
+
259
+ @done_once = true
260
+
261
+ end
262
+
263
+ EM.defer( operation, callback )
264
+
265
+ end
266
+
267
+ end
268
+
269
+ end
270
+
271
+ end
@@ -0,0 +1,170 @@
1
+ <pre>
2
+
3
+ #
4
+ # behave |verb| ~ a present tense behad
5
+ #
6
+ # eg. The ability to sing was being had,
7
+ #
8
+ # By this one time,
9
+ #
10
+ # At band camp.
11
+ #
12
+
13
+ </pre>
14
+
15
+ LanGrove::Behaviour::Base
16
+ =========================
17
+
18
+ Defines the interface between the Daemon's [Primary Components](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove#primary-components) and the [Plugins](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/plugin) that perform the Behaviour specified actions upon them.
19
+
20
+ Behaviour Triggers
21
+ ------------------
22
+
23
+ Behaviours are assigned to action at configurable trigger points in each Daemon module's life cycle.
24
+
25
+ ### [Server](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/server) Triggers
26
+
27
+ * :server_start
28
+ * :server_stop
29
+ * :server_reload
30
+
31
+ ### [Handler](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/handler) Triggers
32
+
33
+ * :handler_start
34
+ * :handler_stop
35
+ * :handler_reload
36
+ * :handler_connect
37
+ * :handler_after_connect
38
+ * :handler_disconnect
39
+ * :handler_after_disconnect
40
+ * :handler_first_message
41
+ * :hander_receive
42
+ * :handler_after_receive
43
+ * :handler_error
44
+
45
+ ### [Adaptor](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/adaptor) Triggers
46
+
47
+ * none
48
+
49
+ ### [Protocol](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/protocol) Triggers
50
+
51
+ * none
52
+
53
+
54
+ Function
55
+ --------
56
+
57
+ * Behaviour triggers fire via the [Daemon Root](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/root) module.
58
+ * The triggers are called by the Module undergoing the associated event.
59
+ * The call carries reference to the Module
60
+ * The listening behaviour passes the Module reference onward to the [Plugin](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/plugin) configured to perform the action.
61
+
62
+
63
+ Configuration
64
+ =============
65
+
66
+ * Behaviours are assigned to triggers in the :server: subconfig branch.
67
+ * Behaviours are assigned a [Plugin](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/plugin)
68
+
69
+
70
+ Behaviours
71
+ ----------
72
+
73
+ ### Persistable
74
+
75
+ Requires a [Persistor](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/plugin#persistor) Plugin
76
+
77
+ Creates the ability to store and fetch the contents of the [Handler's Capsule](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/handler#the-capsule)
78
+
79
+ <pre>
80
+
81
+ :plugins:
82
+ :save_my_handler_state:
83
+ :class: ...
84
+ ...
85
+ ...
86
+
87
+ :daemons:
88
+ :my_daemon
89
+ ...
90
+ ...
91
+ :server:
92
+ :behaviours:
93
+ :persistable:
94
+ :plugin: :save_my_handler_state
95
+ :at:
96
+ :handler_after_receive:
97
+ :handler_disconnect:
98
+ ...
99
+ ...
100
+
101
+ </pre>
102
+
103
+
104
+ ### Preloadable
105
+
106
+ Requires a [Persistor](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/plugin#persistor) Plugin
107
+
108
+ Currently only works with a [Multiplexing Socket Handler](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/handler#socket-multiplexer)
109
+
110
+ Creates the ability to fetch all previously persisted [Handler Capsules](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/handler#the-capsule) ahead of goind to listen on the socket.
111
+
112
+ <pre>
113
+
114
+ :plugins:
115
+ :my_persistor:
116
+ :class: ...
117
+ ...
118
+ ...
119
+
120
+ :daemons:
121
+ :my_daemon
122
+ ...
123
+ :handler:
124
+ :class: SocketMultiplexer
125
+ :proxy_by: :unique_thing
126
+ :proxy_to:
127
+ :handler:
128
+ :class: ...
129
+
130
+ ...
131
+ :server:
132
+ :behaviours:
133
+
134
+ #
135
+ # acts on the nested handler
136
+ # to store each handler after a modification
137
+ #
138
+ :persistable:
139
+ :plugin: :my_persistor
140
+ :at:
141
+ :handler_afer_receive
142
+
143
+ #
144
+ # acts on the multiplexer
145
+ # to reload all handler's state at daemon start
146
+ #
147
+ :preloadable:
148
+ :plugin: :my_persistor
149
+ :at:
150
+ :multiplexer_start:
151
+ ...
152
+ ...
153
+
154
+ </pre>
155
+
156
+
157
+ ### Enqueueable
158
+
159
+
160
+ Requires an [Enqueuer](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/plugin#enqueuer) Plugin
161
+
162
+ Enqueues a Job onto a specified Queue with the [Handler's Capsule](https://github.com/cluetechnologies/langrove-enterprise/tree/master/lib/langrove/handler#the-capsule) as payload.
163
+
164
+
165
+
166
+ <pre>
167
+
168
+ ...pending: config...
169
+
170
+ </pre>
@@ -0,0 +1,63 @@
1
+ ASSESSABLE_VERSION = 0
2
+
3
+ module LanGrove
4
+
5
+ module Behaviour
6
+
7
+ class Assessable < Base
8
+
9
+ #
10
+ # Assessable provides a second persistance for a 'previous' capsule,
11
+ # with a built in DELTA detector.
12
+ #
13
+
14
+ def initialize( root, config, name )
15
+
16
+ @requires = {
17
+
18
+ #
19
+ # The Assessor plugin should contain an embedded Persistor plugin.
20
+ #
21
+ :assessor => {
22
+
23
+ :actions => [
24
+
25
+ #
26
+ # Assessor should implement:
27
+ #
28
+ # (In addition to having access to store() and fetch() from
29
+ # the nested Persistor)
30
+ #
31
+ # <Plugin>.assess( handler )
32
+ #
33
+ # - Should use the handler.key to collect from a
34
+ # second persistance the 'previous' capsule
35
+ # contents and - upon comparison with the supplied
36
+ # handler.capsule (the latest)
37
+ #
38
+ # -- emit Notifications on each DELTA
39
+ # -- store the new capsule as the 'new previous'
40
+ #
41
+ # - Success assumed.
42
+ #
43
+ # - (on failure) Should THROW
44
+ #
45
+ :assess
46
+
47
+ ],
48
+
49
+ :version => ASSESSABLE_VERSION
50
+
51
+ }
52
+
53
+ } if @requires.nil?
54
+
55
+ super
56
+
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+
63
+ end
@@ -0,0 +1,16 @@
1
+ module LanGrove
2
+
3
+ module Behaviour
4
+
5
+ end
6
+
7
+ end
8
+
9
+ require 'langrove/behaviour/behaviour_base'
10
+
11
+ require 'langrove/behaviour/persistable'
12
+ require 'langrove/behaviour/enqueueable'
13
+ require 'langrove/behaviour/preloadable'
14
+ require 'langrove/behaviour/assessable'
15
+ require 'langrove/behaviour/notifiable'
16
+ #require 'langrove/behaviour/terminatable'