cs 0.1.0beta3 → 0.1.0

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 (57) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +8 -0
  3. data/Gemfile +22 -6
  4. data/README.md +15 -4
  5. data/cs.gemspec +7 -7
  6. data/lib/{commonsense-ruby-lib.rb → cs.rb} +80 -31
  7. data/lib/{commonsense-ruby-lib → cs}/auth/http.rb +52 -33
  8. data/lib/{commonsense-ruby-lib → cs}/auth/oauth.rb +28 -28
  9. data/lib/cs/collection.rb +7 -0
  10. data/lib/cs/collection/sensor_data_collection.rb +61 -0
  11. data/lib/{commonsense-ruby-lib → cs}/end_point.rb +36 -24
  12. data/lib/cs/end_point/group.rb +26 -0
  13. data/lib/cs/end_point/notification.rb +16 -0
  14. data/lib/{commonsense-ruby-lib → cs}/end_point/sensor.rb +22 -6
  15. data/lib/{commonsense-ruby-lib → cs}/end_point/sensor_data.rb +17 -6
  16. data/lib/cs/end_point/trigger.rb +16 -0
  17. data/lib/{commonsense-ruby-lib → cs}/end_point/user.rb +8 -4
  18. data/lib/{commonsense-ruby-lib → cs}/error.rb +7 -1
  19. data/lib/cs/parameter_processor.rb +99 -0
  20. data/lib/cs/relation.rb +244 -0
  21. data/lib/cs/relation/group_relation.rb +24 -0
  22. data/lib/cs/relation/notification_relation.rb +20 -0
  23. data/lib/{commonsense-ruby-lib → cs}/relation/sensor_data_relation.rb +7 -52
  24. data/lib/{commonsense-ruby-lib → cs}/relation/sensor_relation.rb +28 -55
  25. data/lib/cs/relation/trigger_relation.rb +21 -0
  26. data/lib/cs/relation/user_relation.rb +20 -0
  27. data/lib/{commonsense-ruby-lib → cs}/serializer.rb +1 -1
  28. data/lib/cs/session.rb +170 -0
  29. data/lib/cs/time.rb +45 -0
  30. data/lib/cs/version.rb +3 -0
  31. data/spec/features/sensor_management_spec.rb +146 -45
  32. data/spec/features/user_management_spec.rb +94 -22
  33. data/spec/lib/cs/collection/sensor_data_collection_spec.rb +27 -0
  34. data/spec/lib/cs/end_point/group_spec.rb +120 -0
  35. data/spec/lib/cs/end_point/sensor_data_spec.rb +110 -0
  36. data/spec/lib/{commonsense-ruby-lib → cs}/end_point/sensor_spec.rb +6 -6
  37. data/spec/lib/{commonsense-ruby-lib → cs}/end_point/user_spec.rb +14 -7
  38. data/spec/lib/{commonsense-ruby-lib → cs}/end_point_spec.rb +25 -12
  39. data/spec/lib/cs/relation/group_relation_spec.rb +103 -0
  40. data/spec/lib/cs/relation/sensor_data_relation_spec.rb +184 -0
  41. data/spec/lib/cs/relation/sensor_relation_spec.rb +192 -0
  42. data/spec/lib/cs/relation/user_relation_spec.rb +81 -0
  43. data/spec/lib/cs/relation_spec.rb +151 -0
  44. data/spec/lib/cs/session_spec.rb +91 -0
  45. data/spec/lib/cs/time_spec.rb +71 -0
  46. data/spec/lib/cs_spec.rb +85 -0
  47. data/spec/spec_helper.rb +6 -26
  48. metadata +69 -86
  49. data/lib/commonsense-ruby-lib/end_point/group.rb +0 -28
  50. data/lib/commonsense-ruby-lib/relation.rb +0 -233
  51. data/lib/commonsense-ruby-lib/session.rb +0 -105
  52. data/lib/commonsense-ruby-lib/version.rb +0 -3
  53. data/spec/lib/commonsense-ruby-lib/end_point/sensor_data_spec.rb +0 -68
  54. data/spec/lib/commonsense-ruby-lib/relation/sensor_data_relation_spec.rb +0 -444
  55. data/spec/lib/commonsense-ruby-lib/relation/sensor_relation_spec.rb +0 -165
  56. data/spec/lib/commonsense-ruby-lib/session_spec.rb +0 -43
  57. data/spec/lib/commonsense-ruby-lib_spec.rb +0 -51
@@ -1,6 +1,6 @@
1
1
  require "oauth"
2
2
 
3
- module CommonSense
3
+ module CS
4
4
  module Auth
