api_resource 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- api_resource (0.6.0)
4
+ api_resource (0.6.1)
5
5
  colorize
6
6
  differ
7
7
  json
@@ -69,7 +69,7 @@ GEM
69
69
  guard-rspec (2.3.3)
70
70
  guard (>= 1.1)
71
71
  rspec (~> 2.11)
72
- guard-spork (1.4.0)
72
+ guard-spork (1.4.1)
73
73
  childprocess (>= 0.2.3)
74
74
  guard (>= 1.1)
75
75
  spork (>= 0.8.4)
@@ -81,7 +81,7 @@ GEM
81
81
  i18n (0.6.1)
82
82
  journey (1.0.4)
83
83
  json (1.7.6)
84
- listen (0.7.0)
84
+ listen (0.7.1)
85
85
  log4r (1.1.10)
86
86
  lumberjack (1.0.2)
87
87
  mail (2.4.4)
@@ -99,7 +99,7 @@ GEM
99
99
  coderay (~> 1.0.5)
100
100
  method_source (~> 0.8)
101
101
  slop (~> 3.3.1)
102
- rack (1.4.1)
102
+ rack (1.4.3)
103
103
  rack-cache (1.2)
104
104
  rack (>= 0.4)
105
105
  rack-ssl (1.3.2)
@@ -8,6 +8,7 @@ module ApiResource
8
8
  #TODO: many of these methods should also force loading of the resource definition
9
9
  extend ActiveSupport::Concern
10
10
  extend ActiveSupport::Autoload
11
+ include ActiveModel::Dirty
11
12
 
12
13
  autoload :AssociationProxy
13
14
  autoload :BelongsToRemoteObjectProxy
@@ -142,11 +143,18 @@ module ApiResource
142
143
  end
143
144
 
144
145
  # TODO: add a special foreign_key option to associations
145
- def association_foreign_key_field(assoc)
146
+ def association_foreign_key_field(assoc, type = nil)
147
+
148
+ if type.nil? && has_many?(assoc)
149
+ type = :has_many
150
+ else
151
+ type = type.to_s.to_sym
152
+ end
153
+
146
154
  # for now just use the association name
147
155
  str = assoc.to_s.singularize.foreign_key
148
156
 
149
- if has_many?(assoc)
157
+ if type == :has_many
150
158
  str = str.pluralize
151
159
  end
152
160
 
@@ -177,19 +185,15 @@ module ApiResource
177
185
  end
178
186
 
179
187
  def define_association_as_attribute(assoc_type, assoc_name)
188
+ id_method_name = association_foreign_key_field(assoc_name, assoc_type)
189
+
180
190
  # set up dirty tracking for associations, but only for ApiResource
181
191
  # these methods are also used for ActiveRecord
182
192
  # TODO: change this
183
193
  if self.ancestors.include?(ApiResource::Base)
184
194
  define_attribute_method(assoc_name)
195
+ define_attribute_method(id_method_name)
185
196
  end
186
-
187
- id_method_name = assoc_name.to_s.singularize + "_id"
188
-
189
- if assoc_type.to_s == "has_many"
190
- id_method_name += "s"
191
- end
192
-
193
197
  # TODO: Come up with a better implementation for the foreign key thing
194
198
  # implement the rest of the active record methods, refactor this into something
195
199
  # a little bit more sensible
@@ -223,11 +227,19 @@ module ApiResource
223
227
  end
224
228
 
225
229
  def #{id_method_name}
