embulk-input-zendesk 0.2.13 → 0.2.14

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: e0911f65a242c33edcf81953f2546825701b2a4c
4
- data.tar.gz: 34b91761ad01712a8ba0bb6a9c258d9555dd5a65
3
+ metadata.gz: eae8ef806e71aa366b06bc45075e36020c783c11
4
+ data.tar.gz: d8584f430c482719f7ec2c8ec2c441cfbe7f1a02
5
5
  SHA512:
6
- metadata.gz: 85e63afc0356899056627249dda852e1a9fe0af9de006335b86d89c01bc53ac97d93a8974f82c27ce69041ad22a40ca271e85d77853d7378cc425198657d6224
7
- data.tar.gz: 01e8c2238dd8aa341f3560ed1c8079f0d68454e3a9964137483cedaf625bbec42a4c9bb6ae1cd3fefcdaa9fe4a68896b049150968efe8c4782ac06e943034d88
6
+ metadata.gz: 293666013500b2074377043e545198e394b3e65876c916630b69cc922ec0639887f4101104e419f5d45f5ed95bc05197b528bb794bb9d2361bfa4fd1a939b6e6
7
+ data.tar.gz: 9ab732489802ac3cb5ec658785d1d8b09e3331bcf90362165fb3c92477b44ea7f1887aeb47b5e658f12f83b1b3e9c4ed7a813d50fbb9663401a211e9923f3fc9
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- jruby-9.1.5.0
1
+ jruby-9.1.17.0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 0.2.14 - 2019-01-25
2
+ * [fixed] Disable pagination and add `dedup` option for non-incremental targets [#49](https://github.com/treasure-data/embulk-input-zendesk/pull/49)
3
+
1
4
  ## 0.2.13 - 2019-01-14
2
5
  * [enhancement] Add `dedup` option, in order to avoid OOM when importing large dataset [#48](https://github.com/treasure-data/embulk-input-zendesk/pull/48)
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.13"
4
+ spec.version = "0.2.14"
5
5
  spec.authors = ["uu59", "muga", "sakama"]
6
6
  spec.summary = "Zendesk input plugin for Embulk"
7
7
  spec.description = "Loads records from Zendesk."
@@ -104,12 +104,12 @@ module Embulk
104
104
 
105
105
  # they have non-incremental API only
106
106
  UNAVAILABLE_INCREMENTAL_EXPORT.each do |target|
107
- define_method(target) do |partial = true, start_time = 0, &block|
107
+ define_method(target) do |partial = true, start_time = 0, dedup = true, &block|
108
108
  path = "/api/v2/#{target}.json"
109
109
  if partial
110
110
  export(path, target, &block)
111
111
  else
112
- export_parallel(path, target, start_time, &block)
112
+ export_parallel(path, target, start_time, dedup, false, &block)
113
113
  end
114
114
  end
115
115
  end
@@ -129,26 +129,27 @@ module Embulk
129
129
 
130
130
  private
131
131
 
132
- def export_parallel(path, key, start_time = 0, &block)
132
+ def export_parallel(path, key, start_time = 0, dedup = true, paging = true, &block)
133
133
  per_page = 100 # 100 is maximum https://developer.zendesk.com/rest_api/docs/core/introduction#pagination
134
134
  first_response = request(path, false, per_page: per_page, page: 1)
135
135
  first_fetched = JSON.parse(first_response.body)
136
136
  total_count = first_fetched["count"]
137
137
  last_page_num = (total_count / per_page.to_f).ceil
138
- Embulk.logger.info "#{key} records=#{total_count} last_page=#{last_page_num}"
139
-
140
- first_fetched[key].uniq { |r| r['id'] }.each do |record|
141
- block.call record
142
- end
143
-
144
- execute_thread_pool do |pool|
145
- (2..last_page_num).each do |page|
146
- pool.post do
147
- response = request(path, false, per_page: per_page, page: page)
148
- fetched_records = extract_records_from_response(response, key)
149
- Embulk.logger.info "Fetched #{key} on page=#{page} >>> size: #{fetched_records.length}"
150
- fetched_records.uniq { |r| r['id'] }.each do |record|
151
- block.call record
138
+ Embulk.logger.info "#{key} records=#{total_count} last_page=#{paging ? last_page_num : 1}"
139
+
140
+ handler = lambda { |records| records.each { |r| block.call r } }
141
+ handler.call(dedup ? first_fetched[key].uniq { |r| r['id'] } : first_fetched[key])
142
+
143
+ # stop if endpoints have no pagination, ie. API returns all records
144
+ # `ticket_fields`, `ticket_forms`
145
+ if paging
146
+ execute_thread_pool do |pool|
147
+ (2..last_page_num).each do |page|
148
+ pool.post do
149
+ response = request(path, false, per_page: per_page, page: page)
150
+ fetched_records = extract_records_from_response(response, key)
151
+ Embulk.logger.info "Fetched #{key} on page=#{page} >>> size: #{fetched_records.length}"
152
+ handler.call(dedup ? fetched_records.uniq { |r| r['id'] } : fetched_records)
152
153
  end
153
154
  end
154
155
  end
@@ -107,8 +107,7 @@ module Embulk
107
107
  "",
108
108
  {
109
109
  ticket_metrics: records,
110
- next_page: "https://treasuredata.zendesk.com/api/v2/incremental/tickets
111
- .json?include=metric_sets&start_time=1488535542",
110
+ next_page: "https://treasuredata.zendesk.com/api/v2/incremental/tickets.json?include=metric_sets&start_time=1488535542",
112
111
  }.to_json
113
112
  ].join("\r\n")
114
113
 
@@ -299,7 +298,7 @@ module Embulk
299
298
 
300
299
  test "invoke export when partial=false" do
301
300
  # Added default `start_time`
302
- mock(client).export_parallel(anything, "ticket_fields", 0)
301
+ mock(client).export_parallel(anything, "ticket_fields", 0, true, false) # new args: `dedup`, `paging`
303
302
  client.ticket_fields(false)
304
303
  end
305
304
  end
@@ -312,10 +311,40 @@ module Embulk
312
311
 
313
312
  test "invoke export when partial=false" do
314
313
  # Added default `start_time`
315
- mock(client).export_parallel(anything, "ticket_forms", 0)
314
+ mock(client).export_parallel(anything, "ticket_forms", 0, true, false) # new args: `dedup`, `paging`)
316
315
  client.ticket_forms(false)
317
316
  end
318
317
  end
318
+
319
+ sub_test_case "no pagination" do
320
+ data("ticket_fields", "ticket_fields")
321
+ data("ticket_forms", "ticket_forms")
322
+ test "non-incremental targets" do |target|
323
+ response = [
324
+ "HTTP/1.1 200",
325
+ "Content-Type: application/json",
326
+ "",
327
+ {
328
+ target => 200.times.map{|n| {"id" => n}},
329
+ count: 200,
330
+ next_page: nil,
331
+ previous_page: nil,
332
+ }.to_json
333
+ ].join("\r\n")
334
+
335
+ # mock multiple responses, to simulate real API behavior
336
+ @httpclient.test_loopback_http_response << response
337
+ @httpclient.test_loopback_http_response << response
338
+ counter = Concurrent::AtomicFixnum.new(0)
339
+ handler = proc { counter.increment }
340
+ # validate expected target
341
+ proxy(@httpclient).get("#{login_url}/api/v2/#{target}.json",anything,anything)
342
+ # (`partial`, `start_time`, `default`, `block`)
343
+ client.public_send(target, false, 0, true, &handler)
344
+ # only ingest 200 records
345
+ assert_equal(200, counter.value)
346
+ end
347
+ end
319
348
  end
320
349
 
321
350
 
@@ -629,12 +658,12 @@ module Embulk
629
658
  "Content-Type: application/json",
630
659
  "",
631
660
  {
632
- ticket_fields: [{ id: 1 }],
661
+ tickets: [{ id: 1 }],
633
662
  count: 1
634
663
  }.to_json
635
664
  ].join("\r\n")
636
665
  handler = proc { }
637
- client.ticket_fields(false, &handler)
666
+ client.tickets(false, &handler)
638
667
  assert_equal(true, @pool.shutdown?)
639
668
  end
640
669
 
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.13
4
+ version: 0.2.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - uu59
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-01-14 00:00:00.000000000 Z
13
+ date: 2019-01-25 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  requirement: !ruby/object:Gem::Requirement
@@ -261,7 +261,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
261
261
  version: '0'
262
262
  requirements: []
263
263
  rubyforge_project:
264
- rubygems_version: 2.6.6
264
+ rubygems_version: 2.6.14.1
265
265
  signing_key:
266
266
  specification_version: 4
267
267
  summary: Zendesk input plugin for Embulk