api_resource 0.2.11 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -51,7 +51,13 @@ module ApiResource
51
51
  end
52
52
 
53
53
  def get(path, headers = {})
54
- format.decode(request(:get, path, build_request_headers(headers, :get, self.site.merge(path))))
54
+ # our site and headers for this request
55
+ site = self.site.merge(path)
56
+ headers = build_request_headers(headers, :get, site)
57
+
58
+ self.with_caching(path, headers) do
59
+ format.decode(request(:get, path, headers))
60
+ end
55
61
  end
56
62
 
57
63
  def delete(path, headers = {})
@@ -81,6 +87,23 @@ module ApiResource
81
87
  end
82
88
  end
83
89
 
90
+ protected
91
+
92
+ def cache_key(path, headers)
93
+ key = Digest::MD5.hexdigest([path, headers].to_s)
94
+ return "a-#{key}-#{ApiResource::Base.ttl}"
95
+ end
96
+
97
+ def with_caching(path, data = {}, &block)
98
+ if ApiResource::Base.ttl.to_f > 0.0
99
+ key = self.cache_key(path, data)
100
+ ApiResource.cache.fetch(key, :expires_in => ApiResource::Base.ttl) do
101
+ yield
102
+ end
103
+ else
104
+ yield
105
+ end
106
+ end
84
107
 
85
108
  private
86
109
  # Makes a request to the remote service.
@@ -83,37 +83,35 @@ module ApiResource
83
83
  end
84
84
  end
85
85
 
86
- module InstanceMethods
87
- def get(method_name, options = {})
88
- connection.get(custom_method_element_url(method_name, options), self.class.headers)
89
- end
86
+ def get(method_name, options = {})
87
+ connection.get(custom_method_element_url(method_name, options), self.class.headers)
88
+ end
90
89
 
91
- def post(method_name, options = {}, body = nil)
92
- request_body = body.blank? ? encode : body
93
- if new?
94
- connection.post(custom_method_new_element_url(method_name, options), request_body, self.class.headers)
95
- else
96
- connection.post(custom_method_element_url(method_name, options), request_body, self.class.headers)
97
- end
90
+ def post(method_name, options = {}, body = nil)
91
+ request_body = body.blank? ? encode : body
92
+ if new?
93
+ connection.post(custom_method_new_element_url(method_name, options), request_body, self.class.headers)
94
+ else
95
+ connection.post(custom_method_element_url(method_name, options), request_body, self.class.headers)
98
96
  end
97
+ end
99
98
 
100
- def put(method_name, options = {}, body = '')
101
- connection.put(custom_method_element_url(method_name, options), body, self.class.headers)
102
- end
99
+ def put(method_name, options = {}, body = '')
100
+ connection.put(custom_method_element_url(method_name, options), body, self.class.headers)
101
+ end
103
102
 
104
- def delete(method_name, options = {})
105
- connection.delete(custom_method_element_url(method_name, options), self.class.headers)
106
- end
103
+ def delete(method_name, options = {})
104
+ connection.delete(custom_method_element_url(method_name, options), self.class.headers)
105
+ end
107
106
 
108
107
 
109
- private
110
- def custom_method_element_url(method_name, options = {})
111
- "#{self.class.prefix(prefix_options)}#{self.class.collection_name}/#{id}/#{method_name}.#{self.class.format.extension}#{self.class.__send__(:query_string, options)}"
112
- end
108
+ private
109
+ def custom_method_element_url(method_name, options = {})
110
+ "#{self.class.prefix(prefix_options)}#{self.class.collection_name}/#{id}/#{method_name}.#{self.class.format.extension}#{self.class.__send__(:query_string, options)}"
111
+ end
113
112
 
114
- def custom_method_new_element_url(method_name, options = {})
115
- "#{self.class.prefix(prefix_options)}#{self.class.collection_name}/new/#{method_name}.#{self.class.format.extension}#{self.class.__send__(:query_string, options)}"
116
- end
117
- end
113
+ def custom_method_new_element_url(method_name, options = {})
114
+ "#{self.class.prefix(prefix_options)}#{self.class.collection_name}/new/#{method_name}.#{self.class.format.extension}#{self.class.__send__(:query_string, options)}"
115
+ end
118
116
  end
