remotely 0.1.1 → 0.1.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 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
- ## App Setup
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.app :legsapp, "http://omgsomanylegs.com/api/v1"
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:
@@ -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] Hash of registered apps (key: name, value: URL)
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 = URI.parse(url)
67
- apps[name] = { base: "#{url.scheme || "http"}://#{url.host}:#{url.port}", uri: url.path }
68
- end
69
-
70
- # Set the Basic Auth user and password to use when making
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 = self.class.get(path_to(name, type), :class => klass, :parent => self)
221
+ response = klass.get(path_to(name, type), :class => klass, :parent => self)
222
222
  set_association(name, response)
223
223
  end
224
224
 
@@ -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
- if @app.nil? && name.nil? && Remotely.apps.size == 1
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
- (path and @uri = path) or @uri
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(uri, options={})
75
- uri = expand(uri)
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(uri, :get, options)
62
+ before_request(path, :get, options)
80
63
 
81
- response = remotely_connection.get { |req| req.url(uri, options) }
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(uri, options={})
99
- uri = expand(uri)
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(uri, :post, body)
105
- raise_if_html(remotely_connection.post(uri, body))
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(uri, options={})
117
- uri = expand(uri)
99
+ def put(path, options={})
100
+ path = expand(path)
118
101
  body = options.delete(:body) || Yajl::Encoder.encode(options)
119
102
 
120
- before_request(uri, :put, body)
121
- raise_if_html(remotely_connection.put(uri, body))
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(uri)
132
- uri = expand(uri)
133
- before_request(uri, :delete)
134
- response = raise_if_html(remotely_connection.delete(uri))
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
- # Expand a URI to include any path specified in the the main app
139
- # configuration. When creating a Faraday object with a path that
140
- # includes a uri, eg: "localhost:1234/api", Faraday drops the path,
141
- # making it "localhost:1234". We need to add the "/api" back in
142
- # before our relative uri.
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") # => "/api/members"
130
+ # Model.expand("/members") # => "members"
147
131
  #
148
- def expand(uri)
149
- baseuri = Remotely.apps[app][:uri]
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
@@ -1,3 +1,3 @@
1
1
  module Remotely
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -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
@@ -257,7 +257,12 @@ describe Remotely::Model do
257
257
 
258
258
  context "basic auth" do
259
259
  before do
260
- Remotely.configure { app :adventure_app, "http://localhost:3000" }
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.remotely_connection.should be_a Faraday::Connection
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 "prepends the app uri" do
347
- Thing.expand("/members").should == "/api/members"
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
 
@@ -5,19 +5,24 @@ describe Remotely do
5
5
  Remotely.reset!
6
6
  end
7
7
 
8
- it "is configurable" do
8
+ it "is resetable" do
9
9
  Remotely.configure { app :configapp, "localhost:2222" }
10
- Remotely.apps.should include(:configapp)
10
+ Remotely.reset!
11
+ Remotely.apps.should be_empty
11
12
  end
12
13
 
13
- it "configures basic auth parameters" do
14
- Remotely.configure { basic_auth "user", "password" }
15
- Remotely.basic_auth.should == ["user", "password"]
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 resetable" do
19
- Remotely.configure { app :configapp, "localhost:2222" }
20
- Remotely.reset!
21
- Remotely.apps.should be_empty
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
@@ -1,6 +1,8 @@
1
1
  require "ostruct"
2
2
 
3
- Remotely.app :adventure_app, "http://localhost:1234"
3
+ Remotely.configure do
4
+ app :adventure_app, "http://localhost:1234"
5
+ end
4
6
 
5
7
  class BaseTestClass < OpenStruct
6
8
  extend ActiveModel::Naming
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.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: 2011-12-05 00:00:00.000000000Z
12
+ date: 2012-01-05 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &2168718920 !ruby/object:Gem::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: *2168718920
24
+ version_requirements: *2169407720
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &2168717680 !ruby/object:Gem::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: *2168717680
35
+ version_requirements: *2169407000
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: ZenTest
38
- requirement: &2168716540 !ruby/object:Gem::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: *2168716540
46
+ version_requirements: *2169400760
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: autotest-growl
49
- requirement: &2168716060 !ruby/object:Gem::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: *2168716060
57
+ version_requirements: *2169400280
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: webmock
60
- requirement: &2168715620 !ruby/object:Gem::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: *2168715620
68
+ version_requirements: *2169399780
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: ruby-debug19
71
- requirement: &2168715040 !ruby/object:Gem::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: *2168715040
79
+ version_requirements: *2169399220
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: ruby-debug-completion
82
- requirement: &2168714480 !ruby/object:Gem::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: *2168714480
90
+ version_requirements: *2169398540
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: activesupport
93
- requirement: &2168714040 !ruby/object:Gem::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: *2168714040
101
+ version_requirements: *2169397720
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: activemodel
104
- requirement: &2168713560 !ruby/object:Gem::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: *2168713560
112
+ version_requirements: *2169397260
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: faraday
115
- requirement: &2168708460 !ruby/object:Gem::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: *2168708460
123
+ version_requirements: *2169396740
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: yajl-ruby
126
- requirement: &2168708040 !ruby/object:Gem::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: *2168708040
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