5
5
  class OAuth
6
6
 
@@ -21,48 +21,48 @@ module CommonSense
21
21
  @oauth
22
22
  end
23
23
 
24
- def get(path, query={}, headers = {})
24
+ def execute(&block)
25
25
  reset
26
- headers = default_headers.merge(headers)
27
- response = oauth.get(path, headers)
26
+ response = yield
28
27
  parse_response(response)
29
28
  @response_body
30
29
  end
31
30
 
32
- def post(path, body = '', headers = {})
33
- reset
34
- headers = default_headers.merge(headers)
35
- response = oauth.post(path, body.to_json, headers)
36
- parse_response(response)
31
+ def get(path, query={}, headers = {})
32
+ execute do
33
+ path += '?' + URI.encode_www_form(query) unless query.empty?
34
+ headers = default_headers.merge(headers)
35
+ oauth.get(path, headers)
36
+ end
37
+ end
37
38
 
38
- @response_body
39
+ def post(path, body = '', headers = {})
40
+ execute do
41
+ headers = default_headers.merge(headers)
42
+ oauth.post(path, body.to_json, headers)
43
+ end
39
44
  end
40
45
 
41
46
  def put(path, body = '', headers = {})
42
- reset
43
- headers = default_headers.merge(headers)
44
- response = oauth.put(path, body.to_json, headers)
45
- parse_response(response)
46
-
47
- @response_body
47
+ execute do
48
+ headers = default_headers.merge(headers)
49
+ oauth.put(path, body.to_json, headers)
50
+ end
48
51
  end
49
52
 
50
53
  def delete(path, query={}, headers = {})
51
- reset
52
- headers = default_headers.merge(headers)
53
- response = oauth.delete(path, headers)
54
- parse_response(response)
55
-
56
- @response_body
54
+ execute do
55
+ path += '?' + URI.encode_www_form(query) unless query.empty?
56
+ headers = default_headers.merge(headers)
57
+ oauth.delete(path, headers)
58
+ end
57
59
  end
58
60
 
59
61
  def head(path, headers = {})
60
- reset
61
- headers = default_headers.merge(headers)
62
- response = oauth.head(path, headers)
63
- parse_response(response)
64
-
65
- @response_body
62
+ execute do
63
+ headers = default_headers.merge(headers)
64
+ oauth.head(path, headers)
65
+ end
66
66
  end
67
67
 
68
68
  def base_uri=(uri = nil)
@@ -0,0 +1,7 @@
1
+ module CS
2
+ ##
3
+ # Module to handle Collection
4
+ module Collection
5
+
6
+ end
7
+ end
@@ -0,0 +1,61 @@
1
+ require 'delegate'
2
+
3
+ module CS
4
+ module Collection
5
+ class SensorDataCollection < SimpleDelegator
6
+ attr_accessor :session
7
+ attr_accessor :batch_size
8
+
9
+ def initialize
10
+ @batch_size = 1000
11
+ super([])
12
+ end
13
+
14
+ def save!
15
+ check_session!
16
+
17
+ # group batch
18
+ self.each_slice(@batch_size) do |batch|
19
+ body = process_batch(batch)
20
+ @session.post(get_url, body)
21
+ end
22
+ end
23
+
24
+ ##
25
+ # Given array of sensor data it will group the data by sensor_id
26
+ # and construct payload for multiple sensor upload
27
+ def process_batch(batch)
28
+ sensors = {}
29
+ batch.each do |point|
30
+ next if point.nil? || point.sensor_id.nil?
31
+ sensor_id = point.sensor_id
32
+
33
+ if !sensors[sensor_id]
34
+ sensors[sensor_id] = {
35
+ sensor_id: sensor_id,
36
+ data: []
37
+ }
38
+ end
39
+
40
+ sensors[sensor_id][:data].push(point.to_cs_point)
41
+ end
42
+
43
+ retval = []
44
+ sensors.each do |k, v|
45
+ retval.push(v)
46
+ end
47
+
48
+ {sensors: retval}
49
+ end
50
+
51
+ def get_url
52
+ "/sensors/data.json"
53
+ end
54
+
55
+ private
56
+ def check_session!
57
+ raise Error::SessionEmptyError unless @session
58
+ end
59
+ end
60
+ end
61
+ end
@@ -1,7 +1,7 @@
1
- require 'commonsense-ruby-lib/serializer'
2
- module CommonSense
1
+ require 'cs/serializer'
2
+ module CS
3
3
  module EndPoint
4
- include CommonSense::Serializer
4
+ include CS::Serializer
5
5
 
6
6
  attr_accessor :session
7
7
 
