ddy_remote_resource 0.4.6 → 0.4.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/remote_resource/base.rb +1 -1
- data/lib/remote_resource/request.rb +1 -1
- data/lib/remote_resource/url_naming_determination.rb +14 -5
- data/lib/remote_resource/version.rb +1 -1
- data/spec/lib/remote_resource/base_spec.rb +1 -1
- data/spec/lib/remote_resource/connection_options_spec.rb +21 -19
- data/spec/lib/remote_resource/request_spec.rb +22 -0
- data/spec/lib/remote_resource/url_naming_determination_spec.rb +24 -6
- data/spec/lib/remote_resource/version_spec.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee1e160b0d79e1f23df3b5f2005f26440bd443c5
|
4
|
+
data.tar.gz: 85fb186045fd88dadeccd07f349c7695c4338df9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6e50af7d6a5c7049e2067ea0521c8f74030eedbf74644ff254d831b797c923c87c6e2f74c7e968cf2706ac65d86036a9e5ad212eed20d32e79b916cb34e8681a
|
7
|
+
data.tar.gz: 88f99d3f9c0d5b136095d0baf364017b821b8e8108019d642e8d73c24bc80b5188e5fe470b0236b3e63750a794b2a0b50cf82001c2026f74fda31a029e71b84a
|
data/lib/remote_resource/base.rb
CHANGED
@@ -2,7 +2,7 @@ module RemoteResource
|
|
2
2
|
module Base
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
-
OPTIONS = [:base_url, :site, :headers, :version, :path_prefix, :path_postfix, :content_type, :collection, :collection_name, :root_element]
|
5
|
+
OPTIONS = [:base_url, :site, :headers, :version, :path_prefix, :path_postfix, :collection_prefix, :content_type, :collection, :collection_name, :root_element]
|
6
6
|
|
7
7
|
included do
|
8
8
|
include Virtus.model
|
@@ -44,7 +44,7 @@ module RemoteResource
|
|
44
44
|
|
45
45
|
def determined_request_url
|
46
46
|
id = attributes[:id].presence
|
47
|
-
base_url = original_connection_options[:base_url].presence || determined_url_naming.base_url(id)
|
47
|
+
base_url = original_connection_options[:base_url].presence || determined_url_naming.base_url(id, check_collection_options: true)
|
48
48
|
content_type = connection_options[:content_type]
|
49
49
|
|
50
50
|
"#{base_url}#{content_type}"
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module RemoteResource
|
2
2
|
class UrlNamingDetermination
|
3
|
+
CollectionOptionKeyError = Class.new(StandardError)
|
3
4
|
|
4
5
|
attr_reader :resource_klass, :connection_options
|
5
6
|
|
@@ -8,7 +9,7 @@ module RemoteResource
|
|
8
9
|
@connection_options = connection_options
|
9
10
|
end
|
10
11
|
|
11
|
-
def base_url(id = nil)
|
12
|
+
def base_url(id = nil, check_collection_options: false)
|
12
13
|
site = connection_options.fetch(:site, resource_klass.site)
|
13
14
|
version = connection_options.fetch(:version, resource_klass.version)
|
14
15
|
path_prefix = connection_options.fetch(:path_prefix, resource_klass.path_prefix)
|
@@ -16,16 +17,24 @@ module RemoteResource
|
|
16
17
|
|
17
18
|
id = "/#{id}" if id.present?
|
18
19
|
|
19
|
-
"#{site}#{version.presence}#{path_prefix.presence}#{collection_prefix}/#{url_safe_relative_name}#{id}#{path_postfix.presence}"
|
20
|
+
"#{site}#{version.presence}#{path_prefix.presence}#{collection_prefix(check_collection_options)}/#{url_safe_relative_name}#{id}#{path_postfix.presence}"
|
20
21
|
end
|
21
22
|
|
22
|
-
def collection_prefix
|
23
|
+
def collection_prefix(check_collection_options)
|
23
24
|
prefix = connection_options.fetch(:collection_prefix, resource_klass.collection_prefix)
|
24
25
|
|
25
26
|
if prefix.present?
|
26
27
|
prefix = "/#{prefix}" unless prefix.chr == '/'
|
27
|
-
collection_options = connection_options.fetch(:collection_options).with_indifferent_access
|
28
|
-
|
28
|
+
collection_options = connection_options.fetch(:collection_options, {}).with_indifferent_access
|
29
|
+
|
30
|
+
prefix.gsub(/:\w+/) do |key|
|
31
|
+
value = collection_options.fetch(key[1..-1], nil)
|
32
|
+
if value.nil?
|
33
|
+
raise(CollectionOptionKeyError, "`collection_prefix` variable `#{key}` is missing from `collection_options`") if check_collection_options
|
34
|
+
value = key
|
35
|
+
end
|
36
|
+
URI.parser.escape(value.to_s)
|
37
|
+
end
|
29
38
|
end
|
30
39
|
end
|
31
40
|
|
@@ -23,7 +23,7 @@ describe RemoteResource::Base do
|
|
23
23
|
specify { expect(described_class.const_defined?('RemoteResource::Querying::PersistenceMethods')).to be_truthy }
|
24
24
|
|
25
25
|
describe 'OPTIONS' do
|
26
|
-
let(:options) { [:base_url, :site, :headers, :version, :path_prefix, :path_postfix, :content_type, :collection, :collection_name, :root_element] }
|
26
|
+
let(:options) { [:base_url, :site, :headers, :version, :path_prefix, :path_postfix, :collection_prefix, :content_type, :collection, :collection_name, :root_element] }
|
27
27
|
|
28
28
|
specify { expect(described_class::OPTIONS).to eql options }
|
29
29
|
end
|
@@ -6,15 +6,16 @@ describe RemoteResource::ConnectionOptions do
|
|
6
6
|
class ConnectionOptionsDummy
|
7
7
|
include RemoteResource::Base
|
8
8
|
|
9
|
-
self.site
|
10
|
-
self.content_type
|
11
|
-
self.extra_headers
|
12
|
-
self.version
|
13
|
-
self.path_prefix
|
14
|
-
self.path_postfix
|
15
|
-
self.content_type
|
16
|
-
self.
|
17
|
-
self.
|
9
|
+
self.site = 'https://foobar.com'
|
10
|
+
self.content_type = ''
|
11
|
+
self.extra_headers = { "X-Locale" => "nl" }
|
12
|
+
self.version = '/v1'
|
13
|
+
self.path_prefix = '/prefix'
|
14
|
+
self.path_postfix = '/postfix'
|
15
|
+
self.content_type = '.json'
|
16
|
+
self.collection_prefix = '/parent/:parent_id'
|
17
|
+
self.collection = true
|
18
|
+
self.root_element = :test_dummy
|
18
19
|
|
19
20
|
end
|
20
21
|
end
|
@@ -77,16 +78,17 @@ describe RemoteResource::ConnectionOptions do
|
|
77
78
|
describe '#to_hash' do
|
78
79
|
let(:connection_options_hash) do
|
79
80
|
{
|
80
|
-
base_url:
|
81
|
-
site:
|
82
|
-
headers:
|
83
|
-
version:
|
84
|
-
path_prefix:
|
85
|
-
path_postfix:
|
86
|
-
content_type:
|
87
|
-
|
88
|
-
|
89
|
-
|
81
|
+
base_url: 'https://foobar.com/v1/prefix/parent/:parent_id/connection_options_dummies/postfix',
|
82
|
+
site: 'https://foobar.com',
|
83
|
+
headers: { "Accept" => "application/json", "X-Locale" => "nl" },
|
84
|
+
version: '/v1',
|
85
|
+
path_prefix: '/prefix',
|
86
|
+
path_postfix: '/postfix',
|
87
|
+
content_type: '.json',
|
88
|
+
collection_prefix: '/parent/:parent_id',
|
89
|
+
collection: true,
|
90
|
+
collection_name: nil,
|
91
|
+
root_element: :test_dummy
|
90
92
|
}
|
91
93
|
end
|
92
94
|
|
@@ -11,6 +11,10 @@ describe RemoteResource::Request do
|
|
11
11
|
attr_accessor :name
|
12
12
|
|
13
13
|
end
|
14
|
+
|
15
|
+
class RequestDummyWithCollectionPrefix < RequestDummy
|
16
|
+
self.collection_prefix = '/parent/:parent_id'
|
17
|
+
end
|
14
18
|
end
|
15
19
|
|
16
20
|
let(:dummy_class) { RemoteResource::RequestDummy }
|
@@ -334,6 +338,24 @@ describe RemoteResource::Request do
|
|
334
338
|
expect(request.determined_request_url).to eql 'http://www.foobar.com/request_dummy.json'
|
335
339
|
end
|
336
340
|
end
|
341
|
+
|
342
|
+
context 'collection_prefix' do
|
343
|
+
let(:dummy_class) { RemoteResource::RequestDummyWithCollectionPrefix }
|
344
|
+
|
345
|
+
context 'when connection_options does include collection_options' do
|
346
|
+
let(:connection_options) do
|
347
|
+
{ collection_options: { parent_id: 23 } }
|
348
|
+
end
|
349
|
+
|
350
|
+
it { expect(request.determined_request_url).to eql 'http://www.foobar.com/parent/23/request_dummy_with_collection_prefix.json' }
|
351
|
+
end
|
352
|
+
|
353
|
+
context 'when connection_options does NOT include collection_options' do
|
354
|
+
it 'raises error' do
|
355
|
+
expect{ request.determined_request_url }.to raise_error(RemoteResource::UrlNamingDetermination::CollectionOptionKeyError)
|
356
|
+
end
|
357
|
+
end
|
358
|
+
end
|
337
359
|
end
|
338
360
|
|
339
361
|
describe '#determined_params' do
|
@@ -110,8 +110,14 @@ describe RemoteResource::UrlNamingDetermination do
|
|
110
110
|
{ collection_prefix: '/parent/:parent_id' }
|
111
111
|
end
|
112
112
|
|
113
|
-
it '
|
114
|
-
expect
|
113
|
+
it 'returns base_url with variable' do
|
114
|
+
expect(url_naming_determination.base_url).to eql 'http://www.foobar.com/parent/:parent_id/url_naming_determination_dummy'
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'when check_collection_options is true' do
|
118
|
+
it 'raises an exception' do
|
119
|
+
expect { url_naming_determination.base_url(nil, check_collection_options: true) }.to raise_error(RemoteResource::UrlNamingDetermination::CollectionOptionKeyError)
|
120
|
+
end
|
115
121
|
end
|
116
122
|
end
|
117
123
|
|
@@ -120,8 +126,14 @@ describe RemoteResource::UrlNamingDetermination do
|
|
120
126
|
{ collection_prefix: '/parent/:parent_id', collection_options: { other_id: 696 } }
|
121
127
|
end
|
122
128
|
|
123
|
-
it '
|
124
|
-
expect
|
129
|
+
it 'returns base_url with variable' do
|
130
|
+
expect(url_naming_determination.base_url).to eql 'http://www.foobar.com/parent/:parent_id/url_naming_determination_dummy'
|
131
|
+
end
|
132
|
+
|
133
|
+
context 'when check_collection_options is true' do
|
134
|
+
it 'raises an exception' do
|
135
|
+
expect { url_naming_determination.base_url(nil, check_collection_options: true) }.to raise_error(RemoteResource::UrlNamingDetermination::CollectionOptionKeyError)
|
136
|
+
end
|
125
137
|
end
|
126
138
|
end
|
127
139
|
end
|
@@ -142,8 +154,14 @@ describe RemoteResource::UrlNamingDetermination do
|
|
142
154
|
end
|
143
155
|
|
144
156
|
context 'when connection_options does NOT include collection_options' do
|
145
|
-
it '
|
146
|
-
expect
|
157
|
+
it 'returns base_url with variable' do
|
158
|
+
expect(url_naming_determination.base_url).to eql 'http://www.foobar.com/parent/:parent_id/url_naming_determination_dummy'
|
159
|
+
end
|
160
|
+
|
161
|
+
context 'when check_collection_options is true' do
|
162
|
+
it 'raises an exception' do
|
163
|
+
expect { url_naming_determination.base_url(nil, check_collection_options: true) }.to raise_error(RemoteResource::UrlNamingDetermination::CollectionOptionKeyError)
|
164
|
+
end
|
147
165
|
end
|
148
166
|
end
|
149
167
|
end
|