embulk-output-mailchimp 0.3.18 → 0.3.19

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3d40d14e9983581d16ab09fb8c909b443eb25373
4
- data.tar.gz: ed754d0a34cae59e5d0e6e36012a44bcac293551
3
+ metadata.gz: c09e4eb035f05f307279f2ecf2ce11c3050b1cf6
4
+ data.tar.gz: c38bcf2a895c5c87cdb8d075867fac68cda8b15c
5
5
  SHA512:
6
- metadata.gz: 274b98c648edc2175e9551996e77a136dbe046dd38efa410deb94adb3c308a05a8c5ac8e0cab0c7e6f4d24771798f1ad6a51270c69108b85f6c28321e37edf4b
7
- data.tar.gz: 78652eeea2f7b95488bf6fbff24b986af8dbe2ed8a3d4faf8fcf6e42401b7bdbe24eab80738de4e5e8071bad47d3df196d150c421747668bcefb311a4025028a
6
+ metadata.gz: fbe4afd20c07d7863ae67c5cd35617b12de3bcedea65b7cc271689ef65f7ca84a1d0f8c508bceac15531407739c220eb868afc78c35d773ce68608ca7291f68a
7
+ data.tar.gz: 8ade98e5dde219c3e43e2711bd50c71ff23c32c38e6510235cb44c320f09c2094832e33ea4bd4a6cd88fe041c6a0f947553468889d2ae66f7797223e315fb4e0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 0.3.19 - 2017-10-10
2
+ - Fixed bug can not parse invalid JSON response and added request timeout to avoid flush MailChimp API [#35](https://github.com/treasure-data/embulk-output-mailchimp/pull/35)
3
+
1
4
  ## 0.3.18 - 2017-09-19
2
5
  - Fixed error parsing MailChimp API response JSON when push the large data [#34](https://github.com/treasure-data/embulk-output-mailchimp/pull/34)
3
6
 
data/README.md CHANGED
@@ -25,6 +25,7 @@ add e-mail to List in MailChimp.
25
25
  - **grouping_columns**: Array for group names in MailChimp dashboard(array, default: nil)
26
26
  - **language_column**: column name for language (string, optional, default: nil)
27
27
  - **double_optin**: control whether to send an opt-in confirmation email (boolean, default: true)
28
+ - **max_records_per_request**: The max records per batch request. MailChimp API enables max records is 500 per batch request (int, default: 500)
28
29
 
29
30
  ## Example
30
31
 
data/build.gradle CHANGED
@@ -18,7 +18,7 @@ configurations {
18
18
  provided
19
19
  }
20
20
 
21
- version = "0.3.18"
21
+ version = "0.3.19"
22
22
 
23
23
  sourceCompatibility = 1.7
24
24
  targetCompatibility = 1.7
@@ -5,6 +5,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
5
5
  import com.fasterxml.jackson.databind.DeserializationFeature;
6
6
  import com.fasterxml.jackson.databind.JsonNode;
7
7
  import com.fasterxml.jackson.databind.ObjectMapper;
8
+ import com.fasterxml.jackson.databind.node.MissingNode;
8
9
  import com.fasterxml.jackson.databind.node.ObjectNode;
9
10
  import com.google.common.base.Function;
10
11
  import com.google.common.base.Joiner;
@@ -31,6 +32,7 @@ import org.slf4j.Logger;
31
32
  import javax.annotation.Nullable;
32
33
 
33
34
  import java.text.MessageFormat;
35
+ import java.util.ArrayList;
34
36
  import java.util.HashMap;
35
37
  import java.util.List;
36
38
  import java.util.Map;
@@ -80,6 +82,14 @@ public class MailChimpClient
80
82
  task.getListId());
81
83
 
82
84
  JsonNode response = client.sendRequest(endpoint, HttpMethod.POST, node.toString(), task);
85
+ client.avoidFlushAPI("Pushing next request");
86
+
87
+ if (response instanceof MissingNode) {
88
+ ReportResponse reportResponse = new ReportResponse();
89
+ reportResponse.setErrors(new ArrayList<ErrorResponse>());
90
+ return reportResponse;
91
+ }
92
+
83
93
  return mapper.treeToValue(response, ReportResponse.class);
84
94
  }
85
95
 
@@ -153,6 +163,9 @@ public class MailChimpClient
153
163
  task.getListId(),
154
164
  categoriesResponse.getId());
155
165
  response = client.sendRequest(detailEndpoint, HttpMethod.GET, task);
166
+
167
+ // Avoid flush MailChimp API
168
+ client.avoidFlushAPI("Fetching next category's interests");
156
169
  InterestsResponse interestsResponse = mapper.treeToValue(response, InterestsResponse.class);
157
170
  categories.put(categoriesResponse.getTitle().toLowerCase(),
158
171
  convertInterestCategoryToMap(interestsResponse.getInterests()));
@@ -24,6 +24,7 @@ import org.slf4j.Logger;
24
24
 
25
25
  import java.io.IOException;
26
26
  import java.util.concurrent.ExecutionException;
27
+ import java.util.concurrent.TimeUnit;
27
28
  import java.util.concurrent.TimeoutException;
28
29
 
