loriot-rb 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d99af5c1b764bdb03d3249026d43675062b689a2
4
+ data.tar.gz: 8720cbe04f7b6074bb6461673f1836e1a2d8030d
5
+ SHA512:
6
+ metadata.gz: f328d76dcf62f672180aac284d8d8cdc09dbe17c024efde88c5c353f7516e2338fd028aab0d0d4fecca03626b2986682487708feea4ed56a9e8ba607051a062e
7
+ data.tar.gz: 555cc19bf453f9ec5d1338bc1014a92bb43831a90d8c4bec1b0fd37bcb2b9432781e57546cc1798ac9e709c45a2e602103c20af11bcb33a852e486c066469cdf
@@ -0,0 +1,23 @@
1
+ v0.4.0 [☰](https://bitbucket.org/fractalgarden/loriot-rb/branches/compare/v0.3.0..v0.4.0) April 7th, 2017
2
+ ------------------------------
3
+ * the method `listen` now accept a block to do something every iteration, moreover, it has been included in the unit test.
4
+
5
+ v0.3.0 April 7th, 2017
6
+ ------------------------------
7
+ * added the configuration in the config.rb
8
+ * moved sensible data to a yaml accessible dinamically with LoriotRb::Settings
9
+ * added a rails generator
10
+ * improved the code organization
11
+ * improved the readme
12
+
13
+ v0.2.0 April 5th, 2017
14
+ ------------------------------
15
+ * dividing the project into modules based on the connection protocol
16
+ * new method listen to waiting for data
17
+ * improved debug option
18
+
19
+ v0.1.0 March 10th, 2017
20
+ ------------------------------
21
+ * Starting project
22
+ * Connection with tls
23
+ * Basic unit test
data/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ LoriotRb
2
+
3
+ Copyright (C) 2017 Marco Mastrodonato, marco.mastrodonato@fractalgarden.com
4
+
5
+ This program is free software: you can redistribute it and/or modify
6
+ it under the terms of the GNU General Public License as published by
7
+ the Free Software Foundation, either version 3 of the License.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
@@ -0,0 +1,140 @@
1
+ # IOT at you service with LoraWan and Ruby
2
+ ### Manage your devices with Loriot cloud system
3
+
4
+ [![Version ](https://badge.fury.io/rb/loriot-rb.svg) ](https://rubygems.org/gems/loriot-rb)
5
+ [![Travis CI ](http://img.shields.io/travis/marcomd/loriot-rb/master.svg) ](https://travis-ci.org/marcomd/loriot-rb)
6
+ [![Quality ](http://img.shields.io/codeclimate/github/marcomd/loriot-rb.svg)](https://codeclimate.com/github/marcomd/loriot-rb)
7
+
8
+ ### What is Lora?
9
+
10
+ LoRaWAN is a Low Power Wide Area Network with features that support low-cost, mobile, and secure bi-directional communication for Internet of Things (IoT), machine-to-machine (M2M), and smart city, and industrial applications. LoRaWAN is optimized for low power consumption and is designed to support large networks with millions and millions of devices. Innovative features of LoRaWAN include support for redundant operation, geolocation, low-cost, and low-power - devices can even run on energy harvesting technologies enabling the mobility and ease of use of Internet of Things.
11
+
12
+
13
+ ![](/assets/LoraWan_Description.jpg)
14
+
15
+
16
+ ## Install
17
+
18
+ gem install loriot-rb
19
+
20
+ To use it in a bundle, add to gem file `gem 'loriot-rb'` and run `bundle install`
21
+
22
+ ## Connection to loriot server
23
+
24
+ Establish a secure connection to your `Loriot Application` on the cloud.
25
+
26
+ This version only support the TLS protocol.
27
+
28
+ From irb require the library:
29
+
30
+ ```ruby
31
+ require 'loriot-rb'
32
+ ```
33
+
34
+ then create an instance
35
+
36
+ ```ruby
37
+ lora = LoriotClient.new
38
+ ```
39
+
40
+ if you are in debug mode you should also receive a json:
41
+
42
+ ```json
43
+ { "hello":"LORIOT.io TLS Server", "version":"1.0.4" }
44
+ ```
45
+
46
+ ### Send data to a device
47
+
48
+
49
+ ```ruby
50
+ lora.send_cmd(EUI: 'Insert here your EUI code', confirmed: true, data: "0101")
51
+ ```
52
+
53
+ Request example:
54
+
55
+ ```json
56
+ { "cmd":"tx", "EUI":"BE7A0000000010B7", "port":40, "confirmed":false, "data":"0101" }
57
+ ```
58
+
59
+ Response example:
60
+
61
+ ```json
62
+ { "cmd":"txd", "EUI":"BE7A0000000010B7", "seqdn":114, "seqq":113, "ts":1489133179385 }
63
+ ```
64
+
65
+ `"cmd":"txd"` show the data sent to the gateway
66
+
67
+ The response could also be:
68
+
69
+ ```json
70
+ { "cmd":"tx", "EUI":"BE7A0000000010CF", "seqdn": 4, "data": "0301", "success": "Data enqueued" }
71
+ ```
72
+
73
+ ### Receive Data
74
+
75
+ To listen your devices:
76
+
77
+ ```ruby
78
+ lora.listen
79
+ ```
80
+
81
+ ### Close the connection
82
+
83
+ ```ruby
84
+ lora.quit
85
+ ```
86
+
87
+ ## Compatibility
88
+
89
+ Ruby `2.3+`
90
+
91
+ ## Install
92
+
93
+ gem install loriot-rb
94
+
95
+ To use it in a bundle, add to gem file `gem 'loriot-rb'` and run `bundle install`
96
+
97
+ ## To Do
98
+
99
+ - [x] Connect to a device with tls protocol `v0.1.0`
100
+ - [x] Send data to a device `v0.1.0`
101
+ - [x] Receive data from a device `v0.2.0`
102
+ - [x] Organization in modules to support new protocols `v0.2.0`
103
+ - [x] Add a configuration `v0.3.0`
104
+ - [x] Add a rails generator `v0.3.0`
105
+ - [ ] Test with many devices
106
+
107
+ ## Contributing
108
+
109
+ 1. Fork it
110
+ 2. Create your feature branch (`git checkout -b my-feature`)
111
+ 3. Commit your changes (`git commit -am 'I made extensive use of all my creativity'`)
112
+ 4. Push to the branch (`git push origin my-feature`)
113
+ 5. Create new Pull Request
114
+
115
+ ## Testing
116
+
117
+ Wide coverage with `xx unit tests` and `xxx assertions`
118
+
119
+ To test locally install the development requirements:
120
+
121
+ bundle install
122
+
123
+ Then execute:
124
+
125
+ bundle exec ruby test/unit_test.rb
126
+
127
+ Performance tests:
128
+
129
+ bundle exec ruby test/performance_test.rb
130
+
131
+
132
+ ## Found a bug?
133
+
134
+ Please open an issue.
135
+
136
+
137
+ ## License
138
+
139
+ The GNU Lesser General Public License, version 3.0 (LGPL-3.0)
140
+ See LICENSE file
@@ -0,0 +1,6 @@
1
+ LoriotRb.configure do |config|
2
+ # These informations are shared for all environments
3
+ config.protocol = :tls
4
+ config.host = 'eu1.loriot.io'
5
+ config.port = 737
6
+ end
@@ -0,0 +1,17 @@
1
+ defaults: &defaults
2
+ appid: "BE7A02C1"
3
+ token: "zHcD-1ouz3ytyOLE6SMhwA"
4
+ test_eui: "BE7A0000000010CF"
5
+ #foo: add every variable you need and use it with => LoriotRb::Settings.foo
6
+ # bar: sub variable are accessible with hash => LoriotRb::Settings.foo[:bar]
7
+
8
+ development:
9
+ <<: *defaults
10
+
11
+ test:
12
+ <<: *defaults
13
+
14
+ production:
15
+ <<: *defaults
16
+ appid: "YOUR PRODUCTION APP ID"
17
+ token: "YOUR PRODUCTION TOKEN"
@@ -0,0 +1,19 @@
1
+ defaults: &defaults
2
+ # Insert your credentials provided by Loriot
3
+ appid:
4
+ token:
5
+ # Insert your device for test purpose
6
+ test_eui:
7
+ #foo: add every variable you need and use it with => LoriotRb::Settings.foo
8
+ # bar: sub variable are accessible with hash => LoriotRb::Settings.foo[:bar]
9
+
10
+ development:
11
+ <<: *defaults
12
+
13
+ test:
14
+ <<: *defaults
15
+
16
+ production:
17
+ <<: *defaults
18
+ appid:
19
+ token:
@@ -0,0 +1,27 @@
1
+ module LoriotRb
2
+ class Configuration
3
+ # attr_writer :allow_sign_up
4
+
5
+ attr_accessor :protocol, :host, :port, :env
6
+
7
+ def initialize
8
+ @protocol = nil
9
+ @host = nil
10
+ @port = nil
11
+ @env = 'development'
12
+ end
13
+
14
+ end
15
+
16
+ def self.configuration
17
+ @configuration ||= Configuration.new
18
+ end
19
+
20
+ def self.configuration=(config)
21
+ @configuration = config
22
+ end
23
+
24
+ def self.configure
25
+ yield configuration
26
+ end
27
+ end
@@ -0,0 +1,67 @@
1
+ require 'yaml'
2
+ require_relative '../vendor/deep_symbolize'
3
+
4
+ module LoriotRb
5
+ # we don't want to instantiate this class - it's a singleton,
6
+ # so just keep it as a self-extended module
7
+ extend self
8
+
9
+ # Appdata provides a basic single-method DSL with .parameter method
10
+ # being used to define a set of available settings.
11
+ # This method takes one or more symbols, with each one being
12
+ # a name of the configuration option.
13
+ def parameter(*names)
14
+ names.each do |name|
15
+ attr_accessor name
16
+
17
+ # For each given symbol we generate accessor method that sets option's
18
+ # value being called with an argument, or returns option's current value
19
+ # when called without arguments
20
+ define_method name do |*values|
21
+ value = values.first
22
+ value ? self.send("#{name}=", value) : instance_variable_get("@#{name}")
23
+ end
24
+ end
25
+ end
26
+
27
+ # And we define a wrapper for the configuration block, that we'll use to set up
28
+ # our set of options
29
+ def configure_on_the_fly(&block)
30
+ instance_eval &block
31
+ end
32
+
33
+ module Settings
34
+ # again - it's a singleton, thus implemented as a self-extended module
35
+ extend self
36
+
37
+ @_settings = {}
38
+ attr_reader :_settings
39
+
40
+ # This is the main point of entry - we call Settings.load! and provide
41
+ # a name of the file to read as it's argument. We can also pass in some
42
+ # options, but at the moment it's being used to allow per-environment
43
+ # overrides in Rails
44
+ def load!(filename, options = {})
45
+ newsets = YAML::load_file(filename)
46
+ newsets.extend DeepSymbolizable
47
+ newsets = newsets.deep_symbolize
48
+ newsets = newsets[options[:env].to_sym] if options[:env] && \
49
+ newsets[options[:env].to_sym]
50
+ deep_merge!(@_settings, newsets)
51
+ end
52
+
53
+ # Deep merging of hashes
54
+ # deep_merge by Stefan Rusterholz, see http://www.ruby-forum.com/topic/142809
55
+ def deep_merge!(target, data)
56
+ merger = proc{|key, v1, v2|
57
+ Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
58
+ target.merge! data, &merger
59
+ end
60
+
61
+ def method_missing(name, *args, &block)
62
+ @_settings[name.to_sym] ||
63
+ fail(NoMethodError, "unknown configuration root #{name}", caller)
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,33 @@
1
+ require 'rails/generators/base'
2
+
3
+ module LoriotRb
4
+ module Generators
5
+ class InstallGenerator < Rails::Generators::Base
6
+ desc 'Installs LoriotRb configuration files'
7
+ source_root File.expand_path('../../', __FILE__)
8
+ # class_option :protocol, :type => :string, :default => 'tls', :desc => "Choose your favorite emulator [tls]"
9
+
10
+ def copy_to_local
11
+ # copy_file '../config/settings.yml', 'config/loriot_rb.yml'
12
+ copy_file '../config/private_EXAMPLE.yml', 'config/loriot_rb_private.yml'
13
+ file = 'config/initializers/loriot-rb.rb'
14
+ copy_file '../config/config.rb', file
15
+ append_file file do
16
+ <<-FILE.gsub(/^ /, '')
17
+ connection_protocol = LoriotRb.configuration.protocol
18
+ raise 'Define your protocol in the configuration file!' unless connection_protocol
19
+ raise "Connection protocol #{connection_protocol} not recognized!" unless %w(tls).include?(connection_protocol.to_s)
20
+ require "loriot-rb/#{connection_protocol}/call"
21
+ LoriotClient.include LoriotRb::Call
22
+
23
+ %w(loriot_rb_private.yml).each do |file|
24
+ filepath = File.join(Rails.root,'config',file)
25
+ LoriotRb::Settings.load!(filepath,env: LoriotRb.configuration.env) if File.exist? filepath
26
+ end
27
+ raise 'Insert your secret data to login on the loriot cloud!' unless LoriotRb::Settings.appid.present? && LoriotRb::Settings.token.present?
28
+ FILE
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,47 @@
1
+ # LoriotRb
2
+ # Copyright (C) 2017 Marco Mastrodonato, marco.mastrodonato@fractalgarden.com
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require 'json'
17
+ require 'socket'
18
+ require 'openssl'
19
+
20
+ require_relative 'core/configuration'
21
+ require_relative 'core/configuration_dynamic'
22
+
23
+ module LoriotRb
24
+ def self.root
25
+ File.expand_path('../..', __FILE__)
26
+ end
27
+ end
28
+
29
+ require_relative 'version'
30
+ require_relative 'loriot-rb/base'
31
+
32
+ unless defined?(Rails)
33
+ require_relative 'config/config'
34
+
35
+ connection_protocol = LoriotRb.configuration.protocol
36
+ raise "Define your protocol in the configuration file!" unless connection_protocol
37
+ raise "Connection protocol #{connection_protocol} not recognized!" unless %w(tls).include?(connection_protocol.to_s)
38
+ require_relative "loriot-rb/#{connection_protocol}/call"
39
+ LoriotClient.include LoriotRb::Call
40
+
41
+ %w(private.yml).each do |file|
42
+ filepath = File.join(LoriotRb.root,'lib','config',file)
43
+ LoriotRb::Settings.load!(filepath,env: LoriotRb.configuration.env) if File.exist? filepath
44
+ end
45
+ raise "Insert your secret data to login on the loriot cloud!" if LoriotRb::Settings.appid.nil? || LoriotRb::Settings.token.nil?
46
+ end
47
+
@@ -0,0 +1,72 @@
1
+ require_relative 'help'
2
+
3
+ ###################################
4
+ # An interface to Loriot Service from Ruby
5
+ ###################################
6
+ class LoriotClient
7
+ include LoriotRb::Base
8
+
9
+ # Establish a secure connection to your account on the cloud
10
+ def initialize(options = {})
11
+ options = { debug: false,
12
+ token: LoriotRb::Settings.token,
13
+ appid: LoriotRb::Settings.appid,
14
+ host: LoriotRb.configuration.host,
15
+ port: LoriotRb.configuration.port }.merge(options)
16
+ @debug = options[:debug]
17
+ @token = options[:token]
18
+ @appid = options[:appid]
19
+ options
20
+
21
+ welcome_response = sub_initialize(options)
22
+
23
+ raise("Loriot-rb: Cannot connect to host #{options[:host]}:#{options[:port]}") unless welcome_response.index('hello')
24
+
25
+ end
26
+
27
+ # Send the request to device
28
+ def send_cmd(options = {})
29
+ options = { debug: @debug,
30
+ token: @token,
31
+ appid: @appid,
32
+ cmd: "tx",
33
+ eui: nil,
34
+ port: 40,
35
+ confirmed: false,
36
+ data: "0301"}.merge(options)
37
+
38
+ raise("Eui is blank! Should i guess your device?") unless options[:eui]
39
+ response = sub_send_cmd(options)
40
+ puts "#{Time.now} Cmd response: #{response}" if options[:debug]
41
+ response
42
+ end
43
+
44
+ # Receive all data devices from the cloud
45
+ # Each device sends its data to the cloud
46
+ def read_data(options = {})
47
+ options = { debug: @debug }.merge(options)
48
+ puts "#{Time.now} Waiting for #{@appid} incoming data..." if options[:debug]
49
+ response = sub_read_data(options)
50
+ puts "#{Time.now} Received: #{response}" if options[:debug]
51
+ response
52
+ end
53
+
54
+ # Stay awaiting data from the cloud
55
+ def listen(options = {}, &block)
56
+ options = { debug: @debug }.merge(options)
57
+
58
+ puts "#{Time.now} Starting Listen #{@appid}" if options[:debug]
59
+ response = nil
60
+ begin
61
+ response = read_data(options)
62
+ block.call(response) if block
63
+ end while response && !options[:test]
64
+ # Return last response
65
+ response
66
+ end
67
+
68
+ # Close the secure connection with the cloud
69
+ def quit
70
+ sub_quit
71
+ end
72
+ end
@@ -0,0 +1,16 @@
1
+ # LoriotRb methods
2
+ module LoriotRb
3
+ # It contains generic methods
4
+ module Base
5
+ private
6
+
7
+ # Show tips on usage
8
+ def loriotrb_help
9
+ <<-HELP.gsub(/^ /, '')
10
+ *************************************************************************
11
+ LoriotRb version #{LoriotRb.version}
12
+ *************************************************************************
13
+ HELP
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,73 @@
1
+ # LoriotRb calling methods
2
+ module LoriotRb
3
+ # It contains all the methods for selecting the items
4
+ module Call
5
+
6
+ attr_reader :contex, :tcp_socket, :ssl_socket
7
+
8
+ private
9
+
10
+ def sub_initialize(options={})
11
+ @context = OpenSSL::SSL::SSLContext.new
12
+ @tcp_socket = TCPSocket.new(options[:host], options[:port])
13
+ @ssl_socket = OpenSSL::SSL::SSLSocket.new(@tcp_socket, @context)
14
+ @ssl_socket.sync_close = true
15
+ @ssl_socket.connect
16
+ welcome_response = ''
17
+ @ssl_socket.sysread(512, welcome_response)
18
+ puts "Welcome response: #{welcome_response}" if options[:debug]
19
+ welcome_response
20
+ end
21
+
22
+ # Send the request to device
23
+ def sub_send_cmd(options={})
24
+ response = ''
25
+ str_app_token = "{\"appid\":\"#{options[:appid]}\", \"token\":\"#{options[:token]}\"}"
26
+ puts "#{Time.now} To: #{str_app_token}" if options[:debug]
27
+ @ssl_socket.puts str_app_token
28
+ str_request = "{\"cmd\":\"#{options[:cmd]}\",\"EUI\":\"#{options[:eui]}\",\"port\":#{options[:port]},\"confirmed\":#{options[:confirmed]},\"data\":\"#{options[:data]}\"} "
29
+ puts "#{Time.now} Cmq request: #{str_request}" if options[:debug]
30
+ @ssl_socket.puts(str_request)
31
+ begin
32
+ retries ||= 0
33
+ @ssl_socket.sysread(512, response)
34
+ rescue EOFError => e
35
+ if (retries += 1) < 3
36
+ puts "Attempt ##{retries}..." if options[:debug]
37
+ sleep 0.5
38
+ retry
39
+ else
40
+ raise e
41
+ end
42
+ end
43
+
44
+ # Return the json hash from the string
45
+ JSON.parse(response)
46
+ end
47
+
48
+ # Send the request to device
49
+ def sub_read_data(options={})
50
+ response = ''
51
+ begin
52
+ retries ||= 0
53
+ @ssl_socket.sysread(512, response)
54
+ rescue EOFError => e
55
+ if (retries += 1) < 3
56
+ puts "Attempt ##{retries}..." if options[:debug]
57
+ sleep 0.5
58
+ retry
59
+ else
60
+ raise e
61
+ end
62
+ end
63
+
64
+ # Return the json hash from the string
65
+ JSON.parse(response)
66
+ end
67
+
68
+ def sub_quit
69
+ @ssl_socket.close
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,60 @@
1
+ # Symbolizes all of hash's keys and subkeys.
2
+ # Also allows for custom pre-processing of keys (e.g. downcasing, etc)
3
+ # if the block is given:
4
+ #
5
+ # somehash.deep_symbolize { |key| key.downcase }
6
+ #
7
+ # Usage: either include it into global Hash class to make it available to
8
+ # to all hashes, or extend only your own hash objects with this
9
+ # module.
10
+ # E.g.:
11
+ # 1) class Hash; include DeepSymbolizable; end
12
+ # 2) myhash.extend DeepSymbolizable
13
+
14
+ module DeepSymbolizable
15
+ def deep_symbolize(&block)
16
+ method = self.class.to_s.downcase.to_sym
17
+ syms = DeepSymbolizable::Symbolizers
18
+ syms.respond_to?(method) ? syms.send(method, self, &block) : self
19
+ end
20
+
21
+ module Symbolizers
22
+ extend self
23
+
24
+ # the primary method - symbolizes keys of the given hash,
25
+ # preprocessing them with a block if one was given, and recursively
26
+ # going into all nested enumerables
27
+ def hash(hash, &block)
28
+ hash.inject({}) do |result, (key, value)|
29
+ # Recursively deep-symbolize subhashes
30
+ value = _recurse_(value, &block)
31
+
32
+ # Pre-process the key with a block if it was given
33
+ key = yield key if block_given?
34
+ # Symbolize the key string if it responds to to_sym
35
+ sym_key = key.to_sym rescue key
36
+
37
+ # write it back into the result and return the updated hash
38
+ result[sym_key] = value
39
+ result
40
+ end
41
+ end
42
+
43
+ # walking over arrays and symbolizing all nested elements
44
+ def array(ary, &block)
45
+ ary.map { |v| _recurse_(v, &block) }
46
+ end
47
+
48
+ # handling recursion - any Enumerable elements (except String)
49
+ # is being extended with the module, and then symbolized
50
+ def _recurse_(value, &block)
51
+ if value.is_a?(Enumerable) && !value.is_a?(String)
52
+ # support for a use case without extended core Hash
53
+ value.extend DeepSymbolizable unless value.class.include?(DeepSymbolizable)
54
+ value = value.deep_symbolize(&block)
55
+ end
56
+ value
57
+ end
58
+ end
59
+
60
+ end
@@ -0,0 +1,5 @@
1
+ module LoriotRb
2
+ def self.version
3
+ "0.4.0"
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: loriot-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
5
+ platform: ruby
6
+ authors:
7
+ - Marco Mastrodonato
8
+ - Rudi Petazzi
9
+ - Stefano Piras
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2017-04-07 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: json
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '2.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '2.0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: openssl
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '2.0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '2.0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: test-unit
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '3.0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '3.0'
57
+ description: This gem let you to connect to Loriot cloud system and manage your registered
58
+ devices.
59
+ email:
60
+ - marco.mastrodonato@fractalgarden.com
61
+ - rudi.petazzi@fractalgarden.com
62
+ - stefano.piras@fractalgarden.com
63
+ executables: []
64
+ extensions: []
65
+ extra_rdoc_files: []
66
+ files:
67
+ - CHANGELOG.md
68
+ - LICENSE
69
+ - README.md
70
+ - lib/config/config.rb
71
+ - lib/config/private.yml
72
+ - lib/config/private_EXAMPLE.yml
73
+ - lib/core/configuration.rb
74
+ - lib/core/configuration_dynamic.rb
75
+ - lib/generators/install_generator.rb
76
+ - lib/loriot-rb.rb
77
+ - lib/loriot-rb/base.rb
78
+ - lib/loriot-rb/help.rb
79
+ - lib/loriot-rb/tls/call.rb
80
+ - lib/vendor/deep_symbolize.rb
81
+ - lib/version.rb
82
+ homepage:
83
+ licenses:
84
+ - LGPL-3.0
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 2.3.0
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements:
101
+ - The brave to dare
102
+ rubyforge_project:
103
+ rubygems_version: 2.6.10
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: Manage your devices with Loriot cloud system
107
+ test_files: []