rhoconnect-rb 0.3.2 → 1.0.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.
data/.travis.yml CHANGED
@@ -4,6 +4,8 @@ rvm:
4
4
  - 1.9.2
5
5
  - 1.9.3
6
6
  - ree
7
+ - jruby-18mode
8
+ - jruby-19mode
7
9
  notifications:
8
10
  email:
9
11
  on_success: always
data/CHANGELOG.md ADDED
@@ -0,0 +1,6 @@
1
+ ## 1.0.0
2
+ * Added rhoconnect API methods
3
+ * Changed namespace from Rhoconnect to Rhoconnectrb
4
+ * `rhoconnect_query` now takes an attributes hash
5
+ * Added default settings for easier setup w/ RhoConnect apps
6
+ * Travis build support for JRuby
data/Gemfile CHANGED
@@ -6,6 +6,10 @@ gem 'rails', '>= 3.0'
6
6
 
7
7
  group :test do
8
8
  gem 'rspec', '~>2.5.0', :require => 'spec'
9
- gem 'rcov', '~>0.9.8', :platforms => [:ruby_18]
9
+ gem 'simplecov', :platforms => [:ruby_19,:jruby]
10
10
  gem 'webmock'
11
11
  end
12
+
13
+ platforms :jruby do
14
+ gem 'jruby-openssl'
15
+ end
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- rhoconnect-rb ![Build Status](https://secure.travis-ci.org/rhomobile/rhoconnect-rb.png)
1
+ rhoconnect-rb [![Build Status](https://secure.travis-ci.org/rhomobile/rhoconnect-rb.png)](http://travis-ci.org/rhomobile/rhoconnect-rb)
2
2
  ===
3
3
 
4
4
  A ruby library for the [RhoConnect](http://rhomobile.com/products/rhoconnect) App Integration Server.
@@ -12,23 +12,23 @@ Load the `rhoconnect-rb` library:
12
12
  require 'rhoconnect-rb'
13
13
 
14
14
  Note, if you are using datamapper, install the `dm-serializer` library and require it in your application. `rhoconnect-rb` depends on this utility to interact with Rhoconnect applications using JSON.
15
-
15
+
16
16
  ## Setup the Model
17
- Now include Rhoconnect::Resource in a model that you want to synchronize with your mobile application:
17
+ Now include Rhoconnectrb::Resource in a model that you want to synchronize with your mobile application:
18
18
 
19
19
  class Product < ActiveRecord::Base
20
- include Rhoconnect::Resource
20
+ include Rhoconnectrb::Resource
21
21
  end
22
-
22
+
23
23
  Or, if you are using DataMapper:
24
24
 
25
25
  class Product
26
26
  include DataMapper::Resource
27
- include Rhoconnect::Resource
27
+ include Rhoconnectrb::Resource
28
28
  end
29
29
 
30
30
  ## Partitioning Datasets
31
-
31
+
32
32
  Next, your models will need to declare a partition key for `rhoconnect-rb`. This partition key is used by `rhoconnect-rb` to uniquely identify the model dataset when it is stored in a rhoconnect instance. It is typically an attribute on the model or related model. `rhoconnect-rb` supports two types of partitions:
33
33
 
34
34
  * :app - No unique key will be used, a shared dataset is synchronized for all users.
@@ -37,21 +37,21 @@ Next, your models will need to declare a partition key for `rhoconnect-rb`. Thi
37
37
  For example, the `Product` model above might have a `belongs_to :user` relationship. This provides us a simple way to organize the `Product` dataset for rhoconnect by reusing this relationship. The partition identifying a username would be declared as:
38
38
 
39
39
  class Product < ActiveRecord::Base
40
- include Rhoconnect::Resource
41
-
40
+ include Rhoconnectrb::Resource
41
+
42
42
  belongs_to :user
43
-
44
- def partition
45
- lambda { self.user.username }
43
+
44
+ def partition
45
+ lambda { self.user.username }
46
46
  end
47
47
  end
48
-
48
+
49
49
  Now all of the `Product` data synchronized by rhoconnect will organized by `self.user.username`. Note: You can also used a fixed key if the dataset doesn't require a dynamic value:
50
50
 
51
51
  def partition
52
52
  :app
53
53
  end
54
-
54
+
55
55
  For more information about Rhoconnect partitions, please refer to the [Rhoconnect docs](http://docs.rhomobile.com/rhoconnect/source-adapters#data-partitioning).
56
56
 
57
57
  ## Querying Datasets
@@ -59,20 +59,20 @@ For more information about Rhoconnect partitions, please refer to the [Rhoconnec
59
59
  `rhoconnect-rb` installs a `/rhoconnect/query` route in your application which the Rhoconnect instance invokes to query the dataset for the dataset you want to synchronize. This route is mapped to a `rhoconnect_query` method in your model. This method should return a collection of objects:
60
60
 
61
61
  class Product < ActiveRecord::Base
62
- include Rhoconnect::Resource
63
-
62
+ include Rhoconnectrb::Resource
63
+
64
64
  belongs_to :user
65
-
66
- def partition
67
- lambda { self.user.username }
65
+
66
+ def partition
67
+ lambda { self.user.username }
68
68
  end
69
-
69
+
70
70
  def self.rhoconnect_query(partition, attributes = nil)
71
71
  Product.includes(:user).where("users.username = ?", partition)
72
72
  end
73
73
  end
74
74
 
75
- In this example, `self.rhoconnect_query` returns a list of products where the partition string (provided by the rhoconnect instance) matches the `user_id` field in the products table.
75
+ In this example, `self.rhoconnect_query` returns a list of products where the partition string (provided by the rhoconnect instance) matches the `user_id` field in the products table.
76
76
 
77
77
  ## Configuration and Authentication
78
78
 
@@ -83,41 +83,246 @@ Configure RhoConnect in an initializer like `config/initializers/rhoconnect.rb`
83
83
  config.uri = "http://myrhoconnect.com"
84
84
  config.token = "secrettoken"
85
85
  config.app_endpoint = "http://myapp.heroku.com"
86
-
86
+
87
87
  If `app_endpoint` is defined, your Rhoconnect instance will be configured to query data from the endpoint using the rhoconnect_query method in your model. For example, if your `app_endpoint` is defined as "http://myapp.heroku.com", RhoConnect will query data with:
88
88
 
89
89
  POST http://myapp.heroku.com/rhoconnect/query
90
90
 
91
- Example:
91
+ Example:
92
92
 
93
- Rhoconnect.configure do |config|
94
- config.uri = "http://myrhoconnect-server.com"
95
- config.token = "secrettoken"
96
- config.app_endpoint = "http://myapp.heroku.com"
93
+ Rhoconnectrb.configure do |config|
94
+ config.uri = "http://localhost:8675"
95
+ config.token = "mydevtoken"
96
+ config.app_endpoint = "http://localhost:3000"
97
97
  end
98
-
98
+
99
99
  Example with authentication:
100
100
 
101
101
  `rhoconnect-rb` installs a `/rhoconnect/authenticate` route into your application which will receive credentials from the client. Add block which handles the credentials:
102
102
 
103
- Rhoconnect.configure do |config|
104
- config.uri = "http://myrhoconnect-server.com"
105
- config.token = "secrettoken"
106
- config.authenticate = lambda { |credentials|
107
- User.authenticate(credentials[:login], credentials[:password])
103
+ Rhoconnectrb.configure do |config|
104
+ config.uri = "http://localhost:8675"
105
+ config.token = "mydevtoken"
106
+ config.app_endpoint = "http://localhost:3000"
107
+ config.authenticate = lambda { |credentials|
108
+ User.authenticate(credentials[:login], credentials[:password])
108
109
  }
109
110
  end
110
-
111
+
111
112
  ### Using the [RhoConnect Heroku Addon](http://docs.rhomobile.com/rhoconnect/heroku-addon)
112
113
 
113
114
  If you're using the [RhoConnect Heroku Addon](http://docs.rhomobile.com/rhoconnect/heroku-addon), then you can omit the config.uri and config.token (they are managed for you):
114
115
 
115
- Rhoconnect.configure do |config|
116
- config.authenticate = lambda { |credentials|
117
- User.authenticate(credentials[:login], credentials[:password])
116
+ Rhoconnectrb.configure do |config|
117
+ config.app_endpoint = "http://myapp.heroku.com"
118
+ config.authenticate = lambda { |credentials|
119
+ User.authenticate(credentials[:login], credentials[:password])
118
120
  }
119
121
  end
120
-
122
+
123
+ ## Rhoconnect-rb API
124
+
125
+ ### Overview of the API
126
+
127
+ The Rhoconnectrb::API module contains routes to all the resources available in <a href='http://docs.rhomobile.com/rhoconnect/rest-api'>Rhoconnect</a>. At a high level the API calls take on the following syntax:
128
+
129
+ Namespace::Resource.verb_action1_action2_...([resource_id,action1_id,action2_id],data)
130
+
131
+ Some of these values are not used for every API call such as resource_id and data.
132
+
133
+ ### System Resource
134
+
135
+ #### `POST /rc/v1/system/login`
136
+
137
+
138
+ data = {:login=>'username',:password=>'password'}
139
+ Rhoconnectrb::API::System.post_login(data)
140
+
141
+ #### `GET /rc/v1/system/license`
142
+
143
+
144
+ Rhoconnectrb::API::System.get_license
145
+
146
+ #### `POST /rc/v1/system/reset`
147
+
148
+
149
+ Rhoconnectrb::API::System.post_reset({})
150
+
151
+ #### `GET /rc/v1/system/appserver`
152
+
153
+
154
+ Rhoconnectrb::API::System.get_appserver
155
+
156
+ #### `POST /rc/v1/system/appserver`
157
+
158
+
159
+ data = {:adapter_url=>'http://test.com'}
160
+ Rhoconnectrb::API::System.post_appserver(data)
161
+
162
+ #### `GET /rc/v1/system/stats`
163
+
164
+
165
+ data ={:names=>"*sources*"}
166
+ Rhoconnectrb::API::System.get_stats(data)
167
+
168
+ ### Store Resource
169
+
170
+ #### `GET /rc/v1/store/:doc`
171
+
172
+
173
+ Rhoconnectrb::API::Store.get('docname')
174
+
175
+ #### `POST /rc/v1/store/:doc`
176
+
177
+
178
+ data = {:data=>{:id=3},:append=>false}
179
+ Rhoconnectrb::API::Store.post('docname',data)
180
+
181
+ ### User Resource
182
+
183
+ #### `POST /rc/v1/users`
184
+
185
+
186
+ data = {:attributes=>{:login=>'login',:password=>'password'}}
187
+ Rhoconnectrb::API::Users.post(data)
188
+
189
+ #### `DELETE /rc/v1/users/:user_id`
190
+
191
+
192
+ Rhoconnectrb::API::Users.delete('user_id')
193
+
194
+ #### `PUT /rc/v1/users/:user_id`
195
+
196
+
197
+ data = {:attributes=>{:a_user_specific_attribute => a_user_specific_attribute_value}}
198
+ Rhoconnectrb::API::Users.put('user_id',data)
199
+
200
+ #### `GET /rc/v1/users`
201
+
202
+
203
+ Rhoconnectrb::API::Users.get
204
+
205
+ #### `Get /rc/v1/users/:user_id`
206
+
207
+ Rhoconnectrb::API::Users.get('user_id')
208
+
209
+ #### `Get /rc/v1/users/:user_id/clients`
210
+
211
+
212
+ Rhoconnectrb::API::Users.get_clients(['user_id','client_id'])
213
+
214
+ #### `DELETE /rc/v1/users/:user_id/clients/:client_id`
215
+
216
+
217
+ Rhoconnectrb::API::Users.delete_clients(['user_id','client_id'])
218
+
219
+ #### `GET /rc/v1/users/:user_id/sources/:source_id/docnames`
220
+
221
+
222
+ Rhoconnectrb::API::Users.get_sources_docnames(['user_id','source_id'])
223
+
224
+ #### `POST /rc/v1/users/ping`
225
+
226
+
227
+ data = {
228
+ :api_token => token,
229
+ :user_id => [array_of_users],
230
+ :sources => source_name,
231
+ :message => 'hello world',
232
+ :vibrate => 2000,
233
+ :sound => 'hello.mp3'
234
+ }
235
+ Rhoconnectrb::API::Users.post_ping(data)
236
+
237
+ #### `GET /rc/v1/users/:user_id/sources/:source_id/docs/:doc`
238
+
239
+
240
+ Rhoconnectrb::API::Users.get_sources_docs(['user_id','source_id','docname'])
241
+
242
+ #### `POST /rc/v1/users/:user_id/sources/:source_id/docs/:doc`
243
+
244
+
245
+ data = {:data=>data,:append=>false}
246
+ Rhoconnectrb::API::Users.post_sources_docs(['user_id','source_id','docname'],data)
247
+
248
+ ### Read State Resource
249
+
250
+ #### `POST /rc/v1/read_state/users/:user_id/sources/:source_id`
251
+
252
+
253
+ data = {:refresh_time => 100}
254
+ Rhconnectrb::API::ReadState.post_users_sources(['user_id','source_id'])
255
+
256
+ ### Source Resource
257
+
258
+ #### `GET /rc/v1/sources/type/:partition_type`
259
+
260
+
261
+ Rhoconnectrb::API::Sources.get_type('parition_type')
262
+
263
+ #### `GET /rc/v1/sources/:source_id`
264
+
265
+
266
+ Rhoconnectrb::API::Sources.get('source_id')
267
+
268
+ #### `PUT /rc/v1/sources/:source_id`
269
+
270
+
271
+ data = {:user_name=>'username',:data=>{:poll_interval=>25}}
272
+ Rhoconnectrb::API::Sources.put('source_id',data)
273
+
274
+ ### Client Resource
275
+
276
+ #### `GET /rc/v1/clients/:client_id`
277
+
278
+
279
+ Rhoconnectrb::API::Clients.get('client_id')
280
+
281
+ #### `GET /rc/v1/clients/:client_id/sources/:source_id/docnames`
282
+
283
+
284
+ Rhoconnectrb::API::Clients.get_sources_docnames(['client_id','source_id'])
285
+
286
+ #### `POST /rc/v1/clients/:client_id/sources/:source_id/docnames`
287
+
288
+
289
+ data = {:data=>data,:append=>false}
290
+ Rhoconnectrb::API::Clients.post_sources_docnames(['client_id','source_id'],data)
291
+
292
+ ### Resource Resource
293
+
294
+ The Resource class is used for API calls to user defined dynamic or source adapters. The resource name is passed in as a parameter.
295
+
296
+ #### `POST /app/v1/:source_name/push_objects`
297
+
298
+
299
+ data = {:user_id=>'user_id',:objects=>data}
300
+ Rhoconnectrb::API::Resource.post_push_objects('source_name',data)
301
+
302
+ #### `POST /app/v1/:source_name/push_deletes`
303
+
304
+
305
+ data = {:user_id => 'user_id',:objects=>'object_ids'}
306
+ Rhoconnectrb::API::Resource.post_push_deletes('source_name',data)
307
+
308
+ #### `POST /app/v1/:source_name/fast_insert`
309
+
310
+
311
+ data = {:user_id=>'user_id',:objects=>data}
312
+ Rhoconnectrb::API::Resource.post_fast_insert('source_name',data)
313
+
314
+ #### `POST /app/v1/:source_name/fast_update`
315
+
316
+
317
+ data = {:user_id=>'user_id',:objects=>data}
318
+ Rhoconnectrb::API::Resource.post_fast_update('source_name',data)
319
+
320
+ #### `POST /app/v1/:source_name/fast_delete`
321
+
322
+
323
+ data = {:user_id=>'user_id',:objects=>data}
324
+ Rhoconnectrb::API::Resource.post_fast_delete('source_name',data)
325
+
121
326
 
122
327
  ## Meta
123
328
  Created and maintained by Lucas Campbell-Rossen, Vladimir Tarasov and Lars Burgess.
data/Rakefile CHANGED
@@ -11,11 +11,4 @@ RSpec::Core::RakeTask.new(:spec) do |t|
11
11
  t.pattern = 'spec/**/*_spec.rb'
12
12
  end
13
13
 
14
- desc "Run all specs with rcov"
15
- RSpec::Core::RakeTask.new(:rcov) do |t|
16
- t.rcov = true
17
- t.rcov_opts = ['--exclude', 'spec/*,gems/*']
18
- t.rspec_opts = ["-b", "-c", "-fd"]
19
- end
20
-
21
14
  task :default => :spec
data/config/routes.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  Rails.application.routes.draw do
2
- match '/rhoconnect/authenticate' => Rhoconnect::Authenticate
3
- match '/rhoconnect/query' => Rhoconnect::Query
4
- match '/rhoconnect/create' => Rhoconnect::Create
5
- match '/rhoconnect/update' => Rhoconnect::Update
6
- match '/rhoconnect/delete' => Rhoconnect::Delete
2
+ match '/rhoconnect/authenticate' => Rhoconnectrb::Authenticate
3
+ match '/rhoconnect/query' => Rhoconnectrb::Query
4
+ match '/rhoconnect/create' => Rhoconnectrb::Create
5
+ match '/rhoconnect/update' => Rhoconnectrb::Update
6
+ match '/rhoconnect/delete' => Rhoconnectrb::Delete
7
7
  end
data/lib/rhoconnect-rb.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  require 'json'
2
2
  require 'rest_client'
3
- require 'rhoconnect/version'
4
- require 'rhoconnect/configuration'
5
- require 'rhoconnect/client'
6
- require 'rhoconnect/resource'
7
- require 'rhoconnect/endpoints'
8
- require 'rhoconnect/railtie' if defined?(Rails)
3
+ require 'rhoconnectrb/version'
4
+ require 'rhoconnectrb/configuration'
5
+ require 'rhoconnectrb/client'
6
+ require 'rhoconnectrb/resource'
7
+ require 'rhoconnectrb/endpoints'
8
+ require 'rhoconnectrb/railtie' if defined?(Rails)
9
+ Dir["/rhoconnectrb/api/*.rb"].each {|file| require file }
@@ -0,0 +1,50 @@
1
+ require 'rest_client'
2
+ require 'uri'
3
+
4
+ module Rhoconnectrb
5
+ module API
6
+
7
+ class Base
8
+ def self.post(url,data)
9
+ resp = resource[url].post data.to_json
10
+ resp.body
11
+ end
12
+
13
+ def self.get(url,params=nil)
14
+ if params
15
+ params = {:params=>params}
16
+ resp = resource[url].get(params)
17
+ else
18
+ resp = resource[url].get self.content
19
+ end
20
+ resp.body
21
+ end
22
+
23
+ def self.put(url,data)
24
+ resp = resource[url].put data.to_json
25
+ resp.body
26
+ end
27
+
28
+ def self.delete(url,nothing=nil)
29
+ resp = resource[url].delete
30
+ resp.body
31
+ end
32
+
33
+ def self.token
34
+ url = Rhoconnectrb.configuration.uri || ENV['RHOCONNECT_URL']
35
+ uri = URI.parse(url)
36
+ Rhoconnectrb.configuration.token || uri.user
37
+ end
38
+
39
+ def self.content
40
+ {'X-RhoConnect-API-TOKEN'=> self.token, :content_type => :json, :accept => :json}
41
+ end
42
+
43
+ def self.resource
44
+ uri = Rhoconnectrb.configuration.uri || ENV['RHOCONNECT_URL']
45
+ RestClient::Resource.new(uri + "/rc/v1",:headers=>self.content)
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,43 @@
1
+ module Rhoconnectrb
2
+ module API
3
+ class Clients
4
+ def self.klass
5
+ self.to_s.underscore.split('/')[2]
6
+ end
7
+
8
+ def self.method_missing method_name, *args
9
+ action = method_name.to_s.split("_")
10
+ #handle CRUD operations
11
+ if action.size == 1
12
+ if action[0] =~ /put|delete/
13
+ Base.send(action[0],"/#{klass}/#{args[0]}",args[1])
14
+ else
15
+ url = args.size > 0 ? "/#{klass}/#{args[0]}" : "/#{klass}"
16
+ resp = Base.send(action[0],url,args[1])
17
+ end
18
+ end
19
+
20
+ if action.size > 1
21
+ verb = action.delete_at(0)
22
+ #if posting without parameters just post with data else contruct url
23
+ if verb == 'post' and !args[1]
24
+ Base.send(verb,"/#{klass}/#{action[0]}",args[0])
25
+ else
26
+ if args[0].class.to_s == 'String'
27
+ url = "/#{klass}/#{args[0]}/#{action[0]}"
28
+ else
29
+ url = klass
30
+ args[0].each_with_index do |value,index|
31
+ url += "/#{value}"
32
+ url += "/#{action[index]}" if action[index]
33
+ end
34
+ end
35
+ resp = Base.send(verb,url,args[1])
36
+ end
37
+ end
38
+ resp
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,30 @@
1
+ #READSTATE is special class that does not have resource id so logic changes to account for nil id inherint to every request
2
+ module Rhoconnectrb
3
+ module API
4
+ class ReadState
5
+
6
+ def self.klass
7
+ self.to_s.underscore.split('/')[2]
8
+ end
9
+
10
+ def self.method_missing method_name, *args
11
+ action = method_name.to_s.split("_")
12
+
13
+ if action.size > 1
14
+ verb = action.delete_at(0)
15
+
16
+ if args[0].class.to_s == 'String'
17
+ url = "/#{klass}/#{action[0]}/#{args[0]}"
18
+ else
19
+ url = klass
20
+ args[0].each_with_index do |value,index|
21
+ url += "/#{action[index]}" if action[index]
22
+ url += "/#{value}"
23
+ end
24
+ end
25
+ Base.send(verb,url,args[1])
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,36 @@
1
+ module Rhoconnectrb
2
+ module API
3
+ class Resource
4
+
5
+ def self.method_missing method_name, *args
6
+ action = method_name.to_s.split("_")
7
+ method = "#{action[1]}_#{action[2]}"
8
+ url = "/#{args[0]}/#{method}"
9
+ self.send(action[0],url,args[1])
10
+ end
11
+
12
+ private
13
+
14
+ def self.post(url,data)
15
+ resp = resource[url].post data.to_json, self.content
16
+ resp.body
17
+ end
18
+
19
+ def self.token
20
+ url = Rhoconnectrb.configuration.uri || ENV['RHOCONNECT_URL']
21
+ uri = URI.parse(url)
22
+ Rhoconnectrb.configuration.token || uri.user
23
+ end
24
+
25
+ def self.content
26
+ {'X-RhoConnect-API-TOKEN'=> self.token, :content_type => :json, :accept => :json}
27
+ end
28
+
29
+ def self.resource
30
+ uri = Rhoconnectrb.configuration.uri || ENV['RHOCONNECT_URL']
31
+ RestClient::Resource.new(uri + "/app/v1")
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,47 @@
1
+ module Rhoconnectrb
2
+ module API
3
+ class Sources
4
+
5
+ def self.klass
6
+ self.to_s.underscore.split('/')[2]
7
+ end
8
+
9
+ def self.method_missing method_name, *args
10
+ action = method_name.to_s.split("_")
11
+ #handle CRUD operations
12
+ if action.size == 1
13
+ if action[0] =~ /put|delete/
14
+ resp = Base.send(action[0],"/#{klass}/#{args[0]}",args[1])
15
+ else
16
+ url = args.size > 0 ? "/#{klass}/#{args[0]}" : klass
17
+ resp = Base.send(action[0],url,args[1])
18
+ end
19
+ end
20
+
21
+ if action.size > 1
22
+ verb = action.delete_at(0)
23
+ #if posting without parameters just post with data else contruct url
24
+ if verb == 'post' and !args[1]
25
+ resp = Base.send(verb,"/#{klass}/#{action[0]}",args[0])
26
+ elsif action[0] =~ /type/
27
+ #special case currently for this one call, refactor after rhoconnect is refactored. check for array or string passed
28
+ partition_type = args[0].is_a?(Array) ? args[0].first.to_sym : args[0].to_sym
29
+ resp = Base.send(verb,"/#{klass}/#{action[0]}/#{partition_type}")
30
+ else
31
+ if args[0].class.to_s == 'String'
32
+ url = "/#{klass}/#{args[0]}/#{action[0]}"
33
+ else
34
+ url = klass
35
+ args[0].each_with_index do |value,index|
36
+ url += "/#{value}"
37
+ url += "/#{action[index]}" if action[index]
38
+ end
39
+ end
40
+ resp = Base.send(verb,url,args[1])
41
+ end
42
+ end
43
+ resp
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,37 @@
1
+ module Rhoconnectrb
2
+ module API
3
+ class Store
4
+
5
+ def self.klass
6
+ self.to_s.underscore.split('/')[2]
7
+ end
8
+
9
+ def self.method_missing method_name, *args
10
+ action = method_name.to_s.split("_")
11
+ if action.size == 1
12
+ resp = Base.send(action[0],"/#{klass}/#{args[0]}",args[1])
13
+ else
14
+
15
+ verb = action.delete_at(0)
16
+ #if posting without parameters just post with data else contruct url
17
+ if verb == 'post' and !args[1]
18
+ resp = Base.send(verb,"/#{klass}/#{action[0]}",args[0])
19
+ else
20
+ if args[0].class.to_s == 'String'
21
+ url = "/#{klass}/#{args[0]}/#{action[0]}"
22
+ else
23
+ url = klass
24
+ args[0].each_with_index do |value,index|
25
+ url += "/#{value}"
26
+ url += "/#{action[index]}" if action[index]
27
+ end
28
+ end
29
+ resp = Base.send(verb,url,args[1])
30
+ end
31
+ end
32
+ resp
33
+ end
34
+
35
+ end
36
+ end
37
+ end