nutella_lib 0.4.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6803b3cb787519bd1f861c931211696fa0b35afb
4
- data.tar.gz: 20537f9462a2a9bdbacb51c2d24d801788b29ed1
3
+ metadata.gz: 2016c67f84255831a77a366b0e60feb41d533933
4
+ data.tar.gz: 5249682d97501eda22d951916126f3e539aaf425
5
5
  SHA512:
6
- metadata.gz: 83cbd543626b9031e998e4cbf1bd4c0e94af45d0d09e4c689d8c2d1a1d34cb80a4c60ff6079c6cfcef73b420daf579dd6f9b09366629beeb064c91bf393a6371
7
- data.tar.gz: 086aed862b969022d4cfec48defbe19eacb3e7f949ff4c21da2e0c5d44a9bd81d69e496956ed54af0200acc2e057f80e335782a76ef77cab1cb29e3711b54d41
6
+ metadata.gz: 68d73aba562d55c2f487fcedd3ffbbb0081dd342486fd6079722d2d718fbcc06b79ffeaa1c28301347f479d664fb37c52c3d04dd3f39b3ed1f4fe801ade57f0e
7
+ data.tar.gz: d9d0434e9ac3dec3bcfb2e3a79aca838b4eeda46313bbddebe44f9059c60e4de39538f9e3a20badd0820493d74f09ac1afd3c265e21a26ceac755abbc0aea8cf
data/Gemfile CHANGED
@@ -1,6 +1,7 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
3
  gem 'mqtt', '~> 0.3', '>= 0.3'
4
+ gem 'ansi', '~> 1.5', '>= 1.4'
4
5
 
5
6
  group :development do
6
7
  gem 'shoulda', '~> 3', '>= 3'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.4.1
@@ -0,0 +1,57 @@
1
+ module Nutella
2
+
3
+ module App
4
+
5
+ # Initializes this component as an application component
6
+ # @param [String] broker_hostname
7
+ # @param [String] component_id
8
+ def self.init( broker_hostname, app_id, component_id )
9
+ Nutella.app_id = app_id
10
+ Nutella.run_id = nil
11
+ Nutella.component_id = component_id
12
+ Nutella.resource_id = nil
13
+ Nutella.mqtt = SimpleMQTTClient.new broker_hostname
14
+ # Fetch the `run_id`s list for this application and subscribe to its updates
15
+ # @app_runs_list = net.sync_request('app_runs_list')
16
+ # self.net.subscribe('app_runs_list', lambda {|message, _| Nutella.app.app_runs_list = message })
17
+ end
18
+
19
+ # Setter/getter for runs_list
20
+ def self.app_runs_list=(val) @app_runs_list=val; end
21
+ def self.app_runs_list; @app_runs_list end
22
+
23
+ # Accessors for sub-modules
24
+ def self.net; Nutella::App::Net; end
25
+ def self.log; Nutella::App::Log; end
26
+
27
+
28
+ # Parse command line arguments for app level components
29
+ #
30
+ # @param [Array] args command line arguments array
31
+ # @return [String, String] broker and app_id
32
+ def self.parse_args(args)
33
+ if args.length < 2
34
+ STDERR.puts 'Couldn\'t read broker address and app_id from the command line, impossible to initialize component!'
35
+ return
36
+ end
37
+ return args[0], args[1]
38
+ end
39
+
40
+ # Extracts the component name from the folder where the code for this component is located
41
+ #
42
+ # @return [String] the component name
43
+ def self.extract_component_id
44
+ Nutella.extract_component_id
45
+ end
46
+
47
+ # Sets the resource id
48
+ #
49
+ # @param [String] resource_id the resource id (i.e. the particular instance of this component)
50
+ def self.set_resource_id( resource_id )
51
+ Nutella.set_resource_id resource_id
52
+ end
53
+
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,49 @@
1
+ require 'ansi'
2
+
3
+ module Nutella
4
+
5
+ module App
6
+
7
+ module Log
8
+
9
+ def self.debug(message, code=nil)
10
+ puts( ANSI.cyan + message + ANSI.reset )
11
+ Nutella.app.net.publish( 'logging', log_to_json(message, code, __method__) )
12
+ code
13
+ end
14
+
15
+ def self.info(message, code=nil)
16
+ puts( message )
17
+ Nutella.app.net.publish( 'logging', log_to_json(message, code, __method__) )
18
+ code
19
+ end
20
+
21
+ def self.success(message, code=nil)
22
+ puts( ANSI.green + message + ANSI.reset )
23
+ Nutella.app.net.publish( 'logging', log_to_json(message, code, __method__) )
24
+ code
25
+ end
26
+
27
+ def self.warn(message, code=nil)
28
+ puts( ANSI.yellow + message + ANSI.reset )
29
+ Nutella.app.net.publish( 'logging', log_to_json(message, code, __method__) )
30
+ code
31
+ end
32
+
33
+ def self.error(message, code=nil)
34
+ puts( ANSI.red + message + ANSI.reset )
35
+ Nutella.app.net.publish( 'logging', log_to_json(message, code, __method__) )
36
+ code
37
+ end
38
+
39
+ private
40
+
41
+ def self.log_to_json( message, code, level)
42
+ code.nil? ? {level: level, message: message} : {level: level, message: message, code: code}
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -1,8 +1,9 @@
1
1
  module Nutella
