embulk-input-marketo 0.4.0 → 0.5.0

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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +16 -62
  3. data/.travis.yml.erb +9 -14
  4. data/CHANGELOG.md +8 -0
  5. data/README.md +2 -4
  6. data/embulk-input-marketo.gemspec +2 -1
  7. data/gemfiles/embulk-latest +1 -1
  8. data/lib/embulk/input/marketo/activity_log.rb +13 -12
  9. data/lib/embulk/input/marketo/lead.rb +19 -17
  10. data/lib/embulk/input/marketo_api/soap/activity_log.rb +25 -23
  11. data/lib/embulk/input/marketo_api/soap/base.rb +14 -19
  12. data/lib/embulk/input/marketo_api/soap/lead.rb +22 -17
  13. data/test/activity_log_fixtures.rb +181 -150
  14. data/test/embulk/input/marketo/test_activity_log.rb +13 -15
  15. data/test/embulk/input/marketo/test_lead.rb +19 -22
  16. data/test/embulk/input/marketo_api/soap/test_activity_log.rb +33 -8
  17. data/test/embulk/input/marketo_api/soap/test_base.rb +2 -14
  18. data/test/embulk/input/marketo_api/soap/test_lead.rb +2 -2
  19. data/test/lead_fixtures.rb +11 -19
  20. data/test/savon_helper.rb +17 -0
  21. metadata +18 -25
  22. data/gemfiles/embulk-0.6.0-latest +0 -4
  23. data/gemfiles/embulk-0.6.13 +0 -4
  24. data/gemfiles/embulk-0.6.14 +0 -4
  25. data/gemfiles/embulk-0.6.15 +0 -4
  26. data/gemfiles/embulk-0.6.16 +0 -4
  27. data/gemfiles/embulk-0.6.17 +0 -4
  28. data/gemfiles/embulk-0.6.18 +0 -4
  29. data/gemfiles/embulk-0.6.19 +0 -4
  30. data/gemfiles/embulk-0.6.20 +0 -4
  31. data/gemfiles/embulk-0.6.21 +0 -4
  32. data/gemfiles/embulk-0.6.22 +0 -4
  33. data/gemfiles/embulk-0.6.23 +0 -4
  34. data/gemfiles/embulk-0.6.24 +0 -4
  35. data/gemfiles/embulk-0.6.25 +0 -4
  36. data/gemfiles/embulk-0.6.26 +0 -4
  37. data/gemfiles/embulk-0.6.27 +0 -4
  38. data/gemfiles/embulk-0.7.0 +0 -4
  39. data/gemfiles/embulk-0.7.0-latest +0 -4
  40. data/gemfiles/embulk-0.7.1 +0 -4
  41. data/gemfiles/embulk-0.7.2 +0 -4
  42. data/gemfiles/embulk-0.7.3 +0 -4
  43. data/gemfiles/embulk-0.7.4 +0 -4
  44. data/gemfiles/embulk-0.7.5 +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dde3369b27304f507037e63efd59b2e4e7bdc449
4
- data.tar.gz: fd6df82180b3d3fbf3ef0835b16ea6894f1e4161
3
+ metadata.gz: 8e89a971b0dca06b010f1081c37969c59c1ef04c
4
+ data.tar.gz: 8dda51b8e935c023e514c6db6e1e15b868fc59ff
5
5
  SHA512:
6
- metadata.gz: 3ec3f1ca521a50e53e6c62fe7c51e67c44c09bad74936ff4e34b52fe6e00f721848bef35a35d2030c75a641d405126ea7efe28871928fc9319041b5dcc200f13
7
- data.tar.gz: 303b8b3f47e439d4e863f6f157f64de2cc7d46fd46b2487f206573e7e4d0a43e00e6edd6a902b10e10200204e2fd1149e0982352fda66efbbd2500909959363c
6
+ metadata.gz: a4f0072db71cdbd8ea2b6cad7c1071c5fd5ca05efe827d27d0e6185142028464890f98b413343e98396330d037ced52e114bbeec9c229a2746f573bfda070b7a
7
+ data.tar.gz: e7e7f52566640fba0a3d5cb23087dc10f6e94dd7635e6a17e36018cd8aed257ced0608a50793596608e84b0f5cb31e2bbd6c36506185b1f98bb83bd7f4004f7f
data/.travis.yml CHANGED
@@ -5,87 +5,41 @@ addons:
5
5
  repo_token:
6
6
  secure: "cYPXD2Dv1VOU0rdUSsevrGuHcjBajCTq8s961R8d2pPkX+V1AbmIMKK0if00qMgqR7D65p6jOnfiuZfXolF1z4awqLXNu7LhP6zOr1hMRCOHOfjj/SJLbm5MFreN81G+6k4XpfBlA9YShA9E/nNVxBmakxC8aCnlJHGfDUbkb9kmNX/LXSNf0efZMRVr3vN8tP6tHP0TUCx90A2FNols9qHgl+boxF090OpgFTspyeqC6K82Q4D97RwajnM+oKIBMfxuc4Pc1n+PZ+mQQfYNK7ze4WszXRtQydwDD7rtF5d6IwczElZ243GjXxdJWL6inUvcMJQogC5X8ayh7m0ZNT2awfbJXT1tsLte42j+/eUAPaCD07bE8XzgdmfTdmpxP6nHasAMkleDMlcBRrxht+cGD61qEXcsSKd0c7mnvg35L+hl39NGFde0yz1Xxx/D69p9KHE0pa7cZNC7D8n1w9AUxFdl8OX6rfDlgiapIonAF/QG/5Z3ltHDzZu6XK1MMFugrdV7SxuSepL3xgBv5jN0jMA/GVmvFbXf6FGDXxt/bhSUCZoTJ/c8BaRnIM+QTkBts6TqgQ6BeUQNAe5p0TtssNwMW8RC4DpkaLDeQRSScJJ6V6UDpjsPJ3hcozpzrCVwy/5F72MYzcHeKg85EF30aA94Q+EDbsKUR0BEeGo="
7
7
 
8
- notifications:
9
- slack:
10
- secure: NP6hpwbwLnX9jFgENk3FN3B4jO4b2bIeK7gU9tRw87QmlUFDCcypSVYJrd7j1oQP4plZy+ohZMCs7RQJmtP1k2RQ99tu2ncWhslpz6f5zZo1Hjx4hleFpAv6N9tycfxEILcq/USxcTdM/8/YPtDr5WXM+w3hTuE21VlxqT6ED9LUYaiiUZeZApBXYAe36BIOGe+TtmwWrMfXvaqaoAt0A7pIzaXPD4i7WxR+qAMM4gjJGzH4JKs2zoQ2MgI81xD5Pe0yz/5ciiHATJj0WFkrOeZaoqFvW5MQ20eArvfW9dC7/fXnrPx8RPd6iaD29hQfnPI2mnWRvXxch0DsBcYOfFzYpdgx43XVTXVJ3zyudbgqnL8RrTbwIMsxIrEW3hAZ1MvxiKDBACWFdbzz8GAjywaq0zRZ/zKam1zcDRMQAWnZP54wUFHfSXvZWhRDzImSYTM75EqaspTabRQp89SpRuaGl+ab7wEDdJBXqLiUf7jHYc2K3F9o4B99luSvbxGv97M9D7P+Aee7tpFe4mjTuxjDnIVDbQzdza8qrZWXNfymSPb2pZOKP535alF92XalExBQnxKPzmUYDpTksrsgYPZeUHcnwO6J5lCPfPerWJ/U+s4PEm0HE5TpghhsZ901gYxCeDw/KnVQGsIy3f8YAI/+YVwjl4Ld4BOd1MV2PB8=
11
-
12
8
  before_install:
13
9
  - |
14
10
  # Currently, Travis can't treat jruby 9.0.1.0
15
- if [[ ${TRAVIS_RUBY_VERSION} = "jruby-9.0.0.0" ]];then
16
- rvm get head
17
- rvm use jruby-9.0.1.0 --install
18
- ruby -v
19
- fi
11
+ ruby -v
12
+ rvm get head
13
+ rvm use jruby-9.0.5.0 --install
14
+ ruby -v
15
+ gem i bundler
16
+ bundle install
20
17
 
21
18
  jdk: oraclejdk8