119
117
  end
@@ -8,7 +8,15 @@ module ApiResource
8
8
  # ActiveResource::Formats[:xml] # => ActiveResource::Formats::XmlFormat
9
9
  # ActiveResource::Formats[:json] # => ActiveResource::Formats::JsonFormat
10
10
  def self.[](mime_type_reference)
11
- ApiResource::Formats.const_get(ActiveSupport::Inflector.camelize(mime_type_reference.to_s) + "Format")
11
+ format_name = ActiveSupport::Inflector.camelize(mime_type_reference.to_s) + "Format"
12
+ begin
13
+ ApiResource::Formats.const_get(format_name)
14
+ rescue NameError => e
15
+ raise BadFormat.new("#{mime_type_reference} is not a valid format")
16
+ end
17
+ end
18
+
19
+ class BadFormat < StandardError
12
20
  end
13
21
  end
14
22
  end
@@ -35,50 +35,46 @@ module ApiResource
35
35
  alias_method_chain :save, :validations
36
36
  end
37
37
 
38
- module InstanceMethods
38
+ def save_with_validations(*args)
39
+ # we want to leave the original intact
40
+ options = args.clone.extract_options!
39
41
 
40
- def save_with_validations(*args)
41
- # we want to leave the original intact
42
- options = args.clone.extract_options!
43
-
44
- perform_validation = options.blank? ? true : options[:validate]
45
-
46
- @remote_errors = nil
47
- if perform_validation && valid? || !perform_validation
48
- save_without_validations(*args)
49
- true
50
- else
51
- false
52
- end
53
- rescue ApiResource::UnprocessableEntity => error
54
- @remote_errors = error
55
- load_remote_errors(@remote_errors, true)
56
- false
57
- end
58
-
59
- def load_remote_errors(remote_errors, save_cache = false)
60
- error_data = self.class.format.decode(remote_errors.response.body)['errors'] || {}
61
- if error_data.is_a?(Hash)
62
- self.errors.from_hash(error_data)
63
- elsif error_data.is_a?(Array)
64
- self.errors.from_array(error_data)
65
- else
66
- raise Exception.new
67
- end
68
- rescue Exception
69
- raise "Invalid response for invalid object: expected an array or hash got #{remote_errors}"
70
- end
42
+ perform_validation = options.blank? ? true : options[:validate]
71
43
 
72
- # This method runs any local validations but not remote ones
73
- def valid?
74
- super
75
- errors.empty?
44
+ @remote_errors = nil
45
+ if perform_validation && valid? || !perform_validation
46
+ save_without_validations(*args)
47
+ true
48
+ else
49
+ false
76
50
  end
77
-
78
- def errors
79
- @errors ||= ApiResource::Errors.new(self)
51
+ rescue ApiResource::UnprocessableEntity => error
52
+ @remote_errors = error
53
+ load_remote_errors(@remote_errors, true)
54
+ false
55
+ end
56
+
57
+ def load_remote_errors(remote_errors, save_cache = false)
58
+ error_data = self.class.format.decode(remote_errors.response.body)['errors'] || {}
59
+ if error_data.is_a?(Hash)
60
+ self.errors.from_hash(error_data)
61
+ elsif error_data.is_a?(Array)
62
+ self.errors.from_array(error_data)
63
+ else
64
+ raise Exception.new
80
65
  end
81
-
66
+ rescue Exception
67
+ raise "Invalid response for invalid object: expected an array or hash got #{remote_errors}"
68
+ end
69
+
70
+ # This method runs any local validations but not remote ones
71
+ def valid?
72
+ super
73
+ errors.empty?
74
+ end
75
+
76
+ def errors
77
+ @errors ||= ApiResource::Errors.new(self)
82
78
  end
83
79
 
84
80
  end
@@ -11,18 +11,16 @@ module ApiResource
11
11
  alias_method_chain method, :observers
12
12
  end
13
13
 
