embulk-input-marketo 0.5.6 → 0.5.7.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/.github/PULL_REQUEST_TEMPLATE.md +37 -0
  3. data/.gitignore +11 -2
  4. data/.travis.yml +5 -45
  5. data/LICENSE.txt +21 -0
  6. data/README.md +14 -65
  7. data/build.gradle +102 -0
  8. data/config/checkstyle/checkstyle.xml +128 -0
  9. data/config/checkstyle/default.xml +108 -0
  10. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  11. data/gradle/wrapper/gradle-wrapper.properties +6 -0
  12. data/gradlew +169 -0
  13. data/gradlew.bat +84 -0
  14. data/lib/embulk/input/marketo.rb +3 -0
  15. data/settings.gradle +1 -0
  16. data/src/main/java/org/embulk/input/marketo/CsvTokenizer.java +677 -0
  17. data/src/main/java/org/embulk/input/marketo/MarketoInputPlugin.java +15 -0
  18. data/src/main/java/org/embulk/input/marketo/MarketoInputPluginDelegate.java +77 -0
  19. data/src/main/java/org/embulk/input/marketo/MarketoService.java +30 -0
  20. data/src/main/java/org/embulk/input/marketo/MarketoServiceImpl.java +176 -0
  21. data/src/main/java/org/embulk/input/marketo/MarketoUtils.java +172 -0
  22. data/src/main/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPlugin.java +63 -0
  23. data/src/main/java/org/embulk/input/marketo/delegate/CampaignInputPlugin.java +67 -0
  24. data/src/main/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPlugin.java +61 -0
  25. data/src/main/java/org/embulk/input/marketo/delegate/LeadWithListInputPlugin.java +58 -0
  26. data/src/main/java/org/embulk/input/marketo/delegate/LeadWithProgramInputPlugin.java +56 -0
  27. data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPlugin.java +260 -0
  28. data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseInputPluginDelegate.java +69 -0
  29. data/src/main/java/org/embulk/input/marketo/exception/MarketoAPIException.java +30 -0
  30. data/src/main/java/org/embulk/input/marketo/model/MarketoAccessTokenResponse.java +92 -0
  31. data/src/main/java/org/embulk/input/marketo/model/MarketoBulkExtractRequest.java +59 -0
  32. data/src/main/java/org/embulk/input/marketo/model/MarketoError.java +40 -0
  33. data/src/main/java/org/embulk/input/marketo/model/MarketoField.java +91 -0
  34. data/src/main/java/org/embulk/input/marketo/model/MarketoResponse.java +81 -0
  35. data/src/main/java/org/embulk/input/marketo/model/filter/DateRangeFilter.java +31 -0
  36. data/src/main/java/org/embulk/input/marketo/model/filter/ListFilter.java +10 -0
  37. data/src/main/java/org/embulk/input/marketo/model/filter/MarketoFilter.java +8 -0
  38. data/src/main/java/org/embulk/input/marketo/rest/MarketoBaseRestClient.java +226 -0
  39. data/src/main/java/org/embulk/input/marketo/rest/MarketoFileResponseEntityReader.java +69 -0
  40. data/src/main/java/org/embulk/input/marketo/rest/MarketoRESTEndpoint.java +44 -0
  41. data/src/main/java/org/embulk/input/marketo/rest/MarketoResponseJetty92EntityReader.java +88 -0
  42. data/src/main/java/org/embulk/input/marketo/rest/MarketoRestClient.java +332 -0
  43. data/src/main/java/org/embulk/input/marketo/rest/RecordPagingIterable.java +130 -0
  44. data/src/test/java/org/embulk/input/marketo/TestMarketoInputPlugin.java +5 -0
  45. data/src/test/java/org/embulk/input/marketo/rest/MarketoBaseRestClientTest.java +220 -0
  46. metadata +65 -222
  47. data/.ruby-version +0 -1
  48. data/.travis.yml.erb +0 -42
  49. data/Gemfile +0 -3
  50. data/LICENSE +0 -13
  51. data/Rakefile +0 -20
  52. data/embulk-input-marketo.gemspec +0 -28
  53. data/gemfiles/embulk-latest +0 -4
  54. data/gemfiles/template.erb +0 -4
  55. data/lib/embulk/input/marketo/activity_log.rb +0 -103
  56. data/lib/embulk/input/marketo/base.rb +0 -139
  57. data/lib/embulk/input/marketo/lead.rb +0 -143
  58. data/lib/embulk/input/marketo_api.rb +0 -22
  59. data/lib/embulk/input/marketo_api/soap/activity_log.rb +0 -103
  60. data/lib/embulk/input/marketo_api/soap/base.rb +0 -135
  61. data/lib/embulk/input/marketo_api/soap/lead.rb +0 -91
  62. data/test/activity_log_fixtures.rb +0 -216
  63. data/test/embulk/input/marketo/test_activity_log.rb +0 -444
  64. data/test/embulk/input/marketo/test_base.rb +0 -76
  65. data/test/embulk/input/marketo/test_lead.rb +0 -605
  66. data/test/embulk/input/marketo_api/soap/test_activity_log.rb +0 -154
  67. data/test/embulk/input/marketo_api/soap/test_base.rb +0 -96
  68. data/test/embulk/input/marketo_api/soap/test_lead.rb +0 -139
  69. data/test/embulk/input/test_marketo_api.rb +0 -28
  70. data/test/lead_fixtures.rb +0 -111
  71. data/test/mute_logger.rb +0 -7
  72. data/test/override_assert_raise.rb +0 -18
  73. data/test/prepare_embulk.rb +0 -15
  74. data/test/run-test.rb +0 -26
  75. data/test/savon_helper.rb +0 -17