2
- module Net
2
+
3
+ module App
3
4
 
4
5
  # This module implements the pub/sub and request/response APIs at the application level
5
- module App
6
+ module Net
6
7
 
7
8
 
8
9
  # @!group Application-level communication APIs
@@ -15,7 +16,7 @@ module Nutella
15
16
  # - [String] message: the received message. Messages that are not JSON are discarded.
16
17
  # - [String] channel: the application-level channel the message was received on (optional, only for wildcard subscriptions)
17
18
  # - [Hash] from: the sender's identifiers (run_id, app_id, component_id and optionally resource_id)
18
- def App.subscribe (channel, callback)
19
+ def self.subscribe (channel, callback)
19
20
  Nutella::Net.subscribe_to(channel, callback, Nutella.app_id, nil)
20
21
  end
21
22
 
@@ -23,7 +24,7 @@ module Nutella
23
24
  # Un-subscribes from an application-level channel
24
25
  #
25
26
  # @param [String] channel the application level channel we want to unsubscribe from. Can contain wildcard(s).
26
- def App.unsubscribe( channel )
27
+ def self.unsubscribe( channel )
27
28
  Nutella::Net.unsubscribe_to(channel, Nutella.app_id, nil)
28
29
  end
29
30
 
@@ -33,7 +34,7 @@ module Nutella
33
34
  # @param [String] channel the application-level channel we want to publish the message to. *CANNOT* contain wildcard(s)!
34
35
  # @param [Object] message the message we are publishing. This can be,
35
36
  # nil/empty (default), a string, a hash and, in general, anything with a .to_json method.
36
- def App.publish(channel, message=nil)
37
+ def self.publish(channel, message=nil)
37
38
  Nutella::Net.publish_to(channel, message, Nutella.app_id, nil)
38
39
  end
39
40
 
@@ -43,7 +44,7 @@ module Nutella
43
44
  # @param [String] channel the application-level channel we want to make the request to. *CANNOT* contain wildcard(s)!
44
45
  # @param [Object] message the body of request. This can be,
45
46
  # nil/empty (default), a string, a hash and, in general, anything with a .to_json method.
46
- def App.sync_request ( channel, message=nil )
47
+ def self.sync_request ( channel, message=nil )
47
48
  Nutella::Net.sync_request_to(channel, message, Nutella.app_id, nil)
48
49
  end
49
50
 
@@ -54,7 +55,7 @@ module Nutella
54
55
  # @param [Object] message the body of request. This can be,
55
56
  # nil/empty (default), a string, a hash and, in general, anything with a .to_json method.
56
57
  # @param [Proc] callback the callback that is fired whenever a response is received. It takes one parameter (response).
57
- def App.async_request ( channel, message=nil, callback )
58
+ def self.async_request ( channel, message=nil, callback )
58
59
  Nutella::Net.async_request_to(channel, message, callback, Nutella.app_id, nil)
59
60
  end
60
61
 
@@ -67,7 +68,7 @@ module Nutella
67
68
  # - [String] the received message (payload). Messages that are not JSON are discarded.
68
69
  # - [Hash] the sender's identifiers (run_id, app_id, component_id and optionally resource_id)
69
70
  # - [*returns* Hash] The response sent back to the client that performed the request. Whatever is returned by the callback is marshaled into a JSON string and sent via MQTT.
70
- def App.handle_requests( channel, callback )
71
+ def self.handle_requests( channel, callback )
71
72
  Nutella::Net.handle_requests_on(channel, callback, Nutella.app_id, nil)
72
73
  end
73
74
 
@@ -85,7 +86,7 @@ module Nutella
85
86
  # - [String] message: the received message. Messages that are not JSON are discarded.
86
87
  # - [String] channel: the application-level channel the message was received on (optional, only for wildcard subscriptions)
87
88
  # - [Hash] from: the sender's identifiers (run_id, app_id, component_id and optionally resource_id)
88
- def App.subscribe_to_run( run_id, channel, callback )
89
+ def self.subscribe_to_run( run_id, channel, callback )
89
90
  Nutella::Net.subscribe_to(channel, callback, Nutella.app_id, run_id)
90
91
  end
91
92
 
@@ -94,7 +95,7 @@ module Nutella
94
95
  #
95
96
  # @param [String] run_id the specific run we are un-subscribing from
96
97
  # @param [String] channel the run-level channel we want to unsubscribe from. Can contain wildcard(s).
97
- def App.unsubscribe_to_run( run_id, channel )
98
+ def self.unsubscribe_to_run( run_id, channel )
98
99
  Nutella::Net.unsubscribe_to(channel, Nutella.app_id, run_id)
99
100
  end
100
101
 
@@ -105,7 +106,7 @@ module Nutella
105
106
  # @param [String] channel the run-level channel we want to publish the message to. *CANNOT* contain wildcard(s)!