@@ -22,7 +22,7 @@ module CommonSense
22
22
 
23
23
  # get value of property name
24
24
  def parameter(name)
25
- self.instance_variable_get(name)
25
+ self.instance_variable_get("@#{name}")
26
26
  end
27
27
 
28
28
  # Persist end point object to CS. It will create a new record on CS
@@ -44,20 +44,20 @@ module CommonSense
44
44
  #
45
45
  # sensor.name = "accelerometer edit"
46
46
  # sensor.save! # this will update the sensor
47
- def save!
47
+ def save!(options={})
48
48
  check_session!
49
49
 
50
50
  if @id
51
- self.update!
51
+ self.update!(options)
52
52
  else
53
- self.create!
53
+ self.create!(options)
54
54
  end
55
55
  end
56
56
 
57
- # it will persist data to CS just like {#save!} but it will return nil instead of exception
57
+ # it will persist data to CS just like {#save!} but it will return false instead of exception
58
58
  # if it encouter error while persiting data
59
- def save
60
- save! rescue nil
59
+ def save(options={})
60
+ save!(options) rescue false
61
61
  end
62
62
 
63
63
  # Create a new end point object to CS. It will raise an exception if there is an error
@@ -74,8 +74,9 @@ module CommonSense
74
74
  #
75
75
  # sensor.create! # this will create new sensor on CS
76
76
  # sensor.id # should give you the id of the sensor
77
- def create!
77
+ def create!(options={})
78
78
  parameter = self.to_parameters
79
+ parameter.merge!(options)
79
80
  res = session.post(post_url, parameter)
80
81
 
81
82
  if session.response_code != 201
@@ -90,11 +91,10 @@ module CommonSense
90
91
  true
91
92
  end
92
93
 
93
- # Create a new endpoint object to CS, just like {#create!} but it will return nil
94
+ # Create a new endpoint object to CS, just like {#create!} but it will return false
94
95
  # if there is an error.
95
- def create
96
- result = create! rescue nil
97
- not result.nil?
96
+ def create(options={})
97
+ create!(options) rescue false
98
98
  end
99
99
 
100
100
  # Retrieve Data from CS of the current object based on the id of the object.
@@ -125,10 +125,9 @@ module CommonSense
125
125
  end
126
126
 
127
127
  # it will retrieve / reload current object form CS, just like {#retrieve!} but it
128
- # will return nil instead of raise an exception if there is an error.
128
+ # will return false instead of raise an exception if there is an error.
129
129
  def retrieve
130
- result = retrieve! rescue nil
131
- not result.nil?
130
+ retrieve! rescue false
132
131
  end
133
132
 
134
133
  # alias for {#retrieve}
@@ -143,11 +142,12 @@ module CommonSense
143
142
  # sensor = client.sensors.find(1)
144
143
  # sensor.name = "new name"
145
144
  # sensor.update!
146
- def update!
145
+ def update!(options={})
147
146
  check_session!
148
147
  raise Error::ResourceIdError unless @id
149
148
 
150
149
  parameter = self.to_parameters
150
+ parameter.merge!(options)
151
151
  res = session.put(put_url, parameter)
152
152
 
153
153
  if session.response_code != 200
@@ -160,9 +160,8 @@ module CommonSense
160
160
 
161
161
  # Update current end point object to CS, just like {#update!} but it will return nil
162
162
  # if there is an error
163
- def update
164
- result = update! rescue nil
165
- not result.nil?
163
+ def update(options={})
164
+ update!(options) rescue false
166
165
  end
167
166
 
168
167
 
@@ -192,8 +191,7 @@ module CommonSense
192
191
  # Delete the current end point object from CS, just like {#delete!} but it will return nil
193
192
  # if there is an error
194
193
  def delete
195
- result = delete! rescue nil
196
- not result.nil?
194
+ delete! rescue false
197
195
  end
198
196
 
199
197
  # return the commonsense URL for method
@@ -205,6 +203,12 @@ module CommonSense
205
203
  url
206
204
  end
207
205
 
206
+ def duplicate
207
+ clone = self.dup
208
+ clone.id = nil
209
+ clone
210
+ end
211
+
208
212
  protected
209
213
  def scan_header_for_id(location_header)