@@ -1,444 +0,0 @@
1
- require "prepare_embulk"
2
- require "override_assert_raise"
3
- require "embulk/input/marketo/activity_log"
4
- require "activity_log_fixtures"
5
-
6
- module Embulk
7
- module Input
8
- module Marketo
9
- class ActivityLogTest < Test::Unit::TestCase
10
- include ActivityLogFixtures
11
- include OverrideAssertRaise
12
-
13
- class TransactionTest < self
14
- def test_generate_task
15
- control = proc {} # dummy
16
- columns = task[:columns].map do |col|
17
- Column.new(nil, col["name"], col["type"].to_sym, col["format"])
18
- end
19
-
20
- mock(ActivityLog).resume(task, columns, 1, &control)
21
- ActivityLog.transaction(config, &control)
22
- end
23
-
24
- def test_resume
25
- next_config_diff = {from_datetime: from_datetime}
26
- control = proc { [next_config_diff] } # In actual, embulk prepares control block returning Array.
27
- columns = task[:columns].map do |col|
28
- Column.new(nil, col["name"], col["type"].to_sym)
29
- end
30
-
31
- actual = ActivityLog.resume(task, columns, 1, &control)
32
- assert_equal(next_config_diff, actual)
33
- end
34
-
35
- data do
36
- [
37
- ["endpoint", "endpoint"],
38
- ["wsdl", "wsdl"],
39
- ]
40
- end
41
- def test_invalid_url(key)
42
- control = proc {} # dummy
43
-
44
- settings = {
45
- endpoint: "https://marketo.example.com",
46
- wsdl: "https://marketo.example.com/?wsdl",
47
- user_id: "user_id",
48
- encryption_key: "TOPSECRET",
49
- columns: [
50
- {"name" => "Name", "type" => "string"},
51
- ],
52
- from_datetime: Time.now,
53
- to_datetime: Time.now + 3600,
54
- }
55
- settings[key.to_sym] = " invalid url "
56
- config = DataSource[settings.to_a]
57
-
58
- assert_raise(ConfigError) do
59
- ActivityLog.transaction(config, &control)
60
- end
61
- end
62
-
63
- private
64
-
65
- def settings
66
- {
67
- endpoint: "https://marketo.example.com",
68
- wsdl: "https://marketo.example.com/?wsdl",
69
- user_id: "user_id",
70
- encryption_key: "TOPSECRET",
71
- from_datetime: from_datetime,
72
- to_datetime: to_datetime,
73
- retry_initial_wait_sec: 3,
74
- retry_limit: 2,
75
- columns: [
76
- {"name" => :id, "type" => :long},
77
- {"name" => :activity_date_time, "type" => :timestamp, "format" => "%Y-%m-%dT%H:%M:%S%z"},
78
- {"name" => :activity_type, "type" => :string},
79
- {"name" => :mktg_asset_name, "type" => :string},
80
- {"name" => :mkt_person_id, "type" => :long},
81
- {"name" => "Attribute Name", "type" => :string},
82
- {"name" => "Old Value", "type" => :string},
83
- ]
84
- }
85
- end
86
-
87
- def config
88
- DataSource[settings.to_a]
89
- end
90
-
91
- def task
92
- {
93
- endpoint_url: "https://marketo.example.com",
94
- wsdl_url: "https://marketo.example.com/?wsdl",
95
- user_id: "user_id",
96
- encryption_key: "TOPSECRET",
97
- from_datetime: from_datetime,
98
- to_datetime: to_datetime,
99
- retry_initial_wait_sec: 3,
100
- retry_limit: 2,
101
- columns: [
102
- {"name" => :id, "type" => :long},
103
- {"name" => :activity_date_time, "type" => :timestamp, "format" => "%Y-%m-%dT%H:%M:%S%z"},
104
- {"name" => :activity_type, "type" => :string},
105
- {"name" => :mktg_asset_name, "type" => :string},
106
- {"name" => :mkt_person_id, "type" => :long},
107
- {"name" => "Attribute Name", "type" => :string},
108
- {"name" => "Old Value", "type" => :string},
109
- ]
110
- }
111
- end
112
- end
113
-
114
- def test_target
115
- assert_equal(:activity_log, ActivityLog.target)
116
- end
117
-
118
- class GuessTest < self
119
- setup :setup_soap
120
-
121
- def setup_soap
122
- @soap = MarketoApi::Soap::ActivityLog.new(settings[:endpoint], settings[:wsdl], settings[:user_id], settings[:encryption_key])
123
-
124
- stub(ActivityLog).soap_client(config) { @soap }
125
- end
126
-
127
- def test_include_metadata
128
- stub(@soap).metadata(from_datetime, batch_size: ActivityLog::PREVIEW_COUNT) { Guess::SchemaGuess.from_hash_records(records) }
129
-
130
- assert_equal(
131
- {"columns" => expected_guessed_columns},
132
- Marketo::ActivityLog.guess(config)
133
- )
134
- end
135
-
136
- data do
137
- [
138
- ["endpoint", "endpoint"],
139
- ["wsdl", "wsdl"],
140
- ]
141
- end
142
- def test_invalid_url(key)
143
- config[key] = " invalid url "
144
- assert_raise(ConfigError) do
145
- Marketo::ActivityLog.guess(config)
146
- end
147
- end
148
-
149
- private
150
-
151
- def records
152
- [
153
- {
154
- id: "12",
155
- activity_date_time: "2015-06-25T00:12:00+00:00",
156
- activity_type: "Visit Webpage",
157
- mktg_asset_name: "webpage.example.com/person/1/edit",
158
- mkt_person_id: "34",
159
- "Webpage ID" => "56",
160
- "Webpage URL" => "/person/1/edit",
161
- "Referrer URL" => "https://webpage.example.com",
162
- "Client IP Address" => "127.0.0.1",
163
- "User Agent" => "UserAgent",
164
- "Message Id" => "78",
165
- "Created At" => "2015-07-06 19:00:02",
166
- "Lead ID" => "90"
167
- }
168
- ]
169
- end
170
-
171
- def expected_guessed_columns
172
- [
173
- {name: :id, type: :long},
174
- {name: :activity_date_time, type: :timestamp, format: "%Y-%m-%dT%H:%M:%S%:z"},
175
- {name: :activity_type, type: :string},
176
- {name: :mktg_asset_name, type: :string},
177
- {name: :mkt_person_id, type: :long},
178
- {name: "Webpage ID", type: :long},
179
- {name: "Webpage URL", type: :string},
180
- {name: "Referrer URL", type: :string},
181
- {name: "Client IP Address", type: :string},
182
- {name: "User Agent", type: :string},
183
- {name: "Message Id", type: :long},
184
- {name: "Created At", type: :timestamp, format: "%Y-%m-%d %H:%M:%S"},
185
- {name: "Lead ID", type: :long}
186
- ]
187
- end
188
- end
189
-
190
- class TestRetry < self
191
- def setup
192
- @soap = MarketoApi::Soap::ActivityLog.new(settings[:endpoint], settings[:wsdl], settings[:user_id], settings[:encryption_key])
193
- stub(ActivityLog).soap_client(task) { @soap }
194
-
195
- @page_builder = Object.new
196
- @plugin = ActivityLog.new(task, nil, nil, @page_builder)
197
- end
198
-
199
- def test_retry
200
- any_instance_of(Savon::Client) do |klass|
201
- stub(klass).call(:get_lead_changes, anything) do
202
- raise "foo"
203
- end
204
- end
205
-
206
- mock(Embulk.logger).warn(/Retrying/).times(task[:retry_limit])
207
- stub(Embulk.logger).info {}
208
-
209
- assert_raise do
210
- @plugin.run
211
- end
212
- end
213
- end
214
-
215
- class FormatRecordTest < self
216
- def setup
217
- @page_builder = Object.new
218
- plugin_task = task.dup
219
- plugin_task[:columns] = [
220
- {"name" => "time", "type" => :timestamp, "format" => "%Y-%m-%d %H:%M:%S"}
221
- ]
222
- @plugin = ActivityLog.new(plugin_task, nil, nil, @page_builder)
223
- end
224
-
225
- data do
226
- [
227
- ["valid timestamp", [Time.parse("2000-01-01 00:00:00"), "2000-01-01 00:00:00"]],
228
- ["nil", [nil, nil]],
229
- ["empty", [nil, ""]],
230
- ]
231
- end
232
- def test_valid_timestamp(data)
233
- expected, actual = data
234
- record = { "time" => actual }
235
- assert_equal [expected], @plugin.format_record(record)
236
- end
237
-
238
- def test_invalid_timestamp
239
- record = { "time" => "123" }
240
- assert_raise(Embulk::ConfigError) do
241
- @plugin.format_record(record)
242
- end
243
- end
244
- end
245
-
246
- class RunTest < self
247
- def setup_soap
248
- @soap = MarketoApi::Soap::ActivityLog.new(settings[:endpoint], settings[:wsdl], settings[:user_id], settings[:encryption_key])
249
-
250
- stub(ActivityLog).soap_client(task) { @soap }
251
- end
252
-
253
- def setup_plugin
254
- @page_builder = Object.new
255
- @plugin = ActivityLog.new(task, nil, nil, @page_builder)
256
- stub(Embulk).logger { ::Logger.new(IO::NULL) }
257
- end
258
-
259
- def setup
260
- setup_soap
261
- setup_plugin
262
- end
263
-
264
- def test_run_through
265
- stub(@plugin).preview? { false }
266
-
267
- any_instance_of(Savon::Client) do |klass|
268
- mock(klass).call(:get_lead_changes, message: request) do
269
- savon_response(xml_ac_response)
270
- end
271
-
272
- mock(klass).call(:get_lead_changes, message: offset_request) do
273
- savon_response(xml_ac_next_response)
274
- end
275
- end
276
-
277
- mock(@page_builder).add(["1", Time.parse("2015-07-14T00:00:09+0000"), "at1", "score1", "100", "Attribute1", "402"])
278
- mock(@page_builder).add(["2", Time.parse("2015-07-14T00:00:10+0000"), "at2", "score2", "90", "Attribute2", "403"])
279
- mock(@page_builder).add(["3", Time.parse("2015-07-14T00:00:11+0000"), "at3", "score3", "100", "Attribute3", "404"])
280
- mock(@page_builder).finish
281
-
282
- @plugin.init
283
- @plugin.run
284
- end
285
-
286
- def test_run_with_no_response
287
- stub(@plugin).preview? { false }
288
-
289
- any_instance_of(Savon::Client) do |klass|
290
- mock(klass).call(:get_lead_changes, message: request) do
291
- savon_response xml_ac_none_response
292
- end
293
- end
294
-
295
- mock(@page_builder).finish
296
-
297
- @plugin.init
298
- @plugin.run
299
- end
300
-
301
- def test_preview_through
302
- stub(@plugin).preview? { true }
303
-
304
- any_instance_of(Savon::Client) do |klass|
305
- mock(klass).call(:get_lead_changes, message: preview_request) do
306
- savon_response xml_ac_preview_response
307
- end
308
- end
309
-
310
- 1.upto(ActivityLog::PREVIEW_COUNT) do |count|
311
- mock(@page_builder).add([count.to_s, Time.parse("2015-07-14T00:00:11+0000"), "at#{count}", "score#{count}", "100", "Attribute#{count}", "404"])
312
- end
313
- mock(@page_builder).finish
314
-
315
- @plugin.init
316
- @plugin.run
317
- end
318
-
319
- def test_wrong_type
320
- any_instance_of(Savon::Client) do |klass|
321
- stub(klass).call(:get_lead_changes, message: request) do
322
- savon_response xml_ac_next_response
323
- end
324
- end
325
- stub(@page_builder).add {}
326
- stub(@page_builder).finish {}
327
-
328
- task = task()
329
- task[:columns] = [
330
- {"name" => "Old Value", "type" => :timestamp}
331
- ]
332
- @plugin = ActivityLog.new(task, nil, nil, @page_builder)
333
-
334
- assert_raise(Embulk::ConfigError) do
335
- @plugin.init
336
- @plugin.run
337
- end
338
- end
339
-
340
- def test_task_report
341
- stub(@plugin).preview? { false }
342
-
343
- any_instance_of(Savon::Client) do |klass|
344
- mock(klass).call(:get_lead_changes, anything) do
345
- savon_response(xml_ac_response_no_record)
346
- end
347
- end
348
-
349
- mock(@page_builder).finish
350
-
351
- from_datetime = "1998-11-11"
352
- plugin = ActivityLog.new(task().merge(from_datetime: from_datetime), nil, nil, @page_builder)
353
- plugin.init
354
- actual = plugin.run
355
- expected = {
356
- from_datetime: from_datetime
357
- }
358
-
359
- assert_equal expected, actual
360
- end
361
-
362
- private
363
-
364
- def request
365
- {
366
- start_position: {
367
- oldest_created_at: Time.parse(from_datetime).iso8601,
368
- latest_created_at: Time.parse(to_datetime).iso8601,
369
- },
370
- batch_size: 100
371
- }
372
- end
373
-
374
- def offset_request
375
- {
376
- start_position: {
377
- oldest_created_at: Time.parse(from_datetime).iso8601,
378
- latest_created_at: Time.parse(to_datetime).iso8601,
379
- offset: "offset"
380
- },
381
- batch_size: 100
382
- }
383
- end
384
- end
385
-
386
- def preview_request
387
- {
388
- start_position: {
389
- oldest_created_at: Time.parse(from_datetime).iso8601,
390
- },
391
- batch_size: ActivityLog::PREVIEW_COUNT
392
- }
393
- end
394
-
395
- private
396
-
397
- def settings
398
- {
399
- endpoint: "https://marketo.example.com",
400
- wsdl: "https://marketo.example.com/?wsdl",
401
- user_id: "user_id",
402
- encryption_key: "TOPSECRET",
403
- from_datetime: from_datetime,
404
- to_datetime: to_datetime,
405
- }
406
- end
407
-
408
- def config
409
- DataSource[settings.to_a]
410
- end
411
-
412
- def task
413
- {
414
- endpoint_url: "https://marketo.example.com",
415
- wsdl_url: "https://marketo.example.com/?wsdl",
416
- user_id: "user_id",
417
- encryption_key: "TOPSECRET",
418
- from_datetime: from_datetime,
419
- to_datetime: to_datetime,
420
- retry_initial_wait_sec: 0,
421
- retry_limit: 2,
422
- columns: [
423
- {"name" => :id, "type" => :long},
424
- {"name" => :activity_date_time, "type" => :timestamp, "format" => "%Y-%m-%dT%H:%M:%S%z"},
425
- {"name" => :activity_type, "type" => :string},
426
- {"name" => :mktg_asset_name, "type" => :string},
427
- {"name" => :mkt_person_id, "type" => :long},
428
- {"name" => "Attribute Name", "type" => :string},
429
- {"name" => "Old Value", "type" => :string},
430
- ]
431
- }
432
- end
433
-
434
- def from_datetime
435
- "2015-07-01 00:00:00+00:00"
436
- end
437
-
438
- def to_datetime
439
- "2015-11-01 00:00:00+00:00"
440
- end
441
- end
442
- end
443
- end
444
- end
@@ -1,76 +0,0 @@
1
- require "prepare_embulk"
2
- require "embulk/input/marketo/base"
3
-
4
- module Embulk
5
- module Input
6
- module Marketo
7
- class BaseTest < Test::Unit::TestCase
8
- def test_target
9
- assert_raise(NotImplementedError) do
10
- Base.target
11
- end
12
- end
13
-
14
- class SoapClientTest < self
15
- def setup
16
- stub(Base).target { :lead }
17
- @client = Base.soap_client(config)
18
- end
19
-
20
- def test_endpoint
21
- assert_equal(settings[:endpoint], @client.endpoint)
22
- end
23
-
24
- def test_wsdl
25
- assert_equal(settings[:wsdl], @client.wsdl)
26
- end
27
-
28
- def test_user_id
29
- assert_equal(settings[:user_id], @client.user_id)
30
- end
31
-
32
- def test_encryption_key
33
- assert_equal(settings[:encryption_key], @client.encryption_key)
34
- end
35
- end
36
-
37
- private
38
-
39
- def config
40
- DataSource[settings.to_a]
41
- end
42
-
43
- def settings
44
- {
45
- endpoint: "https://marketo.example.com",
46
- wsdl: "https://marketo.example.com/?wsdl",
47
- user_id: "user_id",
48
- encryption_key: "TOPSECRET",
49
- from_datetime: from_datetime,
50
- columns: [
51
- {"name" => "Name", "type" => "string"},
52
- ]
53
- }
54
- end
55
-
56
- def from_datetime
57
- "2015-07-01 00:00:00+00:00"
58
- end
59
-
60
- def task
61
- {
62
- endpoint_url: "https://marketo.example.com",
63
- wsdl_url: "https://marketo.example.com/?wsdl",
64
- user_id: "user_id",
65
- encryption_key: "TOPSECRET",
66
- from_datetime: from_datetime,
67
- columns: [
68
- {"name" => "Name", "type" => "string"},
69
- ]
70
- }
71
- end
72
-
73
- end
74
- end
75
- end
76
- end