106
107
  # @param [String] message the message we are publishing. This can be,
107
108
  # nil/empty (default), a string, a hash and, in general, anything with a .to_json method.
108
- def App.publish_to_run( run_id, channel, message )
109
+ def self.publish_to_run( run_id, channel, message )
109
110
  Nutella::Net.publish_to(channel, message, Nutella.app_id, run_id)
110
111
  end
111
112
 
@@ -116,7 +117,7 @@ module Nutella
116
117
  # @param [String] channel the channel we want to make the request to. *CANNOT* contain wildcard(s)!
117
118
  # @param [Object] request the body of request. This can be,
118
119
  # nil/empty (default), a string, a hash and, in general, anything with a .to_json method.
119
- def App.sync_request_to_run( run_id, channel, request)
120
+ def self.sync_request_to_run( run_id, channel, request)
120
121
  Nutella::Net.sync_request_to(channel, request, Nutella.app_id, run_id)
121
122
  end
122
123
 
@@ -128,7 +129,7 @@ module Nutella
128
129
  # @param [Object] request the body of request. This can be,
129
130
  # nil/empty (default), a string, a hash and, in general, anything with a .to_json method.
130
131
  # @param [Proc] callback the callback that is fired whenever a response is received. It takes one parameter (response).
131
- def App.async_request_to_run( run_id, channel, request, callback)
132
+ def self.async_request_to_run( run_id, channel, request, callback)
132
133
  Nutella::Net.async_request_to(channel, request, callback, Nutella.app_id, run_id)
133
134
  end
134
135
 
@@ -142,7 +143,7 @@ module Nutella
142
143
  # - [String] the received message (payload). Messages that are not JSON are discarded.
143
144
  # - [Hash] the sender's identifiers (run_id, app_id, component_id and optionally resource_id)
144
145
  # - [*returns* Hash] The response sent back to the client that performed the request. Whatever is returned by the callback is marshaled into a JSON string and sent via MQTT.
145
- def App.handle_requests_on_run( run_id, channel, callback )
146
+ def self.handle_requests_on_run( run_id, channel, callback )
146
147
  Nutella::Net.handle_requests_on(channel, callback, Nutella.app_id, run_id)
147
148
  end
148
149
 
@@ -159,7 +160,7 @@ module Nutella
159
160
  # - [String] message: the received message. Messages that are not JSON are discarded.
160
161
  # - [String] run_id: the run_id of the channel the message was sent on
161
162
  # - [Hash] from: the sender's identifiers (run_id, app_id, component_id and optionally resource_id)
162
- def App.subscribe_to_all_runs( channel, callback )
163
+ def self.subscribe_to_all_runs( channel, callback )
163
164
  # Check the passed callback has the right number of arguments
164
165
  raise 'You need to pass a callback with 3 parameters (payload, run_id, from) when subscribing to all runs!' if callback.parameters.length!=3
165
166
  # Pad channel
@@ -187,7 +188,7 @@ module Nutella
187
188
  # Allows application-level APIs to unsubscribe from a run-level channel *for ALL runs*
188
189
  #
189
190
  # @param [String] channel the run-level channel we want to unsubscribe from. Can contain wildcard(s).
190
- def App.unsubscribe_from_all_runs( channel )
191
+ def self.unsubscribe_from_all_runs( channel )
191
192
  Nutella::Net.unsubscribe_to(channel, Nutella.app_id, '+')
192
193
  end
193
194
 
@@ -197,8 +198,8 @@ module Nutella
197
198
  # @param [String] channel the run-level channel we want to publish the message to. *CANNOT* contain wildcard(s)!
198
199
  # @param [Object] message the message we are publishing. This can be,
199
200
  # nil/empty (default), a string, a hash and, in general, anything with a .to_json method.
200
- def App.publish_to_all_runs( channel, message )
201
- Nutella.app_runs_list.each do |run_id|
201
+ def self.publish_to_all_runs( channel, message )
202
+ Nutella.app.app_runs_list.each do |run_id|
202
203
  Nutella::Net.publish_to(channel, message, Nutella.app_id, run_id)
203
204
  end
204
205
  end
@@ -210,8 +211,8 @@ module Nutella
210
211
  # @param [Object] request the body of request. This can be,
211
212
  # nil/empty (default), a string, a hash and, in general, anything with a .to_json method.
212
213
  # @param [Proc] callback the callback that is fired whenever a response is received. It takes one parameter (response).
213
- def App.async_request_to_all_runs(channel, request, callback)
214
- Nutella.app_runs_list.each do |run_id|
214
+ def self.async_request_to_all_runs(channel, request, callback)
215
+ Nutella.app.app_runs_list.each do |run_id|
215
216
  Nutella::Net.async_request_to(channel, request, callback, Nutella.app_id, run_id)
216
217
  end
217
218
  end
@@ -226,7 +227,7 @@ module Nutella
226
227
  # - [String] run_id: the run_id of the channel the message was sent on
227
228
  # - [Hash] the sender's identifiers (from containing, run_id, app_id, component_id and optionally resource_id)
