remotely 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +24 -2
- data/lib/remotely.rb +14 -20
- data/lib/remotely/application.rb +49 -0
- data/lib/remotely/associations.rb +2 -2
- data/lib/remotely/ext/url.rb +15 -0
- data/lib/remotely/http_methods.rb +38 -48
- data/lib/remotely/version.rb +1 -1
- data/spec/remotely/application_spec.rb +31 -0
- data/spec/remotely/model_spec.rb +10 -10
- data/spec/remotely_spec.rb +14 -9
- data/spec/support/test_classes.rb +3 -1
- metadata +27 -24
data/README.md
CHANGED
@@ -3,11 +3,16 @@
|
|
3
3
|
Remotely lets you specify associations for your models that should
|
4
4
|
be fetched from a remote API instead of the database.
|
5
5
|
|
6
|
-
##
|
6
|
+
## Configuration
|
7
7
|
|
8
8
|
Apps are where Remotely goes to find association resources. You can define as many as you want, but if you define only one, you can omit the `:app` option from your associations.
|
9
9
|
|
10
|
-
Remotely.
|
10
|
+
Remotely.configure do
|
11
|
+
app :legsapp do
|
12
|
+
url "http://somanylegs.com/api/v1"
|
13
|
+
basic_auth "username", "password"
|
14
|
+
end
|
15
|
+
end
|
11
16
|
|
12
17
|
## Defining Associations
|
13
18
|
|
@@ -37,6 +42,23 @@ Apps are where Remotely goes to find association resources. You can define as ma
|
|
37
42
|
has_many_remote :legs, :app => :legsapp, ...
|
38
43
|
end
|
39
44
|
|
45
|
+
**Note about associations**
|
46
|
+
|
47
|
+
If you do not specify the `:app` options in your associations, you need
|
48
|
+
to create a `Remotely::Model` subclass for the associated object. This
|
49
|
+
is so Remotely knows which app to use to retrieve entries of that type.
|
50
|
+
|
51
|
+
class Person < ActiveRecord::Base
|
52
|
+
has_many_remote :legs
|
53
|
+
end
|
54
|
+
|
55
|
+
# Means the following must exist:
|
56
|
+
|
57
|
+
class Leg < Remotely::Model
|
58
|
+
app :legsapp
|
59
|
+
uri "/legs"
|
60
|
+
end
|
61
|
+
|
40
62
|
### id Substitution
|
41
63
|
|
42
64
|
A path can include "`:id`" anywhere in it, which is replaced by the instance's `id`. This is useful when the resource on the API end is namespaced. For example:
|
data/lib/remotely.rb
CHANGED
@@ -4,14 +4,15 @@ require "active_support/inflector"
|
|
4
4
|
require "active_support/concern"
|
5
5
|
require "active_support/core_ext/hash"
|
6
6
|
require "active_model"
|
7
|
+
|
7
8
|
require "remotely/ext/url"
|
9
|
+
require "remotely/application"
|
10
|
+
require "remotely/http_methods"
|
11
|
+
require "remotely/associations"
|
12
|
+
require "remotely/model"
|
13
|
+
require "remotely/collection"
|
8
14
|
|
9
15
|
module Remotely
|
10
|
-
autoload :Collection, "remotely/collection"
|
11
|
-
autoload :Associations, "remotely/associations"
|
12
|
-
autoload :Model, "remotely/model"
|
13
|
-
autoload :HTTPMethods, "remotely/http_methods"
|
14
|
-
|
15
16
|
class RemotelyError < StandardError
|
16
17
|
def message; self.class::MESSAGE; end
|
17
18
|
end
|
@@ -38,7 +39,7 @@ module Remotely
|
|
38
39
|
end
|
39
40
|
|
40
41
|
class << self
|
41
|
-
# @return [Hash]
|
42
|
+
# @return [Hash] Registered application configurations
|
42
43
|
def apps
|
43
44
|
@apps ||= {}
|
44
45
|
end
|
@@ -61,27 +62,20 @@ module Remotely
|
|
61
62
|
#
|
62
63
|
# @param [Symbol] name Placeholder name for the application.
|
63
64
|
# @param [String] url URL to the application's API.
|
65
|
+
# @param [Block] Block defining the attributes of the application.
|
64
66
|
#
|
65
|
-
def app(name, url)
|
66
|
-
url
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
# requests.
|
72
|
-
#
|
73
|
-
# @param [String] user BasicAuth user
|
74
|
-
# @param [String] password BasicAuth password
|
75
|
-
#
|
76
|
-
def basic_auth(user=nil, password=nil)
|
77
|
-
user and password and @basic_auth = [user, password] or @basic_auth
|
67
|
+
def app(name, url=nil, &block)
|
68
|
+
if !url && block_given?
|
69
|
+
apps[name] = Application.new(name, &block)
|
70
|
+
else
|
71
|
+
apps[name] = Application.new(name) { url(url) }
|
72
|
+
end
|
78
73
|
end
|
79
74
|
|
80
75
|
# Clear all registered apps
|
81
76
|
#
|
82
77
|
def reset!
|
83
78
|
@apps = {}
|
84
|
-
@basic_auth = nil
|
85
79
|
end
|
86
80
|
end
|
87
81
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Remotely
|
2
|
+
class Application
|
3
|
+
attr_reader :name
|
4
|
+
|
5
|
+
def initialize(name, &block)
|
6
|
+
@name = name
|
7
|
+
instance_eval(&block)
|
8
|
+
end
|
9
|
+
|
10
|
+
# Set or get the applications base url.
|
11
|
+
#
|
12
|
+
# @param [String] url Base url to the appplication
|
13
|
+
#
|
14
|
+
def url(url=nil)
|
15
|
+
return @url unless url
|
16
|
+
@url = URI.parse(set_scheme(url)).to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
# Set or get BasicAuth credentials.
|
20
|
+
#
|
21
|
+
# @param [String] user BasicAuth user
|
22
|
+
# @param [String] password BasicAuth password
|
23
|
+
#
|
24
|
+
def basic_auth(user=nil, password=nil)
|
25
|
+
return @basic_auth unless user && password
|
26
|
+
@basic_auth = [user, password]
|
27
|
+
end
|
28
|
+
|
29
|
+
# Connection to the application (with BasicAuth if it was set).
|
30
|
+
#
|
31
|
+
def connection
|
32
|
+
return unless @url
|
33
|
+
|
34
|
+
@connection ||= Faraday::Connection.new(@url) do |b|
|
35
|
+
b.request :url_encoded
|
36
|
+
b.adapter :net_http
|
37
|
+
end
|
38
|
+
|
39
|
+
@connection.basic_auth(*@basic_auth) if @basic_auth
|
40
|
+
@connection
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def set_scheme(url)
|
46
|
+
url =~ /^http/ ? url : "http://#{url}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -193,7 +193,7 @@ module Remotely
|
|
193
193
|
end
|
194
194
|
|
195
195
|
private
|
196
|
-
|
196
|
+
|
197
197
|
def can_fetch_remotely_association?(name)
|
198
198
|
opts = remote_associations[name]
|
199
199
|
|
@@ -218,7 +218,7 @@ module Remotely
|
|
218
218
|
def fetch_association(name)
|
219
219
|
type = remote_associations[name][:type]
|
220
220
|
klass = name.to_s.classify.constantize
|
221
|
-
response =
|
221
|
+
response = klass.get(path_to(name, type), :class => klass, :parent => self)
|
222
222
|
set_association(name, response)
|
223
223
|
end
|
224
224
|
|
data/lib/remotely/ext/url.rb
CHANGED
@@ -5,6 +5,7 @@ class URL
|
|
5
5
|
@url = "/" + args.flatten.compact.join("/")
|
6
6
|
@url.gsub! %r[/{2,}], "/"
|
7
7
|
@url.gsub! %r[/$], ""
|
8
|
+
define_delegation_methods
|
8
9
|
end
|
9
10
|
|
10
11
|
def +(other)
|
@@ -22,6 +23,20 @@ class URL
|
|
22
23
|
def to_s
|
23
24
|
@url
|
24
25
|
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def define_delegation_methods
|
30
|
+
@url.public_methods(false).each do |name|
|
31
|
+
metaclass.class_eval do
|
32
|
+
define_method(name) { |*args| @url.send(name, *args) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def metaclass
|
38
|
+
(class << self; self; end)
|
39
|
+
end
|
25
40
|
end
|
26
41
|
|
27
42
|
def URL(*args)
|
@@ -12,6 +12,10 @@ module Remotely
|
|
12
12
|
# Set or get the app for this model belongs to. If name is passed,
|
13
13
|
# it's a setter, otherwise, a getter.
|
14
14
|
#
|
15
|
+
# In getter form, if a model didn't declare which app it is
|
16
|
+
# associated with and there is only one registered app, it
|
17
|
+
# will default to that app.
|
18
|
+
#
|
15
19
|
# @overload app()
|
16
20
|
# Gets the current `app` value.
|
17
21
|
#
|
@@ -22,11 +26,7 @@ module Remotely
|
|
22
26
|
# @return [Symbol] New app symbol or current value.
|
23
27
|
#
|
24
28
|
def app(name=nil)
|
25
|
-
|
26
|
-
name = Remotely.apps.first.first
|
27
|
-
end
|
28
|
-
|
29
|
-
(name and @app = name) or @app
|
29
|
+
@app = (@app || Remotely.apps[name] || only_registered_app)
|
30
30
|
end
|
31
31
|
|
32
32
|
# Set or get the base uri for this model. If name is passed,
|
@@ -42,24 +42,7 @@ module Remotely
|
|
42
42
|
# @return [String] New uri or current value.
|
43
43
|
#
|
44
44
|
def uri(path=nil)
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
# The connection to the remote API.
|
49
|
-
#
|
50
|
-
# @return [Faraday::Connection] Connection to the remote API.
|
51
|
-
#
|
52
|
-
def remotely_connection
|
53
|
-
address = Remotely.apps[app][:base]
|
54
|
-
address = "http://#{address}" unless address =~ /^http/
|
55
|
-
|
56
|
-
@connection ||= Faraday::Connection.new(address) do |b|
|
57
|
-
b.request :url_encoded
|
58
|
-
b.adapter :net_http
|
59
|
-
end
|
60
|
-
|
61
|
-
@connection.basic_auth(*Remotely.basic_auth) if Remotely.basic_auth
|
62
|
-
@connection
|
45
|
+
@uri = (@uri || path)
|
63
46
|
end
|
64
47
|
|
65
48
|
# GET request.
|
@@ -71,14 +54,14 @@ module Remotely
|
|
71
54
|
# is an array, Collection, if it's a hash, Model, otherwise it's the
|
72
55
|
# parsed response body.
|
73
56
|
#
|
74
|
-
def get(
|
75
|
-
|
57
|
+
def get(path, options={})
|
58
|
+
path = expand(path)
|
76
59
|
klass = options.delete(:class)
|
77
60
|
parent = options.delete(:parent)
|
78
61
|
|
79
|
-
before_request(
|
62
|
+
before_request(path, :get, options)
|
80
63
|
|
81
|
-
response =
|
64
|
+
response = app.connection.get { |req| req.url(path, options) }
|
82
65
|
parse_response(raise_if_html(response), klass, parent)
|
83
66
|
end
|
84
67
|
|
@@ -95,14 +78,14 @@ module Remotely
|
|
95
78
|
# is an array, Collection, if it's a hash, Model, otherwise it's the
|
96
79
|
# parsed response body.
|
97
80
|
#
|
98
|
-
def post(
|
99
|
-
|
81
|
+
def post(path, options={})
|
82
|
+
path = expand(path)
|
100
83
|
klass = options.delete(:class)
|
101
84
|
parent = options.delete(:parent)
|
102
85
|
body = options.delete(:body) || Yajl::Encoder.encode(options)
|
103
86
|
|
104
|
-
before_request(
|
105
|
-
raise_if_html(
|
87
|
+
before_request(path, :post, body)
|
88
|
+
raise_if_html(app.connection.post(path, body))
|
106
89
|
end
|
107
90
|
|
108
91
|
# PUT request.
|
@@ -113,12 +96,12 @@ module Remotely
|
|
113
96
|
# @return [Boolean] Was the request successful? (Resulted in a
|
114
97
|
# 200-299 response code)
|
115
98
|
#
|
116
|
-
def put(
|
117
|
-
|
99
|
+
def put(path, options={})
|
100
|
+
path = expand(path)
|
118
101
|
body = options.delete(:body) || Yajl::Encoder.encode(options)
|
119
102
|
|
120
|
-
before_request(
|
121
|
-
raise_if_html(
|
103
|
+
before_request(path, :put, body)
|
104
|
+
raise_if_html(app.connection.put(path, body))
|
122
105
|
end
|
123
106
|
|
124
107
|
# DELETE request.
|
@@ -128,29 +111,30 @@ module Remotely
|
|
128
111
|
# @return [Boolean] Was the resource deleted? (Resulted in a
|
129
112
|
# 200-299 response code)
|
130
113
|
#
|
131
|
-
def http_delete(
|
132
|
-
|
133
|
-
before_request(
|
134
|
-
response = raise_if_html(
|
114
|
+
def http_delete(path)
|
115
|
+
path = expand(path)
|
116
|
+
before_request(path, :delete)
|
117
|
+
response = raise_if_html(app.connection.delete(path))
|
135
118
|
SUCCESS_STATUSES.include?(response.status)
|
136
119
|
end
|
137
120
|
|
138
|
-
#
|
139
|
-
#
|
140
|
-
#
|
141
|
-
#
|
142
|
-
#
|
121
|
+
# Remove the leading slash because Faraday considers
|
122
|
+
# it to be absolute path and ignores any prefixes. eg:
|
123
|
+
#
|
124
|
+
# c = Faraday::Connection.new("http://foo.com/api")
|
125
|
+
# c.get("users") # => /api/users (Good)
|
126
|
+
# c.get("/users") # => /users (Bad)
|
143
127
|
#
|
144
128
|
# @example
|
145
129
|
# Remotely.configure { app :thingapp, "http://example.com/api" }
|
146
|
-
# Model.expand("/members") # => "
|
130
|
+
# Model.expand("/members") # => "members"
|
147
131
|
#
|
148
|
-
def expand(
|
149
|
-
|
150
|
-
uri =~ /^#{baseuri}/ ? uri : URL(baseuri, uri)
|
132
|
+
def expand(path)
|
133
|
+
path.gsub(%r(^/), "")
|
151
134
|
end
|
152
135
|
|
153
136
|
# Gets called before a request. Override to add logging, etc.
|
137
|
+
#
|
154
138
|
def before_request(uri, http_verb = :get, options = {})
|
155
139
|
if ENV['REMOTELY_DEBUG']
|
156
140
|
puts "-> #{http_verb.to_s.upcase} #{uri}"
|
@@ -201,5 +185,11 @@ module Remotely
|
|
201
185
|
body
|
202
186
|
end
|
203
187
|
end
|
188
|
+
|
189
|
+
private
|
190
|
+
|
191
|
+
def only_registered_app
|
192
|
+
Remotely.apps.size == 1 ? Remotely.apps.first.last : nil
|
193
|
+
end
|
204
194
|
end
|
205
195
|
end
|
data/lib/remotely/version.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Remotely::Application do
|
4
|
+
it "sets the url" do
|
5
|
+
app = Remotely::Application.new(:name) { url "http://omg.com" }
|
6
|
+
app.url.should == "http://omg.com"
|
7
|
+
end
|
8
|
+
|
9
|
+
it "defaults the url to http" do
|
10
|
+
app = Remotely::Application.new(:name) { url "omg.com" }
|
11
|
+
app.url.should == "http://omg.com"
|
12
|
+
end
|
13
|
+
|
14
|
+
it "sets basic auth credentials" do
|
15
|
+
app = Remotely::Application.new(:name) { basic_auth "user", "pass" }
|
16
|
+
app.basic_auth.should == ["user", "pass"]
|
17
|
+
end
|
18
|
+
|
19
|
+
it "has a connection to the app" do
|
20
|
+
app = Remotely::Application.new(:name) { url "http://example.com" }
|
21
|
+
app.connection.should be_a Faraday::Connection
|
22
|
+
end
|
23
|
+
|
24
|
+
it "has a connection with basic auth to the app" do
|
25
|
+
app = Remotely::Application.new(:name) do
|
26
|
+
url "http://example.com"
|
27
|
+
basic_auth "user", "pass"
|
28
|
+
end
|
29
|
+
app.connection.headers["authorization"].should_not be_nil
|
30
|
+
end
|
31
|
+
end
|
data/spec/remotely/model_spec.rb
CHANGED
@@ -257,7 +257,12 @@ describe Remotely::Model do
|
|
257
257
|
|
258
258
|
context "basic auth" do
|
259
259
|
before do
|
260
|
-
Remotely.configure
|
260
|
+
Remotely.configure do
|
261
|
+
app :adventure_app do
|
262
|
+
url "http://localhost:3000"
|
263
|
+
basic_auth "user", "password"
|
264
|
+
end
|
265
|
+
end
|
261
266
|
end
|
262
267
|
|
263
268
|
after do
|
@@ -265,7 +270,6 @@ describe Remotely::Model do
|
|
265
270
|
end
|
266
271
|
|
267
272
|
it "sends Authorization headers when basic auth is configured" do
|
268
|
-
Remotely.configure { basic_auth "user", "password" }
|
269
273
|
Adventure.find(1)
|
270
274
|
a_request(:get, "#{app}/adventures/1").with(headers: {'Authorization' => "Basic dXNlcjpwYXNzd29yZA=="})
|
271
275
|
end
|
@@ -277,7 +281,7 @@ describe Remotely::Model do
|
|
277
281
|
end
|
278
282
|
|
279
283
|
it "sets the app it belongs to" do
|
280
|
-
Adventure.app.should == :adventure_app
|
284
|
+
Adventure.app.name.should == :adventure_app
|
281
285
|
end
|
282
286
|
|
283
287
|
it "sets the uri to itself" do
|
@@ -285,7 +289,7 @@ describe Remotely::Model do
|
|
285
289
|
end
|
286
290
|
|
287
291
|
it "has a connection" do
|
288
|
-
Adventure.
|
292
|
+
Adventure.app.connection.should be_a Faraday::Connection
|
289
293
|
end
|
290
294
|
|
291
295
|
it "supports ActiveModel::Naming methods" do
|
@@ -343,12 +347,8 @@ describe Remotely::Model do
|
|
343
347
|
Thing.app :uri_app
|
344
348
|
end
|
345
349
|
|
346
|
-
it "
|
347
|
-
Thing.expand("/members").should == "
|
348
|
-
end
|
349
|
-
|
350
|
-
it "doesn't prepend when it's already there" do
|
351
|
-
Thing.expand("/api/members").should == "/api/members"
|
350
|
+
it "removes leading slash to work with Faraday's path_prefix" do
|
351
|
+
Thing.expand("/members").should == "members"
|
352
352
|
end
|
353
353
|
end
|
354
354
|
|
data/spec/remotely_spec.rb
CHANGED
@@ -5,19 +5,24 @@ describe Remotely do
|
|
5
5
|
Remotely.reset!
|
6
6
|
end
|
7
7
|
|
8
|
-
it "is
|
8
|
+
it "is resetable" do
|
9
9
|
Remotely.configure { app :configapp, "localhost:2222" }
|
10
|
-
Remotely.
|
10
|
+
Remotely.reset!
|
11
|
+
Remotely.apps.should be_empty
|
11
12
|
end
|
12
13
|
|
13
|
-
it "
|
14
|
-
Remotely.configure {
|
15
|
-
Remotely.
|
14
|
+
it "is configurable with the old, non-block style" do
|
15
|
+
Remotely.configure { app :configapp, "localhost:2222" }
|
16
|
+
Remotely.apps[:configapp].url.should == "http://localhost:2222"
|
16
17
|
end
|
17
18
|
|
18
|
-
it "is
|
19
|
-
Remotely.configure { app
|
20
|
-
Remotely.
|
21
|
-
|
19
|
+
it "is configurable with a block" do
|
20
|
+
Remotely.configure { app(:configapp) { url "localhost:2222" } }
|
21
|
+
Remotely.apps[:configapp].url.should == "http://localhost:2222"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "saves the basic auth credentials" do
|
25
|
+
Remotely.configure { app(:appname) { basic_auth "user", "pass" }}
|
26
|
+
Remotely.apps[:appname].basic_auth.should == ["user", "pass"]
|
22
27
|
end
|
23
28
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: remotely
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-01-05 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &2169407720 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2169407720
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &2169407000 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 2.6.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2169407000
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: ZenTest
|
38
|
-
requirement: &
|
38
|
+
requirement: &2169400760 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2169400760
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: autotest-growl
|
49
|
-
requirement: &
|
49
|
+
requirement: &2169400280 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2169400280
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: webmock
|
60
|
-
requirement: &
|
60
|
+
requirement: &2169399780 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *2169399780
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: ruby-debug19
|
71
|
-
requirement: &
|
71
|
+
requirement: &2169399220 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *2169399220
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: ruby-debug-completion
|
82
|
-
requirement: &
|
82
|
+
requirement: &2169398540 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *2169398540
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: activesupport
|
93
|
-
requirement: &
|
93
|
+
requirement: &2169397720 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :runtime
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *2169397720
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: activemodel
|
104
|
-
requirement: &
|
104
|
+
requirement: &2169397260 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :runtime
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *2169397260
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: faraday
|
115
|
-
requirement: &
|
115
|
+
requirement: &2169396740 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,10 +120,10 @@ dependencies:
|
|
120
120
|
version: '0'
|
121
121
|
type: :runtime
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *2169396740
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: yajl-ruby
|
126
|
-
requirement: &
|
126
|
+
requirement: &2169395480 !ruby/object:Gem::Requirement
|
127
127
|
none: false
|
128
128
|
requirements:
|
129
129
|
- - ! '>='
|
@@ -131,7 +131,7 @@ dependencies:
|
|
131
131
|
version: '0'
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
|
-
version_requirements: *
|
134
|
+
version_requirements: *2169395480
|
135
135
|
description: Remote API based model associations.
|
136
136
|
email:
|
137
137
|
- me@mattenoble.com
|
@@ -147,6 +147,7 @@ files:
|
|
147
147
|
- README.md
|
148
148
|
- Rakefile
|
149
149
|
- lib/remotely.rb
|
150
|
+
- lib/remotely/application.rb
|
150
151
|
- lib/remotely/associations.rb
|
151
152
|
- lib/remotely/collection.rb
|
152
153
|
- lib/remotely/ext/url.rb
|
@@ -154,6 +155,7 @@ files:
|
|
154
155
|
- lib/remotely/model.rb
|
155
156
|
- lib/remotely/version.rb
|
156
157
|
- remotely.gemspec
|
158
|
+
- spec/remotely/application_spec.rb
|
157
159
|
- spec/remotely/associations_spec.rb
|
158
160
|
- spec/remotely/collection_spec.rb
|
159
161
|
- spec/remotely/ext/url_spec.rb
|
@@ -188,6 +190,7 @@ signing_key:
|
|
188
190
|
specification_version: 3
|
189
191
|
summary: Remote API based model associations.
|
190
192
|
test_files:
|
193
|
+
- spec/remotely/application_spec.rb
|
191
194
|
- spec/remotely/associations_spec.rb
|
192
195
|
- spec/remotely/collection_spec.rb
|
193
196
|
- spec/remotely/ext/url_spec.rb
|