embulk-input-zendesk 0.2.10 → 0.2.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a0187b06702508e3aa734155601f2ac61bfa9456
4
- data.tar.gz: 0978a2745e336986fc17c57796a77f271439ba4a
3
+ metadata.gz: 4bbd52d83f9670fdf5c7bad8bb916bbce2d2539c
4
+ data.tar.gz: 3ede177aa9ffe5d102a6bb68e62a256a209c68d6
5
5
  SHA512:
6
- metadata.gz: 5b19b4372816708a26d2110a823a3fba165fd066ab650f85002d3751ae9efb3f3b3e6eb9163f2a1eca976f9c31ccae00edf760da7216a6c017d8f78a775abb79
7
- data.tar.gz: 374a88e38e1ab5469f66500aab6fd2be1f9fead2ea21358698ad8458d5ea26df88eea4ae4f7fdfffe9cedb4b7e8f0b7cedc91bbe930691ebc666414c559c902e
6
+ metadata.gz: 8fe16f902ee028b8f13237f4bd8784ded62e96df33527da4459cd59044212193d1994b8d8129b8a008e7bb76ec099e04a69e8fc8fd7e4134889c65593f53fb13
7
+ data.tar.gz: 08d9ada788c89cb5eb1beabd3462b7a1731965e2ecd4171b4bc781de3621a1ac95ab7d4fa1b5b935a5d678b63346f37be46b83950a555f14fc885044cff45a44
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- jruby-9.0.4.0
1
+ jruby-9.1.5.0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 0.2.11 - 2018-15-26
2
+ * [enhancement] Rate limit is fail fast instead of retry for guess/preview mode
3
+
1
4
  ## 0.2.10 - 2018-03-26
2
5
  * [enhancement] Add Zendesk market place header
3
6
 
@@ -1,7 +1,7 @@
1
1
 
2
2
  Gem::Specification.new do |spec|
3
3
  spec.name = "embulk-input-zendesk"
4
- spec.version = "0.2.10"
4
+ spec.version = "0.2.11"
5
5
  spec.authors = ["uu59", "muga", "sakama"]
6
6
  spec.summary = "Zendesk input plugin for Embulk"
7
7
  spec.description = "Loads records from Zendesk."
@@ -130,7 +130,7 @@ module Embulk
130
130
 
131
131
  def export_parallel(path, key, start_time = 0, &block)
132
132
  per_page = 100 # 100 is maximum https://developer.zendesk.com/rest_api/docs/core/introduction#pagination
133
- first_response = request(path, per_page: per_page, page: 1)
133
+ first_response = request(path, false, per_page: per_page, page: 1)
134
134
  first_fetched = JSON.parse(first_response.body)
135
135
  total_count = first_fetched["count"]
136
136
  last_page_num = (total_count / per_page.to_f).ceil
@@ -143,7 +143,7 @@ module Embulk
143
143
  execute_thread_pool do |pool|
144
144
  (2..last_page_num).each do |page|
145
145
  pool.post do
146
- response = request(path, per_page: per_page, page: page)
146
+ response = request(path, false, per_page: per_page, page: page)
147
147
  fetched_records = extract_records_from_response(response, key)
148
148
  Embulk.logger.info "Fetched #{key} on page=#{page} >>> size: #{fetched_records.length}"
149
149
  fetched_records.uniq { |r| r['id'] }.each do |record|
@@ -160,7 +160,7 @@ module Embulk
160
160
  per_page = PARTIAL_RECORDS_SIZE
161
161
  Embulk.logger.info("Fetching #{path} with page=#{page} (partial)")
162
162
 
163
- response = request(path, per_page: per_page, page: page)
163
+ response = request(path, true, per_page: per_page, page: page)
164
164
 
165
165
  begin
166
166
  data = JSON.parse(response.body)
@@ -186,7 +186,7 @@ module Embulk
186
186
  execute_thread_pool do |pool|
187
187
  loop do
188
188
  start_fetching = Time.now
189
- response = request(path, query.merge(start_time: start_time))
189
+ response = request(path, false, query.merge(start_time: start_time))
190
190
  actual_fetched = 0
191
191
  data = JSON.parse(response.body)
192
192
  # no key found in response occasionally => retry
@@ -261,7 +261,7 @@ module Embulk
261
261
  httpclient
262
262
  end
263
263
 
264
- def request(path, query = {})
264
+ def request(path, partial = false, query = {})
265
265
  u = URI.parse(config[:login_url])