228
229
  # - [*returns* Hash] The response sent back to the client that performed the request. Whatever is returned by the callback is marshaled into a JSON string and sent via MQTT.
229
- def App.handle_requests_on_all_runs(channel, callback)
230
+ def self.handle_requests_on_all_runs(channel, callback)
230
231
  # Check the passed callback has the right number of arguments
231
232
  raise 'You need to pass a callback with 3 parameters (request, run_id, from) when handling requests!' if callback.parameters.length!=3
232
233
  # Pad channel
@@ -257,9 +258,21 @@ module Nutella
257
258
  # @!endgroup
258
259
 
259
260
 
261
+ # Listens for incoming messages. All this function
262
+ # does is to put the thread to sleep and wait for something to
263
+ # happen over the network to wake up.
264
+ def self.listen
265
+ begin
266
+ sleep
267
+ rescue Interrupt
268
+ # Simply returns once interrupted
269
+ end
270
+ end
271
+
272
+
260
273
  private
261
274
 
262
- def App.extract_run_id_from_ch( app_id, mqtt_channel )
275
+ def self.extract_run_id_from_ch( app_id, mqtt_channel )
263
276
  head = "/nutella/apps/#{app_id}/runs/"
264
277
  mqtt_channel.gsub(head, '').split('/')[0]
265
278
  end
@@ -268,4 +281,5 @@ module Nutella
268
281
  end
269
282
 
270
283
  end
284
+
271
285
  end
@@ -15,50 +15,32 @@ module Nutella
15
15
  end
16
16
 
17
17
 
18
- # Initializes this component as an application component
19
- # @param [String] broker_hostname
20
- # @param [String] component_id
21
- def self.init_as_app_component( broker_hostname, app_id, component_id )
22
- @app_id = app_id
23
- @run_id = nil
24
- @component_id = component_id
25
- @resource_id = nil
26
- @mqtt = SimpleMQTTClient.new broker_hostname
27
- # Fetch the `run_id`s list for this application and subscribe to its updates
28
- @app_runs_list = net.app.sync_request('app_runs_list')
29
- net.app.subscribe('app_runs_list', lambda {|message, _| @app_runs_list = message })
30
- end
31
-
32
-
33
- # Accessors for app_id
18
+ # Variables accessors
34
19
  def self.app_id; @app_id end
35
-
36
- # Accessors for run_id
37
20
  def self.run_id; @run_id end
38
-
39
- # Accessors for mqtt client
40
- def self.mqtt;
41
- raise 'Nutella has not been initialized: you need to call the proper init method before you can start using nutella' if @mqtt.nil?
42
- @mqtt
43
- end
44
-
45
- # Accessors for component_id
21
+ def self.resource_id; @resource_id end
46
22
  def self.component_id;
47
23
  raise 'Nutella has not been initialized: you need to call the proper init method before you can start using nutella' if @component_id.nil?
48
24
  @component_id
49
25
  end
26
+ def self.mqtt;
27
+ raise 'Nutella has not been initialized: you need to call the proper init method before you can start using nutella' if @mqtt.nil?
28
+ @mqtt
29
+ end
50
30
 
51
- # Accessors for resource_id
52
- def self.resource_id; @resource_id end
53
-
54
- # Accessor for runs list
55
- def self.app_runs_list; @app_runs_list end
31
+ # Variables Setters
32
+ def self.app_id=(val); @app_id=val; end
33
+ def self.run_id=(val); @run_id=val; end
34
+ def self.resource_id=(val); @resource_id=val; end
35
+ def self.component_id=(val); @component_id=val; end
36
+ def self.mqtt=(val); @mqtt=val; end
56
37
 
57
- # Accessor for the net module
58
- def self.net; Nutella::Net end
59
38
 
60
- # Accessor for the persist module
61
- def self.persist; Nutella::Persist end
39
+ # Accessors for sub-modules
40
+ def self.app; Nutella::App; end
41
+ def self.net; Nutella::Net; end
42
+ def self.log; Nutella::Log; end
43
+ def self.persist; Nutella::Persist; end
62
44
 
63
45
 
64
46
  # Utility functions
@@ -68,7 +50,7 @@ module Nutella
68
50
  #
69
51
  # @param [Array] args command line arguments array
70
52
  # @return [String, String, String] broker, app_id and run_id
71
- def self.parse_run_component_args(args)
53
+ def self.parse_args(args)
72
54
  if args.length < 3
73
55
  STDERR.puts 'Couldn\'t read broker address, app_id and run_id from the command line, impossible to initialize component!'
74
56
  return
@@ -77,19 +59,6 @@ module Nutella
77
59
  end
78
60
 
79
61
 
80
- # Parse command line arguments for app level components
81
- #
82
- # @param [Array] args command line arguments array
83
- # @return [String, String] broker and app_id
84
- def self.parse_app_component_args(args)
85
- if args.length < 2
86
- STDERR.puts 'Couldn\'t read broker address and app_id from the command line, impossible to initialize component!'
87
- return
88
- end
89
- return args[0], args[1]
90
- end
91
-
92
-
93
62
  # Extracts the component name from the folder where the code for this component is located
