fancybox2 0.0.1 → 0.0.6

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
  SHA256:
3
- metadata.gz: 36eebce6aa26f750e0d2974e2f7ea1a2f029174bddb6d3bb6b8a4adb4e01fd4a
4
- data.tar.gz: 7f0d67c72d4472d950bbb581a2b2829cea9a0527bdc4377568a3d4293039ccbc
3
+ metadata.gz: 88d9c51fb40eb09f50db57b7dd601e78f36dc27df736d3b801c331cf9b6ba62c
4
+ data.tar.gz: 7cb67a8d2d7894591dca8815f9aee65a809498405ad65fd2fc05e05d3af192f1
5
5
  SHA512:
6
- metadata.gz: 38a9da60393ba4308c46fca05ef6764111a872128f89cfc62bda02a998df36f64a08f41ef86eedc4108011368cd1eeaf682bbdda1f299ce16bfe2d66dfc075eb
7
- data.tar.gz: 6600b35da0bf560f6b6f84edaa7f2307b6a49c4ae8e0c831cda9f764e0652b8f25384df236b87f096e19faba44ee86653381decef46c22d00597f65dfc807ea5
6
+ metadata.gz: 253c8254774761d441e39ef541038a86e6f4860db9fe5d7584565e7aa1641110247231a59cad0ae2304e5f9fe462a5f09fa2c62f8fb9ebe6aa0cc2a38834cf9f
7
+ data.tar.gz: ce444bf2a0f6eb8ce1148a17013a0419a50029c193b0a7f89423f768120fcddcd0f25acf2356154d4f75b9c277e265a1499a99fec3588124c1f3f086f3f34d60
data/README.md CHANGED
@@ -2,188 +2,12 @@
2
2
  <img width="480" src="assets/logo.png"/>
3
3
  </p>
4
4
 
