delivery-sdk-ruby 1.0.2 → 1.0.3
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 +21 -1
- data/lib/delivery-sdk-ruby.rb +1 -0
- data/lib/delivery/client/delivery_client.rb +16 -7
- data/lib/delivery/client/delivery_query.rb +16 -82
- data/lib/delivery/client/request_manager.rb +96 -0
- data/lib/delivery/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c6d87b3a7e5e623b5a4cb2a7895f013a728f0db61b1262d45b54164dd5643f1f
|
4
|
+
data.tar.gz: d67e6da84bbb02eb12c7c12c79e3e7ef0dd19e37344b9009205106c41b61a9c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 21039d8c46e5404f0997f7ffbb71ed997d1b3ce5d8d83770da3701dca4b2263533ab20e3b17cd10e1370c24dd4bf84ca4735784efc00c38dfe097bd5bfe055c1
|
7
|
+
data.tar.gz: 2c1e1f3a77db72f6e19943d932d0357f8f06efbf2945a2780d8e09287dfa784381d493a4c3b981d0785ebddd332de49308030d0d05644dbf94faad1e53122c33
|
data/README.md
CHANGED
@@ -90,6 +90,26 @@ KenticoCloud::Delivery::DeliveryClient.new project_id: '<your-project-id>',
|
|
90
90
|
secure_key: '<your-secure-key>'
|
91
91
|
```
|
92
92
|
|
93
|
+
### Retry policy
|
94
|
+
|
95
|
+
By default, the SDK uses a retry policy, asking for requested content again in case of an error. The default policy retries the HTTP requests if the following status codes are returned:
|
96
|
+
|
97
|
+
* 408 - `RequestTimeout`
|
98
|
+
* 500 - `InternalServerError`
|
99
|
+
* 502 - `BadGateway`
|
100
|
+
* 503 - `ServiceUnavailable`
|
101
|
+
* 504 - `GatewayTimeout`
|
102
|
+
|
103
|
+
The default policy retries requests 5 times, totaling 6 overall attempts to retrieve content before returning a `ResponseBase` object containing the error. The consecutive attempts are delayed exponentially: 200 milliseconds, 400 milliseconds, 800 milliseconds, etc.
|
104
|
+
|
105
|
+
To disable the retry policy, you can use the `with_retry_policy` argument:
|
106
|
+
|
107
|
+
```ruby
|
108
|
+
KenticoCloud::Delivery::DeliveryClient.new project_id: '<your-project-id>',
|
109
|
+
secure_key: '<your-secure-key>',
|
110
|
+
with_retry_policy: false
|
111
|
+
```
|
112
|
+
|
93
113
|
## Listing items
|
94
114
|
|
95
115
|
|
@@ -354,7 +374,7 @@ link_resolver = KenticoCloud::Delivery::Resolvers::ContentLinkResolver.new(lambd
|
|
354
374
|
return "/coffees/#{link.url_slug}" if link.type.eql? 'coffee'
|
355
375
|
return "/brewers/#{link.url_slug}" if link.type.eql? 'brewer'
|
356
376
|
end, lambda do |id|
|
357
|
-
#
|
377
|
+
# Link broken
|
358
378
|
return "/notfound?id=#{id}"
|
359
379
|
end)
|
360
380
|
delivery_client = KenticoCloud::Delivery::DeliveryClient.new project_id: '<your-project-id>',
|
data/lib/delivery-sdk-ruby.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/delivery/client/delivery_client'
|
2
2
|
require File.dirname(__FILE__) + '/delivery/client/delivery_query'
|
3
|
+
require File.dirname(__FILE__) + '/delivery/client/request_manager'
|
3
4
|
require File.dirname(__FILE__) + '/delivery/models/content_item'
|
4
5
|
require File.dirname(__FILE__) + '/delivery/models/content_type'
|
5
6
|
require File.dirname(__FILE__) + '/delivery/models/taxonomy_group'
|
@@ -23,12 +23,14 @@ module KenticoCloud
|
|
23
23
|
# - secure_key (+string+)
|
24
24
|
# - content_link_url_resolver ( KenticoCloud::Delivery::Resolvers::ContentLinkResolver )
|
25
25
|
# - inline_content_item_resolver ( KenticoCloud::Delivery::Resolvers::InlineContentItemResolver )
|
26
|
+
# - with_retry_policy (+bool+)
|
26
27
|
def initialize(config)
|
27
28
|
@project_id = config.fetch(:project_id)
|
28
29
|
@preview_key = config.fetch(:preview_key, nil)
|
29
30
|
@secure_key = config.fetch(:secure_key, nil)
|
30
31
|
@content_link_url_resolver = config.fetch(:content_link_url_resolver, nil)
|
31
32
|
@inline_content_item_resolver = config.fetch(:inline_content_item_resolver, nil)
|
33
|
+
@with_retry_policy = config.fetch(:with_retry_policy, true)
|
32
34
|
self.use_preview = !@preview_key.nil?
|
33
35
|
end
|
34
36
|
|
@@ -39,7 +41,8 @@ module KenticoCloud
|
|
39
41
|
def types
|
40
42
|
DeliveryQuery.new project_id: @project_id,
|
41
43
|
secure_key: @secure_key,
|
42
|
-
query_type: QUERY_TYPE_TYPES
|
44
|
+
query_type: QUERY_TYPE_TYPES,
|
45
|
+
with_retry_policy: @with_retry_policy
|
43
46
|
end
|
44
47
|
|
45
48
|
# Return a single content type of the project
|
@@ -53,7 +56,8 @@ module KenticoCloud
|
|
53
56
|
DeliveryQuery.new project_id: @project_id,
|
54
57
|
secure_key: @secure_key,
|
55
58
|
code_name: code_name,
|
56
|
-
query_type: QUERY_TYPE_TYPES
|
59
|
+
query_type: QUERY_TYPE_TYPES,
|
60
|
+
with_retry_policy: @with_retry_policy
|
57
61
|
end
|
58
62
|
|
59
63
|
# Return all content items of the project
|
@@ -69,7 +73,8 @@ module KenticoCloud
|
|
69
73
|
qp: query_parameters,
|
70
74
|
content_link_url_resolver: @content_link_url_resolver,
|
71
75
|
inline_content_item_resolver: @inline_content_item_resolver,
|
72
|
-
query_type: QUERY_TYPE_ITEMS
|
76
|
+
query_type: QUERY_TYPE_ITEMS,
|
77
|
+
with_retry_policy: @with_retry_policy
|
73
78
|
q.use_preview = use_preview
|
74
79
|
q.preview_key = @preview_key
|
75
80
|
q
|
@@ -90,7 +95,8 @@ module KenticoCloud
|
|
90
95
|
qp: query_parameters,
|
91
96
|
content_link_url_resolver: @content_link_url_resolver,
|
92
97
|
inline_content_item_resolver: @inline_content_item_resolver,
|
93
|
-
query_type: QUERY_TYPE_ITEMS
|
98
|
+
query_type: QUERY_TYPE_ITEMS,
|
99
|
+
with_retry_policy: @with_retry_policy
|
94
100
|
q.use_preview = use_preview
|
95
101
|
q.preview_key = @preview_key
|
96
102
|
q
|
@@ -107,7 +113,8 @@ module KenticoCloud
|
|
107
113
|
DeliveryQuery.new project_id: @project_id,
|
108
114
|
secure_key: @secure_key,
|
109
115
|
qp: query_parameters,
|
110
|
-
query_type: QUERY_TYPE_TAXONOMIES
|
116
|
+
query_type: QUERY_TYPE_TAXONOMIES,
|
117
|
+
with_retry_policy: @with_retry_policy
|
111
118
|
end
|
112
119
|
|
113
120
|
# Return a single taxonomy group of the project
|
@@ -121,7 +128,8 @@ module KenticoCloud
|
|
121
128
|
DeliveryQuery.new project_id: @project_id,
|
122
129
|
secure_key: @secure_key,
|
123
130
|
code_name: code_name,
|
124
|
-
query_type: QUERY_TYPE_TAXONOMIES
|
131
|
+
query_type: QUERY_TYPE_TAXONOMIES,
|
132
|
+
with_retry_policy: @with_retry_policy
|
125
133
|
end
|
126
134
|
|
127
135
|
# Return a single element of a content type
|
@@ -137,7 +145,8 @@ module KenticoCloud
|
|
137
145
|
secure_key: @secure_key,
|
138
146
|
code_name: element,
|
139
147
|
content_type: content_type,
|
140
|
-
query_type: QUERY_TYPE_ELEMENT
|
148
|
+
query_type: QUERY_TYPE_ELEMENT,
|
149
|
+
with_retry_policy: @with_retry_policy
|
141
150
|
end
|
142
151
|
end
|
143
152
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'rest-client'
|
2
1
|
require 'delivery/builders/url_builder'
|
3
2
|
require 'delivery/query_parameters/query_string'
|
4
3
|
require 'delivery/version'
|
@@ -22,7 +21,8 @@ module KenticoCloud
|
|
22
21
|
:inline_content_item_resolver,
|
23
22
|
:query_type,
|
24
23
|
:query_string,
|
25
|
-
:content_type
|
24
|
+
:content_type,
|
25
|
+
:with_retry_policy
|
26
26
|
|
27
27
|
# Setter for a custom URL.
|
28
28
|
#
|
@@ -61,21 +61,14 @@ module KenticoCloud
|
|
61
61
|
# * *Returns*:
|
62
62
|
# - KenticoCloud::Delivery::Responses::ResponseBase or a class extending it
|
63
63
|
def execute
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
resp = KenticoCloud::Delivery::Responses::ResponseBase.new 500, err.message
|
73
|
-
else
|
74
|
-
resp = make_response resp
|
75
|
-
ensure
|
76
|
-
yield resp if block_given?
|
77
|
-
resp
|
78
|
-
end
|
64
|
+
headers = @headers.clone
|
65
|
+
headers['X-KC-SDKID'] = provide_sdk_header
|
66
|
+
headers['Authorization'] = "Bearer #{preview_key}" if should_preview
|
67
|
+
headers['Authorization'] = "Bearer #{secure_key}" if !should_preview && secure_key
|
68
|
+
|
69
|
+
resp = KenticoCloud::Delivery::RequestManager.start self, headers
|
70
|
+
yield resp if block_given?
|
71
|
+
resp
|
79
72
|
end
|
80
73
|
|
81
74
|
# Sets a content link resolver to render links contained in rich text. See
|
@@ -198,18 +191,22 @@ module KenticoCloud
|
|
198
191
|
self
|
199
192
|
end
|
200
193
|
|
201
|
-
private
|
202
|
-
|
203
194
|
# Uses KenticoCloud::Delivery::Builders::UrlBuilder.provide_url to set
|
204
195
|
# the URL for the query. The +UrlBuilder+ also validates the URL.
|
205
196
|
#
|
206
197
|
# * *Raises*:
|
207
198
|
# - +UriFormatException+ if the URL is 65,519 characters or more
|
199
|
+
#
|
200
|
+
# * *Returns*:
|
201
|
+
# - +string+ The full URL for this query
|
208
202
|
def provide_url
|
209
203
|
@url = KenticoCloud::Delivery::Builders::UrlBuilder.provide_url self if @url.nil?
|
210
204
|
KenticoCloud::Delivery::Builders::UrlBuilder.validate_url @url
|
205
|
+
@url
|
211
206
|
end
|
212
207
|
|
208
|
+
private
|
209
|
+
|
213
210
|
# Initializes the +query_string+ attribute with the passed array of
|
214
211
|
# KenticoCloud::Delivery::QueryParameters::Filter objects.
|
215
212
|
#
|
@@ -242,72 +239,9 @@ module KenticoCloud
|
|
242
239
|
use_preview && !preview_key.nil?
|
243
240
|
end
|
244
241
|
|
245
|
-
# Executes the REST request using the +rest-client+ gem.
|
246
|
-
#
|
247
|
-
# * *Returns*:
|
248
|
-
# - +Object+ The response from the server
|
249
|
-
def execute_rest
|
250
|
-
headers = @headers.clone
|
251
|
-
|
252
|
-
headers['X-KC-SDKID'] = provide_sdk_header
|
253
|
-
headers['Authorization'] = "Bearer #{preview_key}" if should_preview
|
254
|
-
headers['Authorization'] = "Bearer #{secure_key}" if !should_preview && secure_key
|
255
|
-
|
256
|
-
RestClient.get @url, headers
|
257
|
-
end
|
258
|
-
|
259
242
|
def provide_sdk_header
|
260
243
|
"rubygems.org;delivery-sdk-ruby;#{KenticoCloud::Delivery::VERSION}"
|
261
244
|
end
|
262
|
-
|
263
|
-
# Converts a standard REST response based on the type of query.
|
264
|
-
#
|
265
|
-
# * *Returns*:
|
266
|
-
# - An object derived from the KenticoCloud::Delivery::Responses::ResponseBase class
|
267
|
-
def make_response(response)
|
268
|
-
case query_type
|
269
|
-
when KenticoCloud::Delivery::QUERY_TYPE_ITEMS
|
270
|
-
respond_item response
|
271
|
-
when KenticoCloud::Delivery::QUERY_TYPE_TYPES
|
272
|
-
respond_type response
|
273
|
-
when KenticoCloud::Delivery::QUERY_TYPE_TAXONOMIES
|
274
|
-
respond_taxonomy response
|
275
|
-
when KenticoCloud::Delivery::QUERY_TYPE_ELEMENT
|
276
|
-
KenticoCloud::Delivery::Responses::DeliveryElementResponse.new JSON.parse(response)
|
277
|
-
end
|
278
|
-
end
|
279
|
-
|
280
|
-
def respond_type(response)
|
281
|
-
if code_name.nil?
|
282
|
-
KenticoCloud::Delivery::Responses::DeliveryTypeListingResponse.new JSON.parse(response)
|
283
|
-
else
|
284
|
-
KenticoCloud::Delivery::Responses::DeliveryTypeResponse.new JSON.parse(response)
|
285
|
-
end
|
286
|
-
end
|
287
|
-
|
288
|
-
def respond_taxonomy(response)
|
289
|
-
if code_name.nil?
|
290
|
-
KenticoCloud::Delivery::Responses::DeliveryTaxonomyListingResponse.new JSON.parse(response)
|
291
|
-
else
|
292
|
-
KenticoCloud::Delivery::Responses::DeliveryTaxonomyResponse.new JSON.parse(response)
|
293
|
-
end
|
294
|
-
end
|
295
|
-
|
296
|
-
def respond_item(response)
|
297
|
-
if code_name.nil?
|
298
|
-
KenticoCloud::Delivery::Responses::DeliveryItemListingResponse.new(
|
299
|
-
JSON.parse(response),
|
300
|
-
content_link_url_resolver,
|
301
|
-
inline_content_item_resolver
|
302
|
-
)
|
303
|
-
else
|
304
|
-
KenticoCloud::Delivery::Responses::DeliveryItemResponse.new(
|
305
|
-
JSON.parse(response),
|
306
|
-
content_link_url_resolver,
|
307
|
-
inline_content_item_resolver
|
308
|
-
)
|
309
|
-
end
|
310
|
-
end
|
311
245
|
end
|
312
246
|
end
|
313
247
|
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
|
3
|
+
module KenticoCloud
|
4
|
+
module Delivery
|
5
|
+
class RequestManager
|
6
|
+
class << self
|
7
|
+
MAX_ATTEMPTS = 6
|
8
|
+
INITIAL_DELAY = 0.2
|
9
|
+
RETRY_WHEN_CODE = [408, 500, 502, 503, 504].freeze
|
10
|
+
|
11
|
+
def start(query, headers)
|
12
|
+
@query = query
|
13
|
+
@headers = headers
|
14
|
+
@times_run = 1
|
15
|
+
@delay = INITIAL_DELAY
|
16
|
+
@url = @query.provide_url
|
17
|
+
continue
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def should_retry(potential_response)
|
23
|
+
return potential_response if @times_run == MAX_ATTEMPTS ||
|
24
|
+
!RETRY_WHEN_CODE.include?(potential_response.http_code) ||
|
25
|
+
!@query.with_retry_policy
|
26
|
+
|
27
|
+
@times_run += 1
|
28
|
+
@delay *= 2
|
29
|
+
sleep(@delay)
|
30
|
+
continue
|
31
|
+
end
|
32
|
+
|
33
|
+
def continue
|
34
|
+
resp = RestClient.get @url, @headers
|
35
|
+
rescue RestClient::ExceptionWithResponse => err
|
36
|
+
should_retry KenticoCloud::Delivery::Responses::ResponseBase.new err.http_code, err.response
|
37
|
+
rescue RestClient::SSLCertificateNotVerified => err
|
38
|
+
should_retry KenticoCloud::Delivery::Responses::ResponseBase.new 500, err
|
39
|
+
rescue SocketError => err
|
40
|
+
should_retry KenticoCloud::Delivery::Responses::ResponseBase.new 500, err.message
|
41
|
+
else
|
42
|
+
make_response resp
|
43
|
+
end
|
44
|
+
|
45
|
+
# Converts a standard REST response based on the type of query.
|
46
|
+
#
|
47
|
+
# * *Returns*:
|
48
|
+
# - An object derived from the KenticoCloud::Delivery::Responses::ResponseBase class
|
49
|
+
def make_response(response)
|
50
|
+
case @query.query_type
|
51
|
+
when KenticoCloud::Delivery::QUERY_TYPE_ITEMS
|
52
|
+
respond_item response
|
53
|
+
when KenticoCloud::Delivery::QUERY_TYPE_TYPES
|
54
|
+
respond_type response
|
55
|
+
when KenticoCloud::Delivery::QUERY_TYPE_TAXONOMIES
|
56
|
+
respond_taxonomy response
|
57
|
+
when KenticoCloud::Delivery::QUERY_TYPE_ELEMENT
|
58
|
+
KenticoCloud::Delivery::Responses::DeliveryElementResponse.new JSON.parse(response)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def respond_type(response)
|
63
|
+
if @query.code_name.nil?
|
64
|
+
KenticoCloud::Delivery::Responses::DeliveryTypeListingResponse.new JSON.parse(response)
|
65
|
+
else
|
66
|
+
KenticoCloud::Delivery::Responses::DeliveryTypeResponse.new JSON.parse(response)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def respond_taxonomy(response)
|
71
|
+
if @query.code_name.nil?
|
72
|
+
KenticoCloud::Delivery::Responses::DeliveryTaxonomyListingResponse.new JSON.parse(response)
|
73
|
+
else
|
74
|
+
KenticoCloud::Delivery::Responses::DeliveryTaxonomyResponse.new JSON.parse(response)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def respond_item(response)
|
79
|
+
if @query.code_name.nil?
|
80
|
+
KenticoCloud::Delivery::Responses::DeliveryItemListingResponse.new(
|
81
|
+
JSON.parse(response),
|
82
|
+
@query.content_link_url_resolver,
|
83
|
+
@query.inline_content_item_resolver
|
84
|
+
)
|
85
|
+
else
|
86
|
+
KenticoCloud::Delivery::Responses::DeliveryItemResponse.new(
|
87
|
+
JSON.parse(response),
|
88
|
+
@query.content_link_url_resolver,
|
89
|
+
@query.inline_content_item_resolver
|
90
|
+
)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
data/lib/delivery/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delivery-sdk-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Dugre
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -122,6 +122,7 @@ files:
|
|
122
122
|
- lib/delivery/builders/url_builder.rb
|
123
123
|
- lib/delivery/client/delivery_client.rb
|
124
124
|
- lib/delivery/client/delivery_query.rb
|
125
|
+
- lib/delivery/client/request_manager.rb
|
125
126
|
- lib/delivery/models/content_item.rb
|
126
127
|
- lib/delivery/models/content_type.rb
|
127
128
|
- lib/delivery/models/pagination.rb
|