cs 0.1.0beta3
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.
- data/.gitignore +21 -0
- data/Gemfile +10 -0
- data/LICENSE +22 -0
- data/README.md +132 -0
- data/Rakefile +7 -0
- data/cs.gemspec +22 -0
- data/lib/commonsense-ruby-lib.rb +127 -0
- data/lib/commonsense-ruby-lib/auth/http.rb +117 -0
- data/lib/commonsense-ruby-lib/auth/oauth.rb +101 -0
- data/lib/commonsense-ruby-lib/end_point.rb +276 -0
- data/lib/commonsense-ruby-lib/end_point/group.rb +28 -0
- data/lib/commonsense-ruby-lib/end_point/sensor.rb +36 -0
- data/lib/commonsense-ruby-lib/end_point/sensor_data.rb +70 -0
- data/lib/commonsense-ruby-lib/end_point/user.rb +50 -0
- data/lib/commonsense-ruby-lib/error.rb +51 -0
- data/lib/commonsense-ruby-lib/relation.rb +233 -0
- data/lib/commonsense-ruby-lib/relation/sensor_data_relation.rb +116 -0
- data/lib/commonsense-ruby-lib/relation/sensor_relation.rb +162 -0
- data/lib/commonsense-ruby-lib/serializer.rb +20 -0
- data/lib/commonsense-ruby-lib/session.rb +105 -0
- data/lib/commonsense-ruby-lib/version.rb +3 -0
- data/spec/features/sensor_data_management_spec.rb +4 -0
- data/spec/features/sensor_management_spec.rb +105 -0
- data/spec/features/user_management_spec.rb +70 -0
- data/spec/lib/commonsense-ruby-lib/end_point/sensor_data_spec.rb +68 -0
- data/spec/lib/commonsense-ruby-lib/end_point/sensor_spec.rb +98 -0
- data/spec/lib/commonsense-ruby-lib/end_point/user_spec.rb +36 -0
- data/spec/lib/commonsense-ruby-lib/end_point_spec.rb +190 -0
- data/spec/lib/commonsense-ruby-lib/relation/sensor_data_relation_spec.rb +444 -0
- data/spec/lib/commonsense-ruby-lib/relation/sensor_relation_spec.rb +165 -0
- data/spec/lib/commonsense-ruby-lib/session_spec.rb +43 -0
- data/spec/lib/commonsense-ruby-lib_spec.rb +51 -0
- data/spec/spec_helper.rb +40 -0
- data/spec/support/spec_config.yml.sample +6 -0
- data/spec/support/vcr.rb +5 -0
- metadata +175 -0
@@ -0,0 +1,162 @@
|
|
1
|
+
module CommonSense
|
2
|
+
module Relation
|
3
|
+
|
4
|
+
# Class that used to query List of sensor data from CS.
|
5
|
+
#
|
6
|
+
# == parameters
|
7
|
+
# The relation object has serveral parameter
|
8
|
+
#
|
9
|
+
# * page : Integer, number of page in pagination. starts from 0
|
10
|
+
# * per_page : Integer, number of sensor per page, default 1000, max: 1000
|
11
|
+
# * shared : Boolean, filter only sensor that is shared.
|
12
|
+
# * onwed : Boolean, filter only sensor that user own.
|
13
|
+
# * physical : Boolean, filter only physical sensor (sensor that connected to device).
|
14
|
+
# * details : String "no" or "full", gives full description of sensor
|
15
|
+
#
|
16
|
+
# == Examples
|
17
|
+
# This is an example how would you use the sensors relation object
|
18
|
+
#
|
19
|
+
# === Create Sensors Relation
|
20
|
+
#
|
21
|
+
# client = CommonSense::Client.new
|
22
|
+
# client.login('user', 'password')
|
23
|
+
# session = client.session
|
24
|
+
#
|
25
|
+
# # create sensors relation
|
26
|
+
# sensors = client.sensors
|
27
|
+
#
|
28
|
+
# # is the same as
|
29
|
+
# sensors = CommonSense::Relation::Sensors.new
|
30
|
+
# sensors.session = session
|
31
|
+
#
|
32
|
+
# === Get all sensor
|
33
|
+
#
|
34
|
+
# sensors = client.sensors
|
35
|
+
# sensors.to_a
|
36
|
+
#
|
37
|
+
# === Get sensor by specifying parameters
|
38
|
+
#
|
39
|
+
# client.sensors.where(page: 0, per_page: 1000)
|
40
|
+
# client.sensors.where(owned: true)
|
41
|
+
# client.sensors.where(physical: true)
|
42
|
+
# client.sensors.where(page: 0, per_page: 1000, physical: true, owned: true, details: "full")
|
43
|
+
#
|
44
|
+
# === Chain parameters
|
45
|
+
#
|
46
|
+
# client.sensors.where(page:0, per_page: 10).where(physical: true)
|
47
|
+
#
|
48
|
+
# === Find sensor by name
|
49
|
+
#
|
50
|
+
# client.sensors.find_by_name(/position/)
|
51
|
+
# client.sensors.find_by_name(/position/, owned: true) # or
|
52
|
+
# client.sensors.where(owned: true).find_by_name(/position/)
|
53
|
+
#
|
54
|
+
# === Get first sensor or last sensor
|
55
|
+
#
|
56
|
+
# sensor = client.sensors.first
|
57
|
+
# sensor = client.sensors.last
|
58
|
+
#
|
59
|
+
# === Get number of sensors
|
60
|
+
#
|
61
|
+
# client.sensors.count
|
62
|
+
# client.sensors.where(owned: true).count
|
63
|
+
class SensorRelation
|
64
|
+
include Relation
|
65
|
+
|
66
|
+
parameter :page, Integer, default: 0, required: true
|
67
|
+
parameter :per_page, Integer, default: 1000, required: true, maximum: 1000
|
68
|
+
parameter :shared, Boolean
|
69
|
+
parameter :owned, Boolean
|
70
|
+
parameter :physical, Boolean
|
71
|
+
parameter :details, String, valid_values: ["no", "full"]
|
72
|
+
parameter :group_id, String
|
73
|
+
|
74
|
+
def initialize(session=nil)
|
75
|
+
@session = session
|
76
|
+
page = 0
|
77
|
+
per_page = 1000
|
78
|
+
end
|
79
|
+
|
80
|
+
# Create a new {EndPoint::Sensor Sensor} object.
|
81
|
+
#
|
82
|
+
# example:
|
83
|
+
#
|
84
|
+
# sensor = client.sensors.build
|
85
|
+
def build(attribtues={})
|
86
|
+
sensor = EndPoint::Sensor.new(attribtues)
|
87
|
+
sensor.session = self.session
|
88
|
+
sensor
|
89
|
+
end
|
90
|
+
|
91
|
+
# Find {EndPoint::Sensor Sensor} by id
|
92
|
+
#
|
93
|
+
# example:
|
94
|
+
#
|
95
|
+
# sensor = client.sensors.find("1")
|
96
|
+
def find(id)
|
97
|
+
check_session!
|
98
|
+
sensor = EndPoint::Sensor.new(id: id)
|
99
|
+
sensor.session = self.session
|
100
|
+
sensor.retrieve ? sensor : nil
|
101
|
+
end
|
102
|
+
|
103
|
+
# Find sensor by name in regular expression.
|
104
|
+
# The second argument is parameter that is usualy us in {#where where}
|
105
|
+
#
|
106
|
+
# example:
|
107
|
+
#
|
108
|
+
# client.sensors.find_by_name(/position/, owned: true)
|
109
|
+
def find_by_name(regex, parameters={})
|
110
|
+
check_session!
|
111
|
+
self.where(parameters)
|
112
|
+
self.select { |sensor| sensor.name =~ regex }
|
113
|
+
end
|
114
|
+
|
115
|
+
def each(&block)
|
116
|
+
page = self.page || 0;
|
117
|
+
begin
|
118
|
+
sensors = get_data!({
|
119
|
+
page: page, per_page: self.per_page, shared: self.shared,
|
120
|
+
owned: self.owned, physical: self.physical, details: self.details, group_id: self.group_id
|
121
|
+
})
|
122
|
+
|
123
|
+
sensors = sensors["sensors"]
|
124
|
+
if !sensors.empty?
|
125
|
+
sensors.each do |sensor|
|
126
|
+
sensor = EndPoint::Sensor.new(sensor)
|
127
|
+
sensor.session = session
|
128
|
+
yield sensor
|
129
|
+
end
|
130
|
+
|
131
|
+
page += 1
|
132
|
+
end
|
133
|
+
|
134
|
+
end while sensors.size == self.per_page
|
135
|
+
end
|
136
|
+
|
137
|
+
private
|
138
|
+
def get_url
|
139
|
+
"/sensors.json"
|
140
|
+
end
|
141
|
+
|
142
|
+
def parse_single_resource(sensors)
|
143
|
+
sensors = sensors["sensors"]
|
144
|
+
if !sensors.empty?
|
145
|
+
sensor = EndPoint::Sensor.new(sensors[0])
|
146
|
+
sensor.session = self.session
|
147
|
+
|
148
|
+
return sensor
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def get_single_resource(params={})
|
153
|
+
options = {
|
154
|
+
page: 0, per_page: 1, shared: self.shared,
|
155
|
+
owned: self.owned, physical: self.physical, details: self.details
|
156
|
+
}
|
157
|
+
options.merge!(params)
|
158
|
+
get_data(options)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module CommonSense
|
2
|
+
module Serializer
|
3
|
+
def from_hash(hash)
|
4
|
+
if hash
|
5
|
+
hash.each do |k,v|
|
6
|
+
self.instance_variable_set("@#{k}", v) if self.respond_to?(k)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_h(include_nil = true)
|
12
|
+
symbol = self.class.attribute_set
|
13
|
+
hash = {}
|
14
|
+
symbol.each {|var| hash[var] = instance_variable_get("@#{var}")}
|
15
|
+
|
16
|
+
return include_nil ? hash : hash.reject { |k,v| v.nil? }
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module CommonSense
|
2
|
+
class Session
|
3
|
+
def initialize(opts={})
|
4
|
+
options = {
|
5
|
+
base_uri: 'https://api.sense-os.nl',
|
6
|
+
authentication: true
|
7
|
+
}.merge(opts)
|
8
|
+
@base_uri = options[:base_uri]
|
9
|
+
@auth_proxy = options[:authentication] ? nil : CommonSense::Auth::HTTP.new(@base_uri)
|
10
|
+
end
|
11
|
+
|
12
|
+
# login to commonsense
|
13
|
+
# @return [String] session_id
|
14
|
+
def login(username, password)
|
15
|
+
@auth_proxy = CommonSense::Auth::HTTP.new(@base_uri)
|
16
|
+
@auth_proxy.login(username, password)
|
17
|
+
end
|
18
|
+
|
19
|
+
def oauth(consumer_key, consumer_secret, access_token, access_token_secret)
|
20
|
+
@auth_proxy = CommonSense::Auth::OAuth.new(consumer_key, consumer_secret,
|
21
|
+
access_token, access_token_secret,
|
22
|
+
@base_uri)
|
23
|
+
end
|
24
|
+
|
25
|
+
def session_id
|
26
|
+
auth_proxy.session_id
|
27
|
+
end
|
28
|
+
|
29
|
+
def session_id=(session_id)
|
30
|
+
@auth_proxy = CommonSense::Auth::HTTP.new(@base_uri)
|
31
|
+
@auth_proxy.session_id = session_id
|
32
|
+
end
|
33
|
+
|
34
|
+
def auth_proxy
|
35
|
+
raise 'The session is not logged in' unless @auth_proxy
|
36
|
+
@auth_proxy
|
37
|
+
end
|
38
|
+
|
39
|
+
def get(path, body = '', headers = {})
|
40
|
+
auth_proxy.get(path, body, headers)
|
41
|
+
end
|
42
|
+
|
43
|
+
def post(path, body = '', headers = {})
|
44
|
+
auth_proxy.post(path, body, headers = {})
|
45
|
+
end
|
46
|
+
|
47
|
+
def put(path, body = '', headers = {})
|
48
|
+
auth_proxy.put(path, body, headers)
|
49
|
+
end
|
50
|
+
|
51
|
+
def delete(path, body='', headers = {})
|
52
|
+
auth_proxy.delete(path, body, headers)
|
53
|
+
end
|
54
|
+
|
55
|
+
def head(path, headers = {})
|
56
|
+
auth_proxy.head(path, headers)
|
57
|
+
end
|
58
|
+
|
59
|
+
def response_code
|
60
|
+
auth_proxy.response_code
|
61
|
+
end
|
62
|
+
|
63
|
+
def response_body
|
64
|
+
auth_proxy.response_body
|
65
|
+
end
|
66
|
+
|
67
|
+
def response_headers
|
68
|
+
auth_proxy.response_headers
|
69
|
+
end
|
70
|
+
|
71
|
+
def errors
|
72
|
+
auth_proxy.errors
|
73
|
+
end
|
74
|
+
|
75
|
+
def base_uri=(uri = nil)
|
76
|
+
auth_proxy.base_uri = uri
|
77
|
+
end
|
78
|
+
|
79
|
+
def dump_to_text(path)
|
80
|
+
File.open(path, 'w') do |f|
|
81
|
+
f.write("Response Code: #{response_code}\n")
|
82
|
+
f.write("Response Headers: #{response_headers}\n")
|
83
|
+
f.write("Errors: #{errors}\n")
|
84
|
+
f.write("\n")
|
85
|
+
f.write(response_body)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def open_in_browser(path=nil)
|
90
|
+
require 'launchy'
|
91
|
+
|
92
|
+
path ||= "/tmp/common-sense-ruby-#{Time.now.to_i}.html"
|
93
|
+
dump_to_text(path)
|
94
|
+
::Launchy::Browser.run(path)
|
95
|
+
end
|
96
|
+
|
97
|
+
def to_s
|
98
|
+
"\"#{self.session_id}\""
|
99
|
+
end
|
100
|
+
|
101
|
+
def inspect
|
102
|
+
auth_proxy.kind_of?(CommonSense::Auth::HTTP) ? to_s : "OAuth"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
describe "Sensor Management" do
|
5
|
+
|
6
|
+
describe "Manage Sensor" do
|
7
|
+
before(:all) do
|
8
|
+
@client = create_client
|
9
|
+
@client.login($username, $password)
|
10
|
+
end
|
11
|
+
|
12
|
+
after(:all) do
|
13
|
+
@client.sensors.each {|sensors| sensors.delete}
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:sensor_info) do
|
17
|
+
{
|
18
|
+
name: "accelerometer",
|
19
|
+
display_name: "Accelerometer",
|
20
|
+
device_type: "BMA123",
|
21
|
+
pager_type: "email",
|
22
|
+
data_type: "json",
|
23
|
+
data_structure: {"x-axis" => "Float", "y-axis" => "Float", "z-axis" => "Float"}
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def compare_to_sensor_info(sensor)
|
28
|
+
sensor.name.should eq(sensor_info[:name])
|
29
|
+
sensor.display_name.should eq(sensor_info[:display_name])
|
30
|
+
sensor.display_name.should eq(sensor_info[:display_name])
|
31
|
+
sensor.pager_type.should eq(sensor_info[:pager_type])
|
32
|
+
sensor.data_type.should eq(sensor_info[:data_type])
|
33
|
+
sensor.data_structure.should eq(sensor_info[:data_structure])
|
34
|
+
end
|
35
|
+
|
36
|
+
it "create a new sensor" do
|
37
|
+
sensor = @client.sensors.build
|
38
|
+
sensor.name = sensor_info[:name]
|
39
|
+
sensor.display_name = sensor_info[:display_name]
|
40
|
+
sensor.device_type = sensor_info[:display_name]
|
41
|
+
sensor.pager_type = sensor_info[:pager_type]
|
42
|
+
sensor.data_type = sensor_info[:data_type]
|
43
|
+
sensor.data_structure = sensor_info[:data_structure]
|
44
|
+
sensor.save!
|
45
|
+
end
|
46
|
+
|
47
|
+
it "get list of sensor from commonSense" do
|
48
|
+
sensor = @client.sensors.build(sensor_info)
|
49
|
+
sensor.save!
|
50
|
+
|
51
|
+
@client.sensors.all.should_not be_empty
|
52
|
+
|
53
|
+
# there could be another Virtual sensor that is automatically created
|
54
|
+
@client.sensors.count.should be > 1
|
55
|
+
|
56
|
+
@client.sensors.each do |sensor|
|
57
|
+
compare_to_sensor_info(sensor)
|
58
|
+
break
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
it "get first sensor data" do
|
63
|
+
sensor = @client.sensors.build(sensor_info)
|
64
|
+
sensor.save!
|
65
|
+
sensor = @client.sensors.first
|
66
|
+
|
67
|
+
sensor.should_not be nil
|
68
|
+
compare_to_sensor_info(sensor)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "get sensor data by id" do
|
72
|
+
sensor = @client.sensors.build(sensor_info)
|
73
|
+
sensor.save!
|
74
|
+
|
75
|
+
first = @client.sensors.first
|
76
|
+
|
77
|
+
sensor = @client.sensors.find(first.id)
|
78
|
+
sensor.should_not be_nil
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
it "filter sensor data" do
|
83
|
+
sensor = @client.sensors.build(sensor_info)
|
84
|
+
sensor.save!
|
85
|
+
sensors = @client.sensors.where(page: 0, per_page: 1, owned: true , details: "full")
|
86
|
+
sensors.to_a.should_not be_empty
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should handle pagination" do
|
90
|
+
2.times do
|
91
|
+
sensor = @client.sensors.build(sensor_info)
|
92
|
+
sensor.save!
|
93
|
+
end
|
94
|
+
|
95
|
+
count = @client.sensors.count
|
96
|
+
|
97
|
+
i = 0;
|
98
|
+
@client.sensors.where(per_page: 1).each do
|
99
|
+
i += 1
|
100
|
+
end
|
101
|
+
|
102
|
+
i.should eq(count)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "User management" do
|
4
|
+
|
5
|
+
describe "Manage user" do
|
6
|
+
|
7
|
+
let!(:user) do
|
8
|
+
$user
|
9
|
+
end
|
10
|
+
|
11
|
+
it "create new user" do
|
12
|
+
current_user = user
|
13
|
+
current_user.id.should_not be_nil
|
14
|
+
end
|
15
|
+
|
16
|
+
it "get user data from commonSense" do
|
17
|
+
attributes = user.to_h
|
18
|
+
|
19
|
+
client = create_client
|
20
|
+
session_id = client.login(user.username, 'password')
|
21
|
+
session_id.should_not be_nil
|
22
|
+
|
23
|
+
current_user = client.current_user
|
24
|
+
|
25
|
+
attributes.each do |key, value|
|
26
|
+
next if key == :password
|
27
|
+
current_user.send(key).should eq(value)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it "update user" do
|
32
|
+
current_time = Time.now.to_f
|
33
|
+
client = create_client
|
34
|
+
username = "user-#{current_time}@tester.com"
|
35
|
+
current_user = client.new_user(username: username, email: username, password: 'password')
|
36
|
+
current_user.save!
|
37
|
+
current_user.id.should_not be_nil
|
38
|
+
|
39
|
+
expected = { username: "user-edit-#{current_time}@tester.com",
|
40
|
+
email: "user-edit-#{current_time}@tester.com",
|
41
|
+
name: "Jan Edit",
|
42
|
+
surname: "jagger edit",
|
43
|
+
address: 'Looydstraat 5 edit',
|
44
|
+
zipcode: '12345',
|
45
|
+
country: 'GERMANY',
|
46
|
+
mobile: '987654321'
|
47
|
+
}
|
48
|
+
|
49
|
+
client = create_client
|
50
|
+
client.session.should be_nil
|
51
|
+
session_id = client.login(current_user.username, 'password')
|
52
|
+
session_id.should_not be_nil
|
53
|
+
client.session.should_not be_nil
|
54
|
+
|
55
|
+
current_user = client.current_user
|
56
|
+
|
57
|
+
expected.each do |key, value|
|
58
|
+
current_user.send("#{key}=".to_sym, value)
|
59
|
+
end
|
60
|
+
|
61
|
+
current_user.save!
|
62
|
+
current_user.reload
|
63
|
+
|
64
|
+
expected.each do |key,value|
|
65
|
+
current_user.send(key).should eq(value)
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|