api_resource 0.6.2 → 0.6.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +24 -9
- data/api_resource.gemspec +1 -0
- data/lib/api_resource/associations.rb +8 -5
- data/lib/api_resource/associations/multi_object_proxy.rb +4 -0
- data/lib/api_resource/associations/single_object_proxy.rb +4 -0
- data/lib/api_resource/base.rb +22 -3
- data/lib/api_resource/version.rb +1 -1
- data/spec/lib/associations/association_scope_spec.rb +10 -0
- data/spec/lib/associations_spec.rb +27 -1
- data/spec/spec_helper.rb +3 -0
- data/spec/support/mocks/association_mocks.rb +10 -1
- data/spec/support/requests/association_requests.rb +4 -0
- data/spec/support/requests/test_resource_requests.rb +1 -0
- metadata +19 -3
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
api_resource (0.6.
|
4
|
+
api_resource (0.6.2)
|
5
5
|
colorize
|
6
6
|
differ
|
7
7
|
json
|
@@ -39,12 +39,14 @@ GEM
|
|
39
39
|
activesupport (3.2.10)
|
40
40
|
i18n (~> 0.6)
|
41
41
|
multi_json (~> 1.0)
|
42
|
+
archive-tar-minitar (0.5.2)
|
42
43
|
arel (3.0.2)
|
43
44
|
builder (3.0.4)
|
44
45
|
childprocess (0.3.6)
|
45
46
|
ffi (~> 1.0, >= 1.0.6)
|
46
47
|
coderay (1.0.8)
|
47
48
|
colorize (0.5.8)
|
49
|
+
columnize (0.3.6)
|
48
50
|
diff-lcs (1.1.3)
|
49
51
|
differ (0.1.2)
|
50
52
|
erubis (2.7.0)
|
@@ -77,10 +79,12 @@ GEM
|
|
77
79
|
activesupport
|
78
80
|
colorize
|
79
81
|
i18n
|
80
|
-
hike (1.2.
|
82
|
+
hike (1.2.2)
|
81
83
|
i18n (0.6.1)
|
82
84
|
journey (1.0.4)
|
83
|
-
json (1.7.
|
85
|
+
json (1.7.7)
|
86
|
+
linecache19 (0.5.12)
|
87
|
+
ruby_core_source (>= 0.1.4)
|
84
88
|
listen (0.7.1)
|
85
89
|
log4r (1.1.10)
|
86
90
|
lumberjack (1.0.2)
|
@@ -90,7 +94,7 @@ GEM
|
|
90
94
|
treetop (~> 1.4.8)
|
91
95
|
metaclass (0.0.1)
|
92
96
|
method_source (0.8.1)
|
93
|
-
mime-types (1.
|
97
|
+
mime-types (1.22)
|
94
98
|
mocha (0.12.7)
|
95
99
|
metaclass (~> 0.0.1)
|
96
100
|
multi_json (1.5.0)
|
@@ -99,10 +103,10 @@ GEM
|
|
99
103
|
coderay (~> 1.0.5)
|
100
104
|
method_source (~> 0.8)
|
101
105
|
slop (~> 3.3.1)
|
102
|
-
rack (1.4.
|
106
|
+
rack (1.4.5)
|
103
107
|
rack-cache (1.2)
|
104
108
|
rack (>= 0.4)
|
105
|
-
rack-ssl (1.3.
|
109
|
+
rack-ssl (1.3.3)
|
106
110
|
rack
|
107
111
|
rack-test (0.6.2)
|
108
112
|
rack (>= 1.0)
|
@@ -123,7 +127,7 @@ GEM
|
|
123
127
|
thor (>= 0.14.6, < 2.0)
|
124
128
|
rake (10.0.3)
|
125
129
|
rb-fsevent (0.9.3)
|
126
|
-
rdoc (3.12)
|
130
|
+
rdoc (3.12.2)
|
127
131
|
json (~> 1.4)
|
128
132
|
rest-client (1.6.7)
|
129
133
|
mime-types (>= 1.16)
|
@@ -135,6 +139,16 @@ GEM
|
|
135
139
|
rspec-expectations (2.12.1)
|
136
140
|
diff-lcs (~> 1.1.3)
|
137
141
|
rspec-mocks (2.12.1)
|
142
|
+
ruby-debug-base19 (0.11.25)
|
143
|
+
columnize (>= 0.3.1)
|
144
|
+
linecache19 (>= 0.5.11)
|
145
|
+
ruby_core_source (>= 0.1.4)
|
146
|
+
ruby-debug19 (0.11.6)
|
147
|
+
columnize (>= 0.3.1)
|
148
|
+
linecache19 (>= 0.5.11)
|
149
|
+
ruby-debug-base19 (>= 0.11.19)
|
150
|
+
ruby_core_source (0.1.5)
|
151
|
+
archive-tar-minitar (>= 0.5.2)
|
138
152
|
ruby_parser (3.1.1)
|
139
153
|
sexp_processor (~> 4.1)
|
140
154
|
sexp_processor (4.1.3)
|
@@ -151,11 +165,11 @@ GEM
|
|
151
165
|
tilt (~> 1.1, != 1.3.0)
|
152
166
|
sqlite3 (1.3.6)
|
153
167
|
thor (0.16.0)
|
154
|
-
tilt (1.3.
|
168
|
+
tilt (1.3.7)
|
155
169
|
treetop (1.4.12)
|
156
170
|
polyglot
|
157
171
|
polyglot (>= 0.3.1)
|
158
|
-
tzinfo (0.3.
|
172
|
+
tzinfo (0.3.37)
|
159
173
|
|
160
174
|
PLATFORMS
|
161
175
|
ruby
|
@@ -174,6 +188,7 @@ DEPENDENCIES
|
|
174
188
|
rake
|
175
189
|
rb-fsevent
|
176
190
|
rspec
|
191
|
+
ruby-debug19
|
177
192
|
simplecov
|
178
193
|
spork
|
179
194
|
sqlite3
|
data/api_resource.gemspec
CHANGED
@@ -31,6 +31,7 @@ Gem::Specification.new do |gem|
|
|
31
31
|
gem.add_development_dependency "flog"
|
32
32
|
gem.add_development_dependency "hash_dealer"
|
33
33
|
gem.add_development_dependency "rb-fsevent"
|
34
|
+
gem.add_development_dependency "ruby-debug19"
|
34
35
|
gem.add_development_dependency "simplecov"
|
35
36
|
# stuff that seems like crap
|
36
37
|
gem.add_development_dependency "sqlite3"
|
@@ -144,7 +144,7 @@ module ApiResource
|
|
144
144
|
|
145
145
|
# TODO: add a special foreign_key option to associations
|
146
146
|
def association_foreign_key_field(assoc, type = nil)
|
147
|
-
|
147
|
+
|
148
148
|
if type.nil? && has_many?(assoc)
|
149
149
|
type = :has_many
|
150
150
|
else
|
@@ -154,7 +154,7 @@ module ApiResource
|
|
154
154
|
# for now just use the association name
|
155
155
|
str = assoc.to_s.singularize.foreign_key
|
156
156
|
|
157
|
-
if type
|
157
|
+
if type.to_s =~ /^has_many/
|
158
158
|
str = str.pluralize
|
159
159
|
end
|
160
160
|
|
@@ -228,10 +228,12 @@ module ApiResource
|
|
228
228
|
|
229
229
|
def #{id_method_name}
|
230
230
|
@attributes_cache[:#{id_method_name}] ||= begin
|
231
|
-
if @attributes.
|
232
|
-
@attributes[
|
233
|
-
|
231
|
+
if @attributes.has_key?("#{id_method_name}")
|
232
|
+
@attributes["#{id_method_name}"]
|
233
|
+
elsif self.#{assoc_name}.collection?
|
234
234
|
self.#{assoc_name}.collect(&:id)
|
235
|
+
else
|
236
|
+
self.#{assoc_name}? ? self.#{assoc_name}.id : nil
|
235
237
|
end
|
236
238
|
end
|
237
239
|
end
|
@@ -241,6 +243,7 @@ module ApiResource
|
|
241
243
|
#{id_method_name}_will_change!
|
242
244
|
end
|
243
245
|
@attributes_cache[:#{id_method_name}] = val
|
246
|
+
write_attribute(:#{id_method_name}, val)
|
244
247
|
end
|
245
248
|
|
246
249
|
EOE
|
data/lib/api_resource/base.rb
CHANGED
@@ -152,6 +152,9 @@ module ApiResource
|
|
152
152
|
|
153
153
|
def load_resource_definition
|
154
154
|
unless instance_variable_defined?(:@resource_definition)
|
155
|
+
# the last time we checked
|
156
|
+
@resource_load_time = Time.now
|
157
|
+
|
155
158
|
# set to not nil so we don't get an infinite loop
|
156
159
|
@resource_definition = true
|
157
160
|
self.set_class_attributes_upon_load
|
@@ -354,12 +357,28 @@ module ApiResource
|
|
354
357
|
end
|
355
358
|
|
356
359
|
protected
|
360
|
+
|
361
|
+
# do we have an invalid resource
|
362
|
+
def resource_definition_is_invalid?
|
363
|
+
# if we have a Hash, it's valid
|
364
|
+
return false if @resource_definition.is_a?(Hash)
|
365
|
+
# if we have no recheck time, it's invalid
|
366
|
+
return true if @resource_load_time.nil?
|
367
|
+
# have we checked in the last minute?
|
368
|
+
return @resource_load_time < Time.now - 1.minute
|
369
|
+
end
|
370
|
+
|
357
371
|
def method_missing(meth, *args, &block)
|
358
372
|
# make one attempt to load remote attrs
|
359
|
-
if self.
|
373
|
+
if self.resource_definition_is_invalid?
|
374
|
+
self.reload_resource_definition
|
375
|
+
end
|
376
|
+
# see if we respond to the method now
|
377
|
+
if self.respond_to?(meth)
|
360
378
|
return self.send(meth, *args, &block)
|
379
|
+
else
|
380
|
+
super
|
361
381
|
end
|
362
|
-
super
|
363
382
|
end
|
364
383
|
|
365
384
|
private
|
@@ -663,7 +682,7 @@ module ApiResource
|
|
663
682
|
include AssociationActivation
|
664
683
|
self.activate_associations
|
665
684
|
|
666
|
-
include Scopes, Callbacks, Observing, Attributes, ModelErrors, Conditions, Finders
|
685
|
+
include Scopes, Callbacks, Observing, Attributes, ModelErrors, Conditions, Finders, Typecast
|
667
686
|
|
668
687
|
end
|
669
688
|
|
data/lib/api_resource/version.rb
CHANGED
@@ -6,6 +6,16 @@ describe ApiResource::Associations::AssociationProxy do
|
|
6
6
|
TestResource.reload_resource_definition
|
7
7
|
end
|
8
8
|
|
9
|
+
context "Methods that collide with enumerables" do
|
10
|
+
|
11
|
+
it "should not include enumerables" do
|
12
|
+
test_resource = TestResource.find(1)
|
13
|
+
# the #zip method is included in enumerable
|
14
|
+
test_resource.belongs_to_object.zip.should_not be_blank
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
9
19
|
context "#remote_path" do
|
10
20
|
|
11
21
|
it "should provide access to its remote path when
|
@@ -804,6 +804,8 @@ describe "Associations" do
|
|
804
804
|
before(:all) do
|
805
805
|
TestAR.class_eval do
|
806
806
|
has_one_remote :test_resource
|
807
|
+
has_one_remote :other_test_resource,
|
808
|
+
:class_name => "TestResource"
|
807
809
|
end
|
808
810
|
end
|
809
811
|
it "should attempt to load a single remote object for a has_one relationship" do
|
@@ -815,6 +817,27 @@ describe "Associations" do
|
|
815
817
|
# load the test resource
|
816
818
|
tar.test_resource.name.should eql "testing"
|
817
819
|
end
|
820
|
+
|
821
|
+
it "should use its object's primary_key as the _id method" do
|
822
|
+
tar = TestAR.new
|
823
|
+
tar.stubs(:id).returns(1)
|
824
|
+
TestResource.connection.expects(:get)
|
825
|
+
.with("/test_resources.json?test_ar_id=1")
|
826
|
+
.returns([{"name" => "testing", "id" => 14}])
|
827
|
+
# load the test resource
|
828
|
+
tar.other_test_resource_id.should eql(14)
|
829
|
+
end
|
830
|
+
|
831
|
+
it "should handle mising objects in its _id method" do
|
832
|
+
tar = TestAR.new
|
833
|
+
tar.stubs(:id).returns(1)
|
834
|
+
TestResource.connection.expects(:get)
|
835
|
+
.with("/test_resources.json?test_ar_id=1")
|
836
|
+
.returns([])
|
837
|
+
# load the test resource
|
838
|
+
tar.other_test_resource_id.should be_nil
|
839
|
+
end
|
840
|
+
|
818
841
|
end
|
819
842
|
context "Has Many" do
|
820
843
|
before(:all) do
|
@@ -826,9 +849,12 @@ describe "Associations" do
|
|
826
849
|
tar = TestAR.new
|
827
850
|
tar.stubs(:id).returns(1)
|
828
851
|
HasManyObject.load_resource_definition
|
829
|
-
HasManyObject.connection.expects(:get).with("/has_many_objects.json?test_ar_id=1").once.returns(
|
852
|
+
HasManyObject.connection.expects(:get).with("/has_many_objects.json?test_ar_id=1").once.returns(
|
853
|
+
[{"name" => "testing", "id" => 22}]
|
854
|
+
)
|
830
855
|
# load the test resource
|
831
856
|
tar.has_many_objects.first.name.should eql "testing"
|
857
|
+
tar.has_many_object_ids.should eql([22])
|
832
858
|
end
|
833
859
|
end
|
834
860
|
context "Has Many Through" do
|
data/spec/spec_helper.rb
CHANGED
@@ -49,8 +49,17 @@ Mocks.define do
|
|
49
49
|
end
|
50
50
|
|
51
51
|
endpoint("/belongs_to_objects/new") do
|
52
|
-
get({
|
52
|
+
get({
|
53
|
+
"attributes" => {
|
54
|
+
"public" => ["zip"]
|
55
|
+
}
|
56
|
+
})
|
57
|
+
end
|
58
|
+
|
59
|
+
endpoint("/belongs_to_objects/:id") do
|
60
|
+
get(HashDealer.roll(:belongs_to_object_response))
|
53
61
|
end
|
62
|
+
|
54
63
|
|
55
64
|
endpoint("/test_associations/new") do
|
56
65
|
get({})
|
@@ -40,6 +40,7 @@ HashDealer.define(:test_resource_with_proxies, :parent => :test_resource) do
|
|
40
40
|
has_one_object{HashDealer.roll(:has_one_object)}
|
41
41
|
has_many_objects{(0..4).to_a.collect{HashDealer.roll(:has_many_object)}}
|
42
42
|
has_many_service_uri{[{:service_uri => "/test_resource/1/has_many"}]}
|
43
|
+
belongs_to_object({:service_uri => "/belongs_to_objects/4"})
|
43
44
|
end
|
44
45
|
|
45
46
|
HashDealer.define(:test_resource_errors) do
|
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.6.
|
4
|
+
version: 0.6.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-
|
14
|
+
date: 2013-04-12 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rake
|
@@ -221,6 +221,22 @@ dependencies:
|
|
221
221
|
- - ! '>='
|
222
222
|
- !ruby/object:Gem::Version
|
223
223
|
version: '0'
|
224
|
+
- !ruby/object:Gem::Dependency
|
225
|
+
name: ruby-debug19
|
226
|
+
requirement: !ruby/object:Gem::Requirement
|
227
|
+
none: false
|
228
|
+
requirements:
|
229
|
+
- - ! '>='
|
230
|
+
- !ruby/object:Gem::Version
|
231
|
+
version: '0'
|
232
|
+
type: :development
|
233
|
+
prerelease: false
|
234
|
+
version_requirements: !ruby/object:Gem::Requirement
|
235
|
+
none: false
|
236
|
+
requirements:
|
237
|
+
- - ! '>='
|
238
|
+
- !ruby/object:Gem::Version
|
239
|
+
version: '0'
|
224
240
|
- !ruby/object:Gem::Dependency
|
225
241
|
name: simplecov
|
226
242
|
requirement: !ruby/object:Gem::Requirement
|
@@ -477,7 +493,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
477
493
|
version: '0'
|
478
494
|
requirements: []
|
479
495
|
rubyforge_project:
|
480
|
-
rubygems_version: 1.8.
|
496
|
+
rubygems_version: 1.8.24
|
481
497
|
signing_key:
|
482
498
|
specification_version: 3
|
483
499
|
summary: ActiveRecord for restful APIs
|