94
63
  #
95
64
  # @return [String] the component name
@@ -0,0 +1,46 @@
1
+ require 'ansi'
2
+
3
+ module Nutella
4
+
5
+ module Log
6
+
7
+ def self.debug(message, code=nil)
8
+ puts( ANSI.cyan + message + ANSI.reset )
9
+ Nutella.net.publish( 'logging', log_to_json(message, code, __method__) )
10
+ code
11
+ end
12
+
13
+ def self.info(message, code=nil)
14
+ puts( message )
15
+ Nutella.net.publish( 'logging', log_to_json(message, code, __method__) )
16
+ code
17
+ end
18
+
19
+ def self.success(message, code=nil)
20
+ puts( ANSI.green + message + ANSI.reset )
21
+ Nutella.net.publish( 'logging', log_to_json(message, code, __method__) )
22
+ code
23
+ end
24
+
25
+ def self.warn(message, code=nil)
26
+ puts( ANSI.yellow + message + ANSI.reset )
27
+ Nutella.net.publish( 'logging', log_to_json(message, code, __method__) )
28
+ code
29
+ end
30
+
31
+ def self.error(message, code=nil)
32
+ puts( ANSI.red + message + ANSI.reset )
33
+ Nutella.net.publish( 'logging', log_to_json(message, code, __method__) )
34
+ code
35
+ end
36
+
37
+ private
38
+
39
+ def self.log_to_json( message, code, level)
40
+ code.nil? ? {level: level, message: message} : {level: level, message: message, code: code}
41
+ end
42
+
43
+
44
+ end
45
+
46
+ end
@@ -7,14 +7,11 @@ module Nutella
7
7
  @subscriptions = []
8
8
  @callbacks = []
9
9
 
10
- # Provides access to the net.app sub-module
11
- def Net.app; Nutella::Net::App end
12
-
13
10
  # Provides access to the subscriptions
14
- def Net.subscriptions; @subscriptions end
11
+ def self.subscriptions; @subscriptions end
15
12
 
16
13
  # Provides access to callbacks
17
- def Net.callbacks; @callbacks end
14
+ def self.callbacks; @callbacks end
18
15
 
19
16
 
20
17
  # Subscribes to a channel or to a set of channels.
@@ -25,7 +22,7 @@ module Nutella
25
22
  # - [String] message: the received message. Messages that are not JSON are discarded.
26
23
  # - [String] channel: the channel the message was received on (optional, only for wildcard subscriptions)
27
24
  # - [Hash] from: the sender's identifiers (run_id, app_id, component_id and optionally resource_id)
28
- def Net.subscribe( channel, callback )
25
+ def self.subscribe( channel, callback )
29
26
  subscribe_to( channel, callback, Nutella.app_id, Nutella.run_id)
30
27
  end
31
28
 
@@ -33,7 +30,7 @@ module Nutella
33
30
  # Un-subscribes from a channel
34
31
  #
35
32
  # @param [String] channel we want to unsubscribe from. Can contain wildcard(s).
36
- def Net.unsubscribe( channel )
33
+ def self.unsubscribe( channel )
37
34
  unsubscribe_to( channel, Nutella.app_id, Nutella.run_id)
38
35
  end
39
36
 
@@ -43,7 +40,7 @@ module Nutella
43
40
  # @param [String] channel we want to publish the message to. *CANNOT* contain wildcard(s)!
44
41
  # @param [Object] message the message we are publishing. This can be,
45
42
  # nil/empty (default), a string, a hash and, in general, anything with a .to_json method.
46
- def Net.publish( channel, message=nil )
43
+ def self.publish( channel, message=nil )
47
44
  publish_to( channel, message, Nutella.app_id, Nutella.run_id)
48
45
  end
49
46
 
@@ -53,7 +50,7 @@ module Nutella
53
50
  # @param [String] channel we want to make the request to. *CANNOT* contain wildcard(s)!
54
51
  # @param [Object] message the body of request. This can be,
55
52
  # nil/empty (default), a string, a hash and, in general, anything with a .to_json method.
56
- def Net.sync_request( channel, message=nil )
53
+ def self.sync_request( channel, message=nil )
57
54
  sync_request_to(channel, message, Nutella.app_id, Nutella.run_id)
58
55
  end
59
56
 
@@ -64,7 +61,7 @@ module Nutella
64
61
  # @param [Object] message the body of request. This can be,
65
62
  # nil/empty (default), a string, a hash and, in general, anything with a .to_json method.
66
63
  # @param [Proc] callback the callback that is fired whenever a response is received. It takes one parameter (response).
67
- def Net.async_request( channel, message=nil, callback )
64
+ def self.async_request( channel, message=nil, callback )
68
65
  async_request_to(channel, message, callback, Nutella.app_id, Nutella.run_id)
69
66
  end
70
67
 
@@ -78,7 +75,7 @@ module Nutella
78
75
  # - [Hash] the sender's identifiers (run_id, app_id, component_id and optionally resource_id)