210
214
  location_header.scan(/.*\/#{resources}\/(.*)/)[0] if location_header
@@ -268,9 +272,17 @@ module CommonSense
268
272
  class_variable_set(:@@delete_url, "/#{resources}/:id.json")
269
273
  end
270
274
 
275
+ def resources_name
276
+ class_variable_get(:@@resources)
277
+ end
278
+
271
279
  def resource(resource)
272
280
  class_variable_set(:@@resource, resource)
273
281
  end
282
+
283
+ def resource_name
284
+ class_variable_get(:@@resource)
285
+ end
274
286
  end
275
287
  end
276
288
  end
@@ -0,0 +1,26 @@
1
+ module CS
2
+ module EndPoint
3
+ class Group
4
+ include EndPoint
5
+
6
+ attribute :name, :anonymous, :public, :hidden, :access_password, :description,
7
+ :required_sensors, :default_list_users, :default_add_users, :default_remove_users,
8
+ :default_list_sensors, :default_add_sensors, :required_show_id, :required_show_email,
9
+ :required_show_first_name, :required_show_surname, :required_show_phone_number,
10
+ :required_show_username
11
+
12
+ resources "groups"
13
+ resource "group"
14
+
15
+ def initialize(hash={})
16
+ from_hash(hash)
17
+ end
18
+
19
+ # get groups that user belongs to
20
+ def current_groups(options={})
21
+ relation = Relation::GroupRelation.new(@session)
22
+ relation.to_a
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,16 @@
1
+ module CS
2
+ module EndPoint
3
+ class Notification
4
+ include EndPoint
5
+
6
+ attribute :type, :text, :destination
7
+
8
+ resources "notifications"
9
+ resource "notification"
10
+
11
+ def initialize(hash={})
12
+ from_hash(hash)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,14 +1,24 @@
1
- module CommonSense
1
+ module CS
2
2
  module EndPoint
3
3
  class Sensor
4
4
  include EndPoint
5
5
 
6
6
  attribute :name, :display_name, :device_type, :pager_type, :data_type, :data_structure
7
- resources :sensors
8
- resource :sensor
7
+ resources "sensors"
8
+ resource "sensor"
9
9
 
10
10
  def initialize(hash={})
11
11
  from_hash(hash)
12
+ parse_data_structure
13
+ end
14
+
15
+ def retrieve!
16
+ super
17
+ parse_data_structure
18
+ true
19
+ end
20
+
21
+ def parse_data_structure
12
22
  if self.data_type == "json"
13
23
  if self.data_structure && self.data_structure.kind_of?(String)
14
24
  self.data_structure = JSON.parse(self.data_structure) rescue nil
@@ -16,8 +26,8 @@ module CommonSense
16
26
  end
17
27
  end
18
28
 
19
- # overide Endpoint#to_parameters
20
- def to_parameters
29
+
30
+ def to_cs_sensor
21
31
  param = self.to_h(false)
22
32
  if param[:data_type] == "json"
23
33
  if param[:data_structure] && !param[:data_structure].kind_of?(String)
@@ -25,7 +35,13 @@ module CommonSense
25
35
  end
26
36
  end
27
37
 
28
- {sensor: param}
38
+ param
39
+ end
40
+
41
+ # overide Endpoint#to_parameters
42
+ def to_parameters
43
+
44
+ {sensor: to_cs_sensor}
29
45
  end
30
46
 
31
47
  def data
@@ -1,9 +1,9 @@
1
- module CommonSense
1
+ module CS
2
2
  module EndPoint
3
3
  # This object represent a sensor data point
4
4
  # usage example:
5
5
  #
6
- # client = CommonSense::Client.new
6
+ # client = CS::Client.new
7
7
  # client.login('username', 'password')
8
8
  #
9
9
  # # Find the first position sensor
@@ -19,13 +19,14 @@ module CommonSense
19
19
  # sensor.data.build(date: Time.now, value: {"lux => 1}).save!
20
20
  #
21
21
  class SensorData
22
- include CommonSense::EndPoint
22
+ include CS::EndPoint
23
23
 
24
24
  attr_accessor :month, :week, :year
25
25
  attribute :date, :value, :sensor_id
26
- resource :data
26
+ resources "data"
27
+ resource "data"
27
28
 
28
- def to_parameters
29
+ def to_cs_point
29
30
  param = self.to_h(false)
30
31
  param.delete(:sensor_id)
31
32
  value = param[:value]
@@ -33,7 +34,17 @@ module CommonSense
33
34
  param[:value] = value.to_json unless value.kind_of?(String) || value.kind_of?(Numeric)
34
35
  end
35
36
 
36
- {data: [param]}
37
+ param[:date] = CS::Time.new(date).to_f if param[:date]
38
+
39
+ param
40
+ end
41
+
42
+ def to_parameters
43
+ {data: [to_cs_point]}
44
+ end
45
+
46
+ def date_human
47
+ Time.new(@date)
37
48
  end
38
49
 
39
50
  # there is no currently end point for geting data by id