rhoconnect-rb 0.2.1 → 0.2.2
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 +59 -6
- data/lib/rhoconnect/client.rb +6 -2
- data/lib/rhoconnect/configuration.rb +5 -2
- data/lib/rhoconnect/version.rb +1 -1
- data/spec/client_spec.rb +16 -16
- data/spec/endpoints_spec.rb +1 -1
- metadata +4 -4
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
rhoconnect-rb
|
2
2
|
===
|
3
3
|
|
4
|
-
A ruby
|
4
|
+
A ruby 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
|
6
|
+
Using rhoconnect-rb, your application's model data will transparently synchronize with a mobile application built on 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
|
|
@@ -26,13 +26,15 @@ Or, if you are using DataMapper:
|
|
26
26
|
include DataMapper::Resource
|
27
27
|
include Rhoconnect::Resource
|
28
28
|
end
|
29
|
+
|
30
|
+
### Partitioning Datasets
|
29
31
|
|
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
|
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:
|
31
33
|
|
32
|
-
* :app - No unique key will be used, a shared dataset is
|
34
|
+
* :app - No unique key will be used, a shared dataset is synchronzied for all users.
|
33
35
|
* lambda { some lambda } - Execute a lambda which returns the unique key string.
|
34
36
|
|
35
|
-
For example, the `Product` model above might have a `belongs_to :user` relationship. The partition identifying
|
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:
|
36
38
|
|
37
39
|
class Product < ActiveRecord::Base
|
38
40
|
include Rhoconnect::Resource
|
@@ -42,9 +44,60 @@ For example, the `Product` model above might have a `belongs_to :user` relations
|
|
42
44
|
partition lambda { self.user.username }
|
43
45
|
end
|
44
46
|
|
47
|
+
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:
|
48
|
+
|
49
|
+
partition lambda { :app }
|
50
|
+
|
45
51
|
For more information about Rhoconnect partitions, please refer to the [Rhoconnect docs](http://docs.rhomobile.com/rhosync/source-adapters#data-partitioning).
|
46
52
|
|
53
|
+
### Querying Datasets
|
54
|
+
|
55
|
+
`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:
|
56
|
+
|
57
|
+
class Product < ActiveRecord::Base
|
58
|
+
include Rhoconnect::Resource
|
59
|
+
|
60
|
+
belongs_to :user
|
61
|
+
|
62
|
+
partition lambda { self.user.username }
|
63
|
+
|
64
|
+
def self.rhoconnect_query(partition)
|
65
|
+
Product.where(:user_id => partition)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
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.
|
70
|
+
|
71
|
+
### Configuration and Authentication
|
72
|
+
|
73
|
+
Configure Rhoconnect in an initializer like `config/initializers/rhoconnect.rb` (for Rails), or directly in your application (i.e. Sinatra):
|
74
|
+
|
75
|
+
# Setup the Rhoconnect uri and api token.
|
76
|
+
# Use rhoconnect:get_token to get the token value.
|
77
|
+
|
78
|
+
config.uri = "http://myrhoconnect.com"
|
79
|
+
config.token = "secrettoken"
|
80
|
+
|
81
|
+
Example:
|
82
|
+
|
83
|
+
Rhoconnect.configure do |config|
|
84
|
+
config.uri = "http://myrhoconnect-server.com"
|
85
|
+
config.token = "secrettoken"
|
86
|
+
end
|
87
|
+
|
88
|
+
Example with authentication:
|
89
|
+
|
90
|
+
Rhoconnect installs a `/rhoconnect/authenticate` route into your application which will receive credentials from the client. Add block which handles the credentials:
|
91
|
+
|
92
|
+
Rhoconnect.configure do |config|
|
93
|
+
config.uri = "http://myrhoconnect-server.com"
|
94
|
+
config.token = "secrettoken"
|
95
|
+
config.authenticate = lambda { |credentials|
|
96
|
+
User.authenticate(credentials[:login], credentials[:password])
|
97
|
+
}
|
98
|
+
end
|
99
|
+
|
47
100
|
## Meta
|
48
|
-
Created and maintained by Vladimir Tarasov and Lars Burgess.
|
101
|
+
Created and maintained by Lucas Campbell-Rossen, Vladimir Tarasov and Lars Burgess.
|
49
102
|
|
50
103
|
Released under the [MIT License](http://www.opensource.org/licenses/mit-license.php).
|
data/lib/rhoconnect/client.rb
CHANGED
@@ -4,8 +4,12 @@ module Rhoconnect
|
|
4
4
|
class Client
|
5
5
|
attr_accessor :uri, :token
|
6
6
|
|
7
|
-
def self.set_app_endpoint(
|
8
|
-
RestClient::Request.execute(
|
7
|
+
def self.set_app_endpoint(args)
|
8
|
+
RestClient::Request.execute(
|
9
|
+
:method => :post, :url => args[:url],
|
10
|
+
:payload => args[:payload], :timeout => 2000,
|
11
|
+
:headers => args[:headers]
|
12
|
+
)
|
9
13
|
end
|
10
14
|
|
11
15
|
# allow configuration, uri or environment variable initialization
|
@@ -34,7 +34,7 @@ module Rhoconnect
|
|
34
34
|
yield(configuration)
|
35
35
|
# make a call to rhoconnect instance to set app url
|
36
36
|
endpoint_url = ENV['APP_ENDPOINT'] || self.configuration.app_endpoint
|
37
|
-
uri = ENV['
|
37
|
+
uri = ENV['RHOCONNECT_URL'] || self.configuration.uri
|
38
38
|
if uri
|
39
39
|
uri = URI.parse(uri)
|
40
40
|
token = uri.user
|
@@ -42,7 +42,10 @@ module Rhoconnect
|
|
42
42
|
uri = uri.to_s
|
43
43
|
end
|
44
44
|
token ||= ENV['token'] || self.configuration.token
|
45
|
-
Rhoconnect::Client.set_app_endpoint(uri + "/api/source/save_adapter
|
45
|
+
Rhoconnect::Client.set_app_endpoint(:url => uri + "/api/source/save_adapter",
|
46
|
+
:payload => {:attributes => {:adapter_url => endpoint_url}, :api_token => token}.to_json,
|
47
|
+
:headers => {:content_type => 'application/json'}
|
48
|
+
) if endpoint_url && uri && token
|
46
49
|
end
|
47
50
|
end
|
48
51
|
|
data/lib/rhoconnect/version.rb
CHANGED
data/spec/client_spec.rb
CHANGED
@@ -4,34 +4,34 @@ describe Rhoconnect::Client do
|
|
4
4
|
|
5
5
|
context "on initialize" do
|
6
6
|
it "should initialize with Rhoconnect_URL environment var" do
|
7
|
-
ENV['RHOCONNECT_URL'] = "http://token@test.
|
7
|
+
ENV['RHOCONNECT_URL'] = "http://token@test.rhoconnect.com"
|
8
8
|
c = Rhoconnect::Client.new
|
9
9
|
c.token.should == 'token'
|
10
|
-
c.uri.should == 'http://test.
|
10
|
+
c.uri.should == 'http://test.rhoconnect.com'
|
11
11
|
ENV.delete('Rhoconnect_URL')
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should initialize with :uri parameter" do
|
15
|
-
c = Rhoconnect::Client.new(:uri => "http://token@test.
|
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 = Rhoconnect::Client.new(:uri => "http://test.
|
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
27
|
Rhoconnect.configure do |config|
|
28
|
-
config.uri = "http://test.
|
28
|
+
config.uri = "http://test.rhoconnect.com"
|
29
29
|
config.token = "token"
|
30
30
|
end
|
31
31
|
begin
|
32
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
|
@@ -47,18 +47,18 @@ describe Rhoconnect::Client do
|
|
47
47
|
|
48
48
|
it "should raise ArugmentError if token is missing" do
|
49
49
|
lambda {
|
50
|
-
Rhoconnect::Client.new(:uri => "http://test.
|
50
|
+
Rhoconnect::Client.new(:uri => "http://test.rhoconnect.com")
|
51
51
|
}.should raise_error(ArgumentError, "Please provide a :token or set it in uri")
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
55
|
context "on create update destroy" do
|
56
56
|
before(:each) do
|
57
|
-
@client = Rhoconnect::Client.new(:uri => "http://token@test.
|
57
|
+
@client = Rhoconnect::Client.new(:uri => "http://token@test.rhoconnect.com")
|
58
58
|
end
|
59
59
|
|
60
60
|
it "should create an object" do
|
61
|
-
stub_request(:post, "http://test.
|
61
|
+
stub_request(:post, "http://test.rhoconnect.com/api/source/push_objects").with(
|
62
62
|
:headers => {"Content-Type" => "application/json"}
|
63
63
|
).to_return(:status => 200, :body => "done")
|
64
64
|
resp = @client.create("Person", "user1",
|
@@ -72,7 +72,7 @@ describe Rhoconnect::Client do
|
|
72
72
|
end
|
73
73
|
|
74
74
|
it "should update an object" do
|
75
|
-
stub_request(:post, "http://test.
|
75
|
+
stub_request(:post, "http://test.rhoconnect.com/api/source/push_objects").with(
|
76
76
|
:headers => {"Content-Type" => "application/json"}
|
77
77
|
).to_return(:status => 200, :body => "done")
|
78
78
|
resp = @client.update("Person", "user1",
|
@@ -86,7 +86,7 @@ describe Rhoconnect::Client do
|
|
86
86
|
end
|
87
87
|
|
88
88
|
it "should destroy an object" do
|
89
|
-
stub_request(:post, "http://test.
|
89
|
+
stub_request(:post, "http://test.rhoconnect.com/api/source/push_deletes").with(
|
90
90
|
:headers => {"Content-Type" => "application/json"}
|
91
91
|
).to_return(:status => 200, :body => "done")
|
92
92
|
resp = @client.destroy("Person", "user1",
|
@@ -102,11 +102,11 @@ describe Rhoconnect::Client do
|
|
102
102
|
|
103
103
|
context "on set callbacks" do
|
104
104
|
before(:each) do
|
105
|
-
@client = Rhoconnect::Client.new(:uri => "http://token@test.
|
105
|
+
@client = Rhoconnect::Client.new(:uri => "http://token@test.rhoconnect.com")
|
106
106
|
end
|
107
107
|
|
108
108
|
it "should set auth callback" do
|
109
|
-
stub_request(:post, "http://test.
|
109
|
+
stub_request(:post, "http://test.rhoconnect.com/api/set_auth_callback").with(
|
110
110
|
:headers => {"Content-Type" => "application/json"}
|
111
111
|
).to_return(:status => 200, :body => "done")
|
112
112
|
resp = @client.set_auth_callback("http://example.com/callback")
|
@@ -115,7 +115,7 @@ describe Rhoconnect::Client do
|
|
115
115
|
end
|
116
116
|
|
117
117
|
it "should set query callback" do
|
118
|
-
stub_request(:post, "http://test.
|
118
|
+
stub_request(:post, "http://test.rhoconnect.com/api/set_query_callback").with(
|
119
119
|
:headers => {"Content-Type" => "application/json"}
|
120
120
|
).to_return(:status => 200, :body => "done")
|
121
121
|
resp = @client.set_query_callback("Person", "http://example.com/callback")
|
data/spec/endpoints_spec.rb
CHANGED
@@ -60,7 +60,7 @@ describe Rhoconnect::EndpointHelpers do
|
|
60
60
|
|
61
61
|
it "should return true if no authenticate block exists" do
|
62
62
|
Rhoconnect.configure do |config|
|
63
|
-
config.uri = "http://test.
|
63
|
+
config.uri = "http://test.rhoconnect.com"
|
64
64
|
config.token = "token"
|
65
65
|
end
|
66
66
|
Rhoconnect.configuration.authenticate.should be_nil
|
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: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 2
|
10
|
+
version: 0.2.2
|
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-28 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
type: :runtime
|