14
- module InstanceMethods
15
- %w( create save update destroy ).each do |method|
16
- module_eval <<-EOE, __FILE__, __LINE__ + 1
17
- def #{method}_with_observers(*args)
18
- notify_observers(:before_#method)
19
- if result = #{method}_without_observers(*args)
20
- notify_observers(:after_#{method})
21
- end
22
- return result
14
+ %w( create save update destroy ).each do |method|
15
+ module_eval <<-EOE, __FILE__, __LINE__ + 1
16
+ def #{method}_with_observers(*args)
17
+ notify_observers(:before_#method)
18
+ if result = #{method}_without_observers(*args)
19
+ notify_observers(:after_#{method})
23
20
  end
24
- EOE
25
- end
21
+ return result
22
+ end
23
+ EOE
26
24
  end
27
25
 
28
26
  end
@@ -28,18 +28,18 @@ module ApiResource
28
28
  self.related_objects[:scope][name.to_sym]
29
29
  end
30
30
  end
31
- module InstanceMethods
32
- def scopes
33
- return self.class.scopes
34
- end
35
-
36
- def scope?(name)
37
- return self.class.scope?(name)
38
- end
39
-
40
- def scope_attributes(name)
41
- return self.class.scope_attributes(name)
42
- end
31
+
32
+ def scopes
33
+ return self.class.scopes
34
+ end
35
+
36
+ def scope?(name)
37
+ return self.class.scope?(name)
43
38
  end
39
+
40
+ def scope_attributes(name)
41
+ return self.class.scope_attributes(name)
42
+ end
43
+
44
44
  end
45
45
  end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe ApiResource do
4
+
5
+ context ".cache" do
6
+
7
+ around(:each) do |example|
8
+ begin
9
+ old_rails = Object.send(:remove_const, :Rails)
10
+ example.run
11
+ ensure
12
+ Rails = old_rails
13
+ ApiResource
14
+ end
15
+ end
16
+
17
+ it "should be a Rails cache if it's initialized" do
18
+ cache_stub = stub()
19
+ Rails = mock(:cache => cache_stub)
20
+ ApiResource.cache(true).should be cache_stub
21
+ end
22
+
23
+ it "should default to an instance of memory cache" do
24
+ defined?(Rails).should be_blank
25
+ ApiResource.cache(true).should be_a(
26
+ ActiveSupport::Cache::MemoryStore
27
+ )
28
+ end
29
+ end
30
+
31
+ context ".with_ttl" do
32
+
33
+ it "should temporarily set ttl for a block" do
34
+ old_ttl = ApiResource.ttl
35
+ ApiResource.with_ttl(10) do
36
+ ApiResource.ttl.should eql(10)
37
+ end
38
+ ApiResource.ttl.should eql(old_ttl)
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -52,7 +52,7 @@ describe "Associations" do
52
52
 
53
53
  it "should only define relationships for the given class - they should not cascade" do
54
54
  TestResource.belongs_to :belongs_to_object
55
- AnotherTestResource.association?(:belongs_to_object).should_not be true
55
+ AnotherTestResource.association?(:belongs_to_object).should_not be_true
56
56
  end
57
57
 
58
58
  it "should have its relationship cascade when sub-classed" do
@@ -295,7 +295,6 @@ describe "Associations" do
295
295
 
296
296
 
297
297
  it "should be able to query scopes on the current model" do
298
-
299
298
  ScopeResource.one.to_query.should eql "one=true"
300
299
  ScopeResource.two("test").to_query.should eql "two=test"
301
300
  ScopeResource.three(1,2,3).to_query.should eql "three[]=1&three[]=2&three[]=3"
@@ -518,6 +517,7 @@ describe "Associations" do
518
517
  end
519
518
 
520
519
  it "should assign associations to the correct type on initialization" do
520
+ #binding.pry
521
521
  tr = TestResource.new(:has_one_object => {:name => "Dan"}, :belongs_to_object => {:name => "Dan"})
522
522
 
523
523
  tr.has_one_object.internal_object.should be_instance_of HasOneObject
@@ -563,7 +563,8 @@ describe "Associations" do
563
563
  context "ActiveModel" do
564
564
  before(:all) do
565
565
  require 'active_record'
566
- ActiveRecord::Base.establish_connection({"adapter" => "sqlite3", "database" => "/tmp/api_resource_test_db.sqlite"})
566
+ db_path = File.expand_path(File.dirname(__FILE__) + "/../tmp/api_resource_test_db.sqlite")
567
+ ActiveRecord::Base.establish_connection({"adapter" => "sqlite3", "database" => db_path})
567
568
  ActiveRecord::Base.connection.create_table(:test_ars, :force => true) do |t|
568
569
  t.integer(:test_resource_id)
569
570
  end
@@ -162,6 +162,10 @@ describe "Base" do
162
162
  TestResource.format.extension.to_sym.should eql(:xml)
163
163
  TestResource.format = :json
164
164
  end
165
+
166
+ it "should only allow proper formats to be set" do
167
+ expect {TestResource.format = :blah}.should raise_error(::ApiResource::Formats::BadFormat)
168
+ end
165
169
 
166
170
  it "should be able to set an http timeout" do
167
171
  TestResource.timeout = 5
@@ -579,5 +583,29 @@ describe "Base" do
579
583
  end
580
584
 
581
585
  end
586
+
587
+ context ".get" do
588
+
589
+ context "with ttl" do
590
+ around(:each) do |example|
591
+
592
+ begin
593
+ initial = ApiResource::Base.ttl
594
+ ApiResource::Base.ttl = 1
595
+ example.run
596
+ ensure
597
+ ApiResource::Base.ttl = initial
598
+ end
599
+
600
+ end
601
+
602
+ it "should implement caching using the ttl setting" do
603
+ cache = mock(:fetch => {:id => 123, :name => "Dan"})
604
+ ApiResource.stubs(:cache => cache)
605
+ TestResource.find(123)
606
+ end
607
+ end
608
+
609
+ end
582
610
 
583
611
  end
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
-
4
3
  require 'bundler'
5
4
  require 'api_resource'
6
5
  require 'simplecov'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api_resource
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.11
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,22 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-21 00:00:00.000000000 Z
12
+ date: 2012-06-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &70339494520880 !ruby/object:Gem::Requirement
16
+ requirement: &2157448720 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - =
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 3.0.9
21
+ version: '3'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70339494520880
24
+ version_requirements: *2157448720
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: hash_dealer
27
- requirement: &70339494519400 !ruby/object:Gem::Requirement
27
+ requirement: &2157445640 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70339494519400
35
+ version_requirements: *2157445640
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rest-client
38
- requirement: &70339494517340 !ruby/object:Gem::Requirement
38
+ requirement: &2157443060 !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: :runtime
45
45
  prerelease: false
46
- version_requirements: *70339494517340
46
+ version_requirements: *2157443060
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: log4r
49
- requirement: &70339494515320 !ruby/object:Gem::Requirement
49
+ requirement: &2157441760 !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: :runtime
56
56
  prerelease: false
57
- version_requirements: *70339494515320
57
+ version_requirements: *2157441760
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: differ
60
- requirement: &70339494514460 !ruby/object:Gem::Requirement
60
+ requirement: &2157438700 !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: :runtime
67
67
  prerelease: false
68
- version_requirements: *70339494514460
68
+ version_requirements: *2157438700
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: colorize
71
- requirement: &70339494513160 !ruby/object:Gem::Requirement
71
+ requirement: &2157427000 !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: :runtime
78
78
  prerelease: false
79
- version_requirements: *70339494513160
79
+ version_requirements: *2157427000
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: json
82
- requirement: &70339494498860 !ruby/object:Gem::Requirement
82
+ requirement: &2157425020 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,43 @@ dependencies:
87
87
  version: '0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *70339494498860
90
+ version_requirements: *2157425020
91
+ - !ruby/object:Gem::Dependency
92
+ name: pry
93
+ requirement: &2157421560 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *2157421560
102
+ - !ruby/object:Gem::Dependency
103
+ name: pry-doc
104
+ requirement: &2157417420 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *2157417420
113
+ - !ruby/object:Gem::Dependency
114
+ name: pry-nav
115
+ requirement: &2157416240 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: *2157416240
91
124
  - !ruby/object:Gem::Dependency
92
125
  name: rspec
93
- requirement: &70339494498060 !ruby/object:Gem::Requirement
126
+ requirement: &2157415120 !ruby/object:Gem::Requirement
94
127
  none: false
95
128
  requirements:
96
129
  - - ! '>='
@@ -98,10 +131,10 @@ dependencies:
98
131
  version: '0'
99
132
  type: :development
100
133
  prerelease: false
101
- version_requirements: *70339494498060
134
+ version_requirements: *2157415120
102
135
  - !ruby/object:Gem::Dependency
103
136
  name: ruby-debug19
104
- requirement: &70339494485980 !ruby/object:Gem::Requirement
137
+ requirement: &2157408240 !ruby/object:Gem::Requirement
105
138
  none: false
106
139
  requirements:
107
140
  - - ! '>='
@@ -109,10 +142,10 @@ dependencies:
109
142
  version: '0'
110
143
  type: :development
111
144
  prerelease: false
112
- version_requirements: *70339494485980
145
+ version_requirements: *2157408240
113
146
  - !ruby/object:Gem::Dependency
114
147
  name: growl
115
- requirement: &70339494484300 !ruby/object:Gem::Requirement
148
+ requirement: &2157406740 !ruby/object:Gem::Requirement
116
149
  none: false
117
150
  requirements:
118
151
  - - ! '>='
@@ -120,10 +153,10 @@ dependencies:
120
153
  version: '0'
121
154
  type: :development
122
155
  prerelease: false
123
- version_requirements: *70339494484300
156
+ version_requirements: *2157406740
124
157
  - !ruby/object:Gem::Dependency
125
158
  name: rspec-rails
126
- requirement: &70339494482660 !ruby/object:Gem::Requirement
159
+ requirement: &2157405020 !ruby/object:Gem::Requirement
127
160
  none: false
128
161
  requirements:
129
162
  - - ! '>='
@@ -131,10 +164,10 @@ dependencies:
131
164
  version: '0'
132
165
  type: :development
133
166
  prerelease: false
134
- version_requirements: *70339494482660
167
+ version_requirements: *2157405020
135
168
  - !ruby/object:Gem::Dependency
136
169
  name: factory_girl
137
- requirement: &70339494480240 !ruby/object:Gem::Requirement
170
+ requirement: &2157402240 !ruby/object:Gem::Requirement
138
171
  none: false
139
172
  requirements:
140
173
  - - ! '>='
@@ -142,10 +175,10 @@ dependencies:
142
175
  version: '0'
143
176
  type: :development
144
177
  prerelease: false
145
- version_requirements: *70339494480240
178
+ version_requirements: *2157402240
146
179
  - !ruby/object:Gem::Dependency
147
180
  name: simplecov
148
- requirement: &70339494479280 !ruby/object:Gem::Requirement
181
+ requirement: &2157394860 !ruby/object:Gem::Requirement
149
182
  none: false
150
183
  requirements:
151
184
  - - ! '>='
@@ -153,10 +186,10 @@ dependencies:
153
186
  version: '0'
154
187
  type: :development
155
188
  prerelease: false
156
- version_requirements: *70339494479280
189
+ version_requirements: *2157394860
157
190
  - !ruby/object:Gem::Dependency
158
191
  name: faker
159
- requirement: &70339494477780 !ruby/object:Gem::Requirement
192
+ requirement: &2157392560 !ruby/object:Gem::Requirement
160
193
  none: false
161
194
  requirements:
162
195
  - - ! '>='
@@ -164,10 +197,10 @@ dependencies:
164
197
  version: '0'
165
198
  type: :development
166
199
  prerelease: false
167
- version_requirements: *70339494477780
200
+ version_requirements: *2157392560
168
201
  - !ruby/object:Gem::Dependency
169
202
  name: guard
170
- requirement: &70339494476400 !ruby/object:Gem::Requirement
203
+ requirement: &2157391740 !ruby/object:Gem::Requirement
171
204
  none: false
172
205
  requirements:
173
206
  - - ! '>='
@@ -175,10 +208,10 @@ dependencies:
175
208
  version: '0'
176
209
  type: :development
177
210
  prerelease: false
178
- version_requirements: *70339494476400
211
+ version_requirements: *2157391740
179
212
  - !ruby/object:Gem::Dependency
180
213
  name: guard-rspec
181
- requirement: &70339494475220 !ruby/object:Gem::Requirement
214
+ requirement: &2157390760 !ruby/object:Gem::Requirement
182
215
  none: false
183
216
  requirements:
184
217
  - - ! '>='
@@ -186,10 +219,10 @@ dependencies:
186
219
  version: '0'
187
220
  type: :development
188
221
  prerelease: false
189
- version_requirements: *70339494475220
222
+ version_requirements: *2157390760
190
223
  - !ruby/object:Gem::Dependency
191
224
  name: mocha
192
- requirement: &70339494473700 !ruby/object:Gem::Requirement
225
+ requirement: &2157389540 !ruby/object:Gem::Requirement
193
226
  none: false
194
227
  requirements:
195
228
  - - ! '>='
@@ -197,10 +230,10 @@ dependencies:
197
230
  version: '0'
198
231
  type: :development
199
232
  prerelease: false
200
- version_requirements: *70339494473700
233
+ version_requirements: *2157389540
201
234
  - !ruby/object:Gem::Dependency
202
235
  name: bundler
203
- requirement: &70339494472760 !ruby/object:Gem::Requirement
236
+ requirement: &2157384400 !ruby/object:Gem::Requirement
204
237
  none: false
205
238
  requirements:
206
239
  - - ! '>='
@@ -208,10 +241,10 @@ dependencies:
208
241
  version: '0'
209
242
  type: :development
210
243
  prerelease: false
211
- version_requirements: *70339494472760
244
+ version_requirements: *2157384400
212
245
  - !ruby/object:Gem::Dependency
213
246
  name: jeweler
214
- requirement: &70339494471640 !ruby/object:Gem::Requirement
247
+ requirement: &2157381720 !ruby/object:Gem::Requirement
215
248
  none: false
216
249
  requirements:
217
250
  - - ~>
@@ -219,21 +252,21 @@ dependencies:
219
252
  version: 1.6.4
220
253
  type: :development
221
254
  prerelease: false
222
- version_requirements: *70339494471640
255
+ version_requirements: *2157381720
223
256
  - !ruby/object:Gem::Dependency
224
257
  name: activerecord
225
- requirement: &70339494455840 !ruby/object:Gem::Requirement
258
+ requirement: &2157379880 !ruby/object:Gem::Requirement
226
259
  none: false
227
260
  requirements:
228
- - - =
261
+ - - ~>
229
262
  - !ruby/object:Gem::Version
230
- version: 3.0.9
263
+ version: '3'
231
264
  type: :development
232
265
  prerelease: false
233
- version_requirements: *70339494455840
266
+ version_requirements: *2157379880
234
267
  - !ruby/object:Gem::Dependency
235
268
  name: sqlite3
236
- requirement: &70339494453680 !ruby/object:Gem::Requirement
269
+ requirement: &2157378660 !ruby/object:Gem::Requirement
237
270
  none: false
238
271
  requirements:
239
272
  - - ! '>='
@@ -241,7 +274,7 @@ dependencies:
241
274
  version: '0'
242
275
  type: :development
243
276
  prerelease: false
244
- version_requirements: *70339494453680
277
+ version_requirements: *2157378660
245
278
  description: A replacement for ActiveResource for RESTful APIs that handles associated
246
279
  object and multiple data sources
247
280
  email: ejl6266@gmail.com
@@ -294,6 +327,7 @@ files:
294
327
  - lib/api_resource/railtie.rb
295
328
  - lib/api_resource/scopes.rb
296
329
  - nohup.out
330
+ - spec/lib/api_resource_spec.rb
297
331
  - spec/lib/associations_spec.rb
298
332
  - spec/lib/attributes_spec.rb
299
333
  - spec/lib/base_spec.rb
@@ -325,7 +359,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
325
359
  version: '0'
326
360
  segments:
327
361
  - 0
328
- hash: 2077166226351536959
362
+ hash: 391851535398052430
329
363
  required_rubygems_version: !ruby/object:Gem::Requirement
330
364
  none: false
331
365
  requirements:
@@ -334,7 +368,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
334
368
  version: '0'
335
369
  requirements: []
336
370
  rubyforge_project:
337
- rubygems_version: 1.8.17
371
+ rubygems_version: 1.8.11
338
372
  signing_key:
339
373
  specification_version: 3
340
374
  summary: A replacement for ActiveResource for RESTful APIs that handles associated