79
76
  # - [*returns* Hash] The response sent back to the client that performed the request. Whatever is returned by the callback is marshaled into a JSON string and sent via MQTT.
80
77
  #
81
- def Net.handle_requests( channel, callback )
78
+ def self.handle_requests( channel, callback )
82
79
  handle_requests_on(channel, callback, Nutella.app_id, Nutella.run_id)
83
80
  end
84
81
 
@@ -86,7 +83,7 @@ module Nutella
86
83
  # Listens for incoming messages. All this function
87
84
  # does is to put the thread to sleep and wait for something to
88
85
  # happen over the network to wake up.
89
- def Net.listen
86
+ def self.listen
90
87
  begin
91
88
  sleep
92
89
  rescue Interrupt
@@ -98,26 +95,26 @@ module Nutella
98
95
  private
99
96
 
100
97
 
101
- def Net.extract_fields_from_message(message)
98
+ def self.extract_fields_from_message(message)
102
99
  mh = JSON.parse message
103
100
  return mh['type'], mh['from'], mh['payload'], mh['id']
104
101
  end
105
102
 
106
- def Net.pad_channel( channel, app_id, run_id )
103
+ def self.pad_channel( channel, app_id, run_id )
107
104
  raise 'If the run_id is specified, app_id needs to also be specified' if (!run_id.nil? && app_id.nil?)
108
105
  return "/nutella/#{channel}" if (app_id.nil? && run_id.nil?)
109
106
  return "/nutella/apps/#{app_id}/#{channel}" if (!app_id.nil? && run_id.nil?)
110
107
  "/nutella/apps/#{app_id}/runs/#{run_id}/#{channel}"
111
108
  end
112
109
 
113
- def Net.un_pad_channel( channel, app_id, run_id )
110
+ def self.un_pad_channel( channel, app_id, run_id )
114
111
  raise 'If the run_id is specified, app_id needs to also be specified' if (!run_id.nil? && app_id.nil?)
115
112
  return channel.gsub('/nutella/', '') if (app_id.nil? && run_id.nil?)
116
113
  return channel.gsub("/nutella/apps/#{app_id}/", '') if (!app_id.nil? && run_id.nil?)
117
114
  channel.gsub("/nutella/apps/#{app_id}/runs/#{run_id}/", '')
118
115
  end
119
116
 
120
- def Net.assemble_from
117
+ def self.assemble_from
121
118
  from = Hash.new
122
119
  if Nutella.run_id.nil?
123
120
  from['type'] = 'app'
@@ -131,14 +128,14 @@ module Nutella
131
128
  from
132
129
  end
133
130
 
134
- def Net.prepare_message_for_publish( message )
131
+ def self.prepare_message_for_publish( message )
135
132
  if message.nil?
136
133
  return {type: 'publish', from: assemble_from}.to_json
137
134
  end
138
135
  {type: 'publish', from: assemble_from, payload: message}.to_json
139
136
  end
140
137
 
141
- def Net.prepare_message_for_request( message )
138
+ def self.prepare_message_for_request( message )
142
139
  id = message.hash + Random.rand(100)
143
140
  if message.nil?
144
141
  return {id: id, type: 'request', from: assemble_from}.to_json, id
@@ -146,7 +143,7 @@ module Nutella
146
143
  return {id: id, type: 'request', from: assemble_from, payload: message}.to_json, id
147
144
  end
148
145
 
149
- def Net.prepare_message_for_response( message, id )
146
+ def self.prepare_message_for_response( message, id )
150
147
  if message.nil?
151
148
  return {id: id, type: 'response', from: assemble_from}.to_json
152
149
  end
@@ -164,7 +161,7 @@ module Nutella
164
161
  # - [Hash] from: the sender's identifiers (run_id, app_id, component_id and optionally resource_id)
165
162
  # @param [String] app_id used to pad channels
166
163
  # @param [String] run_id used to pad channels
167
- def Net.subscribe_to( channel, callback, app_id, run_id )
164
+ def self.subscribe_to( channel, callback, app_id, run_id )
168
165
  # Check the passed callback has the right number of arguments
169
166
  if Nutella.mqtt.is_channel_wildcard?(channel)
170
167
  raise 'You need to pass a callback with 3 parameters (message, channel, from) when subscribing to a wildcard channel!' if callback.parameters.length!=3
@@ -216,7 +213,7 @@ module Nutella
216
213
  # @param [String] channel we want to unsubscribe from. Can contain wildcard(s).
217
214
  # @param [String] app_id used to pad channels
218
215
  # @param [String] run_id used to pad channels
219
- def Net.unsubscribe_to( channel, app_id, run_id )
216
+ def self.unsubscribe_to( channel, app_id, run_id )
220
217
  # Pad channel
221
218
  padded_channel = pad_channel(channel, app_id, run_id)
222
219
  idx = @subscriptions.index padded_channel
@@ -238,15 +235,16 @@ module Nutella
238
235
  # nil/empty (default), a string, a hash and, in general, anything with a .to_json method.
239
236
  # @param [String] app_id used to pad channels
240
237
  # @param [String] run_id used to pad channels
