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 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