spyke 5.4.2 → 6.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -3
- data/lib/spyke/associations/builder.rb +1 -1
- data/lib/spyke/http.rb +19 -11
- data/lib/spyke/relation.rb +5 -1
- data/lib/spyke/version.rb +1 -1
- data/test/associations_test.rb +9 -0
- data/test/path_test.rb +2 -2
- data/test/scopes_test.rb +8 -0
- data/test/support/fixtures.rb +3 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8a623ec5e619581883a58962e9961e7bc04f889e7c4dfdfd5712d2e7e82953b
|
4
|
+
data.tar.gz: e9730e060fbcd6cfb3bf4a718a779d9de490878da0728d1643fbb18f2004968f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec2cacb0215d0d780484fb184e5e06aab71cc06e5b7312c41cbf337830e3ad5e1167a00fd255c0354d4293409763e03d076a53362654512f4da19fa925980485
|
7
|
+
data.tar.gz: 80607d11d9501f9b6f69cfbf311a099130c0904e37879b58a30df4794f758f131360b6c19eadd9d3086e5b8c284c4eed7399219f2edf82f8a260625c992a7997
|
data/README.md
CHANGED
@@ -131,8 +131,6 @@ Post.find(4) # => GET http://api.com/posts/4
|
|
131
131
|
Custom request methods and the `with` scope methods allow you to
|
132
132
|
perform requests for non-REST actions:
|
133
133
|
|
134
|
-
The `.with` scope:
|
135
|
-
|
136
134
|
```ruby
|
137
135
|
Post.with('posts/recent') # => GET http://api.com/posts/recent
|
138
136
|
Post.with(:recent) # => GET http://api.com/posts/recent
|
@@ -172,7 +170,7 @@ Spyke expects errors to be formatted in the same way as the
|
|
172
170
|
[ActiveModel::Errors details hash](https://cowbell-labs.com/2015-01-22-active-model-errors-details.html), ie:
|
173
171
|
|
174
172
|
```ruby
|
175
|
-
{ title: [{ error: 'blank'}, { error: 'too_short', count: 10 }]}
|
173
|
+
{ title: [{ error: 'blank'}, { error: 'too_short', count: 10 }] }
|
176
174
|
```
|
177
175
|
|
178
176
|
If the API you're using returns errors in a different format you can
|
@@ -29,7 +29,7 @@ module Spyke
|
|
29
29
|
candidates << type_name
|
30
30
|
|
31
31
|
candidates.each do |candidate|
|
32
|
-
constant =
|
32
|
+
constant = candidate.safe_constantize
|
33
33
|
return constant if candidate == constant.to_s
|
34
34
|
end
|
35
35
|
raise NameError.new("uninitialized constant #{candidates.first}", candidates.first)
|
data/lib/spyke/http.rb
CHANGED
@@ -41,20 +41,28 @@ module Spyke
|
|
41
41
|
@uri ||= uri_template || default_uri
|
42
42
|
end
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
44
|
+
private
|
45
|
+
|
46
|
+
def send_request(method, path, params)
|
47
|
+
connection.send(method) do |request|
|
48
|
+
if method == :get
|
49
|
+
path, params = merge_query_params(path, params)
|
50
|
+
request.url path, params
|
51
|
+
else
|
52
|
+
request.url path.to_s
|
53
|
+
request.body = params
|
54
|
+
end
|
51
55
|
end
|
56
|
+
rescue Faraday::ConnectionFailed, Faraday::TimeoutError
|
57
|
+
raise ConnectionError
|
52
58
|
end
|
53
|
-
rescue Faraday::ConnectionFailed, Faraday::TimeoutError
|
54
|
-
raise ConnectionError
|
55
|
-
end
|
56
59
|
|
57
|
-
|
60
|
+
def merge_query_params(path, params)
|
61
|
+
parsed_uri = Addressable::URI.parse(path.to_s)
|
62
|
+
path = parsed_uri.path
|
63
|
+
params = params.merge(parsed_uri.query_values || {})
|
64
|
+
[path, params]
|
65
|
+
end
|
58
66
|
|
59
67
|
def scoped_request(method)
|
60
68
|
uri = new.uri
|
data/lib/spyke/relation.rb
CHANGED
@@ -5,7 +5,7 @@ module Spyke
|
|
5
5
|
include Enumerable
|
6
6
|
|
7
7
|
attr_reader :klass
|
8
|
-
|
8
|
+
attr_reader :params
|
9
9
|
delegate :to_ary, :[], :any?, :empty?, :last, :size, :metadata, to: :find_some
|
10
10
|
|
11
11
|
def initialize(klass, options = {})
|
@@ -21,6 +21,10 @@ module Spyke
|
|
21
21
|
relation
|
22
22
|
end
|
23
23
|
|
24
|
+
def params=(params)
|
25
|
+
@params = params.symbolize_keys
|
26
|
+
end
|
27
|
+
|
24
28
|
def with(uri)
|
25
29
|
if uri.is_a? Symbol
|
26
30
|
@options[:uri] = File.join @options[:uri], uri.to_s
|
data/lib/spyke/version.rb
CHANGED
data/test/associations_test.rb
CHANGED
@@ -241,6 +241,15 @@ module Spyke
|
|
241
241
|
assert_requested endpoint
|
242
242
|
end
|
243
243
|
|
244
|
+
|
245
|
+
def test_using_where_with_custom_uri_including_query_params
|
246
|
+
endpoint = stub_request(:get, 'http://sushi.com/featured_ingredients?filter[group_id]=1&filter[status]=published')
|
247
|
+
|
248
|
+
Group.new(id: 1).featured_ingredients.where(filter: { status: 'published' }).to_a
|
249
|
+
|
250
|
+
assert_requested endpoint
|
251
|
+
end
|
252
|
+
|
244
253
|
def test_path_inferred_from_name
|
245
254
|
endpoint = stub_request(:get, 'http://sushi.com/recipes/1/gallery_images')
|
246
255
|
Recipe.new(id: 1).gallery_images.to_a
|
data/test/path_test.rb
CHANGED
@@ -21,13 +21,13 @@ module Spyke
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_required_variables
|
24
|
-
assert_raises
|
24
|
+
assert_raises InvalidPathError, 'Missing required variables: user_id in /users/:user_id/recipes/(:id)' do
|
25
25
|
Path.new('/users/:user_id/recipes/(:id)', id: 2).to_s
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
def test_mix_of_required_and_unrequired_variables
|
30
|
-
assert_raises
|
30
|
+
assert_raises InvalidPathError, 'Missing required variables: part2, part4' do
|
31
31
|
Path.new('/1/profiles(/:part1)/:part2(/:part3)/:part4.xml').to_s
|
32
32
|
end
|
33
33
|
end
|
data/test/scopes_test.rb
CHANGED
@@ -61,6 +61,14 @@ module Spyke
|
|
61
61
|
assert_requested endpoint
|
62
62
|
end
|
63
63
|
|
64
|
+
def test_where_with_stringified_keys
|
65
|
+
endpoint = stub_request(:get, 'http://sushi.com/recipes/1/image')
|
66
|
+
|
67
|
+
RecipeImage.where("recipe_id" => 1).to_a
|
68
|
+
|
69
|
+
assert_requested endpoint
|
70
|
+
end
|
71
|
+
|
64
72
|
def test_chainable_class_method
|
65
73
|
endpoint = stub_request(:get, 'http://sushi.com/recipes?status=published&per_page=3')
|
66
74
|
|
data/test/support/fixtures.rb
CHANGED
@@ -79,6 +79,7 @@ end
|
|
79
79
|
|
80
80
|
class Group < Spyke::Base
|
81
81
|
has_many :ingredients, uri: nil
|
82
|
+
has_many :featured_ingredients, uri: 'featured_ingredients?filter[group_id]=:group_id', class_name: "Ingredient"
|
82
83
|
accepts_nested_attributes_for :ingredients
|
83
84
|
|
84
85
|
def self.build_default
|
@@ -119,10 +120,10 @@ end
|
|
119
120
|
class OtherRecipe < OtherApi
|
120
121
|
uri 'recipes/(:id)'
|
121
122
|
|
122
|
-
def self.
|
123
|
+
def self.request(method, path, params)
|
123
124
|
super
|
124
125
|
rescue Spyke::ConnectionError
|
125
|
-
Recipe.
|
126
|
+
Recipe.request(method, path, params)
|
126
127
|
end
|
127
128
|
end
|
128
129
|
|
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
|
+
version: 6.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jens Balvig
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -318,7 +318,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
318
318
|
- !ruby/object:Gem::Version
|
319
319
|
version: '0'
|
320
320
|
requirements: []
|
321
|
-
rubygems_version: 3.
|
321
|
+
rubygems_version: 3.2.3
|
322
322
|
signing_key:
|
323
323
|
specification_version: 4
|
324
324
|
summary: Interact with REST services in an ActiveRecord-like manner
|