spyke 4.0.1 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/spyke/associations/belongs_to.rb +2 -2
- data/lib/spyke/associations/has_many.rb +7 -3
- data/lib/spyke/attribute_assignment.rb +10 -3
- data/lib/spyke/http.rb +1 -1
- data/lib/spyke/orm.rb +5 -2
- data/lib/spyke/version.rb +1 -1
- data/test/associations_test.rb +24 -2
- data/test/attributes_test.rb +1 -1
- data/test/orm_test.rb +28 -0
- data/test/support/fixtures.rb +4 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 577ad0ebdd60714a718b17b86a679185f8f9c636
|
4
|
+
data.tar.gz: b83cf403640604c5222fdbda68bce4628dc97b9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: baee2b01c8e6c987c47fad6c7ec0034c5cf438e669f9f5c2b2e65a35678d6387a909fe980dc4f7b10e7f8ca5c58ac0b6206cebb7a671132097d0aada67f252ce
|
7
|
+
data.tar.gz: b02433383758e4c430749baf650aceaa005eef0e7df9f7f2bf5df07a0049b27e4ae98e58f3043c1bf2317bba2512ad06849f52771af077c52910d2925dfbd143
|
@@ -3,8 +3,8 @@ module Spyke
|
|
3
3
|
class BelongsTo < Association
|
4
4
|
def initialize(*args)
|
5
5
|
super
|
6
|
-
@options.reverse_merge!(uri: "#{@name.to_s.pluralize}
|
7
|
-
@params[
|
6
|
+
@options.reverse_merge!(uri: "#{@name.to_s.pluralize}/:#{primary_key}", foreign_key: "#{klass.model_name.element}_id")
|
7
|
+
@params[primary_key] = parent.try(foreign_key)
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -3,7 +3,7 @@ module Spyke
|
|
3
3
|
class HasMany < Association
|
4
4
|
def initialize(*args)
|
5
5
|
super
|
6
|
-
@options.reverse_merge!(uri: "#{
|
6
|
+
@options.reverse_merge!(uri: "#{parent_path}/:#{foreign_key}/#{@name}/(:#{primary_key})")
|
7
7
|
@params[foreign_key] = parent.id
|
8
8
|
end
|
9
9
|
|
@@ -22,6 +22,10 @@ module Spyke
|
|
22
22
|
|
23
23
|
private
|
24
24
|
|
25
|
+
def parent_path
|
26
|
+
parent.class.model_name.element.pluralize
|
27
|
+
end
|
28
|
+
|
25
29
|
def combine_with_existing(incoming)
|
26
30
|
return incoming unless primary_keys_present_in_existing?
|
27
31
|
combined = embedded_attributes + incoming
|
@@ -35,11 +39,11 @@ module Spyke
|
|
35
39
|
end
|
36
40
|
|
37
41
|
def group_by_primary_key(array)
|
38
|
-
array.group_by { |h| h.with_indifferent_access[
|
42
|
+
array.group_by { |h| h.with_indifferent_access[primary_key].to_s }
|
39
43
|
end
|
40
44
|
|
41
45
|
def primary_keys_present_in_existing?
|
42
|
-
embedded_attributes && embedded_attributes.any? { |attr| attr.has_key?(
|
46
|
+
embedded_attributes && embedded_attributes.any? { |attr| attr.has_key?(primary_key) }
|
43
47
|
end
|
44
48
|
|
45
49
|
def clear_existing!
|
@@ -42,11 +42,11 @@ module Spyke
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def id
|
45
|
-
attributes[
|
45
|
+
attributes[primary_key]
|
46
46
|
end
|
47
47
|
|
48
48
|
def id=(value)
|
49
|
-
attributes[
|
49
|
+
attributes[primary_key] = value if value.present?
|
50
50
|
end
|
51
51
|
|
52
52
|
def hash
|
@@ -69,11 +69,18 @@ module Spyke
|
|
69
69
|
private
|
70
70
|
|
71
71
|
def use_setters(attributes)
|
72
|
+
# Set id attribute directly if using a custom primary key alongside an attribute named "id" to avoid clobbering
|
73
|
+
set_attribute :id, attributes.delete(:id) if conflicting_ids?(attributes)
|
74
|
+
|
72
75
|
attributes.each do |key, value|
|
73
76
|
send "#{key}=", value
|
74
77
|
end
|
75
78
|
end
|
76
79
|
|
80
|
+
def conflicting_ids?(attributes)
|
81
|
+
primary_key != :id && attributes.key?(:id) && attributes.key?(primary_key)
|
82
|
+
end
|
83
|
+
|
77
84
|
def method_missing(name, *args, &block)
|
78
85
|
case
|
79
86
|
when association?(name) then association(name).load
|
@@ -125,7 +132,7 @@ module Spyke
|
|
125
132
|
end
|
126
133
|
|
127
134
|
def inspect_attributes
|
128
|
-
attributes.except(
|
135
|
+
attributes.except(primary_key).map { |k, v| "#{k}: #{v.inspect}" }.join(' ')
|
129
136
|
end
|
130
137
|
end
|
131
138
|
end
|
data/lib/spyke/http.rb
CHANGED
data/lib/spyke/orm.rb
CHANGED
@@ -10,6 +10,9 @@ module Spyke
|
|
10
10
|
|
11
11
|
class_attribute :callback_methods, instance_accessor: false
|
12
12
|
self.callback_methods = { create: :post, update: :put }.freeze
|
13
|
+
|
14
|
+
class_attribute :primary_key
|
15
|
+
self.primary_key = :id
|
13
16
|
end
|
14
17
|
|
15
18
|
module ClassMethods
|
@@ -24,7 +27,7 @@ module Spyke
|
|
24
27
|
|
25
28
|
def find(id)
|
26
29
|
raise ResourceNotFound if id.blank?
|
27
|
-
where(
|
30
|
+
where(primary_key => id).find_one || raise(ResourceNotFound)
|
28
31
|
end
|
29
32
|
|
30
33
|
def fetch
|
@@ -38,7 +41,7 @@ module Spyke
|
|
38
41
|
end
|
39
42
|
|
40
43
|
def destroy(id = nil)
|
41
|
-
new(
|
44
|
+
new(primary_key => id).destroy
|
42
45
|
end
|
43
46
|
end
|
44
47
|
|
data/lib/spyke/version.rb
CHANGED
data/test/associations_test.rb
CHANGED
@@ -307,14 +307,14 @@ module Spyke
|
|
307
307
|
assert_equal %w{ flavor }, recipe.groups.map(&:title)
|
308
308
|
end
|
309
309
|
|
310
|
-
def test_nested_attributes_merging_with_existing_when_ids_present
|
310
|
+
def test_nested_attributes_merging_with_existing_when_ids_present
|
311
311
|
recipe = Recipe.new(groups_attributes: [{ id: 1, title: 'starter', description: 'nice' }, { id: 2, title: 'sauce', description: 'spicy' }])
|
312
312
|
recipe.attributes = { groups_attributes: [{ 'id' => '2', 'title' => 'flavor' }, { 'title' => 'spices', 'description' => 'lovely' }, { 'title' => 'sweetener', 'description' => 'sweet' }] }
|
313
313
|
assert_equal %w{ starter flavor spices sweetener }, recipe.groups.map(&:title)
|
314
314
|
assert_equal %w{ nice spicy lovely sweet }, recipe.groups.map(&:description)
|
315
315
|
end
|
316
316
|
|
317
|
-
def test_nested_attributes_appending_to_existing_when_ids_present
|
317
|
+
def test_nested_attributes_appending_to_existing_when_ids_present
|
318
318
|
recipe = Recipe.new(groups_attributes: [{ id: 1, title: 'starter' }, { id: 2, title: 'sauce' }])
|
319
319
|
recipe.attributes = { groups_attributes: [{ title: 'flavor' }] }
|
320
320
|
assert_equal %w{ starter sauce flavor }, recipe.groups.map(&:title)
|
@@ -428,5 +428,27 @@ module Spyke
|
|
428
428
|
Cookbook::Tip.new.votes
|
429
429
|
end
|
430
430
|
end
|
431
|
+
|
432
|
+
def test_custom_primary_key_for_belongs_to
|
433
|
+
comment_endpoint = stub_request(:get, 'http://sushi.com/comments/1').to_return_json(result: { user_id: 1 })
|
434
|
+
user_endpoint = stub_request(:get, 'http://sushi.com/users/1').to_return_json(result: { id: 2 })
|
435
|
+
user = Comment.find(1).user
|
436
|
+
assert_equal 2, user.id
|
437
|
+
assert_requested comment_endpoint
|
438
|
+
assert_requested user_endpoint
|
439
|
+
end
|
440
|
+
|
441
|
+
def test_custom_primary_key_for_has_many
|
442
|
+
stub_request(:get, 'http://sushi.com/comments/1').to_return_json(result: { users: [{ id: 1 }] })
|
443
|
+
comment = Comment.find(1)
|
444
|
+
assert_equal 1, comment.users.first.id
|
445
|
+
end
|
446
|
+
|
447
|
+
def test_custom_primary_key_with_nested_attributes
|
448
|
+
comment = Comment.new(users_attributes: [{ uuid: 1, name: "user_1" }])
|
449
|
+
comment.attributes = { users_attributes: [{ uuid: 1, name: "user_1_new_name"}] }
|
450
|
+
assert_equal %w{ user_1_new_name }, comment.users.map(&:name)
|
451
|
+
assert_equal [1], comment.users.map(&:id)
|
452
|
+
end
|
431
453
|
end
|
432
454
|
end
|
data/test/attributes_test.rb
CHANGED
@@ -139,7 +139,7 @@ module Spyke
|
|
139
139
|
recipe = Recipe.new
|
140
140
|
assert_equal '#<Recipe(recipes/(:id)) id: nil >', recipe.inspect
|
141
141
|
user = Recipe.new.build_user
|
142
|
-
assert_equal '#<User(users/:
|
142
|
+
assert_equal '#<User(users/:uuid) id: nil >', user.inspect
|
143
143
|
group = Recipe.new.groups.build
|
144
144
|
assert_equal '#<Group(recipes/:recipe_id/groups/(:id)) id: nil recipe_id: nil>', group.inspect
|
145
145
|
end
|
data/test/orm_test.rb
CHANGED
@@ -168,5 +168,33 @@ module Spyke
|
|
168
168
|
|
169
169
|
Spyke::Base.connection.url_prefix = previous
|
170
170
|
end
|
171
|
+
|
172
|
+
def test_custom_primary_key_on_collection
|
173
|
+
endpoint = stub_request(:get, 'http://sushi.com/users').to_return_json(result: [{ uuid: 1 }])
|
174
|
+
user = User.all.first
|
175
|
+
assert_requested endpoint
|
176
|
+
assert_equal 1, user.id
|
177
|
+
assert_equal 1, user.uuid
|
178
|
+
end
|
179
|
+
|
180
|
+
def test_custom_primary_key_and_id_are_the_same
|
181
|
+
endpoint = stub_request(:get, 'http://sushi.com/users').to_return_json(result: [{ uuid: 1 }])
|
182
|
+
user = User.all.first
|
183
|
+
assert_requested endpoint
|
184
|
+
assert_equal 1, user.id
|
185
|
+
assert_equal 1, user.uuid
|
186
|
+
assert_equal({ "uuid" => 1 }, user.attributes)
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_custom_primary_key_with_response_that_also_has_id_attribute
|
190
|
+
endpoint = stub_request(:get, 'http://sushi.com/users').to_return_json(result: [{ uuid: 1, id: 42 }])
|
191
|
+
user = User.all.to_a.first
|
192
|
+
assert_requested endpoint
|
193
|
+
|
194
|
+
assert_equal 1, user.id
|
195
|
+
assert_equal 1, user.uuid
|
196
|
+
assert_equal 1, user[:uuid]
|
197
|
+
assert_equal 42, user[:id]
|
198
|
+
end
|
171
199
|
end
|
172
200
|
end
|
data/test/support/fixtures.rb
CHANGED
@@ -94,6 +94,7 @@ class Ingredient < Spyke::Base
|
|
94
94
|
end
|
95
95
|
|
96
96
|
class User < Spyke::Base
|
97
|
+
self.primary_key = :uuid
|
97
98
|
has_many :recipes
|
98
99
|
end
|
99
100
|
|
@@ -102,7 +103,10 @@ class Photo < Spyke::Base
|
|
102
103
|
end
|
103
104
|
|
104
105
|
class Comment < Spyke::Base
|
106
|
+
belongs_to :user
|
107
|
+
has_many :users
|
105
108
|
scope :approved, -> { where(comment_approved: true) }
|
109
|
+
accepts_nested_attributes_for :users
|
106
110
|
end
|
107
111
|
|
108
112
|
class OtherApi < Spyke::Base
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spyke
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jens Balvig
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -334,3 +334,4 @@ test_files:
|
|
334
334
|
- test/support/fixtures.rb
|
335
335
|
- test/support/webmock.rb
|
336
336
|
- test/test_helper.rb
|
337
|
+
has_rdoc:
|