22
19
 
23
20
  rvm:
24
- - jruby-19mode
25
- - jruby-9.0.0.0
21
+ - jruby-9.0.5.0
22
+
23
+ script: bundle exec rake test
26
24
 
27
25
  gemfile:
28
- - gemfiles/embulk-0.6.0-latest
29
- - gemfiles/embulk-0.6.13
30
- - gemfiles/embulk-0.6.14
31
- - gemfiles/embulk-0.6.15
32
- - gemfiles/embulk-0.6.16
33
- - gemfiles/embulk-0.6.17
34
- - gemfiles/embulk-0.6.18
35
- - gemfiles/embulk-0.6.19
36
- - gemfiles/embulk-0.6.20
37
- - gemfiles/embulk-0.6.21
38
- - gemfiles/embulk-0.6.22
39
- - gemfiles/embulk-0.6.23
40
- - gemfiles/embulk-0.6.24
41
- - gemfiles/embulk-0.6.25
42
- - gemfiles/embulk-0.6.26
43
- - gemfiles/embulk-0.6.27
44
- - gemfiles/embulk-0.7.0
45
- - gemfiles/embulk-0.7.0-latest
46
- - gemfiles/embulk-0.7.1
47
- - gemfiles/embulk-0.7.2
48
- - gemfiles/embulk-0.7.3
49
- - gemfiles/embulk-0.7.4
50
- - gemfiles/embulk-0.7.5
26
+ - gemfiles/embulk-0.8.0-latest
27
+ - gemfiles/embulk-0.8.7
28
+ - gemfiles/embulk-0.8.8
51
29
  - gemfiles/embulk-latest
52
30
 
53
31
  matrix:
54
32
  exclude:
55
33
  - jdk: oraclejdk8 # Ignore all matrix at first, use `include` to allow build
56
34
  include:
57
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.0-latest}
58
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.13}
59
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.14}
60
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.15}
61
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.16}
62
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.17}
63
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.18}
64
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.19}
65
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.20}
66
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.21}
67
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.22}
68
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.23}
69
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.24}
70
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.25}
71
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.26}
72
- - {rvm: jruby-19mode, gemfile: gemfiles/embulk-0.6.27}
73
- - {rvm: jruby-9.0.0.0, gemfile: gemfiles/embulk-0.7.0}
74
- - {rvm: jruby-9.0.0.0, gemfile: gemfiles/embulk-0.7.0-latest}
75
- - {rvm: jruby-9.0.0.0, gemfile: gemfiles/embulk-0.7.1}
76
- - {rvm: jruby-9.0.0.0, gemfile: gemfiles/embulk-0.7.2}
77
- - {rvm: jruby-9.0.0.0, gemfile: gemfiles/embulk-0.7.3}
78
- - {rvm: jruby-9.0.0.0, gemfile: gemfiles/embulk-0.7.4}
79
- - {rvm: jruby-9.0.0.0, gemfile: gemfiles/embulk-0.7.5}
35
+ - {rvm: jruby-9.0.0.0, gemfile: gemfiles/embulk-0.8.0-latest}
36
+ - {rvm: jruby-9.0.0.0, gemfile: gemfiles/embulk-0.8.7}
37
+ - {rvm: jruby-9.0.0.0, gemfile: gemfiles/embulk-0.8.8}
80
38
  - {rvm: jruby-9.0.0.0, gemfile: gemfiles/embulk-latest}
81
39
 
82
40
 
83
41
  allow_failures:
84
- - gemfile: gemfiles/embulk-0.6.22
85
- - gemfile: gemfiles/embulk-0.7.0
86
- - gemfile: gemfiles/embulk-0.7.1
87
42
  # Ignore failure for *-latest
88
- - gemfile: embulk-0.6.0-latest
89
- - gemfile: embulk-0.7.0-latest
43
+ - gemfile: embulk-0.8.0-latest
90
44
  - gemfile: embulk-latest
91
45
 
data/.travis.yml.erb CHANGED
@@ -5,24 +5,22 @@ addons:
5
5
  repo_token:
