spyke 1.6.0 → 1.7.0
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 +3 -3
- data/lib/spyke/associations/has_many.rb +1 -1
- data/lib/spyke/http.rb +1 -1
- data/lib/spyke/path.rb +30 -5
- data/lib/spyke/version.rb +1 -1
- data/test/path_test.rb +9 -3
- data/test/relation_test.rb +8 -0
- data/test/support/fixtures.rb +12 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b1e4e0a09a6e130d78cdfc11ad4c46baee78c332
|
4
|
+
data.tar.gz: ef161ce8bdf5013e36e41e5054ac461d58c84b88
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf368cf28410559c6fdc38f3f14c24b28effe957d05249aced614adfcbcb39869dc6092c329c46c1bc79ce30200167e481db4c1a1925005c21d6072596d5a3e5
|
7
|
+
data.tar.gz: be1d98fa2a3fab4ef8e19cee15d179a4a937a8108bfe5f789a6406aa9e2c9652bd754e256eb25ecbbb59dea79d40585a3d29351d505e335a65eb14d04e2d6c2a
|
data/README.md
CHANGED
@@ -58,7 +58,7 @@ end
|
|
58
58
|
Spyke::Config.connection = Faraday.new(url: 'http://api.com') do |c|
|
59
59
|
c.request :json
|
60
60
|
c.use JSONParser
|
61
|
-
c.
|
61
|
+
c.adapter Faraday.default_adapter
|
62
62
|
end
|
63
63
|
```
|
64
64
|
|
@@ -104,10 +104,10 @@ You can specify custom URIs on both the class and association level:
|
|
104
104
|
|
105
105
|
```ruby
|
106
106
|
class User < Spyke::Base
|
107
|
-
uri '/v1/users
|
107
|
+
uri '/v1/users/(:id)' # id optional, both /v1/users and /v1/users/4 are usable
|
108
108
|
|
109
109
|
has_one :image, uri: nil
|
110
|
-
has_many :posts, uri: '/posts/for_user/:user_id'
|
110
|
+
has_many :posts, uri: '/posts/for_user/:user_id' # user_id is required
|
111
111
|
end
|
112
112
|
|
113
113
|
class Post < Spyke::Base
|
@@ -3,7 +3,7 @@ module Spyke
|
|
3
3
|
class HasMany < Association
|
4
4
|
def initialize(*args)
|
5
5
|
super
|
6
|
-
@options.reverse_merge!(uri: "/#{parent.class.model_name.plural}/:#{foreign_key}/#{klass.model_name.plural}
|
6
|
+
@options.reverse_merge!(uri: "/#{parent.class.model_name.plural}/:#{foreign_key}/#{klass.model_name.plural}/(:id)")
|
7
7
|
@params[foreign_key] = parent.id
|
8
8
|
end
|
9
9
|
|
data/lib/spyke/http.rb
CHANGED
data/lib/spyke/path.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'uri_template'
|
2
2
|
|
3
3
|
module Spyke
|
4
|
+
class InvalidPathError < StandardError; end
|
4
5
|
class Path
|
5
|
-
|
6
|
-
|
7
|
-
@
|
6
|
+
|
7
|
+
def initialize(pattern, params = {})
|
8
|
+
@pattern = pattern
|
9
|
+
@params = params.symbolize_keys
|
8
10
|
end
|
9
11
|
|
10
12
|
def join(other_path)
|
@@ -16,13 +18,36 @@ module Spyke
|
|
16
18
|
end
|
17
19
|
|
18
20
|
def variables
|
19
|
-
@variables ||=
|
21
|
+
@variables ||= uri_template.variables.map(&:to_sym)
|
20
22
|
end
|
21
23
|
|
22
24
|
private
|
23
25
|
|
26
|
+
def uri_template
|
27
|
+
@uri_template ||= URITemplate.new(:colon, pattern_with_rfc_style_parens)
|
28
|
+
end
|
29
|
+
|
30
|
+
def pattern_with_rfc_style_parens
|
31
|
+
@pattern.gsub('(', '{').gsub(')', '}')
|
32
|
+
end
|
33
|
+
|
24
34
|
def path
|
25
|
-
|
35
|
+
validate_required_params!
|
36
|
+
uri_template.expand(@params).chomp('/')
|
37
|
+
end
|
38
|
+
|
39
|
+
def validate_required_params!
|
40
|
+
if missing_required_params.any?
|
41
|
+
raise Spyke::InvalidPathError, "Missing required params: #{missing_required_params.join(', ')} in #{@pattern}. Mark optional params with parens eg: (:param)"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def missing_required_params
|
46
|
+
required_params - @params.keys
|
47
|
+
end
|
48
|
+
|
49
|
+
def required_params
|
50
|
+
@pattern.scan(/\/:(\w+)/).flatten.map(&:to_sym)
|
26
51
|
end
|
27
52
|
end
|
28
53
|
end
|
data/lib/spyke/version.rb
CHANGED
data/test/path_test.rb
CHANGED
@@ -3,15 +3,15 @@ require 'test_helper'
|
|
3
3
|
module Spyke
|
4
4
|
class PathTest < MiniTest::Test
|
5
5
|
def test_collection_path
|
6
|
-
assert_equal '/recipes', Path.new('/recipes
|
6
|
+
assert_equal '/recipes', Path.new('/recipes/(:id)').to_s
|
7
7
|
end
|
8
8
|
|
9
9
|
def test_resource_path
|
10
|
-
assert_equal '/recipes/2', Path.new('/recipes
|
10
|
+
assert_equal '/recipes/2', Path.new('/recipes/(:id)', id: 2).to_s
|
11
11
|
end
|
12
12
|
|
13
13
|
def test_nested_collection_path
|
14
|
-
path = Path.new('/users/:user_id/recipes
|
14
|
+
path = Path.new('/users/:user_id/recipes/(:id)', user_id: 1, status: 'published')
|
15
15
|
assert_equal [:user_id, :id], path.variables
|
16
16
|
assert_equal '/users/1/recipes', path.to_s
|
17
17
|
end
|
@@ -19,5 +19,11 @@ module Spyke
|
|
19
19
|
def test_nested_resource_path
|
20
20
|
assert_equal '/users/1/recipes/2', Path.new('/users/:user_id/recipes/:id', user_id: 1, id: 2).to_s
|
21
21
|
end
|
22
|
+
|
23
|
+
def test_required_params
|
24
|
+
assert_raises Spyke::InvalidPathError, 'Missing required params: user_id in /users/:user_id/recipes/(:id)' do
|
25
|
+
Path.new('/users/:user_id/recipes/(:id)', id: 2).to_s
|
26
|
+
end
|
27
|
+
end
|
22
28
|
end
|
23
29
|
end
|
data/test/relation_test.rb
CHANGED
@@ -116,5 +116,13 @@ module Spyke
|
|
116
116
|
Recipe.published.to_a
|
117
117
|
assert_requested endpoint_2, times: 1
|
118
118
|
end
|
119
|
+
|
120
|
+
def test_namespaced_model
|
121
|
+
tip_endpoint = stub_request(:get, 'http://sushi.com/tips/1').to_return_json(result: { id: 1 })
|
122
|
+
likes_endpoint = stub_request(:get, 'http://sushi.com/tips/1/likes')
|
123
|
+
Cookbook::Tip.find(1).likes.first
|
124
|
+
assert_requested tip_endpoint
|
125
|
+
assert_requested likes_endpoint
|
126
|
+
end
|
119
127
|
end
|
120
128
|
end
|
data/test/support/fixtures.rb
CHANGED
@@ -59,7 +59,7 @@ class Group < Spyke::Base
|
|
59
59
|
end
|
60
60
|
|
61
61
|
class Ingredient < Spyke::Base
|
62
|
-
uri '/recipes/:recipe_id/ingredients
|
62
|
+
uri '/recipes/:recipe_id/ingredients/(:id)'
|
63
63
|
end
|
64
64
|
|
65
65
|
class User < Spyke::Base
|
@@ -67,7 +67,7 @@ class User < Spyke::Base
|
|
67
67
|
end
|
68
68
|
|
69
69
|
class Photo < Spyke::Base
|
70
|
-
uri '/images/photos
|
70
|
+
uri '/images/photos/(:id)'
|
71
71
|
end
|
72
72
|
|
73
73
|
class Comment < Spyke::Base
|
@@ -87,3 +87,13 @@ class Search
|
|
87
87
|
recipes.metadata[:suggestions]
|
88
88
|
end
|
89
89
|
end
|
90
|
+
|
91
|
+
module Cookbook
|
92
|
+
class Tip < Spyke::Base
|
93
|
+
uri '/tips/(:id)'
|
94
|
+
has_many :likes, class_name: 'Cookbook::Like', uri: '/tips/:cookbook_tip_id/likes/(:id)'
|
95
|
+
end
|
96
|
+
|
97
|
+
class Like < Spyke::Base
|
98
|
+
end
|
99
|
+
end
|
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: 1.
|
4
|
+
version: 1.7.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: 2015-01-
|
11
|
+
date: 2015-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|