spyke 1.6.0 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|