6
6
  secure: "cYPXD2Dv1VOU0rdUSsevrGuHcjBajCTq8s961R8d2pPkX+V1AbmIMKK0if00qMgqR7D65p6jOnfiuZfXolF1z4awqLXNu7LhP6zOr1hMRCOHOfjj/SJLbm5MFreN81G+6k4XpfBlA9YShA9E/nNVxBmakxC8aCnlJHGfDUbkb9kmNX/LXSNf0efZMRVr3vN8tP6tHP0TUCx90A2FNols9qHgl+boxF090OpgFTspyeqC6K82Q4D97RwajnM+oKIBMfxuc4Pc1n+PZ+mQQfYNK7ze4WszXRtQydwDD7rtF5d6IwczElZ243GjXxdJWL6inUvcMJQogC5X8ayh7m0ZNT2awfbJXT1tsLte42j+/eUAPaCD07bE8XzgdmfTdmpxP6nHasAMkleDMlcBRrxht+cGD61qEXcsSKd0c7mnvg35L+hl39NGFde0yz1Xxx/D69p9KHE0pa7cZNC7D8n1w9AUxFdl8OX6rfDlgiapIonAF/QG/5Z3ltHDzZu6XK1MMFugrdV7SxuSepL3xgBv5jN0jMA/GVmvFbXf6FGDXxt/bhSUCZoTJ/c8BaRnIM+QTkBts6TqgQ6BeUQNAe5p0TtssNwMW8RC4DpkaLDeQRSScJJ6V6UDpjsPJ3hcozpzrCVwy/5F72MYzcHeKg85EF30aA94Q+EDbsKUR0BEeGo="
7
7
 
8
- notifications:
9
- slack:
10
- secure: NP6hpwbwLnX9jFgENk3FN3B4jO4b2bIeK7gU9tRw87QmlUFDCcypSVYJrd7j1oQP4plZy+ohZMCs7RQJmtP1k2RQ99tu2ncWhslpz6f5zZo1Hjx4hleFpAv6N9tycfxEILcq/USxcTdM/8/YPtDr5WXM+w3hTuE21VlxqT6ED9LUYaiiUZeZApBXYAe36BIOGe+TtmwWrMfXvaqaoAt0A7pIzaXPD4i7WxR+qAMM4gjJGzH4JKs2zoQ2MgI81xD5Pe0yz/5ciiHATJj0WFkrOeZaoqFvW5MQ20eArvfW9dC7/fXnrPx8RPd6iaD29hQfnPI2mnWRvXxch0DsBcYOfFzYpdgx43XVTXVJ3zyudbgqnL8RrTbwIMsxIrEW3hAZ1MvxiKDBACWFdbzz8GAjywaq0zRZ/zKam1zcDRMQAWnZP54wUFHfSXvZWhRDzImSYTM75EqaspTabRQp89SpRuaGl+ab7wEDdJBXqLiUf7jHYc2K3F9o4B99luSvbxGv97M9D7P+Aee7tpFe4mjTuxjDnIVDbQzdza8qrZWXNfymSPb2pZOKP535alF92XalExBQnxKPzmUYDpTksrsgYPZeUHcnwO6J5lCPfPerWJ/U+s4PEm0HE5TpghhsZ901gYxCeDw/KnVQGsIy3f8YAI/+YVwjl4Ld4BOd1MV2PB8=
11
-
12
8
  before_install:
13
9
  - |
14
10
  # Currently, Travis can't treat jruby 9.0.1.0
15
- if [[ ${TRAVIS_RUBY_VERSION} = "jruby-9.0.0.0" ]];then
16
- rvm get head
17
- rvm use jruby-9.0.1.0 --install
18
- ruby -v
19
- fi
11
+ ruby -v
12
+ rvm get head
13
+ rvm use jruby-9.0.5.0 --install
14
+ ruby -v
15
+ gem i bundler
16
+ bundle install
20
17
 
21
18
  jdk: oraclejdk8
22
19
 
23
20
  rvm:
24
- - jruby-19mode
25
- - jruby-9.0.0.0
21
+ - jruby-9.0.5.0
22
+
23
+ script: bundle exec rake test
26
24
 
27
25
  gemfile:
28
26
  <% versions.each do |file| -%>
@@ -38,9 +36,6 @@ matrix:
38
36
  <% end %>
