rhoconnect-rb 0.1.0 → 0.2.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/README.md +9 -9
- data/config/routes.rb +5 -5
- data/lib/{rhosync → rhoconnect}/client.rb +14 -9
- data/lib/rhoconnect/configuration.rb +49 -0
- data/lib/{rhosync → rhoconnect}/endpoints.rb +19 -19
- data/lib/{rhosync → rhoconnect}/resource.rb +29 -29
- data/lib/rhoconnect/version.rb +3 -0
- data/lib/rhoconnect-rb.rb +5 -5
- data/rhoconnect-rb.gemspec +4 -4
- data/spec/client_spec.rb +25 -24
- data/spec/endpoints_spec.rb +32 -32
- data/spec/resource_spec.rb +29 -29
- data/spec/spec_helper.rb +4 -4
- metadata +11 -11
- data/lib/rhosync/configuration.rb +0 -38
- data/lib/rhosync/version.rb +0 -3
data/README.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
rhoconnect-rb
|
|
2
2
|
===
|
|
3
3
|
|
|
4
|
-
A ruby client library for the [
|
|
4
|
+
A ruby client library for the [Rhoconnect](http://rhomobile.com/products/rhosync) App Integration Server.
|
|
5
5
|
|
|
6
|
-
Using rhoconnect-rb, your application's model data will transparently synchronize with a mobile application built using the [Rhodes framework](http://rhomobile.com/products/rhodes), or any of the available [
|
|
6
|
+
Using rhoconnect-rb, your application's model data will transparently synchronize with a mobile application built using the [Rhodes framework](http://rhomobile.com/products/rhodes), or any of the available [Rhoconnect clients](http://rhomobile.com/products/rhosync/). This client includes built-in support for [ActiveRecord](http://ar.rubyonrails.org/) and [DataMapper](http://datamapper.org/) models.
|
|
7
7
|
|
|
8
8
|
## Getting started
|
|
9
9
|
|
|
@@ -11,23 +11,23 @@ Load the `rhoconnect-rb` library:
|
|
|
11
11
|
|
|
12
12
|
require 'rhoconnect-rb'
|
|
13
13
|
|
|
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
|
|
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
|
## Usage
|
|
17
|
-
Now include
|
|
17
|
+
Now include Rhoconnect::Resource in a model that you want to synchronize with your mobile application:
|
|
18
18
|
|
|
19
19
|
class Product < ActiveRecord::Base
|
|
20
|
-
include
|
|
20
|
+
include Rhoconnect::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
|
|
27
|
+
include Rhoconnect::Resource
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
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
|
|
30
|
+
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 application. It is typically an attribute on the model or related model. `rhoconnect-rb` supports two types of partitions:
|
|
31
31
|
|
|
32
32
|
* :app - No unique key will be used, a shared dataset is used for all users.
|
|
33
33
|
* lambda { some lambda } - Execute a lambda which returns the unique key string.
|
|
@@ -35,14 +35,14 @@ Next, your models will need to declare a partition key for `rhoconnect-rb`. Thi
|
|
|
35
35
|
For example, the `Product` model above might have a `belongs_to :user` relationship. The partition identifying the username would be declared as:
|
|
36
36
|
|
|
37
37
|
class Product < ActiveRecord::Base
|
|
38
|
-
include
|
|
38
|
+
include Rhoconnect::Resource
|
|
39
39
|
|
|
40
40
|
belongs_to :user
|
|
41
41
|
|
|
42
42
|
partition lambda { self.user.username }
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
-
For more information about
|
|
45
|
+
For more information about Rhoconnect partitions, please refer to the [Rhoconnect docs](http://docs.rhomobile.com/rhosync/source-adapters#data-partitioning).
|
|
46
46
|
|
|
47
47
|
## Meta
|
|
48
48
|
Created and maintained by Vladimir Tarasov and Lars Burgess.
|
data/config/routes.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Rails.application.routes.draw do
|
|
2
|
-
match '/
|
|
3
|
-
match '/
|
|
4
|
-
match '/
|
|
5
|
-
match '/
|
|
6
|
-
match '/
|
|
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
|
|
7
7
|
end
|
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
require 'uri'
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module Rhoconnect
|
|
4
4
|
class Client
|
|
5
5
|
attr_accessor :uri, :token
|
|
6
|
+
|
|
7
|
+
def self.set_app_endpoint(url)
|
|
8
|
+
RestClient::Request.execute(:method => :post, :url => url, :timeout => 2000)
|
|
9
|
+
end
|
|
6
10
|
|
|
7
11
|
# allow configuration, uri or environment variable initialization
|
|
8
12
|
def initialize(params = {})
|
|
9
|
-
uri = params[:uri] ||
|
|
10
|
-
raise ArgumentError.new("Please provide a :uri or set
|
|
11
|
-
uri = URI.parse(uri)
|
|
13
|
+
uri = params[:uri] || Rhoconnect.configuration.uri || ENV['RHOCONNECT_URL']
|
|
14
|
+
raise ArgumentError.new("Please provide a :uri or set RHOCONNECT_URL") unless uri
|
|
15
|
+
@uri = URI.parse(uri)
|
|
16
|
+
|
|
17
|
+
@token = params[:token] || Rhoconnect.configuration.token || @uri.user
|
|
18
|
+
@uri.user = nil; @uri = @uri.to_s
|
|
12
19
|
|
|
13
|
-
@token = params[:token] || Rhosync.configuration.token || uri.user
|
|
14
|
-
uri.user = nil; @uri = uri.to_s
|
|
15
20
|
raise ArgumentError.new("Please provide a :token or set it in uri") unless @token
|
|
16
21
|
|
|
17
|
-
RestClient.proxy = ENV['HTTP_PROXY'] || ENV['http_proxy']
|
|
22
|
+
RestClient.proxy = ENV['HTTP_PROXY'] || ENV['http_proxy'] || Rhoconnect.configuration.http_proxy
|
|
18
23
|
end
|
|
19
24
|
|
|
20
25
|
def create(source_name, partition, obj = {})
|
|
@@ -52,7 +57,7 @@ module Rhosync
|
|
|
52
57
|
def send_objects(action, source_name, partition, obj = {}) # :nodoc:
|
|
53
58
|
validate_args(source_name, partition, obj)
|
|
54
59
|
|
|
55
|
-
process(:post, "/api/#{action}",
|
|
60
|
+
process(:post, "/api/source/#{action}",
|
|
56
61
|
{
|
|
57
62
|
:source_id => source_name,
|
|
58
63
|
:user_id => partition,
|
|
@@ -78,7 +83,7 @@ module Rhosync
|
|
|
78
83
|
|
|
79
84
|
def api_headers # :nodoc:
|
|
80
85
|
{
|
|
81
|
-
'User-Agent' =>
|
|
86
|
+
'User-Agent' => Rhoconnect::VERSION,
|
|
82
87
|
'X-Ruby-Version' => RUBY_VERSION,
|
|
83
88
|
'X-Ruby-Platform' => RUBY_PLATFORM
|
|
84
89
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Rhoconnect
|
|
2
|
+
class Configuration
|
|
3
|
+
attr_accessor :uri, :token, :authenticate, :sync_time_as_int, :app_endpoint, :http_proxy
|
|
4
|
+
|
|
5
|
+
def initialize
|
|
6
|
+
@sync_time_as_int = true
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class << self
|
|
12
|
+
attr_accessor :configuration
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Configure Rhoconnect in an initializer:
|
|
16
|
+
# like config/initializers/rhoconnect.rb
|
|
17
|
+
#
|
|
18
|
+
# Setup the Rhoconnect uri and api token.
|
|
19
|
+
# Use rhoconnect:get_token to get the token value.
|
|
20
|
+
#
|
|
21
|
+
# config.uri = "http://myrhoconnect.com"
|
|
22
|
+
# config.token = "secrettoken"
|
|
23
|
+
# config.authenticate = lambda { |credentials|
|
|
24
|
+
# User.authenticate(credentials)
|
|
25
|
+
# }
|
|
26
|
+
#
|
|
27
|
+
# @example
|
|
28
|
+
# Rhoconnect.configure do |config|
|
|
29
|
+
# config.uri = "http://myrhoconnect.com"
|
|
30
|
+
# config.token = "secrettoken"
|
|
31
|
+
# end
|
|
32
|
+
def self.configure
|
|
33
|
+
self.configuration = Configuration.new
|
|
34
|
+
yield(configuration)
|
|
35
|
+
# make a call to rhoconnect instance to set app url
|
|
36
|
+
endpoint_url = self.configuration.app_endpoint || ENV['APP_ENDPOINT']
|
|
37
|
+
uri = self.configuration.uri || ENV['URI']
|
|
38
|
+
if uri
|
|
39
|
+
uri = URI.parse(uri)
|
|
40
|
+
token = uri.user
|
|
41
|
+
uri.user = nil
|
|
42
|
+
uri = uri.to_s
|
|
43
|
+
end
|
|
44
|
+
token ||= ENV['token'] || self.configuration.token
|
|
45
|
+
Rhoconnect::Client.set_app_endpoint(uri + "/api/source/save_adapter?attributes[adapter_url]=#{endpoint_url}&api_token=#{token}") if endpoint_url && uri && token
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
Rhoconnect.configure { }
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
require 'json'
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module Rhoconnect
|
|
4
4
|
class EndpointHelpers
|
|
5
5
|
def self.authenticate(content_type, body)
|
|
6
6
|
code, params = 200, parse_params(content_type, body)
|
|
7
|
-
if
|
|
8
|
-
code = 401 unless
|
|
7
|
+
if Rhoconnect.configuration.authenticate
|
|
8
|
+
code = 401 unless Rhoconnect.configuration.authenticate.call(params)
|
|
9
9
|
end
|
|
10
10
|
[code, {'Content-Type' => 'text/plain'}, [""]]
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def self.query(content_type, body)
|
|
14
14
|
params = parse_params(content_type, body)
|
|
15
|
-
action, c_type, result, records = :
|
|
16
|
-
# Call resource
|
|
17
|
-
code, error =
|
|
15
|
+
action, c_type, result, records = :rhoconnect_query, 'application/json', {}, []
|
|
16
|
+
# Call resource rhoconnect_query class method
|
|
17
|
+
code, error = get_rhoconnect_resource(params['resource'], action) do |klass|
|
|
18
18
|
records = klass.send(action, params['partition'])
|
|
19
19
|
end
|
|
20
20
|
if code == 200
|
|
@@ -35,8 +35,8 @@ module Rhosync
|
|
|
35
35
|
def self.on_cud(action, content_type, body)
|
|
36
36
|
params = parse_params(content_type, body)
|
|
37
37
|
object_id = ""
|
|
38
|
-
code, error =
|
|
39
|
-
object_id = klass.send("
|
|
38
|
+
code, error = get_rhoconnect_resource(params['resource'], action) do |klass|
|
|
39
|
+
object_id = klass.send("rhoconnect_receive_#{action}".to_sym,
|
|
40
40
|
params['partition'], params['attributes'])
|
|
41
41
|
object_id = object_id.to_s if object_id
|
|
42
42
|
end
|
|
@@ -57,7 +57,7 @@ module Rhosync
|
|
|
57
57
|
|
|
58
58
|
private
|
|
59
59
|
|
|
60
|
-
def self.
|
|
60
|
+
def self.get_rhoconnect_resource(resource_name, action)
|
|
61
61
|
code, error = 200, nil
|
|
62
62
|
begin
|
|
63
63
|
klass = Kernel.const_get(resource_name)
|
|
@@ -66,7 +66,7 @@ module Rhosync
|
|
|
66
66
|
error = "error on method `#{action}` for #{resource_name}: #{ne.message}"
|
|
67
67
|
code = 404
|
|
68
68
|
rescue NameError
|
|
69
|
-
error = "Missing
|
|
69
|
+
error = "Missing Rhoconnect::Resource #{resource_name}"
|
|
70
70
|
code = 404
|
|
71
71
|
# TODO: catch HaltException and Exception here, built-in source adapter will handle them
|
|
72
72
|
rescue Exception => e
|
|
@@ -92,11 +92,11 @@ if defined? Rails
|
|
|
92
92
|
class Engine < Rails::Engine; end
|
|
93
93
|
#end
|
|
94
94
|
|
|
95
|
-
module
|
|
95
|
+
module Rhoconnect
|
|
96
96
|
class BaseEndpoint
|
|
97
97
|
def self.call(env)
|
|
98
98
|
req = Rack::Request.new(env)
|
|
99
|
-
|
|
99
|
+
Rhoconnect::EndpointHelpers.send(self.to_s.downcase.split("::")[1].to_sym, req.content_type, req.body.read)
|
|
100
100
|
end
|
|
101
101
|
end
|
|
102
102
|
|
|
@@ -135,33 +135,33 @@ if defined? Sinatra
|
|
|
135
135
|
# require 'rhoconnect-rb'
|
|
136
136
|
#
|
|
137
137
|
# class Myapp < Sinatra::Base
|
|
138
|
-
# register Sinatra::
|
|
138
|
+
# register Sinatra::RhoconnectEndpoints
|
|
139
139
|
# get '/' do
|
|
140
140
|
# 'hello world'
|
|
141
141
|
# end
|
|
142
142
|
# end
|
|
143
143
|
module Sinatra
|
|
144
|
-
module
|
|
144
|
+
module RhoconnectHelpers
|
|
145
145
|
def call_helper(method,*args)
|
|
146
|
-
code, c_type, body =
|
|
146
|
+
code, c_type, body = Rhoconnect::EndpointHelpers.send(method,*args)
|
|
147
147
|
content_type c_type['Content-Type']
|
|
148
148
|
status code
|
|
149
149
|
body[0]
|
|
150
150
|
end
|
|
151
151
|
end
|
|
152
152
|
|
|
153
|
-
module
|
|
153
|
+
module RhoconnectEndpoints
|
|
154
154
|
def self.registered(app)
|
|
155
155
|
# install our endpoint helpers
|
|
156
|
-
app.send(:include,
|
|
156
|
+
app.send(:include, RhoconnectHelpers)
|
|
157
157
|
|
|
158
158
|
[:authenticate,:query,:create,:update,:delete].each do |endpoint|
|
|
159
|
-
app.post "/
|
|
159
|
+
app.post "/rhoconnect/#{endpoint}" do
|
|
160
160
|
call_helper(endpoint, request.env['CONTENT_TYPE'], request.body.read)
|
|
161
161
|
end
|
|
162
162
|
end
|
|
163
163
|
end
|
|
164
164
|
end
|
|
165
|
-
register
|
|
165
|
+
register RhoconnectEndpoints
|
|
166
166
|
end
|
|
167
167
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module
|
|
1
|
+
module Rhoconnect
|
|
2
2
|
module Resource
|
|
3
3
|
|
|
4
4
|
def self.included(model)
|
|
@@ -19,77 +19,77 @@ module Rhosync
|
|
|
19
19
|
@partition.is_a?(Proc) ? @partition.call : @partition
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
def
|
|
22
|
+
def rhoconnect_receive_create(partition, attributes)
|
|
23
23
|
instance = self.send(:new)
|
|
24
|
-
instance.send(:
|
|
25
|
-
instance.
|
|
24
|
+
instance.send(:rhoconnect_apply_attributes, partition, attributes)
|
|
25
|
+
instance.skip_rhoconnect_callbacks = true
|
|
26
26
|
instance.save
|
|
27
27
|
instance.id #=> return object id
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
def
|
|
30
|
+
def rhoconnect_receive_update(partition, attributes)
|
|
31
31
|
object_id = attributes.delete('id')
|
|
32
32
|
instance = self.send(is_datamapper? ? :get : :find, object_id)
|
|
33
|
-
instance.send(:
|
|
34
|
-
instance.
|
|
33
|
+
instance.send(:rhoconnect_apply_attributes, partition, attributes)
|
|
34
|
+
instance.skip_rhoconnect_callbacks = true
|
|
35
35
|
instance.save
|
|
36
36
|
object_id
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
-
def
|
|
39
|
+
def rhoconnect_receive_delete(partition, attributes)
|
|
40
40
|
object_id = attributes['id']
|
|
41
41
|
instance = self.send(is_datamapper? ? :get : :find, object_id)
|
|
42
|
-
instance.
|
|
42
|
+
instance.skip_rhoconnect_callbacks = true
|
|
43
43
|
instance.destroy
|
|
44
44
|
object_id
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
module InstanceMethods
|
|
49
|
-
attr_accessor :
|
|
49
|
+
attr_accessor :skip_rhoconnect_callbacks
|
|
50
50
|
|
|
51
|
-
def
|
|
51
|
+
def rhoconnect_create
|
|
52
52
|
call_client_method(:create)
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
-
def
|
|
55
|
+
def rhoconnect_destroy
|
|
56
56
|
call_client_method(:destroy)
|
|
57
57
|
end
|
|
58
58
|
|
|
59
|
-
def
|
|
59
|
+
def rhoconnect_update
|
|
60
60
|
call_client_method(:update)
|
|
61
61
|
end
|
|
62
62
|
|
|
63
|
-
def
|
|
63
|
+
def rhoconnect_query(partition)
|
|
64
64
|
#return all objects for this partition
|
|
65
65
|
end
|
|
66
66
|
|
|
67
67
|
# By default we ignore partition
|
|
68
68
|
# TODO: Document - this is user-facing function
|
|
69
|
-
def
|
|
69
|
+
def rhoconnect_apply_attributes(partition, attributes)
|
|
70
70
|
self.attributes = attributes
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
-
# Return
|
|
73
|
+
# Return Rhoconnect-friendly attributes list
|
|
74
74
|
def normalized_attributes
|
|
75
75
|
attribs = self.attributes.dup
|
|
76
76
|
attribs.each do |key,value|
|
|
77
77
|
attribs[key] = Time.parse(value.to_s).to_i.to_s if value.is_a?(Time) or value.is_a?(DateTime)
|
|
78
|
-
end if
|
|
78
|
+
end if Rhoconnect.configuration.sync_time_as_int
|
|
79
79
|
attribs
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
private
|
|
83
83
|
|
|
84
84
|
def call_client_method(action)
|
|
85
|
-
unless self.
|
|
85
|
+
unless self.skip_rhoconnect_callbacks
|
|
86
86
|
attribs = self.normalized_attributes
|
|
87
87
|
begin
|
|
88
|
-
|
|
88
|
+
Rhoconnect::Client.new.send(action, self.class.to_s, self.class.get_partition, attribs)
|
|
89
89
|
rescue RestClient::Exception => re
|
|
90
|
-
warn "#{self.class.to_s}:
|
|
90
|
+
warn "#{self.class.to_s}: rhoconnect_#{action} returned error: #{re.message} - #{re.http_body}"
|
|
91
91
|
rescue Exception => e
|
|
92
|
-
warn "#{self.class.to_s}:
|
|
92
|
+
warn "#{self.class.to_s}: rhoconnect_#{action} returned unexpected error: #{e.message}"
|
|
93
93
|
end
|
|
94
94
|
end
|
|
95
95
|
end
|
|
@@ -111,17 +111,17 @@ module Rhosync
|
|
|
111
111
|
if is_datamapper?
|
|
112
112
|
# test for dm-serializer
|
|
113
113
|
if not is_defined?(DataMapper::Serialize)
|
|
114
|
-
raise "
|
|
114
|
+
raise "Rhoconnect::Resource requires dm-serializer to work with DataMapper. Install with `gem install dm-serializer` and add to your application."
|
|
115
115
|
end
|
|
116
|
-
after :create, :
|
|
117
|
-
after :destroy, :
|
|
118
|
-
after :update, :
|
|
116
|
+
after :create, :rhoconnect_create
|
|
117
|
+
after :destroy, :rhoconnect_destroy
|
|
118
|
+
after :update, :rhoconnect_update
|
|
119
119
|
elsif is_activerecord?
|
|
120
|
-
after_create :
|
|
121
|
-
after_destroy :
|
|
122
|
-
after_update :
|
|
120
|
+
after_create :rhoconnect_create
|
|
121
|
+
after_destroy :rhoconnect_destroy
|
|
122
|
+
after_update :rhoconnect_update
|
|
123
123
|
else
|
|
124
|
-
raise "
|
|
124
|
+
raise "Rhoconnect::Resource only supports ActiveRecord or DataMapper at this time."
|
|
125
125
|
end
|
|
126
126
|
end
|
|
127
127
|
|
data/lib/rhoconnect-rb.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'json'
|
|
2
2
|
require 'rest_client'
|
|
3
|
-
require '
|
|
4
|
-
require '
|
|
5
|
-
require '
|
|
6
|
-
require '
|
|
7
|
-
require '
|
|
3
|
+
require 'rhoconnect/version'
|
|
4
|
+
require 'rhoconnect/configuration'
|
|
5
|
+
require 'rhoconnect/client'
|
|
6
|
+
require 'rhoconnect/resource'
|
|
7
|
+
require 'rhoconnect/endpoints'
|
data/rhoconnect-rb.gemspec
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
2
|
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
-
require '
|
|
3
|
+
require 'rhoconnect/version'
|
|
4
4
|
|
|
5
5
|
Gem::Specification.new do |s|
|
|
6
6
|
s.name = "rhoconnect-rb"
|
|
7
|
-
s.version =
|
|
7
|
+
s.version = Rhoconnect::VERSION
|
|
8
8
|
s.platform = Gem::Platform::RUBY
|
|
9
9
|
s.authors = ["Rhomobile"]
|
|
10
10
|
s.date = Time.now.strftime('%Y-%m-%d')
|
|
11
11
|
s.email = ["support@rhomobile.com"]
|
|
12
12
|
s.homepage = %q{http://rhomobile.com}
|
|
13
|
-
s.summary = %q{
|
|
14
|
-
s.description = %q{
|
|
13
|
+
s.summary = %q{Rhoconnect rails plugin}
|
|
14
|
+
s.description = %q{Rhoconnect rails plugin}
|
|
15
15
|
|
|
16
16
|
s.rubyforge_project = nil
|
|
17
17
|
s.add_dependency('rest-client', '~>1.6.1')
|
data/spec/client_spec.rb
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'spec_helper')
|
|
2
2
|
|
|
3
|
-
describe
|
|
3
|
+
describe Rhoconnect::Client do
|
|
4
4
|
|
|
5
5
|
context "on initialize" do
|
|
6
|
-
it "should initialize with
|
|
7
|
-
ENV['
|
|
8
|
-
c =
|
|
6
|
+
it "should initialize with Rhoconnect_URL environment var" do
|
|
7
|
+
ENV['RHOCONNECT_URL'] = "http://token@test.Rhoconnect.com"
|
|
8
|
+
c = Rhoconnect::Client.new
|
|
9
9
|
c.token.should == 'token'
|
|
10
|
-
c.uri.should == 'http://test.
|
|
11
|
-
ENV.delete('
|
|
10
|
+
c.uri.should == 'http://test.Rhoconnect.com'
|
|
11
|
+
ENV.delete('Rhoconnect_URL')
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
it "should initialize with :uri parameter" do
|
|
15
|
-
c =
|
|
15
|
+
c = Rhoconnect::Client.new(:uri => "http://token@test.Rhoconnect.com")
|
|
16
16
|
c.token.should == 'token'
|
|
17
|
-
c.uri.should == 'http://test.
|
|
17
|
+
c.uri.should == 'http://test.Rhoconnect.com'
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
it "should initialize with :token parameter" do
|
|
21
|
-
c =
|
|
21
|
+
c = Rhoconnect::Client.new(:uri => "http://test.Rhoconnect.com", :token => "token")
|
|
22
22
|
c.token.should == 'token'
|
|
23
|
-
c.uri.should == 'http://test.
|
|
23
|
+
c.uri.should == 'http://test.Rhoconnect.com'
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
it "should initialize with configure block" do
|
|
27
|
-
|
|
28
|
-
config.uri = "http://test.
|
|
27
|
+
Rhoconnect.configure do |config|
|
|
28
|
+
config.uri = "http://test.Rhoconnect.com"
|
|
29
29
|
config.token = "token"
|
|
30
30
|
end
|
|
31
31
|
begin
|
|
32
|
-
c =
|
|
32
|
+
c = Rhoconnect::Client.new
|
|
33
33
|
c.token.should == 'token'
|
|
34
|
-
c.uri.should == 'http://test.
|
|
34
|
+
c.uri.should == 'http://test.Rhoconnect.com'
|
|
35
35
|
ensure
|
|
36
|
-
|
|
36
|
+
Rhoconnect.configure do |config|
|
|
37
37
|
config.uri = nil
|
|
38
38
|
config.token = nil
|
|
39
39
|
end
|
|
@@ -41,23 +41,24 @@ describe Rhosync::Client do
|
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
it "should raise ArgumentError if uri is missing" do
|
|
44
|
-
|
|
44
|
+
ENV['RHOCONNECT_URL'] = nil
|
|
45
|
+
lambda { Rhoconnect::Client.new }.should raise_error(ArgumentError, "Please provide a :uri or set RHOCONNECT_URL")
|
|
45
46
|
end
|
|
46
47
|
|
|
47
48
|
it "should raise ArugmentError if token is missing" do
|
|
48
49
|
lambda {
|
|
49
|
-
|
|
50
|
+
Rhoconnect::Client.new(:uri => "http://test.Rhoconnect.com")
|
|
50
51
|
}.should raise_error(ArgumentError, "Please provide a :token or set it in uri")
|
|
51
52
|
end
|
|
52
53
|
end
|
|
53
54
|
|
|
54
55
|
context "on create update destroy" do
|
|
55
56
|
before(:each) do
|
|
56
|
-
@client =
|
|
57
|
+
@client = Rhoconnect::Client.new(:uri => "http://token@test.Rhoconnect.com")
|
|
57
58
|
end
|
|
58
59
|
|
|
59
60
|
it "should create an object" do
|
|
60
|
-
stub_request(:post, "http://test.
|
|
61
|
+
stub_request(:post, "http://test.Rhoconnect.com/api/source/push_objects").with(
|
|
61
62
|
:headers => {"Content-Type" => "application/json"}
|
|
62
63
|
).to_return(:status => 200, :body => "done")
|
|
63
64
|
resp = @client.create("Person", "user1",
|
|
@@ -71,7 +72,7 @@ describe Rhosync::Client do
|
|
|
71
72
|
end
|
|
72
73
|
|
|
73
74
|
it "should update an object" do
|
|
74
|
-
stub_request(:post, "http://test.
|
|
75
|
+
stub_request(:post, "http://test.Rhoconnect.com/api/source/push_objects").with(
|
|
75
76
|
:headers => {"Content-Type" => "application/json"}
|
|
76
77
|
).to_return(:status => 200, :body => "done")
|
|
77
78
|
resp = @client.update("Person", "user1",
|
|
@@ -85,7 +86,7 @@ describe Rhosync::Client do
|
|
|
85
86
|
end
|
|
86
87
|
|
|
87
88
|
it "should destroy an object" do
|
|
88
|
-
stub_request(:post, "http://test.
|
|
89
|
+
stub_request(:post, "http://test.Rhoconnect.com/api/source/push_deletes").with(
|
|
89
90
|
:headers => {"Content-Type" => "application/json"}
|
|
90
91
|
).to_return(:status => 200, :body => "done")
|
|
91
92
|
resp = @client.destroy("Person", "user1",
|
|
@@ -101,11 +102,11 @@ describe Rhosync::Client do
|
|
|
101
102
|
|
|
102
103
|
context "on set callbacks" do
|
|
103
104
|
before(:each) do
|
|
104
|
-
@client =
|
|
105
|
+
@client = Rhoconnect::Client.new(:uri => "http://token@test.Rhoconnect.com")
|
|
105
106
|
end
|
|
106
107
|
|
|
107
108
|
it "should set auth callback" do
|
|
108
|
-
stub_request(:post, "http://test.
|
|
109
|
+
stub_request(:post, "http://test.Rhoconnect.com/api/set_auth_callback").with(
|
|
109
110
|
:headers => {"Content-Type" => "application/json"}
|
|
110
111
|
).to_return(:status => 200, :body => "done")
|
|
111
112
|
resp = @client.set_auth_callback("http://example.com/callback")
|
|
@@ -114,7 +115,7 @@ describe Rhosync::Client do
|
|
|
114
115
|
end
|
|
115
116
|
|
|
116
117
|
it "should set query callback" do
|
|
117
|
-
stub_request(:post, "http://test.
|
|
118
|
+
stub_request(:post, "http://test.Rhoconnect.com/api/set_query_callback").with(
|
|
118
119
|
:headers => {"Content-Type" => "application/json"}
|
|
119
120
|
).to_return(:status => 200, :body => "done")
|
|
120
121
|
resp = @client.set_query_callback("Person", "http://example.com/callback")
|
data/spec/endpoints_spec.rb
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'spec_helper')
|
|
2
2
|
|
|
3
|
-
describe
|
|
3
|
+
describe Rhoconnect::EndpointHelpers do
|
|
4
4
|
|
|
5
5
|
# Auth stub class
|
|
6
6
|
class AuthTest; end
|
|
7
7
|
class BrokenResource < ActiveRecord::Base
|
|
8
|
-
include
|
|
8
|
+
include Rhoconnect::Resource
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
# Query stub class
|
|
12
12
|
class Product < ActiveRecord::Base
|
|
13
|
-
include
|
|
14
|
-
def self.
|
|
13
|
+
include Rhoconnect::Resource
|
|
14
|
+
def self.rhoconnect_query(partition)
|
|
15
15
|
[self.new]
|
|
16
16
|
end
|
|
17
17
|
end
|
|
@@ -20,8 +20,8 @@ describe Rhosync::EndpointHelpers do
|
|
|
20
20
|
AuthTest.stub!(:do_auth).and_return(success)
|
|
21
21
|
AuthTest.should_receive(:do_auth).with(@creds)
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
config.uri = "http://test.
|
|
23
|
+
Rhoconnect.configure do |config|
|
|
24
|
+
config.uri = "http://test.rhoconnect.com"
|
|
25
25
|
config.token = "token"
|
|
26
26
|
config.authenticate = lambda {|credentials|
|
|
27
27
|
AuthTest.do_auth(credentials)
|
|
@@ -46,31 +46,31 @@ describe Rhosync::EndpointHelpers do
|
|
|
46
46
|
|
|
47
47
|
it "should call configured authenticate block" do
|
|
48
48
|
setup_auth_test(true)
|
|
49
|
-
|
|
49
|
+
Rhoconnect::Authenticate.call(@env).should == [
|
|
50
50
|
200, {'Content-Type' => 'text/plain'}, [""]
|
|
51
51
|
]
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
it "should call configured authenticate block with 401" do
|
|
55
55
|
setup_auth_test(false)
|
|
56
|
-
|
|
56
|
+
Rhoconnect::Authenticate.call(@env).should == [
|
|
57
57
|
401, {'Content-Type' => 'text/plain'}, [""]
|
|
58
58
|
]
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
it "should return true if no authenticate block exists" do
|
|
62
|
-
|
|
63
|
-
config.uri = "http://test.
|
|
62
|
+
Rhoconnect.configure do |config|
|
|
63
|
+
config.uri = "http://test.Rhoconnect.com"
|
|
64
64
|
config.token = "token"
|
|
65
65
|
end
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
Rhoconnect.configuration.authenticate.should be_nil
|
|
67
|
+
Rhoconnect::Authenticate.call(@env).should == [
|
|
68
68
|
200, {'Content-Type' => 'text/plain'}, [""]
|
|
69
69
|
]
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
it "should call authenticate block with empty params" do
|
|
73
|
-
|
|
73
|
+
Rhoconnect::EndpointHelpers.authenticate('text/plain', '').should == [
|
|
74
74
|
200, {"Content-Type"=>"text/plain"}, [""]
|
|
75
75
|
]
|
|
76
76
|
end
|
|
@@ -89,34 +89,34 @@ describe Rhosync::EndpointHelpers do
|
|
|
89
89
|
)
|
|
90
90
|
@env.stub!(:body).and_return(@strio)
|
|
91
91
|
Rack::Request.stub!(:new).and_return(@env)
|
|
92
|
-
code, content_type, body =
|
|
92
|
+
code, content_type, body = Rhoconnect::Query.call(@env)
|
|
93
93
|
code.should == 200
|
|
94
94
|
content_type.should == { "Content-Type" => "application/json" }
|
|
95
95
|
JSON.parse(body[0]).should == { '1' => Product.new.normalized_attributes }
|
|
96
96
|
end
|
|
97
97
|
|
|
98
|
-
it "should fail on missing
|
|
98
|
+
it "should fail on missing Rhoconnect::Resource" do
|
|
99
99
|
@strio.stub!(:read).and_return(
|
|
100
100
|
{'partition' => 'testuser', 'resource' => 'Broken'}.to_json
|
|
101
101
|
)
|
|
102
102
|
@env.stub!(:body).and_return(@strio)
|
|
103
103
|
Rack::Request.stub!(:new).and_return(@env)
|
|
104
|
-
code, content_type, body =
|
|
104
|
+
code, content_type, body = Rhoconnect::Query.call(@env)
|
|
105
105
|
code.should == 404
|
|
106
106
|
content_type.should == { "Content-Type" => "text/plain" }
|
|
107
|
-
body[0].should == "Missing
|
|
107
|
+
body[0].should == "Missing Rhoconnect::Resource Broken"
|
|
108
108
|
end
|
|
109
109
|
|
|
110
|
-
it "should fail on undefined
|
|
110
|
+
it "should fail on undefined rhoconnect_query method" do
|
|
111
111
|
@strio.stub!(:read).and_return(
|
|
112
112
|
{'partition' => 'testuser', 'resource' => 'BrokenResource'}.to_json
|
|
113
113
|
)
|
|
114
114
|
@env.stub!(:body).and_return(@strio)
|
|
115
115
|
Rack::Request.stub!(:new).and_return(@env)
|
|
116
|
-
code, content_type, body =
|
|
116
|
+
code, content_type, body = Rhoconnect::Query.call(@env)
|
|
117
117
|
code.should == 404
|
|
118
118
|
content_type.should == { "Content-Type" => "text/plain" }
|
|
119
|
-
body[0].should == "error on method `
|
|
119
|
+
body[0].should == "error on method `rhoconnect_query` for BrokenResource: undefined method `rhoconnect_query' for BrokenResource:Class"
|
|
120
120
|
end
|
|
121
121
|
|
|
122
122
|
it "should fail on unknown exception" do
|
|
@@ -125,8 +125,8 @@ describe Rhosync::EndpointHelpers do
|
|
|
125
125
|
)
|
|
126
126
|
@env.stub!(:body).and_return(@strio)
|
|
127
127
|
Rack::Request.stub!(:new).and_return(@env)
|
|
128
|
-
Product.stub!(:
|
|
129
|
-
code, content_type, body =
|
|
128
|
+
Product.stub!(:rhoconnect_receive_create).and_return { raise "error in create" }
|
|
129
|
+
code, content_type, body = Rhoconnect::Create.call(@env)
|
|
130
130
|
code.should == 500
|
|
131
131
|
content_type.should == { "Content-Type" => "text/plain" }
|
|
132
132
|
body[0].should == "error in create"
|
|
@@ -144,7 +144,7 @@ describe Rhosync::EndpointHelpers do
|
|
|
144
144
|
@strio.stub!(:read).and_return(params.to_json)
|
|
145
145
|
@env.stub!(:body).and_return(@strio)
|
|
146
146
|
Rack::Request.stub!(:new).and_return(@env)
|
|
147
|
-
code, content_type, body =
|
|
147
|
+
code, content_type, body = Rhoconnect::Create.call(@env)
|
|
148
148
|
code.should == 200
|
|
149
149
|
content_type.should == { "Content-Type" => "text/plain" }
|
|
150
150
|
body.should == ['1']
|
|
@@ -163,7 +163,7 @@ describe Rhosync::EndpointHelpers do
|
|
|
163
163
|
@strio.stub!(:read).and_return(params.to_json)
|
|
164
164
|
@env.stub!(:body).and_return(@strio)
|
|
165
165
|
Rack::Request.stub!(:new).and_return(@env)
|
|
166
|
-
code, content_type, body =
|
|
166
|
+
code, content_type, body = Rhoconnect::Update.call(@env)
|
|
167
167
|
code.should == 200
|
|
168
168
|
content_type.should == { "Content-Type" => "text/plain" }
|
|
169
169
|
body.should == ["123"]
|
|
@@ -182,7 +182,7 @@ describe Rhosync::EndpointHelpers do
|
|
|
182
182
|
@strio.stub!(:read).and_return(params.to_json)
|
|
183
183
|
@env.stub!(:body).and_return(@strio)
|
|
184
184
|
Rack::Request.stub!(:new).and_return(@env)
|
|
185
|
-
code, content_type, body =
|
|
185
|
+
code, content_type, body = Rhoconnect::Delete.call(@env)
|
|
186
186
|
code.should == 200
|
|
187
187
|
content_type.should == { "Content-Type" => "text/plain" }
|
|
188
188
|
body.should == ["123"]
|
|
@@ -192,7 +192,7 @@ describe Rhosync::EndpointHelpers do
|
|
|
192
192
|
|
|
193
193
|
context "on Sinatra endpoints" do
|
|
194
194
|
class EndpointTest
|
|
195
|
-
include Sinatra::
|
|
195
|
+
include Sinatra::RhoconnectHelpers
|
|
196
196
|
end
|
|
197
197
|
|
|
198
198
|
it "should register endpoints for authenticate and query" do
|
|
@@ -201,15 +201,15 @@ describe Rhosync::EndpointHelpers do
|
|
|
201
201
|
req = mock("request")
|
|
202
202
|
req.stub!(:body).and_return(strio)
|
|
203
203
|
req.stub!(:env).and_return('CONTENT_TYPE' => 'application/json')
|
|
204
|
-
Sinatra::
|
|
205
|
-
Sinatra::
|
|
206
|
-
|
|
204
|
+
Sinatra::RhoconnectEndpoints.stub!(:request).and_return(req)
|
|
205
|
+
Sinatra::RhoconnectEndpoints.stub!(:params).and_return(@params)
|
|
206
|
+
Rhoconnect::EndpointHelpers.stub!(:query)
|
|
207
207
|
app = mock("app")
|
|
208
208
|
app.stub!(:post).and_yield
|
|
209
209
|
app.should_receive(:post).exactly(5).times
|
|
210
|
-
app.should_receive(:include).with(Sinatra::
|
|
211
|
-
Sinatra::
|
|
212
|
-
Sinatra::
|
|
210
|
+
app.should_receive(:include).with(Sinatra::RhoconnectHelpers)
|
|
211
|
+
Sinatra::RhoconnectEndpoints.should_receive(:call_helper).exactly(5).times
|
|
212
|
+
Sinatra::RhoconnectEndpoints.registered(app)
|
|
213
213
|
end
|
|
214
214
|
|
|
215
215
|
it "should call helper for authenticate" do
|
data/spec/resource_spec.rb
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'spec_helper')
|
|
2
2
|
|
|
3
|
-
describe
|
|
3
|
+
describe Rhoconnect::Resource do
|
|
4
4
|
|
|
5
5
|
context "on set partition" do
|
|
6
6
|
it "should set resource partition to :app" do
|
|
7
7
|
class TestModel1 < ActiveRecord::Base
|
|
8
|
-
include
|
|
8
|
+
include Rhoconnect::Resource
|
|
9
9
|
|
|
10
10
|
partition :app
|
|
11
11
|
end
|
|
@@ -15,7 +15,7 @@ describe Rhosync::Resource do
|
|
|
15
15
|
|
|
16
16
|
it "should set resource partition with lambda" do
|
|
17
17
|
class TestModel2 < ActiveRecord::Base
|
|
18
|
-
include
|
|
18
|
+
include Rhoconnect::Resource
|
|
19
19
|
|
|
20
20
|
partition lambda{ 'helloworld' }
|
|
21
21
|
end
|
|
@@ -27,41 +27,41 @@ describe Rhosync::Resource do
|
|
|
27
27
|
context "on initialize" do
|
|
28
28
|
it "should raise exception if DataMapper or ActiveRecord::Base are missing" do
|
|
29
29
|
lambda { class TestModel3
|
|
30
|
-
include
|
|
30
|
+
include Rhoconnect::Resource
|
|
31
31
|
end
|
|
32
|
-
}.should raise_error("
|
|
32
|
+
}.should raise_error("Rhoconnect::Resource only supports ActiveRecord or DataMapper at this time.")
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
it "should register callbacks for ActiveRecord::Base" do
|
|
36
36
|
class TestModel4 < ActiveRecord::Base
|
|
37
|
-
include
|
|
37
|
+
include Rhoconnect::Resource
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
TestModel4.create_callback.should == :
|
|
41
|
-
TestModel4.destroy_callback.should == :
|
|
42
|
-
TestModel4.update_callback.should == :
|
|
40
|
+
TestModel4.create_callback.should == :rhoconnect_create
|
|
41
|
+
TestModel4.destroy_callback.should == :rhoconnect_destroy
|
|
42
|
+
TestModel4.update_callback.should == :rhoconnect_update
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
it "should register callbacks for DataMapper::Resource" do
|
|
46
46
|
class TestModel5
|
|
47
47
|
include DataMapper::Resource
|
|
48
|
-
include
|
|
48
|
+
include Rhoconnect::Resource
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
-
TestModel5.
|
|
52
|
-
TestModel5.
|
|
53
|
-
TestModel5.
|
|
51
|
+
TestModel5.rhoconnect_callbacks[:create].should == :rhoconnect_create
|
|
52
|
+
TestModel5.rhoconnect_callbacks[:destroy].should == :rhoconnect_destroy
|
|
53
|
+
TestModel5.rhoconnect_callbacks[:update].should == :rhoconnect_update
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
it "should raise exception if dm-serializer is missing" do
|
|
57
57
|
class TestModel6
|
|
58
58
|
include DataMapper::Resource
|
|
59
|
-
include
|
|
59
|
+
include Rhoconnect::Resource
|
|
60
60
|
end
|
|
61
61
|
TestModel6.stub!(:is_defined?).and_return(false)
|
|
62
62
|
lambda {
|
|
63
63
|
TestModel6.install_callbacks
|
|
64
|
-
}.should raise_error("
|
|
64
|
+
}.should raise_error("Rhoconnect::Resource requires dm-serializer to work with DataMapper. Install with `gem install dm-serializer` and add to your application.")
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
|
|
@@ -69,50 +69,50 @@ describe Rhosync::Resource do
|
|
|
69
69
|
|
|
70
70
|
it "should call create update delete hook" do
|
|
71
71
|
class TestModel7 < ActiveRecord::Base
|
|
72
|
-
include
|
|
72
|
+
include Rhoconnect::Resource
|
|
73
73
|
partition :app
|
|
74
74
|
end
|
|
75
|
-
client = mock('
|
|
75
|
+
client = mock('Rhoconnect::Client')
|
|
76
76
|
client.stub!(:send)
|
|
77
|
-
|
|
77
|
+
Rhoconnect::Client.stub!(:new).and_return(client)
|
|
78
78
|
[:create, :update, :destroy].each do |action|
|
|
79
79
|
client.should_receive(:send).with(
|
|
80
80
|
action, "TestModel7", :app, {"name"=>"John", "created_at"=>"1299636666", "updated_at"=>"1299636666", "id"=>1}
|
|
81
81
|
)
|
|
82
|
-
TestModel7.new.send("
|
|
82
|
+
TestModel7.new.send("rhoconnect_#{action}".to_sym)
|
|
83
83
|
end
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
it "should warn on RestClient::Exception" do
|
|
87
87
|
class TestModel8 < ActiveRecord::Base
|
|
88
|
-
include
|
|
88
|
+
include Rhoconnect::Resource
|
|
89
89
|
partition :app
|
|
90
90
|
end
|
|
91
|
-
client = mock('
|
|
91
|
+
client = mock('Rhoconnect::Client')
|
|
92
92
|
exception = RestClient::Exception.new(
|
|
93
93
|
RestClient::Response.create("error connecting to server", nil, nil), 500
|
|
94
94
|
)
|
|
95
95
|
exception.message = "Internal Server Error"
|
|
96
96
|
client.stub!(:send).and_return { raise exception }
|
|
97
|
-
|
|
97
|
+
Rhoconnect::Client.stub!(:new).and_return(client)
|
|
98
98
|
tm = TestModel8.new
|
|
99
99
|
tm.should_receive(:warn).with(
|
|
100
|
-
"TestModel8:
|
|
100
|
+
"TestModel8: rhoconnect_create returned error: Internal Server Error - error connecting to server"
|
|
101
101
|
)
|
|
102
|
-
tm.
|
|
102
|
+
tm.rhoconnect_create
|
|
103
103
|
end
|
|
104
104
|
|
|
105
105
|
it "should warn on Exception" do
|
|
106
106
|
class TestModel8 < ActiveRecord::Base
|
|
107
|
-
include
|
|
107
|
+
include Rhoconnect::Resource
|
|
108
108
|
partition :app
|
|
109
109
|
end
|
|
110
|
-
client = mock('
|
|
110
|
+
client = mock('Rhoconnect::Client')
|
|
111
111
|
client.stub!(:send).and_return { raise Exception.new("error connecting to server") }
|
|
112
|
-
|
|
112
|
+
Rhoconnect::Client.stub!(:new).and_return(client)
|
|
113
113
|
tm = TestModel8.new
|
|
114
|
-
tm.should_receive(:warn).with("TestModel8:
|
|
115
|
-
tm.
|
|
114
|
+
tm.should_receive(:warn).with("TestModel8: rhoconnect_create returned unexpected error: error connecting to server")
|
|
115
|
+
tm.rhoconnect_create
|
|
116
116
|
end
|
|
117
117
|
end
|
|
118
118
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -17,7 +17,7 @@ end
|
|
|
17
17
|
# stubs for sinatra
|
|
18
18
|
module Sinatra
|
|
19
19
|
def self.register(mod); end
|
|
20
|
-
module
|
|
20
|
+
module RhoconnectEndpoints
|
|
21
21
|
def self.content_type(c_type); end
|
|
22
22
|
def self.status(code); end
|
|
23
23
|
end
|
|
@@ -90,11 +90,11 @@ module DataMapper
|
|
|
90
90
|
end
|
|
91
91
|
|
|
92
92
|
module ClassMethods
|
|
93
|
-
attr_accessor :
|
|
93
|
+
attr_accessor :rhoconnect_callbacks
|
|
94
94
|
|
|
95
95
|
def after(action, callback)
|
|
96
|
-
@
|
|
97
|
-
@
|
|
96
|
+
@rhoconnect_callbacks ||= {}
|
|
97
|
+
@rhoconnect_callbacks[action] = callback
|
|
98
98
|
end
|
|
99
99
|
end
|
|
100
100
|
end
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rhoconnect-rb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 23
|
|
5
5
|
prerelease:
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
|
-
-
|
|
8
|
+
- 2
|
|
9
9
|
- 0
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.2.0
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Rhomobile
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date: 2011-06-
|
|
18
|
+
date: 2011-06-27 00:00:00 Z
|
|
19
19
|
dependencies:
|
|
20
20
|
- !ruby/object:Gem::Dependency
|
|
21
21
|
type: :runtime
|
|
@@ -49,7 +49,7 @@ dependencies:
|
|
|
49
49
|
version_requirements: *id002
|
|
50
50
|
name: json
|
|
51
51
|
prerelease: false
|
|
52
|
-
description:
|
|
52
|
+
description: Rhoconnect rails plugin
|
|
53
53
|
email:
|
|
54
54
|
- support@rhomobile.com
|
|
55
55
|
executables: []
|
|
@@ -68,11 +68,11 @@ files:
|
|
|
68
68
|
- config/routes.rb
|
|
69
69
|
- init.rb
|
|
70
70
|
- lib/rhoconnect-rb.rb
|
|
71
|
-
- lib/
|
|
72
|
-
- lib/
|
|
73
|
-
- lib/
|
|
74
|
-
- lib/
|
|
75
|
-
- lib/
|
|
71
|
+
- lib/rhoconnect/client.rb
|
|
72
|
+
- lib/rhoconnect/configuration.rb
|
|
73
|
+
- lib/rhoconnect/endpoints.rb
|
|
74
|
+
- lib/rhoconnect/resource.rb
|
|
75
|
+
- lib/rhoconnect/version.rb
|
|
76
76
|
- rhoconnect-rb.gemspec
|
|
77
77
|
- spec/client_spec.rb
|
|
78
78
|
- spec/endpoints_spec.rb
|
|
@@ -110,7 +110,7 @@ rubyforge_project:
|
|
|
110
110
|
rubygems_version: 1.8.5
|
|
111
111
|
signing_key:
|
|
112
112
|
specification_version: 3
|
|
113
|
-
summary:
|
|
113
|
+
summary: Rhoconnect rails plugin
|
|
114
114
|
test_files:
|
|
115
115
|
- spec/client_spec.rb
|
|
116
116
|
- spec/endpoints_spec.rb
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
module Rhosync
|
|
2
|
-
class Configuration
|
|
3
|
-
attr_accessor :uri, :token, :authenticate, :sync_time_as_int
|
|
4
|
-
|
|
5
|
-
def initialize
|
|
6
|
-
@sync_time_as_int = true
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
class << self
|
|
12
|
-
attr_accessor :configuration
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# Configure RhoSync in an initializer:
|
|
16
|
-
# like config/initializers/rhosync.rb
|
|
17
|
-
#
|
|
18
|
-
# Setup the RhoSync uri and api token.
|
|
19
|
-
# Use rhosync:get_token to get the token value.
|
|
20
|
-
#
|
|
21
|
-
# config.uri = "http://myrhosync.com"
|
|
22
|
-
# config.token = "secrettoken"
|
|
23
|
-
# config.authenticate = lambda { |credentials|
|
|
24
|
-
# User.authenticate(credentials)
|
|
25
|
-
# }
|
|
26
|
-
#
|
|
27
|
-
# @example
|
|
28
|
-
# Rhosync.configure do |config|
|
|
29
|
-
# config.uri = "http://myrhosync.com"
|
|
30
|
-
# config.token = "secrettoken"
|
|
31
|
-
# end
|
|
32
|
-
def self.configure
|
|
33
|
-
self.configuration = Configuration.new
|
|
34
|
-
yield(configuration)
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
Rhosync.configure { }
|
data/lib/rhosync/version.rb
DELETED