cs 0.1.0beta3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c9c07ce0761efba489c25ac1286348c278d43024
4
+ data.tar.gz: a200d01e595e45f19d4188a68b3089ab864222f0
5
+ SHA512:
6
+ metadata.gz: ee82e700560960c985a55829cba9987952b619b20395435d111948695f36550e9c3f4d5ea6d2bc1a4ae784c78dacdba6c3fb710c4268affcc80782e364b2fcce
7
+ data.tar.gz: 32cbaac901131587917bc9a9ada98678399cab0d34bec5ba83cd50daee54f13c08377c7879b82ffb7a39bd659dea8b2861b19424bb4fcfdc8d0dd63a25d9e7a5
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 1.9.3
5
+ - jruby-19mode
6
+ - rbx-2.2.1
7
+ - jruby-head
8
+ script: bundle exec rspec spec
data/Gemfile CHANGED
@@ -1,10 +1,26 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in commonsense-ruby-lib.gemspec
3
+ # Specify your gem's dependencies in cs.gemspec
4
4
  gemspec
5
- gem "pry"
6
- gem "pry-nav"
7
- gem "pry-doc"
8
- gem "redcarpet"
9
5
  gem "time-lord"
10
- #gem "pry-stack_explorer"
6
+ gem 'json'
7
+
8
+ #
9
+ # Rubinius does not load ruby stdlib by default
10
+ #
11
+
12
+ platforms :rbx do
13
+ gem 'rubysl'
14
+ end
15
+
16
+ group :test do
17
+ gem "rake", "~> 10.1.0"
18
+ gem "webmock", "~> 1.13.0"
19
+ gem "rspec", "~> 2.14.1"
20
+ end
21
+
22
+ group :development do
23
+ gem "pry"
24
+ gem "pry-nav"
25
+ gem "pry-doc"
26
+ end
data/README.md CHANGED
@@ -1,11 +1,14 @@
1
1
  # Commonsense::Ruby::Lib
2
2
  Client library to communicate with CommonSense written in ruby
3
3
 