266
266
  u.path = path
267
267
 
@@ -277,8 +277,7 @@ module Embulk
277
277
  retryer.with_retry do
278
278
  Embulk.logger.debug "Fetching #{u.to_s}"
279
279
  response = httpclient.get(u.to_s, query, extheader)
280
-
281
- handle_response(response.status, response.headers, response.body)
280
+ handle_response(response.status, response.headers, response.body, partial)
282
281
  response
283
282
  end
284
283
  end
@@ -312,8 +311,7 @@ module Embulk
312
311
  next
313
312
  end
314
313
  end
315
- handle_response(message.status, message.headers, chunk)
316
-
314
+ handle_response(message.status, message.headers, chunk, true)
317
315
  buf << chunk
318
316
  break if buf.bytesize > PARTIAL_RECORDS_BYTE_SIZE
319
317
  end
@@ -349,13 +347,18 @@ module Embulk
349
347
  result
350
348
  end
351
349
 
352
- def wait_rate_limit(retry_after)
353
- Embulk.logger.warn "Rate Limited. Waiting #{retry_after} seconds to retry"
354
- sleep retry_after
355
- throw :retry
350
+ def wait_rate_limit(retry_after, partial = false)
351
+ # Won't retry for preview/guess mode
352
+ if partial
353
+ raise Embulk::DataError.new("Rate Limited. Waiting #{retry_after} seconds to re-run")
354
+ else
355
+ Embulk.logger.warn "Rate Limited. Waiting #{retry_after} seconds to retry"
356
+ sleep retry_after
357
+ throw :retry
358
+ end
356
359
  end
357
360
 
358
- def handle_response(status_code, headers, body)
361
+ def handle_response(status_code, headers, body, partial = false)
359
362
  # https://developer.zendesk.com/rest_api/docs/core/introduction#response-format
360
363
  case status_code
361
364
  when 200, 404
@@ -379,7 +382,7 @@ module Embulk
379
382
  when 429
380
383
  # rate limit
381
384
  retry_after = headers["Retry-After"]
382
- wait_rate_limit(retry_after.to_i)
385
+ wait_rate_limit(retry_after.to_i, partial)
383
386
  when 400..500
384
387
  # Won't retry for 4xx range errors except above. Almost they should be ConfigError e.g. 403 Forbidden
385
388
  raise Embulk::ConfigError.new("[#{status_code}] #{body}")
@@ -387,7 +390,7 @@ module Embulk
387
390
  # 503 is possible rate limit
388
391
  retry_after = headers["Retry-After"]
389
392
  if retry_after
390
- wait_rate_limit(retry_after.to_i)
393
+ wait_rate_limit(retry_after.to_i, partial)
391
394
  else
392
395
  raise "[#{status_code}] temporally failure."
393
396
  end
@@ -482,6 +482,14 @@ module Embulk
482
482
  stub_response(429, ["Retry-After: #{after}"])
483
483
  mock(client).sleep after.to_i
484
484
  assert_throw(:retry) do
485
+ client.tickets(false, &proc{})
486
+ end
487
+ end
488
+
489
+ test "429 guess/preview fail fast" do
490
+ after = "123"
491
+ stub_response(429, ["Retry-After: #{after}"])
492
+ assert_raise(DataError.new("Rate Limited. Waiting #{after} seconds to re-run")) do
485
493
  client.tickets(&proc{})
486
494
  end
487
495
  end
@@ -505,6 +513,14 @@ module Embulk
505
513
  stub_response(503, ["Retry-After: #{after}"])
506
514
  mock(client).sleep after.to_i
507
515
  assert_throw(:retry) do
516
+ client.tickets(false, &proc{})
517
+ end
518
+ end
519
+
520
+ test "503 with Retry-After guess/preview fail fast" do
521
+ after = "123"
522
+ stub_response(503, ["Retry-After: #{after}"])
523
+ assert_raise(DataError.new("Rate Limited. Waiting #{after} seconds to re-run")) do
508
524
  client.tickets(&proc{})
509
525
  end
510
526
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-input-zendesk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.10
4
+ version: 0.2.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - uu59
@@ -255,7 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
255
255
  version: '0'
256
256
  requirements: []
257
257
  rubyforge_project:
258
- rubygems_version: 2.4.8
258
+ rubygems_version: 2.6.6
259
259
  signing_key:
260
260
  specification_version: 4
261
261
  summary: Zendesk input plugin for Embulk