flowthings 0.1.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.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +3 -0
  5. data/Gemfile +9 -0
  6. data/Guardfile +77 -0
  7. data/LICENSE +202 -0
  8. data/README.md +161 -0
  9. data/Rakefile +2 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +7 -0
  12. data/flowthings.gemspec +31 -0
  13. data/lib/flowthings/client.rb +63 -0
  14. data/lib/flowthings/configuration.rb +39 -0
  15. data/lib/flowthings/connection.rb +23 -0
  16. data/lib/flowthings/crud/aggregate.rb +18 -0
  17. data/lib/flowthings/crud/base.rb +41 -0
  18. data/lib/flowthings/crud/extended_methods.rb +26 -0
  19. data/lib/flowthings/crud/find.rb +13 -0
  20. data/lib/flowthings/crud/member_update.rb +14 -0
  21. data/lib/flowthings/crud/simulate.rb +13 -0
  22. data/lib/flowthings/error.rb +30 -0
  23. data/lib/flowthings/platform_objects/api_task.rb +6 -0
  24. data/lib/flowthings/platform_objects/drop.rb +29 -0
  25. data/lib/flowthings/platform_objects/flow.rb +12 -0
  26. data/lib/flowthings/platform_objects/group.rb +10 -0
  27. data/lib/flowthings/platform_objects/identity.rb +10 -0
  28. data/lib/flowthings/platform_objects/mqtt.rb +8 -0
  29. data/lib/flowthings/platform_objects/platform_object_interface.rb +44 -0
  30. data/lib/flowthings/platform_objects/share.rb +9 -0
  31. data/lib/flowthings/platform_objects/token.rb +9 -0
  32. data/lib/flowthings/platform_objects/track.rb +12 -0
  33. data/lib/flowthings/request.rb +59 -0
  34. data/lib/flowthings/response/platform_response.rb +16 -0
  35. data/lib/flowthings/response/raise_errors.rb +42 -0
  36. data/lib/flowthings/utils/crud_utils.rb +96 -0
  37. data/lib/flowthings/utils/member.rb +0 -0
  38. data/lib/flowthings/version.rb +3 -0
  39. data/lib/flowthings.rb +7 -0
  40. data/spec/client_configuration_spec.rb +67 -0
  41. data/spec/client_spec.rb +51 -0
  42. data/spec/configuration_spec.rb +28 -0
  43. data/spec/flowthings_spec.rb +7 -0
  44. data/spec/platform_object_interface_spec.rb +12 -0
  45. data/spec/platform_objects/api_task_spec.rb +92 -0
  46. data/spec/platform_objects/drop_spec.rb +180 -0
  47. data/spec/platform_objects/flow_spec.rb +83 -0
  48. data/spec/platform_objects/platform_objects_spec.rb +73 -0
  49. data/spec/platform_objects/track_spec.rb +46 -0
  50. data/spec/spec_helper.rb +5 -0
  51. metadata +192 -0
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Flowthings do
4
+ it 'has a version number' do
5
+ expect(Flowthings::VERSION).not_to be nil
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe Flowthings::PlatformObjectInterface do
4
+ describe "platform object" do
5
+ before do
6
+ @connection = {}
7
+ end
8
+ it "should raise an error if you try to initialize it" do
9
+ expect { Flowthings::PlatformObjectInterface.new @connection }.to raise_error(Flowthings::Error::ObjectError, "Use the actual platform objects")
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+
3
+ describe Flowthings::ApiTask do
4
+
5
+ before do
6
+ @account_name = ENV["FT_ACCOUNT_NAME"]
7
+ @account_token = ENV["FT_ACCOUNT_TOKEN"]
8
+
9
+ @api = Flowthings::Client.new({account_name: @account_name,
10
+ account_token: @account_token})
11
+ end
12
+
13
+ describe ".create, .read, .update, .destroy" do
14
+
15
+ before(:example) do
16
+ @path = "/" + @account_name + "/ruby-client-test"
17
+ @flow = @api.flow.create({"path" => @path,
18
+ "description" => "description"})
19
+
20
+ @flowId = @flow["id"]
21
+
22
+ @api_task_task = {
23
+ "destination" => @path,
24
+ "periodicity" => 120000,
25
+ "js" => "new Task({
26
+ request: {uri: 'http://api.example.com/data.json', method: 'GET'},
27
+ callback: function(responseText) {
28
+ var json = JSON.parse(responseText);
29
+ return json['items'].map(function(item) {
30
+ return {
31
+ elems: {
32
+ title : {type: 'string', value: item.title},
33
+ source_uri : {type: 'uri', value: item.uri}
34
+ }
35
+ }
36
+ });"
37
+ }
38
+
39
+ @api_task_task_updated = {
40
+ "destination" => @path,
41
+ "periodicity" => 120000,
42
+ "js" => "new Task({
43
+ request: {uri: 'http://api.example.com/data.json', method: 'GET'},
44
+ callback: function(responseText) {
45
+ var json = JSON.parse(responseText);
46
+ return json['items'].map(function(item) {
47
+ return {
48
+ elems: {
49
+ title : {type: 'string', value: item.title},
50
+ source_uri : {type: 'uri', value: item.uri}
51
+ }
52
+ }
53
+ });",
54
+ "displayName" => "testtesttest"
55
+ }
56
+
57
+ end
58
+
59
+ after(:example) do
60
+ @api.flow.delete(@flowId)
61
+ end
62
+
63
+
64
+ it "should do all of these operations correctly" do
65
+
66
+ api_task_response = @api.api_task.create(@api_task_task)
67
+
68
+ expect(api_task_response.empty?).not_to be true
69
+
70
+ expect(api_task_response["destination"]).to eq(@path)
71
+ expect(api_task_response["periodicity"]).to eq(@api_task_task["periodicity"])
72
+ expect(api_task_response["js"]).to eq(@api_task_task["js"])
73
+
74
+ read_response = @api.api_task.read(api_task_response["id"])
75
+
76
+ expect(read_response["id"]).to eq(api_task_response["id"])
77
+
78
+ update_response = @api.api_task.update(api_task_response["id"],
79
+ @api_task_task_updated)
80
+
81
+
82
+ expect(update_response["displayName"]).to eq(@api_task_task_updated["displayName"])
83
+
84
+ delete_response = @api.api_task.delete(api_task_response["id"])
85
+
86
+ expect(delete_response.empty?).to be true
87
+ end
88
+
89
+ end
90
+
91
+
92
+ end
@@ -0,0 +1,180 @@
1
+ require 'spec_helper'
2
+
3
+ describe Flowthings::Drop do
4
+ before do
5
+ @account_name = ENV["FT_ACCOUNT_NAME"]
6
+ @account_token = ENV["FT_ACCOUNT_TOKEN"]
7
+
8
+ @api = Flowthings::Client.new account_name: @account_name, account_token: @account_token
9
+
10
+ # @flow = @api.flow.create({"path" => "/greg/test/ruby"})
11
+ end
12
+
13
+ # after do
14
+ # # @flow = @api.flow.create({"path" => "/greg/test/ruby"})
15
+ # end
16
+
17
+
18
+ describe ".get" do
19
+ it "should get the proper information from the platform" do
20
+ api = Flowthings::Client.new({account_name: "greg",
21
+ account_token: "p2lAhiLuQeqWN0EMeClmTAYPjgPy"})
22
+
23
+ result = {
24
+ "id" => "d551720070cf25d405fb1e495",
25
+ "flowId" => "f55171ff90cf2ece6103ef410",
26
+ "creationDate" => 1427578887233,
27
+ "path" => "/greg/test/ruby-drop",
28
+ "version" => 0,
29
+ "elems" => {
30
+ "drop" => {
31
+ "type" => "string",
32
+ "value" => "adsf"
33
+ }
34
+ }
35
+ }
36
+
37
+ drop = api.drop("f55171ff90cf2ece6103ef410").read("d551720070cf25d405fb1e495")
38
+
39
+ expect(drop).to eq(result)
40
+ end
41
+ end
42
+
43
+ describe ".create, .update, .destroy" do
44
+
45
+ before(:example) do
46
+ @path = "/" + @account_name + "/ruby-client-test"
47
+ @flow = @api.flow.create "path" => @path, "description" => "description"
48
+
49
+ @flowId = @flow["id"]
50
+
51
+ @drop = {"elems" => {
52
+ "elem_name" => {
53
+ "type" => "string",
54
+ "value" => "elem_value"
55
+ }
56
+ }
57
+ }
58
+
59
+ @update_drop = {"elems" => {
60
+ "elem_name" => {
61
+ "type" => "string",
62
+ "value" => "elem_value"
63
+ },
64
+ "second_elem" => {
65
+ "type" => "string",
66
+ "value" => "elem_value"
67
+ }
68
+ }
69
+ }
70
+
71
+ @aggregation = {
72
+ "filter": "EXISTS elem_name",
73
+ "output": ["$count"]
74
+ }
75
+ end
76
+
77
+ after(:example) do
78
+ @api.flow.delete @flowId
79
+ end
80
+
81
+ it "should create, update and then delete a drop on the platform" do
82
+ create_response = @api.drop(@flowId).create @drop
83
+ dropId = create_response["id"]
84
+
85
+ update_response = @api.drop(@flowId).update dropId, @update_drop
86
+
87
+ destroy_response = @api.drop(@flowId).destroy dropId
88
+
89
+ expect(create_response.empty?).not_to be true
90
+ expect(create_response["flowId"]).to eq(@flowId)
91
+ expect(create_response["elems"]).to eq(@drop["elems"])
92
+
93
+ expect(update_response.empty?).not_to be true
94
+ expect(update_response["flowId"]).to eq(@flowId)
95
+ expect(update_response["id"]).to eq(dropId)
96
+ expect(update_response["elems"]).to eq(@update_drop["elems"])
97
+
98
+ expect(destroy_response.empty?).to be true
99
+ end
100
+
101
+ end
102
+
103
+ describe ".aggregate" do
104
+ before(:example) do
105
+ @path = "/" + @account_name + "/ruby-client-test"
106
+ @flow = @api.flow.create({"path" => @path,
107
+ "description" => "description"})
108
+
109
+ @flowId = @flow["id"]
110
+
111
+ @drop = {"elems" => {
112
+ "elem_name" => {
113
+ "type" => "string",
114
+ "value" => "elem_value"
115
+ }
116
+ }
117
+ }
118
+
119
+ @api.drop(@flowId).create(@drop)
120
+
121
+ @aggregation = {
122
+ "filter": "EXISTS elem_name",
123
+ "output": ["$count"]
124
+ }
125
+ end
126
+
127
+ after(:example) do
128
+ @api.flow.delete(@flowId)
129
+ end
130
+
131
+ it "should aggregate properly" do
132
+ aggregate_response = @api.drop(@flowId).aggregate(@aggregation)
133
+
134
+ expect(aggregate_response.class).to be Array
135
+ expect(aggregate_response[0]["$count"]).to eq(1)
136
+ end
137
+
138
+ end
139
+
140
+
141
+ describe "error" do
142
+
143
+ before(:example) do
144
+ path = "/" + @account_name + "/ruby-client-test"
145
+
146
+ @flow = @api.flow.create({"path" => path,
147
+ "description" => "description"})
148
+
149
+ @flowId = @flow["id"]
150
+ @api.flow.destroy(@flowId)
151
+
152
+ @drop = {"elems" => {
153
+ "elem_name" => {
154
+ "type" => "string",
155
+ "value" => "elem_value"
156
+ }
157
+ }
158
+ }
159
+ end
160
+
161
+ it "should error when appropriate" do
162
+ expect {
163
+ @api.drop(@flowId).create(@drop)
164
+ }.to raise_error
165
+ end
166
+
167
+ it "should be able to rescue from an error" do
168
+ expect {
169
+ begin
170
+ @api.drop(@flowId).create(@drop)
171
+ rescue Flowthings::Error::BadRequest => e
172
+ error = e
173
+ end
174
+
175
+ }.not_to raise_error
176
+ end
177
+
178
+ end
179
+
180
+ end
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+
3
+ describe Flowthings::Flow do
4
+ before do
5
+ @flowid = "f55171ff90cf2ece6103ef410"
6
+
7
+ @account_name = ENV["FT_ACCOUNT_NAME"]
8
+ @account_token = ENV["FT_ACCOUNT_TOKEN"]
9
+ @api = Flowthings::Client.new({account_name: @account_name,
10
+ account_token: @account_token})
11
+ end
12
+
13
+ describe ".read" do
14
+ it "should get the proper information from the platform" do
15
+ api = Flowthings::Client.new({account_name: 'greg',
16
+ account_token: "p2lAhiLuQeqWN0EMeClmTAYPjgPy"})
17
+
18
+ response = {"id" => "f55171ff90cf2ece6103ef410",
19
+ "capacity" => 1000,
20
+ "creationDate" => 1427578873318,
21
+ "creatorId" => "i54af263c0cf25b8ea459c204",
22
+ "path" => "/greg/test/ruby-drop"}
23
+
24
+
25
+ expect(api.flow.read(@flowid)).to eq(response)
26
+ end
27
+ end
28
+
29
+
30
+ describe ".create, .update, .delete" do
31
+ it "should create, update and then delete a flow properly" do
32
+ response = {}
33
+
34
+ path = "/" + @account_name + "/ruby-client-test"
35
+
36
+ expect{
37
+ response = @api.flow.create({"path" => path,
38
+ "description" => "description",
39
+ "filter" => "EXISTS title"})
40
+ }.not_to raise_error
41
+
42
+ expect(response.empty?).not_to be true
43
+ expect(response["path"]).to eq(path)
44
+ expect(response["description"]).to eq("description")
45
+ expect(response["filter"]).to eq("EXISTS title")
46
+
47
+ updated_response = @api.flow.update(response["id"], {"path" => path,
48
+ "description" => "description",
49
+ "filter" => ""})
50
+ @id = response["id"]
51
+
52
+ expect(updated_response["id"]).to eq(response["id"])
53
+ expect(updated_response["description"]).to eq("description")
54
+ expect(updated_response["path"]).to eq(path)
55
+
56
+ expect(updated_response["filter"].empty?).to be true
57
+
58
+ expect(@api.flow.destroy(response["id"]).empty?).to be true
59
+ end
60
+ end
61
+
62
+ describe ".find" do
63
+ before do
64
+ path = "/" + @account_name + "/ruby-client-test"
65
+ @flow = @api.flow.create({"path" => path,
66
+ "description" => "description",
67
+ "filter" => "EXISTS title"})
68
+ end
69
+
70
+ after do
71
+ @api.flow.destroy(@flow["id"])
72
+ end
73
+
74
+ it "should find the correct flow" do
75
+ path_regex = "/\\/" + @account_name + "\\/ruby-client-test/"
76
+
77
+ flow = @api.flow.find(filter: "path =~ " + path_regex)
78
+ expect(flow[0] == @flow)
79
+ end
80
+
81
+ end
82
+
83
+ end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+ require 'active_support/inflector'
3
+
4
+ platform_objects = [Flowthings::ApiTask, Flowthings::Drop, Flowthings::Flow, Flowthings::Group, Flowthings::Identity, Flowthings::Mqtt, Flowthings::Share, Flowthings::Token, Flowthings::Track]
5
+ crud_methods = ["create", "read", "update", "destroy"]
6
+
7
+
8
+ platform_objects.each do |platform_object|
9
+
10
+ describe platform_object do
11
+
12
+ before do
13
+ @options = {}
14
+ @flowId = "f123456"
15
+ @connection = {}
16
+ end
17
+
18
+ describe "initialization" do
19
+ it "should error out without any arguments" do
20
+ expect { platform_object.new }.to raise_error(ArgumentError)
21
+ end
22
+
23
+ unless platform_object == Flowthings::Drop
24
+ it "should take a connection argument and an options argument" do
25
+ expect { platform_object.new @connection, @options }.not_to raise_error
26
+ end
27
+ it "the options argument should be optional" do
28
+ expect { platform_object.new @connection }.not_to raise_error
29
+ end
30
+ else
31
+ it "should take an options argument, a flowId and a connection" do
32
+ expect { platform_object.new @flowId, @connection, @options }.not_to raise_error
33
+ end
34
+
35
+ it "should error out with only one argument" do
36
+ expect { platform_object.new @flowId }.to raise_error(ArgumentError)
37
+ end
38
+
39
+ it "should have an optional options argument" do
40
+ expect { platform_object.new @flowId, @connection }.not_to raise_error
41
+ end
42
+ end
43
+
44
+ end #init
45
+
46
+ describe "crud" do
47
+ before do
48
+ unless platform_object == Flowthings::Drop
49
+ @initialized_object = platform_object.new @options
50
+ else
51
+ @initialized_object = platform_object.new @flowId, @options
52
+ end
53
+ end
54
+
55
+ crud_methods.each do |method|
56
+ describe ".#{method}" do
57
+ unless method == "update"&& ( platform_object == Flowthings::Share || platform_object == Flowthings::Token )
58
+ it "should respond to the method" do
59
+ expect(@initialized_object.respond_to? "#{method}").to be true
60
+ end
61
+ else
62
+ it "should not respond to the method" do
63
+ expect(@initialized_object.respond_to? "#{method}").to be false
64
+ end
65
+ end
66
+ end
67
+
68
+ end
69
+
70
+ end
71
+ end
72
+
73
+ end
@@ -0,0 +1,46 @@
1
+ require "spec_helper"
2
+
3
+ describe Flowthings::Track do
4
+ before(:example) do
5
+ @account_name = ENV["FT_ACCOUNT_NAME"]
6
+ @account_token = ENV["FT_ACCOUNT_TOKEN"]
7
+
8
+ @api = Flowthings::Client.new({
9
+ account_name: @account_name,
10
+ account_token: @account_token
11
+ })
12
+ end
13
+
14
+ describe ".simulate" do
15
+ it "should simulate track output" do
16
+
17
+ simulated_track = {
18
+ "drop" => {
19
+ "elems" => {
20
+ "a" => 1
21
+ }
22
+ },
23
+ "js" => "function (input_drop) {
24
+ var a = input_drop.elems.a.value;
25
+ input_drop.elems.b = a * 3;
26
+ return input_drop;
27
+ }"
28
+ }
29
+
30
+
31
+ track_response = @api.track.simulate(simulated_track)
32
+
33
+ expect(track_response.empty?).not_to be true
34
+
35
+ drops = track_response["drops"]
36
+ log = track_response["log"]
37
+ errs = track_response["errors"]
38
+
39
+ expect(errs.empty?).to be true
40
+ expect(drops.empty?).not_to be true
41
+ expect(log.empty?).not_to be true
42
+
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,5 @@
1
+ require 'dotenv'
2
+ Dotenv.load
3
+
4
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
5
+ require 'flowthings'
metadata ADDED
@@ -0,0 +1,192 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: flowthings
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Greg Meyer
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-07-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: excon
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.44'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.44'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.8'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.10'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.10'
83
+ - !ruby/object:Gem::Dependency
84
+ name: guard
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.12'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.12'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard-rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '4.5'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '4.5'
111
+ description: flowthings.io is an agile intelligence platform that is specifically
112
+ geared towards the Internet of Things. This is our Ruby Client.
113
+ email:
114
+ - dev@flowthings.io
115
+ executables: []
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".gitignore"
120
+ - ".rspec"
121
+ - ".travis.yml"
122
+ - Gemfile
123
+ - Guardfile
124
+ - LICENSE
125
+ - README.md
126
+ - Rakefile
127
+ - bin/console
128
+ - bin/setup
129
+ - flowthings.gemspec
130
+ - lib/flowthings.rb
131
+ - lib/flowthings/client.rb
132
+ - lib/flowthings/configuration.rb
133
+ - lib/flowthings/connection.rb
134
+ - lib/flowthings/crud/aggregate.rb
135
+ - lib/flowthings/crud/base.rb
136
+ - lib/flowthings/crud/extended_methods.rb
137
+ - lib/flowthings/crud/find.rb
138
+ - lib/flowthings/crud/member_update.rb
139
+ - lib/flowthings/crud/simulate.rb
140
+ - lib/flowthings/error.rb
141
+ - lib/flowthings/platform_objects/api_task.rb
142
+ - lib/flowthings/platform_objects/drop.rb
143
+ - lib/flowthings/platform_objects/flow.rb
144
+ - lib/flowthings/platform_objects/group.rb
145
+ - lib/flowthings/platform_objects/identity.rb
146
+ - lib/flowthings/platform_objects/mqtt.rb
147
+ - lib/flowthings/platform_objects/platform_object_interface.rb
148
+ - lib/flowthings/platform_objects/share.rb
149
+ - lib/flowthings/platform_objects/token.rb
150
+ - lib/flowthings/platform_objects/track.rb
151
+ - lib/flowthings/request.rb
152
+ - lib/flowthings/response/platform_response.rb
153
+ - lib/flowthings/response/raise_errors.rb
154
+ - lib/flowthings/utils/crud_utils.rb
155
+ - lib/flowthings/utils/member.rb
156
+ - lib/flowthings/version.rb
157
+ - spec/client_configuration_spec.rb
158
+ - spec/client_spec.rb
159
+ - spec/configuration_spec.rb
160
+ - spec/flowthings_spec.rb
161
+ - spec/platform_object_interface_spec.rb
162
+ - spec/platform_objects/api_task_spec.rb
163
+ - spec/platform_objects/drop_spec.rb
164
+ - spec/platform_objects/flow_spec.rb
165
+ - spec/platform_objects/platform_objects_spec.rb
166
+ - spec/platform_objects/track_spec.rb
167
+ - spec/spec_helper.rb
168
+ homepage: https://flowthings.io
169
+ licenses:
170
+ - Apache 2.0
171
+ metadata: {}
172
+ post_install_message:
173
+ rdoc_options: []
174
+ require_paths:
175
+ - lib
176
+ required_ruby_version: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ required_rubygems_version: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ requirements: []
187
+ rubyforge_project:
188
+ rubygems_version: 2.4.8
189
+ signing_key:
190
+ specification_version: 4
191
+ summary: A rubygem for the flowthings.io platform.
192
+ test_files: []