39
37
 
40
38
  allow_failures:
41
- - gemfile: gemfiles/embulk-0.6.22
42
- - gemfile: gemfiles/embulk-0.7.0
43
- - gemfile: gemfiles/embulk-0.7.1
44
39
  # Ignore failure for *-latest
45
40
  <% versions.find_all{|file| file.to_s.match(/-latest/)}.each do |file| -%>
46
41
  - gemfile: <%= file %>
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 0.5.0 - 2016-04-06
2
+
3
+ This version drops old Embulk supports. Embulk 0.8 or later is required since this version.
4
+
5
+ * [enhancement] Add tests for Embulk 0.8 and drop support old Embulk [#52](https://github.com/treasure-data/embulk-input-marketo/pull/52)
6
+ * [maintenance] Refactor lead and activity [#51](https://github.com/treasure-data/embulk-input-marketo/pull/51)
7
+ * [maintenance] Refactor retry [#50](https://github.com/treasure-data/embulk-input-marketo/pull/50)
8
+
1
9
  ## 0.4.0 - 2015-10-30
2
10
 
3
11
  This version drops scheduled execution with marketo/lead.
data/README.md CHANGED
@@ -14,10 +14,10 @@ This plugin uses Marketo SOAP API.
14
14
 
15
15
  ## Overview
16
16
 
17
- Required Embulk version >= 0.6.13.
17
+ Required Embulk version >= 0.8.7 (since 0.5.0).
18
18
 
19
19
  * **Plugin type**: input
20
- * **Resume supported**: yes for `marketo/lead`, no for `marketo/activity_log`
20
+ * **Resume supported**: no for `marketo/lead`, yes for `marketo/activity_log`
21
21
  * **Cleanup supported**: no
22
22
  * **Guess supported**: yes
23
23
 
@@ -35,8 +35,6 @@ Below parameters are shown in "Admin" > "Web Services" page in Marketo.
35
35
 
36
36
  ### marketo/lead
37
37
 
38
- **NOTE: If you use feature of scheduled execution (resume) with marketo/lead, you should not specify `to_datetime` because this plugin can't place next to_datetime (can't know the date to run with new config).**
39
-
40
38
  - **endpoint** SOAP endpoint URL for your account (string, required)
41
39
  - **wsdl** SOAP endpoint URL for your account (string, default: endpoint + "?WSDL")
42
40
  - **user_id** Your user id (string, reqiured)
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "embulk-input-marketo"
3
- spec.version = "0.4.0"
3
+ spec.version = "0.5.0"
4
4
  spec.authors = ["uu59", "yoshihara"]
5
5
  spec.summary = "Marketo input plugin for Embulk"
6
6
  spec.description = "Loads records from Marketo."
@@ -14,6 +14,7 @@ Gem::Specification.new do |spec|
14
14
 
15
15
  spec.add_dependency 'savon', ['~> 2.11.1']
16
16
  spec.add_dependency 'httpclient'
17
+ spec.add_dependency 'perfect_retry', ["~> 0.3.2"]
17
18
  spec.add_development_dependency 'embulk', [">= 0.6.13", "< 1.0"]
18
19
  spec.add_development_dependency 'bundler', ['~> 1.0']
19
20
  spec.add_development_dependency 'rake', ['>= 10.0']
@@ -1,4 +1,4 @@
1
1
  source 'https://rubygems.org/'
2
2
  gemspec :path => '../'
3
3
 
4
- gem "embulk", "> 0.6.13"
4
+ gem "embulk", "> 0.8.7"
@@ -58,25 +58,18 @@ module Embulk
58
58
  def init
59
59
  @columns = task[:columns]
60
60
  @soap = MarketoApi.soap_client(task, target)
61
- end
62
-
63
- def run
64
- options = {
61
+ @options = {
65
62
  retry_initial_wait_sec: task[:retry_initial_wait_sec],
66
63
  retry_limit: task[:retry_limit],
67
64
  to: task[:to_datetime],
68
65
  batch_size: (preview? ? PREVIEW_COUNT : BATCH_SIZE_DEFAULT),
69
66
  }
67
+ end
70
68
 
69
+ def run
71
70
  counter = 0
72
- latest_updated_at = @soap.each(task[:from_datetime], options) do |activity_log|
73
- values = @columns.map do |column|
74
- name = column["name"].to_s
75
- value = activity_log[name]
76
- cast_value(column, value)
77
- end
78
-
79
- page_builder.add(values)
71
+ latest_updated_at = @soap.each(task[:from_datetime], @options) do |activity_log|
72
+ page_builder.add(format_record(activity_log))
80
73
  break if preview? && (counter += 1) >= PREVIEW_COUNT
81
74
  end
82
75
 
@@ -89,6 +82,14 @@ module Embulk
89
82
 
90
83
  return task_report
91
84
  end
85
+
86
+ def format_record(activity_log)
87
+ @columns.map do |column|
88
+ name = column["name"].to_s
89
+ value = activity_log[name]
90
+ cast_value(column, value)
91
+ end
92
+ end
92
93
  end
93
94
  end
94
95
  end
@@ -94,30 +94,19 @@ module Embulk
94
94
  @ranges = task[:ranges][index]
95
95
  @soap = MarketoApi.soap_client(task, target)
96
96
  @append_processed_time_column = task[:append_processed_time_column]
97
- end
98
-
99
- def run
100
- options = {
97
+ @options = {
101
98
  retry_initial_wait_sec: task[:retry_initial_wait_sec],
102
99
  retry_limit: task[:retry_limit],
103
100
  }
104
- options[:batch_size] = PREVIEW_COUNT if preview?
101
+ @options[:batch_size] = PREVIEW_COUNT if preview?
102
+ end
105
103
 
104
+ def run
106
105
  counter = 0
107
106
  catch(:finish) do
108
107
  @ranges.each do |range|
109
- soap.each(range, options) do |lead|
110
- values = @columns.map do |column|
111
- name = column["name"].to_s
112
- value = (lead[name] || {})[:value]
113
- cast_value(column, value)
114
- end
115
-
116
- if @append_processed_time_column
117
- values << Time.parse(range["from"])
118
- end
119
-
120
- page_builder.add(values)
108
+ soap.each(range, @options) do |lead|
109
+ page_builder.add(format_record(lead, range))
121
110
  throw(:finish) if preview? && (counter += 1) >= PREVIEW_COUNT
122
111
  end
123
112
  end
@@ -128,6 +117,19 @@ module Embulk
128
117
  task_report = {}
129
118
  return task_report
130
119
  end
120
+
121
+ def format_record(lead, range)
122
+ values = @columns.map do |column|
123
+ name = column["name"].to_s
124
+ value = (lead[name] || {})[:value]
125
+ cast_value(column, value)
126
+ end
127
+
128
+ if @append_processed_time_column
129
+ values << Time.parse(range["from"])
130
+ end
131
+ values
132
+ end
131
133
  end
132
134
  end
133
135
  end
@@ -57,42 +57,44 @@ module Embulk
57
57
 
58
58
  def fetch(request, options={}, &block)
59
59
  response = savon_call(:get_lead_changes, {message: request}, options)
60
- remaining = response.body[:success_get_lead_changes][:result][:remaining_count].to_i
60
+ remaining = response.xpath('//remainingCount').text.to_i
61
61
  Embulk.logger.info "Remaining records: #{remaining}"
62
62
 
63
- activities_list = response.body[:success_get_lead_changes][:result][:lead_change_record_list]
63
+ activities = response.xpath('//leadChangeRecord')
64
64
 
65
- if activities_list.nil?
65
+ if activities.empty?
66
66
  Embulk.logger.info "No record is fetched."
67
67
  return {remaining_count: 0, offset: nil, from_datetime: nil}
68
68
  end
69
69
 
70
- activities = activities_list[:lead_change_record].sort_by { |activity| Time.parse(activity[:activity_date_time]) }
71
-
72
70
  activities.each do |activity|
73
- record = {
74
- "id" => activity[:id],
75
- "activity_date_time" => activity[:activity_date_time],
76
- "activity_type" => activity[:activity_type],
77
- "mktg_asset_name" => activity[:mktg_asset_name],
78
- "mkt_person_id" => activity[:mkt_person_id],
79
- }
80
-
81
- activity[:activity_attributes][:attribute].each do |attributes|
82
- name = attributes[:attr_name]
83
- value = attributes[:attr_value]
84
-
85
- record[name] = value
86
- end
87
-
88
- block.call(record)
71
+ process_record(activity, &block)
89
72
  end
90
73
 
91
74
  {
92
75
  remaining_count: remaining,
93
- offset: response.body[:success_get_lead_changes][:result][:new_start_position][:offset],
94
- from_datetime: activities.last[:activity_date_time]
76
+ offset: response.xpath('//newStartPosition/offset').text,
77
+ from_datetime: activities.map{|a| Time.parse(a.at('./activityDateTime').text) }.max,
78
+ }
79
+ end
80
+
81
+ def process_record(activity, &block)
82
+ record = {
83
+ "id" => activity.at("./id").text,
84
+ "activity_date_time" => activity.at('./activityDateTime').text,
85
+ "activity_type" => activity.at('./activityType').text,
86
+ "mktg_asset_name" => activity.at('./mktgAssetName').text,
87
+ "mkt_person_id" => activity.at('./mktPersonId').text,
95
88
  }
89
+
90
+ activity.xpath('./activityAttributes/attribute').each do |attr|
91
+ name = attr.xpath('attrName').text
92
+ value = attr.xpath('attrValue').text
93
+
94
+ record[name] = value
95
+ end
96
+
97
+ block.call(record)
96
98
  end
97
99
  end
98
100
  end
@@ -1,5 +1,6 @@
1
1
  require "savon"
2
2
  require "httpclient" # net/http can't verify cert correctly
3
+ require "perfect_retry"
3
4
 
4
5
  module Embulk
5
6
  module Input
@@ -41,8 +42,19 @@ module Embulk
41
42
  )
42
43
  end
43
44
 
45
+ def retryer(retry_options)
46
+ PerfectRetry.new do |config|
47
+ config.sleep = proc{|n| retry_options[:retry_initial_wait_sec] * (2 ** (n - 1))}
48
+ config.limit = retry_options[:retry_limit]
49
+ config.dont_rescues = [Embulk::ConfigError]
50
+ config.rescues = [StandardError, Timeout::Error]
51
+ config.logger = Embulk.logger
52
+ config.log_level = nil
53
+ end
54
+ end
55
+
44
56
  def savon_call(operation, locals={}, retry_options={})
45
- with_retry(retry_options) do
57
+ retryer(retry_options).with_retry do
46
58
  catch_unretryable_error do
47
59
  savon.call(operation, locals.merge(advanced_typecasting: false))
48
60
  end
@@ -60,23 +72,6 @@ module Embulk
60
72
  }
61
73
  end
62
74
 
63
- def with_retry(options, &block)
64
- wait_sec = options[:retry_initial_wait_sec]
65
- count = 0
66
- begin
67
- yield
68
- rescue Embulk::ConfigError => e # TODO: Add Embulk::DataError for Embulk 0.7+
69
- raise e
70
- rescue ::Timeout::Error, StandardError => e
71
- count += 1
72
- raise e if count > options[:retry_limit]
73
- Embulk.logger.warn "Retrying after #{wait_sec} seconds [#{count}/#{RETRY_TIMEOUT_COUNT}] Error: #{e}"
74
- sleep wait_sec
75
- wait_sec *= 2
76
- retry
77
- end
78
- end
79
-
80
75
  def catch_unretryable_error(&block)
81
76
  yield
82
77
  rescue Savon::SOAPFault => e
@@ -101,7 +96,7 @@ module Embulk
101
96
  # unretryable error such as Authentication Failed, Invalid Request, etc.
102
97
  raise ConfigError.new soap_message
103
98
  end
104
- rescue SocketError, Errno::ECONNREFUSED => e
99
+ rescue SocketError, ::Java::JavaNet::UnknownHostException, Errno::ECONNREFUSED => e
105
100
  # maybe endpoint/wsdl domain was wrong
106
101
  Embulk.logger.debug "Connection error: endpoint=#{endpoint} wsdl=#{wsdl}"
107
102
  raise ConfigError.new "Connection error: #{e.message} (endpoint is '#{endpoint}')"