embulk-input-zendesk 0.1.5 → 0.1.6

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: bdd23bdf56e325f692e469316f07d92a9173727b
4
- data.tar.gz: d70d14895b9e26f7f57b03c1b56cb5ac1382b755
3
+ metadata.gz: 1c154709e56d9966d5bfb53da83c905151afb506
4
+ data.tar.gz: 744915c536f9fe8c6fa1fd20fd28a11bc57dee69
5
5
  SHA512:
6
- metadata.gz: 2b6fb9f91fa3d5f58b8c3ad270084dc81c1dd76c14578461932a1f0ad5453f7c05649d4cc62d74c8053c543e084fe6ae2e90871d490591cd6216f3f16aebac7a
7
- data.tar.gz: 5ef68347436a5d175377cdf2c1c27ff8cefdce8ee73e2f97c4aae14bd08fa54d180569035aa714b83ee19f37f474147905d28fb7260fbbfd29908623b12d8c82
6
+ metadata.gz: fcdf6b6607ef344697eb8ea12e1669752821c853dfaf2f5cb675777664ad78e521223a68be813ac202bd884a398f9d194e9fbc1eaec9a9c0b01cb38e2948336d
7
+ data.tar.gz: b1bd6a19d263d48efdf9eb4047479dbce78e204e9d0304628d1fcc7e5670a01b3dbcdea20c9e5a8774c7068626c1b441185333a5c51b5986375bad188933f88c
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 0.1.6 - 2016-05-09
2
+ * [fixed] Fix non-incremental export to fetch all records [#11](https://github.com/treasure-data/embulk-input-zendesk/pull/11)
3
+
1
4
  ## 0.1.5 - 2016-04-14
2
5
  * [enhancement] Mitigate debug pain when many retry then error [#10](https://github.com/treasure-data/embulk-input-zendesk/pull/10)
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.1.5"
4
+ spec.version = "0.1.6"
5
5
  spec.authors = ["uu59", "muga", "sakama"]
6
6
  spec.summary = "Zendesk input plugin for Embulk"
7
7
  spec.description = "Loads records from Zendesk."
@@ -71,7 +71,7 @@ module Embulk
71
71
  UNAVAILABLE_INCREMENTAL_EXPORT.each do |target|
72
72
  define_method(target) do |partial = true, start_time = 0, &block|
73
73
  path = "/api/v2/#{target}.json"
74
- export(path, target, partial ? PARTIAL_RECORDS_SIZE : 1000, &block)
74
+ export(path, target, partial, &block)
75
75
  end
76
76
  end
77
77
 
@@ -89,11 +89,11 @@ module Embulk
89
89
 
90
90
  private
91
91
 
92
- def export(path, key, per_page, &block)
93
- # for `embulk guess` and `embulk preview` to fetch ~50 records only.
94
- # incremental export API has supported only 1000 per page, it is too large to guess/preview
95
- Embulk.logger.debug "#{path} with per_page: #{per_page}"
96
- response = request(path, per_page: per_page)
92
+ def export(path, key, partial, page = 1, known_ids = [], &block)
93
+ per_page = partial ? PARTIAL_RECORDS_SIZE : 100 # 100 is maximum https://developer.zendesk.com/rest_api/docs/core/introduction#pagination
94
+ Embulk.logger.debug("#{path} with page=#{page}" + (partial ? " (partial)" : ""))
95
+
96
+ response = request(path, per_page: per_page, page: page)
97
97
 
98
98
  begin
99
99
  data = JSON.parse(response.body)
@@ -102,8 +102,16 @@ module Embulk
102
102
  end
103
103
 
104
104
  data[key].each do |record|
105
+ next if known_ids.include?(record["id"])
106
+ known_ids << record["id"]
107
+
105
108
  block.call record
106
109
  end
110
+ return if partial
111
+
112
+ if data["next_page"]
113
+ return export(path, key, partial, page + 1, &block)
114
+ end
107
115
 
108
116
  nil # this is necessary different with incremental_export
109
117
  end
@@ -15,7 +15,7 @@ module Embulk
15
15
  include FixtureHelper
16
16
  include CaptureIo
17
17
 
18
- sub_test_case "tickets" do
18
+ sub_test_case "tickets (incremental export)" do
19
19
  sub_test_case "partial" do
20
20
  def client
21
21
  @client ||= Client.new(login_url: login_url, auth_method: "oauth", access_token: access_token, retry_limit: 1, retry_initial_wait_sec: 0)
@@ -48,6 +48,42 @@ module Embulk
48
48
  client.tickets(&handler)
49
49
  end
50
50
  end
51
+ end
52
+
53
+ sub_test_case "ticket_metrics (non-incremental export)" do
54
+ sub_test_case "partial" do
55
+ def client
56
+ @client ||= Client.new(login_url: login_url, auth_method: "oauth", access_token: access_token, retry_limit: 1, retry_initial_wait_sec: 0)
57
+ end
58
+
59
+ setup do
60
+ stub(Embulk).logger { Logger.new(File::NULL) }
61
+ @httpclient = client.httpclient
62
+ stub(client).httpclient { @httpclient }
63
+ end
64
+
65
+ test "fetch ticket_metrics first page only" do
66
+ records = [
67
+ {"id" => 1},
68
+ {"id" => 2},
69
+ ]
70
+ @httpclient.test_loopback_http_response << [
71
+ "HTTP/1.1 200",
72
+ "Content-Type: application/json",
73
+ "",
74
+ {
75
+ ticket_metrics: records,
76
+ next_page: "https://treasuredata.zendesk.com/api/v2/ticket_metrics.json?page=2",
77
+ }.to_json
78
+ ].join("\r\n")
79
+
80
+ handler = proc { }
81
+ records.each do |record|
82
+ mock(handler).call(record)
83
+ end
84
+ client.ticket_metrics(true, &handler)
85
+ end
86
+ end
51
87
 
52
88
  sub_test_case "all" do
53
89
  def client
@@ -60,29 +96,46 @@ module Embulk
60
96
  stub(client).httpclient { @httpclient }
61
97
  end
62
98
 
63
- test "fetch tickets" do
64
- tickets = [
99
+ test "fetch ticket_metrics all page" do
100
+ records = [
65
101
  {"id" => 1},
66
102
  {"id" => 2},
67
103
  ]
104
+ second_results = [
105
+ {"id" => 3}
106
+ ]
68
107
  @httpclient.test_loopback_http_response << [
69
108
  "HTTP/1.1 200",
70
109
  "Content-Type: application/json",
71
110
  "",
72
111
  {
73
- tickets: tickets
112
+ ticket_metrics: records,
113
+ next_page: "https://treasuredata.zendesk.com/api/v2/ticket_metrics.json?page=2",
114
+ }.to_json
115
+ ].join("\r\n")
116
+
117
+ @httpclient.test_loopback_http_response << [
118
+ "HTTP/1.1 200",
119
+ "Content-Type: application/json",
120
+ "",
121
+ {
122
+ ticket_metrics: second_results,
123
+ next_page: nil,
74
124
  }.to_json
75
125
  ].join("\r\n")
76
126
 
77
127
  handler = proc { }
78
- tickets.each do |ticket|
79
- mock(handler).call(ticket)
128
+ records.each do |record|
129
+ mock(handler).call(record)
130
+ end
131
+ second_results.each do |record|
132
+ mock(handler).call(record)
80
133
  end
81
- client.tickets(false, &handler)
134
+ client.ticket_metrics(false, &handler)
82
135
  end
83
136
 
84
137
  test "fetch tickets without duplicated" do
85
- tickets = [
138
+ records = [
86
139
  {"id" => 1},
87
140
  {"id" => 2},
88
141
  {"id" => 1},
@@ -93,13 +146,13 @@ module Embulk
93
146
  "Content-Type: application/json",
94
147
  "",
95
148
  {
96
- tickets: tickets
149
+ ticket_metrics: records
97
150
  }.to_json
98
151
  ].join("\r\n")
99
152
 
100
153
  handler = proc { }
101
154
  mock(handler).call(anything).twice
102
- client.tickets(false, &handler)
155
+ client.ticket_metrics(false, &handler)
103
156
  end
104
157
 
105
158
  test "fetch tickets with next_page" do
@@ -110,9 +163,8 @@ module Embulk
110
163
  "Content-Type: application/json",
111
164
  "",
112
165
  {
113
- tickets: [{"id" => 1}],
114
- count: 1000,
115
- end_time: end_time,
166
+ ticket_metrics: [{"id" => 1}],
167
+ next_page: "https://treasuredata.zendesk.com/api/v2/ticket_metrics.json?page=2",
116
168
  }.to_json
117
169
  ].join("\r\n")
118
170
 
@@ -121,7 +173,7 @@ module Embulk
121
173
  "Content-Type: application/json",
122
174
  "",
123
175
  {
124
- tickets: [{"id" => 2}],
176
+ ticket_metrics: [{"id" => 2}],
125
177
  count: 2,
126
178
  }.to_json
127
179
  ].join("\r\n")
@@ -131,7 +183,7 @@ module Embulk
131
183
 
132
184
  handler = proc { }
133
185
  mock(handler).call(anything).twice
134
- client.tickets(false, &handler)
186
+ client.ticket_metrics(false, &handler)
135
187
  end
136
188
 
137
189
  test "raise DataError when invalid JSON response" do
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.1.5
4
+ version: 0.1.6
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: 2016-04-14 00:00:00.000000000 Z
13
+ date: 2016-05-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  requirement: !ruby/object:Gem::Requirement