241
- def Net.publish_to( channel, message=nil, app_id, run_id )
238
+ def self.publish_to( channel, message=nil, app_id, run_id )
242
239
  # Pad channel
243
240
  padded_channel = pad_channel(channel, app_id, run_id)
244
241
  # Throw exception if trying to publish something that is not JSON
245
242
  begin
246
- m = Net.prepare_message_for_publish message
243
+ m = self.prepare_message_for_publish message
247
244
  Nutella.mqtt.publish( padded_channel, m )
248
245
  rescue
249
246
  STDERR.puts 'Error: you are trying to publish something that is not JSON'
247
+ STDERR.puts $!
250
248
  end
251
249
  end
252
250
 
@@ -258,7 +256,7 @@ module Nutella
258
256
  # nil/empty (default), a string, a hash and, in general, anything with a .to_json method.
259
257
  # @param [String] app_id used to pad channels
260
258
  # @param [String] run_id used to pad channels
261
- def Net.sync_request_to( channel, message=nil, app_id, run_id )
259
+ def self.sync_request_to( channel, message=nil, app_id, run_id )
262
260
  # Pad channel
263
261
  padded_channel = pad_channel(channel, app_id, run_id)
264
262
  # Prepare message
@@ -291,7 +289,7 @@ module Nutella
291
289
  # @param [Proc] callback the callback that is fired whenever a response is received. It takes one parameter (response).
292
290
  # @param [String] app_id used to pad channels
293
291
  # @param [String] run_id used to pad channels
294
- def Net.async_request_to( channel, message=nil, callback, app_id, run_id )
292
+ def self.async_request_to( channel, message=nil, callback, app_id, run_id )
295
293
  # Check the passed callback has the right number of arguments
296
294
  raise 'You need to pass a callback with 1 parameter (response) when making an asynchronous request!' if callback.parameters.length!=1
297
295
  # Pad channel
@@ -323,7 +321,7 @@ module Nutella
323
321
  # - [*returns* Hash] The response sent back to the client that performed the request. Whatever is returned by the callback is marshaled into a JSON string and sent via MQTT.
324
322
  # @param [String] app_id used to pad channels
325
323
  # @param [String] run_id used to pad channels
326
- def Net.handle_requests_on( channel, callback, app_id, run_id )
324
+ def self.handle_requests_on( channel, callback, app_id, run_id )
327
325
  # Check the passed callback has the right number of arguments
328
326
  raise 'You need to pass a callback with 2 parameter (request, from) when handling requests!' if callback.parameters.length!=2
329
327
  # Pad channel
@@ -335,7 +333,7 @@ module Nutella
335
333
  # Only handle requests that have proper id set
336
334
  return if type!='request' || id.nil?
337
335
  # Execute callback and send response
338
- m = Net.prepare_message_for_response( callback.call( payload, from), id )
336
+ m = self.prepare_message_for_response( callback.call( payload, from), id )
339
337
  Nutella.mqtt.publish( padded_channel, m )
340
338
  rescue JSON::ParserError
341
339
  # Make sure that request contains JSON, if not drop the message
data/lib/nutella_lib.rb CHANGED
@@ -1,12 +1,16 @@
1
+ require 'json'
2
+ require 'set'
3
+
4
+ require 'simple_mqtt_client/simple_mqtt_client'
5
+
1
6
  require 'nutella_lib/core'
2
7
  require 'nutella_lib/net'
3
- require 'nutella_lib/net_app'
8
+ require 'nutella_lib/log'
4
9
  require 'nutella_lib/persist'
5
- require 'simple_mqtt_client/simple_mqtt_client'
6
10
 
7
- # Gems used across the whole library
8
- require 'json'
9
- require 'set'
11
+ require 'nutella_lib/app_core'
12
+ require 'nutella_lib/app_net'
13
+ require 'nutella_lib/app_log'
10
14
 
11
15
  # NO_EXT gets defined when you require "nutella_lib/noext", which
12
16
  # signals that you don't want any extensions.
data/nutella_lib.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: nutella_lib 0.4.0 ruby lib
5
+ # stub: nutella_lib 0.4.1 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "nutella_lib"
9
- s.version = "0.4.0"
9
+ s.version = "0.4.1"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Alessandro Gnoli"]
14
- s.date = "2015-03-13"
14
+ s.date = "2015-03-16"
15
15
  s.description = "Implements the nutella protocol and exposes it natively to ruby developers"
16
16
  s.email = "tebemis@gmail.com"