4
+ [![Code Climate](https://codeclimate.com/github/senseobservationsystems/commonsense-ruby-lib.png)](https://codeclimate.com/github/senseobservationsystems/commonsense-ruby-lib)
5
+ [![Build Status](https://travis-ci.org/senseobservationsystems/commonsense-ruby-lib.png?branch=master)](https://travis-ci.org/senseobservationsystems/commonsense-ruby-lib)
6
+
4
7
  ## Installation
5
8
 
6
9
  Add this line to your application's Gemfile:
7
10
 
8
- gem 'commonsense-ruby-lib'
11
+ gem 'cs'
9
12
 
10
13
  And then execute:
11
14
 
@@ -13,15 +16,20 @@ And then execute:
13
16
 
14
17
  Or install it yourself as:
15
18
 
16
- $ gem install commonsense-ruby-lib
19
+ $ gem install cs
17
20
 
18
21
  ## Usage
19
22
 
20
23
  ### Authentication
21
24
  ```ruby
22
- client = CommonSense::Client.new
25
+ client = CS::Client.new
23
26
  client.login('username','password')
24
27
 
28
+ # setting session_id manually
29
+
30
+ client = CS::Client.new
31
+ client.session_id = '1234'
32
+
25
33
  # get current user
26
34
  current_user = client.current_user
27
35
  ```
@@ -32,13 +40,16 @@ current_user = client.current_user
32
40
  sensors = client.sensors
33
41
 
34
42
  # is the same as
35
- sensors = CommonSense::Relation::Sensors.new
43
+ sensors = CS::Relation::Sensors.new
36
44
  sensors.session = session
37
45
 
38
46
  # Get all sensor
39
47
  sensors = client.sensors
40
48
  sensors.to_a
41
49
 
50
+ # show parameters available when querying
51
+ client.sensors.parameters
52
+
42
53
  # Get sensor by specifying parameters
43
54
  client.sensors.where(page: 0, per_page: 1000)
44
55
  client.sensors.where(owned: true)
data/cs.gemspec CHANGED
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/commonsense-ruby-lib/version', __FILE__)
2
+ require File.expand_path('../lib/cs/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
5
  gem.authors = ["Ahmy Yulrizka"]
@@ -8,15 +8,15 @@ Gem::Specification.new do |gem|
8
8
  gem.summary = %q{Client library to communicate with CommonSense written in ruby}
9
9
  gem.homepage = "https://github.com/senseobservationsystems/commonsense-ruby-lib"
10
10
 
11
+ gem.required_ruby_version = '>= 1.9.3'
12
+
11
13
  gem.files = `git ls-files`.split($\)
12
14
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
15
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
16
  gem.name = "cs"
15
17
  gem.require_paths = ["lib"]
16
- gem.version = CommonSense::VERSION
17
- gem.add_development_dependency("rspec", "~> 2.13.0")
18
- gem.add_development_dependency("launchy", "~> 2.3.0")
19
- gem.add_development_dependency("fakeweb", "~> 1.3.0")
20
- gem.add_dependency('httparty', '~> 0.11.0')
21
- gem.add_dependency('oauth', '~> 0.4.7')
18
+ gem.version = CS::VERSION
19
+ gem.add_development_dependency("launchy", "~> 2.3")
20
+ gem.add_dependency('httparty', '~> 0.12')
21
+ gem.add_dependency('oauth', '~> 0.4')
22
22
  end
@@ -1,18 +1,27 @@
1
- require "commonsense-ruby-lib/version"
2
- require "commonsense-ruby-lib/error"
3
- require "commonsense-ruby-lib/auth/http"
4
- require "commonsense-ruby-lib/auth/oauth"
5
- require "commonsense-ruby-lib/session"
6
- require "commonsense-ruby-lib/end_point"
7
- require "commonsense-ruby-lib/end_point/user"
8
- require "commonsense-ruby-lib/end_point/group"
9
- require "commonsense-ruby-lib/end_point/sensor"
10
- require "commonsense-ruby-lib/end_point/sensor_data"
11
- require "commonsense-ruby-lib/relation"
12
- require "commonsense-ruby-lib/relation/sensor_relation"
13
- require "commonsense-ruby-lib/relation/sensor_data_relation"
14
-
15
- module CommonSense
1
+ require "cs/version"
2
+ require "cs/error"
3
+ require "cs/time"
4
+ require "cs/auth/http"
5
+ require "cs/auth/oauth"
6
+ require "cs/session"
7
+ require "cs/end_point"
8
+ require "cs/end_point/user"
9
+ require "cs/end_point/group"
10
+ require "cs/end_point/sensor"
11
+ require "cs/end_point/sensor_data"
12
+ require "cs/end_point/trigger"
13
+ require "cs/end_point/notification"
14
+ require "cs/parameter_processor"
15
+ require "cs/relation"
16
+ require "cs/relation/sensor_relation"
17
+ require "cs/relation/sensor_data_relation"
18
+ require "cs/relation/user_relation"
19
+ require "cs/relation/group_relation"
20
+ require "cs/relation/trigger_relation"
21
+ require "cs/relation/notification_relation"
22
+ require "cs/collection/sensor_data_collection"
23
+
24
+ module CS
16
25
 
17
26
  # Main entry class of the library.
18
27
  #
@@ -20,28 +29,29 @@ module CommonSense
20
29
  # will raise an exception when there is an error and the normal (without !)
21
30
  # will return nil when it fails.
22
31
  #
23
- # The response can be viewed by looking at the {CommonSense::Session}
32
+ # The response can be viewed by looking at the {CS::Session}
24
33
  #
25
34
  # client.session # will return the session object
26
35
  #
27
36
  # == Authentication with User And Password
28
37
  #
29
- # client = CommonSense::Client.new
38
+ # client = CS::Client.new
30
39
  # client.login('username', 'password')
31
40
  #
32
41
  # == Authentication using OAuth
33
42
  #
34
- # client = CommonSense::Client.new
43
+ # client = CS::Client.new
35
44
  # client.oauth('CONSUMER_KEY', 'CONSUMER_SECRET', 'ACCESS_TOKEN', 'ACCESS_TOKEN_SECRET')
36
45
  #
37
46
  # == Using different API server
38
47
  #
39
- # client = CommonSense::Client.new(base_uri: 'https://api.dev.sense-os.nl')
48
+ # client = CS::Client.new(base_uri: 'https://api.dev.sense-os.nl')
40
49
  # # or
41
50
  # client.base_uri = 'https://api.dev.sense-os.nl'
42
51
  #
43
52
  class Client
44
53
  attr_accessor :session, :base_uri
54
+ attr_reader :logger
45
55
 
46
56
  def initialize(opts={})
47
57
  options = {
@@ -50,43 +60,61 @@ module CommonSense
50
60
  @base_uri = options[:base_uri]
51
61
  end
52
62
 
63
+ def logger=(logger)
64
+ @logger = logger
65
+ @session.logger = logger if @session
66
+ end
67
+
53
68
  # Create a new session to CommonSense using username and plain text password
54
69
  # with `login!` it will throw exception if there is an error
55
70
  #
56
- # client = CommonSense::Client.new
71
+ # client = CS::Client.new
57
72
  # client.login!('username', 'password')
58
- def login!(user, password)
73
+ def login!(user, password, digest=true)
59
74
  @session = Session.new(base_uri: @base_uri)
60
- @session.login(user, password)
75
+ @session.logger = logger
76
+ @session.login(user, password, digest)
61
77
  end
62
78
 
63
79
  # Create a new session to CommonSense using username and plain text password
64
80
  # with `login` it will return nil if it not successful
65
81
  #
66
- # client = CommonSense::Client.new
82
+ # client = CS::Client.new
67
83
  # client.login('username', 'password')
68
- def login(user, password)
69
- login!(user, password) rescue nil
84
+ def login(user, password, digest=true)
85
+ login!(user, password, digest) rescue false
70
86
  end
71
87
 
72
88
  # Create a new session to CommonSense using OAuth credentials
73
89
  #
74
- # client = CommonSense::Client.new
90
+ # client = CS::Client.new
75
91
  # client.login('username', 'password')
76
92
  def oauth(consumer_key, consumer_secret, access_token, access_token_secret)
77
93
  @session = Session.new(base_uri: @base_uri)
94
+ @session.logger = logger
78
95
  @session.oauth(consumer_key, consumer_secret, access_token, access_token_secret)
79
96
  end
80
97
 
81
98
  # Create new session by manually specifiying `session_id` parameter
82
99
  #
83
- # client = CommonSense::Client.new
84
- # client.session_id('12345')
85
- def set_session_id(session_id)
100
+ # client = CS::Client.new
101
+ # client.session_id = '12345'
102
+ def session_id=(session_id)
86
103
  @session = Session.new(base_uri: @base_uri)
104
+ @session.logger = logger
87
105
  @session.session_id = session_id
88
106
  end
89
107
 
108
+ # Create new session by specifying api_key
109
+ #
110
+ # client = CS::Client.new
111
+ # client.session_id = '12345'
112
+ def api_key=(api_key)
113
+ @session = Session.new(base_uri: @base_uri)
114
+ @session.logger = logger
115
+ @session.api_key = api_key
116
+ end
117
+
90
118
  # Retrun logged in user
91
119
  def current_user
92
120
  user = EndPoint::User.new
@@ -96,7 +124,7 @@ module CommonSense
96
124
 
97
125
  # Create a new user
98
126
  #
99
- # client = CommonSense::Client.new
127
+ # client = CS::Client.new
100
128
  # client.new_user(username: 'Ahmy')
101
129
  # client.email = 'ahmy@gmail.com'
102
130
  # ...
@@ -107,21 +135,42 @@ module CommonSense
107
135
  user
108
136
  end
109
137
 
110
- # @see CommonSense::Relation::SensorRelation
138
+ def users
139
+ Relation::UserRelation.new(@session)
140
+ end
141
+
142
+ # @see CS::Relation::SensorRelation
111
143
  def sensors
112
144
  Relation::SensorRelation.new(@session)
113
145
  end
114
146
 
147
+ def groups
148
+ Relation::GroupRelation.new(@session)
149
+ end
150
+
151
+ def triggers
152
+ Relation::TriggerRelation.new(@session)
153
+ end
154
+
155
+ def notifications
156
+ Relation::NotificationRelation.new(@session)
157
+ end
158
+
115
159
  def current_groups
116
160
  group = EndPoint::Group.new
117
161
  group.session = @session
118
162
  group.current_groups
119
163
  end
120
164
 
165
+
121
166
  # return errors got from session
122
167
  def errors
123
168
  return @session.errors if @session
124
169
  end
125
170
  end
171
+
172
+ def self.load_CLI
173
+ require "cs/cli/cli"
174
+ end
126
175
  end
127
176
 
@@ -1,59 +1,75 @@
1
1
  require "httparty"
2
2
  require "json"
3
3
 
4
- module CommonSense
4
+ module CS
5
5
  module Auth
6
6
  class HTTP
7
7
  include HTTParty
8
8
 
9
9
  attr_accessor :response_body, :response_code, :response_headers, :errors
10
- attr_reader :session_id
10
+ attr_reader :session_id, :api_key
11
11
 
12
- def initialize(base_uri = nil)
12
+ def initialize(base_uri = nil, api_key = nil)
13
13
  self.base_uri = base_uri
14
+ @api_key = api_key
14
15
  @session_id = nil
15
16
  reset
16
17
  end
17
18
 
18
- def get(path, query={}, headers = {})
19
+ def execute(&block)
19
20
  reset
20
- headers = default_headers.merge(headers)
21
- options = {query: query, headers: headers}
22
- @response_body = self.class.get(path, options)
21
+ @response_body = yield
23
22
  parse_response
24
23
  @response_body
25
24
  end
26
25
 
26
+ def process_api_key(path)
27
+ return path if @api_key.nil?
28
+
29
+ if URI(path).query.nil?
30
+ path += "?API_KEY=#{@api_key}"
31
+ else
32
+ path += "&API_KEY=#{@api_key}"
33
+ end
34
+
35
+ path
36
+ end
37
+
38
+ def get(path, query={}, headers = {})
39
+ execute do
40
+ headers = default_headers.merge(headers)
41
+ options = {query: query, headers: headers}
42
+ path = process_api_key(path)
43
+ self.class.get(path, options)
44
+ end
45
+ end
46
+
27
47
  def post(path, body = '', headers = {})
28
- reset
29
- headers = default_headers.merge(headers)
30
- @response_body = self.class.post(path, prepare(body, headers))
31
- parse_response
32
- @response_body
48
+ execute do
49
+ headers = default_headers.merge(headers)
50
+ self.class.post(path, prepare(body, headers))
51
+ end
33
52
  end
34
53
 
35
54
  def put(path, body = '', headers = {})
36
- reset
37
- headers = default_headers.merge(headers)
38
- @response_body = self.class.put(path, prepare(body, headers))
39
- parse_response
40
- @response_body
55
+ execute do
56
+ headers = default_headers.merge(headers)
57
+ self.class.put(path, prepare(body, headers))
58
+ end
41
59
  end
42
60
 
43
61
  def delete(path, query={}, headers = {})
44
- reset
45
- headers = default_headers.merge(headers)
46
- options = {query: query, headers: headers}
47
- @response_body = self.class.delete(path, options)
48
- parse_response
49
- @response_body
62
+ execute do
63
+ headers = default_headers.merge(headers)
64
+ options = {query: query, headers: headers}
65
+ self.class.delete(path, options)
66
+ end
50
67
  end
51
68
 
52
69
  def head(path, headers = {})
53
- reset
54
- @response_body = self.class.head(path, prepare(nil, headers))
55
- parse_response
56
- @response_body
70
+ execute do
71
+ self.class.head(path, prepare(nil, headers))
72
+ end
57
73
  end
58
74
 
59
75
  def base_uri=(uri = nil)
@@ -62,9 +78,9 @@ module CommonSense
62
78
 
63
79
  def default_headers
64
80
  header = self.class.default_options[:headers] || {}
65
- header.merge({"Content-Type" => "application/json"})
81
+ header.merge!({"Content-Type" => "application/json"})
66
82
  if @session_id
67
- header.merge!('X-SESSION_ID' => self.session_id)
83
+ header = header.merge('X-SESSION_ID' => self.session_id)
68
84
  end
69
85
  header
70
86
  end
@@ -77,17 +93,19 @@ module CommonSense
77
93
  @session_id = session_id
78
94
  end
79
95
 
80
-
81
96
  # login to commonsense
82
97
  # @return [String] session_id
83
- def login(username, password)
84
- password = Digest::MD5.hexdigest password
98
+ def login(username, password, digest=true)
99
+ if digest
100
+ password = Digest::MD5.hexdigest password
101
+ end
85
102
  post('/login.json', {:username => username, :password => password})
86
103
 
87
104
  if @response_code == 200
88
105
  self.session_id = response_body['session_id']
89
106
  else
90
- errors = [response_body['error']]
107
+ self.session_id = false
108
+ @errors = [response_body['error']]
91
109
  end
92
110
 
93
111
  session_id
@@ -101,6 +119,7 @@ module CommonSense
101
119
  end
102
120
 
103
121
  def parse_response
122
+ return unless @response_body
104
123
  @response_code = @response_body.response.code.to_i
105
124
  @response_headers = @response_body.headers
106
125
  if @response_code >= 400