29
30
  /**
@@ -66,6 +67,7 @@ public class MailChimpHttpClient
66
67
  {
67
68
  Request request = client
68
69
  .newRequest(endpoint)
70
+ .timeout(task.getTimeoutMillis(), TimeUnit.MILLISECONDS)
69
71
  .accept("application/json")
70
72
  .method(method);
71
73
  if (method == HttpMethod.POST || method == HttpMethod.PUT) {
@@ -117,11 +119,47 @@ public class MailChimpHttpClient
117
119
  try {
118
120
  return this.jsonMapper.readTree(json);
119
121
  }
122
+ catch (IOException ex) {
123
+ // Try to parse invalid json before throwing exception
124
+ return parseInvalidJsonString(json);
125
+ }
126
+ }
127
+
128
+ // Sometimes, the MailChimp API returns invalid JSON when we pushed a large of data. ObjectMapper can not read string json.
129
+ // So we have to use this method to parse string and build a json string as ReportResponse
130
+ // E.g invalid json response from MailChimp https://gist.github.com/thangnc/dc94026e4b13b728b7303f402b458b05
131
+ private JsonNode parseInvalidJsonString(final String json)
132
+ {
133
+ int totalCreatedIndex = json.indexOf("\"total_created\"");
134
+ int totalUpdatedIndex = json.indexOf("\"total_updated\"");
135
+ int errorCountIndex = json.indexOf("\"error_count\"");
136
+ int errorsIndex = json.indexOf("\"errors\"");
137
+
138
+ StringBuilder validJson = new StringBuilder();
139
+ validJson.append("{").append(json.substring(errorsIndex, totalCreatedIndex - 1)).append(",");
140
+ validJson.append(json.substring(totalCreatedIndex, totalCreatedIndex + "\"total_created\"".length() + 2)).append(",");
141
+ validJson.append(json.substring(totalUpdatedIndex, totalUpdatedIndex + "\"total_updated\"".length() + 2)).append(",");
142
+ validJson.append(json.substring(errorCountIndex, errorCountIndex + "\"error_count\"".length() + 2)).append("}");
143
+
144
+ try {
145
+ return this.jsonMapper.readTree(validJson.toString());
146
+ }
120
147
  catch (IOException ex) {
121
148
  throw new DataException(ex);
122
149
  }
123
150
  }
124
151
 
152
+ public void avoidFlushAPI(String reason)
153
+ {
154
+ try {
155
+ LOG.info("{} in 5s...", reason);
156
+ Thread.sleep(5000);
157
+ }
158
+ catch (InterruptedException e) {
159
+ LOG.warn("Failed to sleep: {}", e.getMessage());
160
+ }
161
+ }
162
+
125
163
  /**
126
164
  * MailChimp API v3 supports non expires access_token. Then no need refresh_token
127
165
  *
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-output-mailchimp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.18
4
+ version: 0.3.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thang Nguyen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-19 00:00:00.000000000 Z
11
+ date: 2017-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- requirement: !ruby/object:Gem::Requirement
14
+ name: bundler
15
+ version_requirements: !ruby/object:Gem::Requirement
15
16
  requirements:
16
17
  - - ~>
17
18
  - !ruby/object:Gem::Version
18
19
  version: '1.0'
19
- name: bundler
20
- prerelease: false
21
- type: :development
22
- version_requirements: !ruby/object:Gem::Requirement
20
+ requirement: !ruby/object:Gem::Requirement
23
21
  requirements:
24
22
  - - ~>
25
23
  - !ruby/object:Gem::Version
26
24
  version: '1.0'
25
+ prerelease: false
26
+ type: :development
27
27
  - !ruby/object:Gem::Dependency
28
- requirement: !ruby/object:Gem::Requirement
28
+ name: rake
29
+ version_requirements: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - '>='
31
32
  - !ruby/object:Gem::Version
32
33
  version: '10.0'
33
- name: rake
34
- prerelease: false
35
- type: :development
36
- version_requirements: !ruby/object:Gem::Requirement
34
+ requirement: !ruby/object:Gem::Requirement
37
35
  requirements:
38
36
  - - '>='
39
37
  - !ruby/object:Gem::Version
40
38
  version: '10.0'
39
+ prerelease: false
40
+ type: :development
41
41
  description: Dumps records to MailChimp.
42
42
  email:
43
43
  - thang@treasure-data.com
@@ -88,13 +88,13 @@ files:
88
88
  - test/embulk/output/test_mailchimp.rb
89
89
  - test/override_assert_raise.rb
90
90
  - test/run-test.rb
91
- - classpath/embulk-base-restclient-0.5.3.jar
92
- - classpath/embulk-output-mailchimp-0.3.18.jar
93
- - classpath/embulk-util-retryhelper-jetty92-0.5.3.jar
94
- - classpath/jetty-client-9.2.14.v20151106.jar
95
- - classpath/jetty-http-9.2.14.v20151106.jar
96
91
  - classpath/jetty-io-9.2.14.v20151106.jar
92
+ - classpath/embulk-output-mailchimp-0.3.19.jar
97
93
  - classpath/jetty-util-9.2.14.v20151106.jar
94
+ - classpath/jetty-http-9.2.14.v20151106.jar
95
+ - classpath/jetty-client-9.2.14.v20151106.jar
96
+ - classpath/embulk-base-restclient-0.5.3.jar
97
+ - classpath/embulk-util-retryhelper-jetty92-0.5.3.jar
98
98
  homepage: https://github.com/treasure-data/embulk-output-mailchimp
99
99
  licenses:
100
100
  - MIT