17
17
  s.extra_rdoc_files = [
@@ -27,15 +27,19 @@ Gem::Specification.new do |s|
27
27
  "Rakefile",
28
28
  "VERSION",
29
29
  "lib/nutella_lib.rb",
30
+ "lib/nutella_lib/app_core.rb",
31
+ "lib/nutella_lib/app_log.rb",
32
+ "lib/nutella_lib/app_net.rb",
30
33
  "lib/nutella_lib/core.rb",
31
34
  "lib/nutella_lib/ext/kernel.rb",
35
+ "lib/nutella_lib/log.rb",
32
36
  "lib/nutella_lib/net.rb",
33
- "lib/nutella_lib/net_app.rb",
34
37
  "lib/nutella_lib/noext.rb",
35
38
  "lib/nutella_lib/persist.rb",
36
39
  "lib/simple_mqtt_client/simple_mqtt_client.rb",
37
40
  "nutella_lib.gemspec",
38
41
  "test/helper.rb",
42
+ "test/test_logger.rb",
39
43
  "test/test_nutella_net.rb",
40
44
  "test/test_nutella_net_app.rb",
41
45
  "test/test_simple_mqtt_client.rb"
@@ -50,6 +54,7 @@ Gem::Specification.new do |s|
50
54
 
51
55
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
52
56
  s.add_runtime_dependency(%q<mqtt>, [">= 0.3", "~> 0.3"])
57
+ s.add_runtime_dependency(%q<ansi>, [">= 1.4", "~> 1.5"])
53
58
  s.add_development_dependency(%q<shoulda>, [">= 3", "~> 3"])
54
59
  s.add_development_dependency(%q<minitest>, [">= 5", "~> 5.4"])
55
60
  s.add_development_dependency(%q<yard>, [">= 0.8.7", "~> 0.8"])
@@ -59,6 +64,7 @@ Gem::Specification.new do |s|
59
64
  s.add_development_dependency(%q<simplecov>, [">= 0", "~> 0"])
60
65
  else
61
66
  s.add_dependency(%q<mqtt>, [">= 0.3", "~> 0.3"])
67
+ s.add_dependency(%q<ansi>, [">= 1.4", "~> 1.5"])
62
68
  s.add_dependency(%q<shoulda>, [">= 3", "~> 3"])
63
69
  s.add_dependency(%q<minitest>, [">= 5", "~> 5.4"])
64
70
  s.add_dependency(%q<yard>, [">= 0.8.7", "~> 0.8"])
@@ -69,6 +75,7 @@ Gem::Specification.new do |s|
69
75
  end
70
76
  else
71
77
  s.add_dependency(%q<mqtt>, [">= 0.3", "~> 0.3"])
78
+ s.add_dependency(%q<ansi>, [">= 1.4", "~> 1.5"])
72
79
  s.add_dependency(%q<shoulda>, [">= 3", "~> 3"])
73
80
  s.add_dependency(%q<minitest>, [">= 5", "~> 5.4"])
74
81
  s.add_dependency(%q<yard>, [">= 0.8.7", "~> 0.8"])
@@ -0,0 +1,26 @@
1
+ require 'helper'
2
+
3
+ class TestNutellaNet < MiniTest::Test
4
+
5
+ # nutella.init( 'ltg.evl.uic.edu', 'ale_app_1', 'ale_run_1', 'ale_component_2' )
6
+ #
7
+ # def test_logger
8
+ # p nutella.log.success 'success', 401
9
+ # p nutella.log.info 'info', 401
10
+ # p nutella.log.warn 'warn', 401
11
+ # p nutella.log.error 'error', 401
12
+ # p nutella.log.debug 'debug', 401
13
+ # end
14
+
15
+
16
+ # nutella.app.init( 'ltg.evl.uic.edu', 'ale_app_1', 'ale_component_2' )
17
+ #
18
+ # def test_logger
19
+ # p nutella.app.log.success 'success', 401
20
+ # p nutella.app.log.info 'info', 401
21
+ # p nutella.app.log.warn 'warn', 401
22
+ # p nutella.app.log.error 'error', 401
23
+ # p nutella.app.log.debug 'debug', 401
24
+ # end
25
+
26
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nutella_lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alessandro Gnoli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-13 00:00:00.000000000 Z
11
+ date: 2015-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mqtt
@@ -30,6 +30,26 @@ dependencies:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '0.3'
33
+ - !ruby/object:Gem::Dependency
34
+ name: ansi
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '1.4'
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '1.5'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '1.4'
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '1.5'
33
53
  - !ruby/object:Gem::Dependency
34
54
  name: shoulda
35
55
  requirement: !ruby/object:Gem::Requirement
@@ -186,15 +206,19 @@ files:
186
206
  - Rakefile
187
207
  - VERSION
188
208
  - lib/nutella_lib.rb
209
+ - lib/nutella_lib/app_core.rb
210
+ - lib/nutella_lib/app_log.rb
211
+ - lib/nutella_lib/app_net.rb
189
212
  - lib/nutella_lib/core.rb
190
213
  - lib/nutella_lib/ext/kernel.rb
214
+ - lib/nutella_lib/log.rb
191
215
  - lib/nutella_lib/net.rb
192
- - lib/nutella_lib/net_app.rb
193
216
  - lib/nutella_lib/noext.rb
194
217
  - lib/nutella_lib/persist.rb
195
218
  - lib/simple_mqtt_client/simple_mqtt_client.rb
196
219
  - nutella_lib.gemspec
197
220
  - test/helper.rb
221
+ - test/test_logger.rb
198
222
  - test/test_nutella_net.rb
199
223
  - test/test_nutella_net_app.rb
200
224
  - test/test_simple_mqtt_client.rb