5
- [![Build Status](https://travis-ci.org/space-bunny/ruby_sdk.svg)](https://travis-ci.org/space-bunny/ruby_sdk)
6
- [![Gem Version](https://badge.fury.io/rb/spacebunny.svg)](https://badge.fury.io/rb/spacebunny)
5
+ [![Build Status](https://travis-ci.org/FancyPixel/fancybox2-ruby-sdk.svg)](https://travis-ci.org/FancyPixel/fancybox2-ruby-sdk)
6
+ [![Gem Version](https://badge.fury.io/rb/fancybox2.svg)](https://badge.fury.io/rb/fancybox2)
7
7
 
8
- [SpaceBunny](http://spacebunny.io) is the IoT platform that makes it easy for you and your devices to send and
9
- exchange messages with a server or even with each other. You can store the data, receive timely event notifications,
10
- monitor live streams and remotely control your devices. Easy to use, and ready to scale at any time.
8
+ FancyPixel's FancyBox2 Ruby SDK for developing modules
11
9
 
12
- This is the source code repository for Ruby SDK.
13
- Please feel free to contribute!
14
-
15
- ## Installation
16
-
17
- Add this line to your application's Gemfile:
18
-
19
- ```ruby
20
- gem 'spacebunny'
21
- ```
22
-
23
- And then execute:
24
-
25
- $ bundle
26
-
27
- Or install it yourself as:
28
-
29
- $ gem install spacebunny
30
-
31
- After you have signed up for a [SpaceBunny](http://spacebunny.io)'s account, follow the
32
- [Getting Started](http://getting_started_link) guide for a one minute introduction to the platform concepts
33
- and a super rapid setup.
34
-
35
- This SDK provides Device and LiveStream clients and currently supports the AMQP protocol.
36
-
37
- ## Device - Basic usage
38
-
39
- Pick a device, view its configurations and copy the Device Key. Instantiate a new `Spacebunny::Device` client,
40
- providing the Device Key:
41
-
42
- ```ruby
43
- dev = Spacebunny::Device.new 'device_key'
44
- ```
45
-
46
- the SDK will auto-configure, contacting [SpaceBunny APIs](http://doc.spacebunny.io/api) endpoint, retrieving the
47
- connection configurations and required parameters. Nothing remains but to connect:
48
-
49
- ```ruby
50
- dev.connect
51
- ```
52
-
53
- ### Publish
54
-
55
- Ok, all set up! Let's publish some message:
56
-
57
- ```ruby
58
- # We're assuming you have created a 'data' channel and you have enabled it for your device
59
-
60
- # Let's publish, for instance, some JSON. Payload can be everything you want,
61
- # SpaceBunny does not impose any constraint on format or content.
62
-
63
- require 'json' # to convert our payload to JSON
64
-
65
- # Publish one message every second for a minute.
66
- 60.times do
67
- # Generate some random data
68
- payload = { greetings: 'Hello, World!', temp: rand(20.0..25.0), foo: rand(100..200) }.to_json
69
-
70
- # Publish
71
- dev.publish :data, payload
72
-
73
- # Give feedback on what has been published
74
- puts "Published: #{payload}"
75
-
76
- # Take a nap...
77
- sleep 1
78
- end
79
- ```
80
-
81
- Let's check out that our data is really being sent by going to our web dashboard: navigate to devices, select the
82
- device and click on 'LIVE DATA'. Select the 'data' channel from the dropdown and click **Start**.
83
- Having published data as JSON allows SpaceBunny's web UI to parse them and visualize a nice
84
- realtime graph: On the **Chart** tab write `temp` in the input field and press enter.
85
- You'll see the graph of the `temp` parameter being rendered. If you want to plot more parameters,
86
- just use a comma as separator e.g: temp, pressure, voltage
87
- On the **Messages** tab you'll see raw messages' payloads received on this channel.
88
-
89
- ### Inbox
90
-
91
- Waiting for and reading messages from the device's Inbox is trivial:
92
-
93
- ```ruby
94
- dev.inbox(wait: true, ack: :auto) do |message|
95
- puts "Received: #{message.payload}"
96
- end
97
- ```
98
-
99
- `wait` option (default false) causes the script to wait forever on the receive block
100
-
101
- `ack` option can have two values: `:manual` (default) or `:auto`. When `:manual` you are responsible to ack the messages,
102
- for instance:
103
-
104
- ```ruby
105
- dev.inbox(wait: true, ack: :manual) do |message|
106
- puts "Received: #{message.payload}"
107
- # Manually ack the message
108
- message.ack
109
- end
110
- ```
111
- This permits to handle errors or other critical situations
112
-
113
- ## Live Stream - Basic usage
114
-
115
- For accessing a Live Stream a Live Stream Key's is required. On SpaceBunny's Web UI, go to the Streams section,
116
- click on "Live Stream Keys" and pick or create one.
117
-
118
- ```ruby
119
- live = Spacebunny::LiveStream.new client: 'live_stream_key_client', secret: 'live_stream_key_secret'
120
- ```
121
-
122
- Similarly to the Device client, the SDK will auto-configure itself, contacting [SpaceBunny APIs](http://doc.spacebunny.io/api)
123
- endpoint, retrieving the connection configurations and required parameters. Nothing remains but to connect:
124
-
125
- ```ruby
126
- live.connect
127
- ```
128
-
129
- ### Reading live messages
130
-
131
- Each LiveStream has its own cache that will keep always last 100 messages (FIFO, when there are more than 100 messages,
132
- the oldest ones get discarded). If you want to consume messages in a parallel way, you shoul use the cache and connect
133
- as many LiveStream clients as you need: this way messages will be equally distributed to clients.
134
-
135
- ```ruby
136
- live.message_from_cache :some_live_stream, wait: true, ack: :auto do |message|
137
- puts "Received from cache: #{message.payload}"
138
- end
139
-
140
- # An equivalent method is:
141
- # live.message_from :some_live_stream, from_cache: true, wait: true, ack: :auto do |message|
142
- # puts "Received from cache: #{message.payload}"
143
- # end
144
- ```
145
-
146
- Conversely, if you want that each client will receive a copy of each message, don't use the cache:
147
-
148
- ```ruby
149
- live.message_from :some_live_stream, wait: true, ack: :auto do |message|
150
- puts "Received a copy of: #{message.payload}"
151
- end
152
- ```
153
-
154
- Every client subscribed to the LiveStream in this way will receive a copy of the message.
155
-
156
- ## TLS
157
-
158
- Instantiating a TLS-secured connection is trivial:
159
-
160
- ```ruby
161
- # For a Device
162
-
163
- dev = Spacebunny::Device.new key, tls: true
164
-
165
- # Similarly, for a Live Stream
166
-
167
- live = Spacebunny::LiveStream.new client, secret, tls: true
168
- ```
169
-
170
- ## More examples and options
171
-
172
- Take a look at the ```examples``` directory for more code samples and further details about available options.
173
-
174
-
175
- ### Contributing
176
-
177
- Bug reports and pull requests are welcome on GitHub at https://github.com/FancyPixel/spacebunny_ruby.
178
- This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere
179
- to the [Contributor Covenant](contributor-covenant.org) code of conduct.
180
-
181
- ### Development
182
-
183
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rspec` to run the tests.
184
- You can also run `bin/console` for an interactive prompt that will allow you to experiment.
185
-
186
- To install this gem onto your local machine, run `bundle exec rake install`.
10
+ [FancyBox](https://www.fancypixel.it/fancybox-standard/)
187
11
 
188
12
  ### License
189
13
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'zeitwerk'
2
4
  require 'logger'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Array
2
4
  # Extracts options from a set of arguments. Removes and returns the last
3
5
  # element in the array if it's a hash, otherwise returns a blank hash.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # :nocov:
2
4
  class Hash
3
5
  # Returns a new hash with all keys converted using the block operation.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'logger'
2
4
  require 'json'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Fancybox2
2
4
  module Logger
3
5
  class MQTTLogDevice
@@ -11,10 +13,13 @@ module Fancybox2
11
13
  unless @client.respond_to?(:publish)
12
14
  raise ArgumentError, "provided client does not respond to 'publish'"
13
15
  end
16
+ unless @client.respond_to?(:connected?)
17
+ raise ArgumentError, "provided client does not respond to 'connected?'"
18
+ end
14
19
  end
15
20
 
16
21
  def write(message)
17
- if @client.connected?
22
+ if @client && @client.connected?
18
23
  @client.publish @topic, message
19
24
  end
20
25
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Fancybox2
2
4
  module Logger
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
  require 'yaml'
3
5
  require 'logger'
@@ -28,6 +30,7 @@ module Fancybox2
28
30
  @logger = options.fetch :logger, create_default_logger
29
31
  @status = :stopped
30
32
  @alive_task = nil
33
+ @configs = {}
31
34
  end
32
35
 
33
36
  def alive_message_data(&block)
@@ -84,20 +87,15 @@ module Fancybox2
84
87
  @on_configs = block
85
88
  return
86
89
  end
87
- @configs = begin
88
- # Try to parse
89
- JSON.parse packet.payload
90
- rescue JSON::ParserError
91
- logger.debug 'on_configs: failed parsing packet as JSON, retrying with YAML'
92
- begin
93
- # Try to parse YAML
94
- YAML.load packet.payload
95
- rescue StandardError
96
- logger.debug 'on_configs: failed parsing packet as YAML. Falling back to raw payload'
97
- # Fallback to original content
98
- packet.payload
99
- end
100
- end
90
+ begin
91
+ cfg = packet.payload
92
+ if cfg && cfg.is_a?(Hash) && cfg['configs']
93
+ self.configs.merge! cfg['configs']
94
+ end
95
+ rescue JSON::ParserError
96
+ logger.debug 'on_configs: failed parsing packet as JSON'
97
+ end
98
+
101
99
  @on_configs.call(packet) if @on_configs
102
100
  end
103
101
 
@@ -140,6 +138,8 @@ module Fancybox2
140
138
  return
141
139
  end
142
140
 
141
+ @status = :on_shutdown
142
+
143
143
  shutdown_ok = true
144
144
  logger.debug "Received 'shutdown' command"
145
145
  # Stop sending alive messages
@@ -160,17 +160,20 @@ module Fancybox2
160
160
  message_to :core, :shutdown, { status: shutdown_message }
161
161
  sleep 0.05 # Wait some time in order to be sure that the message has been published (message is not mandatory)
162
162
 
163
- if mqtt_client && mqtt_client.connected?
164
- # Gracefully disconnect from broker and exit
165
- logger.debug 'Disconnecting from broker'
166
- mqtt_client.disconnect
167
- end
163
+ Thread.new do
164
+ if mqtt_client && mqtt_client.connected?
165
+ # Gracefully disconnect from broker and exit
166
+ logger.debug 'Disconnecting from broker, bye'
167
+ mqtt_client.disconnect
168
+ @mqtt_client = nil
169
+ end
168
170
 
169
- if do_exit
170
- # Exit from process
171
- status_code = shutdown_ok ? 0 : 1
172
- logger.debug "Exiting with status code #{status_code}"
173
- exit status_code
171
+ if do_exit
172
+ # Exit from process
173
+ status_code = shutdown_ok ? 0 : 1
174
+ logger.debug "Exiting with status code #{status_code}"
175
+ exit status_code
176
+ end
174
177
  end
175
178
  end
176
179
 
@@ -186,8 +189,8 @@ module Fancybox2
186
189
  # Call user code
187
190
  @on_start.call(packet) if @on_start
188
191
 
189
- configs = packet ? packet.payload : {}
190
- interval = configs['aliveTimeout'] || 1000
192
+ cfg = packet ? packet.payload : {}
193
+ interval = cfg['aliveTimeout'] || 1000
191
194
  # Start code execution from scratch
192
195
  logger.debug "Received 'start'"
193
196
  @status = :running
@@ -228,14 +231,17 @@ module Fancybox2
228
231
  def start_sending_alive(interval: 5000)
229
232
  # TODO: replace the alive interval task with Eventmachine?
230
233
  # Interval is expected to be msec, so convert it to secs
231
- interval /= 1000
234
+ interval /= 1000.0
232
235
  @alive_task.shutdown if @alive_task
233
236
  @alive_task = Concurrent::TimerTask.new(execution_interval: interval, timeout_interval: 2, run_now: true) do
234
- packet = { status: @status, lastSeen: Time.now.utc }
235
- if @alive_message_data
236
- packet[:data] = @alive_message_data.call
237
+ packet = { status: @status, lastSeen: Time.now.utc, data: nil }
238
+ begin
239
+ packet[:data] = alive_message_data
240
+ message_to :core, :alive, packet
241
+ rescue StandardError => e
242
+ logger.error "Error in alive_message_data callback: #{e.message}"
243
+ logger.error e.backtrace.join "\n"
237
244
  end
238
- message_to :core, :alive, packet
239
245
  end
240
246
  @alive_task.execute
241
247
  end
@@ -353,12 +359,12 @@ module Fancybox2
353
359
 
354
360
  def create_default_logger
355
361
  stdout_logger = ::Logger.new STDOUT
356
- broker_logger = ::Logger.new(Logger::MQTTLogDevice.new(topic_for(dest: :core, action: :logs),
357
- client: mqtt_client),
358
- formatter: Logger::JSONFormatter.new)
359
- logger = Logger::Multi.new stdout_logger, broker_logger,
360
- level: @log_level,
361
- progname: @log_progname
362
+ # broker_logger = ::Logger.new(Logger::MQTTLogDevice.new(topic_for(dest: :core, action: :logs),
363
+ # client: mqtt_client),
364
+ # formatter: Logger::JSONFormatter.new)
365
+ logger = Logger::Multi.new stdout_logger,# broker_logger,
366
+ level: @log_level,
367
+ progname: @log_progname
362
368
  logger
363
369
  end
364
370
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Fancybox2
2
4
  module Module
3
5
  class Config
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Fancybox2
2
4
  module Module
3
5
  module Exceptions
@@ -4,34 +4,34 @@ module Fancybox2
4
4
  extend self
5
5
 
6
6
  def identifier
7
- return @indentifier if @indentifier
7
+ return @identifier if @identifier
8
8
 
9
9
  host_os = RbConfig::CONFIG['host_os']
10
- case host_os
11
- when /aix(.+)$/
12
- 'aix'
13
- when /darwin(.+)$/
14
- 'darwin'
15
- when /linux/
16
- 'linux'
17
- when /freebsd(.+)$/
18
- 'freebsd'
19
- when /openbsd(.+)$/
20
- 'openbsd'
21
- when /netbsd(.*)$/
22
- 'netbsd'
23
- when /dragonfly(.*)$/
24
- 'dragonflybsd'
25
- when /solaris2/
26
- 'solaris2'
27
- when /mswin|mingw32|windows/
28
- # No Windows platform exists that was not based on the Windows_NT kernel,
29
- # so 'windows' refers to all platforms built upon the Windows_NT kernel and
30
- # have access to win32 or win64 subsystems.
31
- 'windows'
32
- else
33
- host_os
34
- end
10
+ @identifier = case host_os
11
+ when /aix(.+)$/
12
+ 'aix'
13
+ when /darwin(.+)$/
14
+ 'darwin'
15
+ when /linux/
16
+ 'linux'
17
+ when /freebsd(.+)$/
18
+ 'freebsd'
19
+ when /openbsd(.+)$/
20
+ 'openbsd'
21
+ when /netbsd(.*)$/
22
+ 'netbsd'
23
+ when /dragonfly(.*)$/
24
+ 'dragonflybsd'
25
+ when /solaris2/
26
+ 'solaris2'
27
+ when /mswin|mingw32|windows/
28
+ # No Windows platform exists that was not based on the Windows_NT kernel,
29
+ # so 'windows' refers to all platforms built upon the Windows_NT kernel and
30
+ # have access to win32 or win64 subsystems.
31
+ 'windows'
32
+ else
33
+ host_os
34
+ end
35
35
  end
36
36
  end
37
37
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Fancybox2
2
- VERSION = '0.0.1'
4
+ VERSION = '0.0.6'
3
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fancybox2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alessandro Verlato
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-14 00:00:00.000000000 Z
11
+ date: 2020-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: zeitwerk
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.3.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: paho-mqtt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.12
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.0.12
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: concurrent-ruby
29
43
  requirement: !ruby/object:Gem::Requirement