226
- @attributes_cache[:#{id_method_name}] ||=
227
- @attributes[:#{id_method_name}] || self.#{assoc_name}.collect(&:id)
230
+ @attributes_cache[:#{id_method_name}] ||= begin
231
+ if @attributes.key?(:#{id_method_name})
232
+ @attributes[:#{id_method_name}]
233
+ else
234
+ self.#{assoc_name}.collect(&:id)
235
+ end
236
+ end
228
237
  end
229
238
 
230
- def #{id_method_name}=(val)
239
+ def #{id_method_name}=(val, force = false)
240
+ unless @attributes_cache[:#{id_method_name}] == val
241
+ #{id_method_name}_will_change!
242
+ end
231
243
  @attributes_cache[:#{id_method_name}] = val
232
244
  end
233
245
 
@@ -536,6 +536,16 @@ module ApiResource
536
536
  !self.attribute?(key) || self.protected_attribute?(key) ? accum : accum.merge(key => val)
537
537
  end
538
538
  end
539
+
540
+ # also add in the _id fields that are changed
541
+ ret = self.association_names.inject(ret) do |accum, assoc_name|
542
+ id_method = self.class.association_foreign_key_field(assoc_name)
543
+ if self.changes[id_method].present?
544
+ accum[id_method] = self.changes[id_method].last
545
+ end
546
+ accum
547
+ end
548
+
539
549
  options[:include_associations].each do |assoc|
540
550
  if self.association?(assoc)
541
551
  ret[assoc] = self.send(assoc).serializable_hash({
@@ -60,9 +60,14 @@ module ApiResource
60
60
  id_hash = HashWithIndifferentAccess.new(id_hash)
61
61
  # load each individually
62
62
  self.condition.included_objects.inject(hsh) do |accum, assoc|
63
- accum[assoc.to_sym] = self.klass.association_class(assoc).all(
64
- :params => {:ids => id_hash[assoc]}
65
- )
63
+ id_hash[assoc].each_slice(400).each do |ids|
64
+ accum[assoc.to_sym] ||= []
65
+ accum[assoc.to_sym].concat(
66
+ self.klass.association_class(assoc).all(
67
+ :params => {:ids => ids}
68
+ )
69
+ )
70
+ end
66
71
  accum
67
72
  end
68
73
 
@@ -51,7 +51,7 @@ module ApiResource
51
51
  args.slice(i, args.count)
52
52
  # Else we are only dealing with a single argument
53
53
  else
54
- if arg_types[i] == :req || args[i].present?
54
+ if arg_types[i] == :req || (i < args.count)
55
55
  finder_opts[scope_name][arg_name] = args[i]
56
56
  end
57
57
  end
@@ -1,3 +1,3 @@
1
1
  module ApiResource
2
- VERSION = "0.6.1"
2
+ VERSION = "0.6.2"
3
3
  end
@@ -260,6 +260,21 @@ describe "Associations" do
260
260
  ap.test.should eql("testval")
261
261
 
262
262
  end
263
+
264
+ it "should include the foreign_key_id when saving" do
265
+ tr = TestResource.new
266
+ tr.belongs_to_object_id = 4
267
+ hsh = tr.serializable_hash
268
+ hsh[:belongs_to_object_id].should eql(4)
269
+ end
270
+
271
+ it "should serialize the foreign_key_id when saving if it is updated" do
272
+ TestResource.connection
273
+ tr = TestResource.find(1)
274
+ tr.belongs_to_object_id = 5
275
+ hsh = tr.serializable_hash
276
+ hsh[:belongs_to_object_id].should eql(5)
277
+ end
263
278
  end
264
279
 
265
280
  describe "Multi Object Associations" do
@@ -343,6 +358,27 @@ describe "Associations" do
343
358
  )
344
359
  ap.remote_path.should eql("/route")
345
360
  end
361
+
362
+ it "should include the foreign_key_id when saving" do
363
+ tr = TestResource.new
364
+ tr.has_many_object_ids = [4]
365
+ hsh = tr.serializable_hash
366
+ hsh[:has_many_object_ids].should eql([4])
367
+ end
368
+
369
+ it "should serialize the foreign_key_id when saving if it is updated" do
370
+ tr = TestResource.find(1)
371
+ tr.has_many_object_ids = [5]
372
+ hsh = tr.serializable_hash
373
+ hsh[:has_many_object_ids].should eql([5])
374
+ end
375
+
376
+ it "should not try to load if the foreign key is nil" do
377
+ TestResource.connection.expects(:get).returns(:id => 1, :belongs_to_object_id => nil)
378
+ tr = TestResource.find(1)
379
+ tr.id.should eql(1)
380
+ tr.belongs_to_object_id.should be_nil
381
+ end
346
382
  end
347
383
 
348
384
  end
@@ -75,4 +75,11 @@ describe "Conditions" do
75
75
  obj.collect{|o| o * 2}.should eql([2,4])
76
76
  end
77
77
 
78
+ it "should not typecast nil and false to true when creating condition hashes" do
79
+ obj = TestResource.paginate(false, nil)
80
+ hsh = obj.to_hash["paginate"]
81
+ hsh["per_page"].should eql(false)
82
+ hsh.should be_key(:current_page)
83
+ end
84
+
78
85
  end
@@ -35,4 +35,23 @@ describe ApiResource::Finders do
35
35
  TestResource.includes(:has_many_objects).find(1)
36
36
  end
37
37
 
38
+ it "should be able to use a scope with arguments" do
39
+ TestResource.connection.expects(:get)
40
+ .with("/test_resources.json?active=true&birthday%5Bdate%5D=5").returns([{"id" => 10}])
41
+
42
+ res = TestResource.active.birthday(5).all
43
+ res.should be_a(Array)
44
+ res.first.id.should eql(10)
45
+ end
46
+
47
+ it "should be able to use a scope with multiple arguments" do
48
+ TestResource.connection.expects(:get)
49
+ .with("/test_resources.json?paginate%5Bcurrent_page%5D=10&paginate%5Bper_page%5D=5")
50
+ .returns([{:id => 20}])
51
+
52
+ res = TestResource.paginate(5, 10).all
53
+ res.should be_a(Array)
54
+ res.first.id.should eql(20)
55
+ end
56
+
38
57
  end
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.1
4
+ version: 0.6.2
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-01-04 00:00:00.000000000 Z
14
+ date: 2013-01-07 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rake