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.
- checksums.yaml +4 -4
- data/.github/PULL_REQUEST_TEMPLATE.md +37 -0
- data/.gitignore +11 -2
- data/.travis.yml +5 -45
- data/LICENSE.txt +21 -0
- data/README.md +14 -65
- data/build.gradle +102 -0
- data/config/checkstyle/checkstyle.xml +128 -0
- data/config/checkstyle/default.xml +108 -0
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +6 -0
- data/gradlew +169 -0
- data/gradlew.bat +84 -0
- data/lib/embulk/input/marketo.rb +3 -0
- data/settings.gradle +1 -0
- data/src/main/java/org/embulk/input/marketo/CsvTokenizer.java +677 -0
- data/src/main/java/org/embulk/input/marketo/MarketoInputPlugin.java +15 -0
- data/src/main/java/org/embulk/input/marketo/MarketoInputPluginDelegate.java +77 -0
- data/src/main/java/org/embulk/input/marketo/MarketoService.java +30 -0
- data/src/main/java/org/embulk/input/marketo/MarketoServiceImpl.java +176 -0
- data/src/main/java/org/embulk/input/marketo/MarketoUtils.java +172 -0
- data/src/main/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPlugin.java +63 -0
- data/src/main/java/org/embulk/input/marketo/delegate/CampaignInputPlugin.java +67 -0
- data/src/main/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPlugin.java +61 -0
- data/src/main/java/org/embulk/input/marketo/delegate/LeadWithListInputPlugin.java +58 -0
- data/src/main/java/org/embulk/input/marketo/delegate/LeadWithProgramInputPlugin.java +56 -0
- data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseBulkExtractInputPlugin.java +260 -0
- data/src/main/java/org/embulk/input/marketo/delegate/MarketoBaseInputPluginDelegate.java +69 -0
- data/src/main/java/org/embulk/input/marketo/exception/MarketoAPIException.java +30 -0
- data/src/main/java/org/embulk/input/marketo/model/MarketoAccessTokenResponse.java +92 -0
- data/src/main/java/org/embulk/input/marketo/model/MarketoBulkExtractRequest.java +59 -0
- data/src/main/java/org/embulk/input/marketo/model/MarketoError.java +40 -0
- data/src/main/java/org/embulk/input/marketo/model/MarketoField.java +91 -0
- data/src/main/java/org/embulk/input/marketo/model/MarketoResponse.java +81 -0
- data/src/main/java/org/embulk/input/marketo/model/filter/DateRangeFilter.java +31 -0
- data/src/main/java/org/embulk/input/marketo/model/filter/ListFilter.java +10 -0
- data/src/main/java/org/embulk/input/marketo/model/filter/MarketoFilter.java +8 -0
- data/src/main/java/org/embulk/input/marketo/rest/MarketoBaseRestClient.java +226 -0
- data/src/main/java/org/embulk/input/marketo/rest/MarketoFileResponseEntityReader.java +69 -0
- data/src/main/java/org/embulk/input/marketo/rest/MarketoRESTEndpoint.java +44 -0
- data/src/main/java/org/embulk/input/marketo/rest/MarketoResponseJetty92EntityReader.java +88 -0
- data/src/main/java/org/embulk/input/marketo/rest/MarketoRestClient.java +332 -0
- data/src/main/java/org/embulk/input/marketo/rest/RecordPagingIterable.java +130 -0
- data/src/test/java/org/embulk/input/marketo/TestMarketoInputPlugin.java +5 -0
- data/src/test/java/org/embulk/input/marketo/rest/MarketoBaseRestClientTest.java +220 -0
- metadata +65 -222
- data/.ruby-version +0 -1
- data/.travis.yml.erb +0 -42
- data/Gemfile +0 -3
- data/LICENSE +0 -13
- data/Rakefile +0 -20
- data/embulk-input-marketo.gemspec +0 -28
- data/gemfiles/embulk-latest +0 -4
- data/gemfiles/template.erb +0 -4
- data/lib/embulk/input/marketo/activity_log.rb +0 -103
- data/lib/embulk/input/marketo/base.rb +0 -139
- data/lib/embulk/input/marketo/lead.rb +0 -143
- data/lib/embulk/input/marketo_api.rb +0 -22
- data/lib/embulk/input/marketo_api/soap/activity_log.rb +0 -103
- data/lib/embulk/input/marketo_api/soap/base.rb +0 -135
- data/lib/embulk/input/marketo_api/soap/lead.rb +0 -91
- data/test/activity_log_fixtures.rb +0 -216
- data/test/embulk/input/marketo/test_activity_log.rb +0 -444
- data/test/embulk/input/marketo/test_base.rb +0 -76
- data/test/embulk/input/marketo/test_lead.rb +0 -605
- data/test/embulk/input/marketo_api/soap/test_activity_log.rb +0 -154
- data/test/embulk/input/marketo_api/soap/test_base.rb +0 -96
- data/test/embulk/input/marketo_api/soap/test_lead.rb +0 -139
- data/test/embulk/input/test_marketo_api.rb +0 -28
- data/test/lead_fixtures.rb +0 -111
- data/test/mute_logger.rb +0 -7
- data/test/override_assert_raise.rb +0 -18
- data/test/prepare_embulk.rb +0 -15
- data/test/run-test.rb +0 -26
- data/test/savon_helper.rb +0 -17
@@ -0,0 +1,69 @@
|
|
1
|
+
package org.embulk.input.marketo.delegate;
|
2
|
+
|
3
|
+
import com.google.common.annotations.VisibleForTesting;
|
4
|
+
import org.embulk.base.restclient.DefaultServiceDataSplitter;
|
5
|
+
import org.embulk.base.restclient.RestClientInputPluginDelegate;
|
6
|
+
import org.embulk.base.restclient.RestClientInputTaskBase;
|
7
|
+
import org.embulk.base.restclient.ServiceDataSplitter;
|
8
|
+
import org.embulk.config.Config;
|
9
|
+
import org.embulk.config.ConfigDefault;
|
10
|
+
import org.embulk.config.ConfigDiff;
|
11
|
+
import org.embulk.config.TaskReport;
|
12
|
+
import org.embulk.input.marketo.rest.MarketoRestClient;
|
13
|
+
import org.embulk.spi.Exec;
|
14
|
+
import org.embulk.spi.Schema;
|
15
|
+
import org.embulk.util.retryhelper.jetty92.DefaultJetty92ClientCreator;
|
16
|
+
import org.embulk.util.retryhelper.jetty92.Jetty92RetryHelper;
|
17
|
+
|
18
|
+
import java.util.List;
|
19
|
+
|
20
|
+
/**
|
21
|
+
* Created by tai.khuu on 9/18/17.
|
22
|
+
*/
|
23
|
+
public abstract class MarketoBaseInputPluginDelegate<T extends MarketoBaseInputPluginDelegate.PluginTask> implements RestClientInputPluginDelegate<T>
|
24
|
+
{
|
25
|
+
public static final int PREVIEW_RECORD_LIMIT = 15;
|
26
|
+
private static final int CONNECT_TIMEOUT_IN_MILLIS = 30000;
|
27
|
+
private static final int IDLE_TIMEOUT_IN_MILLIS = 60000;
|
28
|
+
public interface PluginTask
|
29
|
+
extends RestClientInputTaskBase, MarketoRestClient.PluginTask
|
30
|
+
{
|
31
|
+
@Config("maximum_retries")
|
32
|
+
@ConfigDefault("3")
|
33
|
+
Integer getMaximumRetries();
|
34
|
+
|
35
|
+
@Config("initial_retry_interval_milis")
|
36
|
+
@ConfigDefault("20000")
|
37
|
+
Integer getInitialRetryIntervalMilis();
|
38
|
+
|
39
|
+
@Config("maximum_retries_interval_milis")
|
40
|
+
@ConfigDefault("120000")
|
41
|
+
Integer getMaximumRetriesIntervalMilis();
|
42
|
+
}
|
43
|
+
|
44
|
+
@Override
|
45
|
+
public ConfigDiff buildConfigDiff(T task, Schema schema, int taskCount, List<TaskReport> taskReports)
|
46
|
+
{
|
47
|
+
return Exec.newConfigDiff();
|
48
|
+
}
|
49
|
+
|
50
|
+
@Override
|
51
|
+
public void validateInputTask(T task)
|
52
|
+
{
|
53
|
+
}
|
54
|
+
|
55
|
+
@VisibleForTesting
|
56
|
+
public MarketoRestClient createMarketoRestClient(PluginTask task)
|
57
|
+
{
|
58
|
+
if (Exec.isPreview()) {
|
59
|
+
task.setBatchSize(PREVIEW_RECORD_LIMIT);
|
60
|
+
}
|
61
|
+
return new MarketoRestClient(task, new Jetty92RetryHelper(task.getMaximumRetries(), task.getInitialRetryIntervalMilis(), task.getMaximumRetriesIntervalMilis(), new DefaultJetty92ClientCreator(CONNECT_TIMEOUT_IN_MILLIS, IDLE_TIMEOUT_IN_MILLIS)));
|
62
|
+
}
|
63
|
+
|
64
|
+
@Override
|
65
|
+
public ServiceDataSplitter<T> buildServiceDataSplitter(T task)
|
66
|
+
{
|
67
|
+
return new DefaultServiceDataSplitter();
|
68
|
+
}
|
69
|
+
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
package org.embulk.input.marketo.exception;
|
2
|
+
|
3
|
+
import org.embulk.input.marketo.model.MarketoError;
|
4
|
+
|
5
|
+
import java.util.List;
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Exception class for all API Exception
|
9
|
+
* Created by tai.khuu on 9/5/17.
|
10
|
+
*/
|
11
|
+
public class MarketoAPIException extends Exception
|
12
|
+
{
|
13
|
+
private final List<MarketoError> marketoErrors;
|
14
|
+
public MarketoAPIException(List<MarketoError> marketoErrors)
|
15
|
+
{
|
16
|
+
this.marketoErrors = marketoErrors;
|
17
|
+
}
|
18
|
+
|
19
|
+
public List<MarketoError> getMarketoErrors()
|
20
|
+
{
|
21
|
+
return marketoErrors;
|
22
|
+
}
|
23
|
+
|
24
|
+
@Override
|
25
|
+
public String getMessage()
|
26
|
+
{
|
27
|
+
MarketoError error = getMarketoErrors().get(0);
|
28
|
+
return "Marketo API Error, code: " + error.getCode() + ", message: " + error.getMessage();
|
29
|
+
}
|
30
|
+
}
|
@@ -0,0 +1,92 @@
|
|
1
|
+
package org.embulk.input.marketo.model;
|
2
|
+
|
3
|
+
import com.fasterxml.jackson.annotation.JsonProperty;
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Created by tai.khuu on 8/25/17.
|
7
|
+
*/
|
8
|
+
public class MarketoAccessTokenResponse
|
9
|
+
{
|
10
|
+
@JsonProperty("error")
|
11
|
+
private String error;
|
12
|
+
|
13
|
+
@JsonProperty("error_description")
|
14
|
+
private String errorDescription;
|
15
|
+
|
16
|
+
@JsonProperty("access_token")
|
17
|
+
private String accessToken;
|
18
|
+
|
19
|
+
@JsonProperty("token_type")
|
20
|
+
private String tokenType;
|
21
|
+
|
22
|
+
@JsonProperty("expires_in")
|
23
|
+
private Integer expiresIn;
|
24
|
+
|
25
|
+
@JsonProperty("scope")
|
26
|
+
private String scope;
|
27
|
+
|
28
|
+
public String getError()
|
29
|
+
{
|
30
|
+
return error;
|
31
|
+
}
|
32
|
+
|
33
|
+
public void setError(String error)
|
34
|
+
{
|
35
|
+
this.error = error;
|
36
|
+
}
|
37
|
+
|
38
|
+
public String getErrorDescription()
|
39
|
+
{
|
40
|
+
return errorDescription;
|
41
|
+
}
|
42
|
+
|
43
|
+
public void setErrorDescription(String errorDescription)
|
44
|
+
{
|
45
|
+
this.errorDescription = errorDescription;
|
46
|
+
}
|
47
|
+
|
48
|
+
public String getAccessToken()
|
49
|
+
{
|
50
|
+
return accessToken;
|
51
|
+
}
|
52
|
+
|
53
|
+
public void setAccessToken(String accessToken)
|
54
|
+
{
|
55
|
+
this.accessToken = accessToken;
|
56
|
+
}
|
57
|
+
|
58
|
+
public String getTokenType()
|
59
|
+
{
|
60
|
+
return tokenType;
|
61
|
+
}
|
62
|
+
|
63
|
+
public void setTokenType(String tokenType)
|
64
|
+
{
|
65
|
+
this.tokenType = tokenType;
|
66
|
+
}
|
67
|
+
|
68
|
+
public Integer getExpiresIn()
|
69
|
+
{
|
70
|
+
return expiresIn;
|
71
|
+
}
|
72
|
+
|
73
|
+
public void setExpiresIn(Integer expiresIn)
|
74
|
+
{
|
75
|
+
this.expiresIn = expiresIn;
|
76
|
+
}
|
77
|
+
|
78
|
+
public String getScope()
|
79
|
+
{
|
80
|
+
return scope;
|
81
|
+
}
|
82
|
+
|
83
|
+
public void setScope(String scope)
|
84
|
+
{
|
85
|
+
this.scope = scope;
|
86
|
+
}
|
87
|
+
|
88
|
+
public boolean hasError()
|
89
|
+
{
|
90
|
+
return error != null;
|
91
|
+
}
|
92
|
+
}
|
@@ -0,0 +1,59 @@
|
|
1
|
+
package org.embulk.input.marketo.model;
|
2
|
+
|
3
|
+
import org.embulk.input.marketo.model.filter.MarketoFilter;
|
4
|
+
|
5
|
+
import java.util.List;
|
6
|
+
import java.util.Map;
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Created by tai.khuu on 8/27/17.
|
10
|
+
*/
|
11
|
+
public class MarketoBulkExtractRequest
|
12
|
+
{
|
13
|
+
private List<String> fields;
|
14
|
+
private String format;
|
15
|
+
|
16
|
+
private Map<String, String> columnHeaderNames;
|
17
|
+
|
18
|
+
private Map<String, MarketoFilter> filter;
|
19
|
+
|
20
|
+
public List<String> getFields()
|
21
|
+
{
|
22
|
+
return fields;
|
23
|
+
}
|
24
|
+
|
25
|
+
public void setFields(List<String> fields)
|
26
|
+
{
|
27
|
+
this.fields = fields;
|
28
|
+
}
|
29
|
+
|
30
|
+
public String getFormat()
|
31
|
+
{
|
32
|
+
return format;
|
33
|
+
}
|
34
|
+
|
35
|
+
public void setFormat(String format)
|
36
|
+
{
|
37
|
+
this.format = format;
|
38
|
+
}
|
39
|
+
|
40
|
+
public Map<String, String> getColumnHeaderNames()
|
41
|
+
{
|
42
|
+
return columnHeaderNames;
|
43
|
+
}
|
44
|
+
|
45
|
+
public void setColumnHeaderNames(Map<String, String> columnHeaderNames)
|
46
|
+
{
|
47
|
+
this.columnHeaderNames = columnHeaderNames;
|
48
|
+
}
|
49
|
+
|
50
|
+
public Map<String, MarketoFilter> getFilter()
|
51
|
+
{
|
52
|
+
return filter;
|
53
|
+
}
|
54
|
+
|
55
|
+
public void setFilter(Map<String, MarketoFilter> filter)
|
56
|
+
{
|
57
|
+
this.filter = filter;
|
58
|
+
}
|
59
|
+
}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
package org.embulk.input.marketo.model;
|
2
|
+
|
3
|
+
/**
|
4
|
+
* Created by tai.khuu on 8/25/17.
|
5
|
+
*/
|
6
|
+
public class MarketoError
|
7
|
+
{
|
8
|
+
private String code;
|
9
|
+
|
10
|
+
private String message;
|
11
|
+
|
12
|
+
public String getCode()
|
13
|
+
{
|
14
|
+
return code;
|
15
|
+
}
|
16
|
+
|
17
|
+
public void setCode(String code)
|
18
|
+
{
|
19
|
+
this.code = code;
|
20
|
+
}
|
21
|
+
|
22
|
+
public String getMessage()
|
23
|
+
{
|
24
|
+
return message;
|
25
|
+
}
|
26
|
+
|
27
|
+
public void setMessage(String message)
|
28
|
+
{
|
29
|
+
this.message = message;
|
30
|
+
}
|
31
|
+
|
32
|
+
@Override
|
33
|
+
public String toString()
|
34
|
+
{
|
35
|
+
return "MarketoError{" +
|
36
|
+
"code='" + code + '\'' +
|
37
|
+
", message='" + message + '\'' +
|
38
|
+
'}';
|
39
|
+
}
|
40
|
+
}
|
@@ -0,0 +1,91 @@
|
|
1
|
+
package org.embulk.input.marketo.model;
|
2
|
+
|
3
|
+
import com.google.common.base.Optional;
|
4
|
+
import org.embulk.input.marketo.MarketoUtils;
|
5
|
+
import org.embulk.spi.type.Type;
|
6
|
+
import org.embulk.spi.type.Types;
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Created by tai.khuu on 9/22/17.
|
10
|
+
*/
|
11
|
+
|
12
|
+
public class MarketoField
|
13
|
+
{
|
14
|
+
private String name;
|
15
|
+
|
16
|
+
private MarketoDataType marketoDataType;
|
17
|
+
|
18
|
+
|
19
|
+
public MarketoField(String name, String dataType)
|
20
|
+
{
|
21
|
+
this.name = name;
|
22
|
+
try {
|
23
|
+
marketoDataType = MarketoDataType.valueOf(dataType.toUpperCase());
|
24
|
+
} catch (IllegalArgumentException ex) {
|
25
|
+
marketoDataType = MarketoDataType.STRING;
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
public MarketoField(String name, MarketoDataType marketoDataType)
|
30
|
+
{
|
31
|
+
this.name = name;
|
32
|
+
this.marketoDataType = marketoDataType;
|
33
|
+
|
34
|
+
}
|
35
|
+
|
36
|
+
public String getName()
|
37
|
+
{
|
38
|
+
return name;
|
39
|
+
}
|
40
|
+
|
41
|
+
public MarketoDataType getMarketoDataType()
|
42
|
+
{
|
43
|
+
return marketoDataType;
|
44
|
+
}
|
45
|
+
|
46
|
+
|
47
|
+
public enum MarketoDataType
|
48
|
+
{
|
49
|
+
DATETIME(Types.TIMESTAMP, MarketoUtils.MARKETO_DATE_TIME_FORMAT),
|
50
|
+
EMAIL(Types.STRING),
|
51
|
+
FLOAT(Types.DOUBLE),
|
52
|
+
INTEGER(Types.LONG),
|
53
|
+
FORMULA(Types.STRING),
|
54
|
+
PERCENT(Types.LONG),
|
55
|
+
URL(Types.STRING),
|
56
|
+
PHONE(Types.STRING),
|
57
|
+
TEXTAREA(Types.STRING),
|
58
|
+
TEXT(Types.STRING),
|
59
|
+
STRING(Types.STRING),
|
60
|
+
SCORE(Types.LONG),
|
61
|
+
BOOLEAN(Types.BOOLEAN),
|
62
|
+
CURRENCY(Types.DOUBLE),
|
63
|
+
DATE(Types.TIMESTAMP, MarketoUtils.MARKETO_DATE_FORMAT),
|
64
|
+
REFERENCE(Types.STRING);
|
65
|
+
|
66
|
+
private Type type;
|
67
|
+
|
68
|
+
private String format;
|
69
|
+
|
70
|
+
MarketoDataType(Type type, String format)
|
71
|
+
{
|
72
|
+
this.type = type;
|
73
|
+
this.format = format;
|
74
|
+
}
|
75
|
+
|
76
|
+
MarketoDataType(Type type)
|
77
|
+
{
|
78
|
+
this.type = type;
|
79
|
+
}
|
80
|
+
|
81
|
+
public Type getType()
|
82
|
+
{
|
83
|
+
return type;
|
84
|
+
}
|
85
|
+
|
86
|
+
public Optional<String> getFormat()
|
87
|
+
{
|
88
|
+
return Optional.fromNullable(format);
|
89
|
+
}
|
90
|
+
}
|
91
|
+
}
|
@@ -0,0 +1,81 @@
|
|
1
|
+
package org.embulk.input.marketo.model;
|
2
|
+
|
3
|
+
import java.util.List;
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Created by tai.khuu on 8/25/17.
|
7
|
+
*/
|
8
|
+
public class MarketoResponse<T>
|
9
|
+
{
|
10
|
+
private String requestId;
|
11
|
+
|
12
|
+
private boolean success;
|
13
|
+
|
14
|
+
private String nextPageToken;
|
15
|
+
|
16
|
+
private boolean moreResult;
|
17
|
+
|
18
|
+
private List<MarketoError> errors;
|
19
|
+
|
20
|
+
private List<T> result;
|
21
|
+
|
22
|
+
public String getRequestId()
|
23
|
+
{
|
24
|
+
return requestId;
|
25
|
+
}
|
26
|
+
|
27
|
+
public void setRequestId(String requestId)
|
28
|
+
{
|
29
|
+
this.requestId = requestId;
|
30
|
+
}
|
31
|
+
|
32
|
+
public boolean isSuccess()
|
33
|
+
{
|
34
|
+
return success;
|
35
|
+
}
|
36
|
+
|
37
|
+
public void setSuccess(boolean success)
|
38
|
+
{
|
39
|
+
this.success = success;
|
40
|
+
}
|
41
|
+
|
42
|
+
public List<MarketoError> getErrors()
|
43
|
+
{
|
44
|
+
return errors;
|
45
|
+
}
|
46
|
+
|
47
|
+
public void setErrors(List<MarketoError> errors)
|
48
|
+
{
|
49
|
+
this.errors = errors;
|
50
|
+
}
|
51
|
+
|
52
|
+
public List<T> getResult()
|
53
|
+
{
|
54
|
+
return result;
|
55
|
+
}
|
56
|
+
|
57
|
+
public void setResult(List<T> result)
|
58
|
+
{
|
59
|
+
this.result = result;
|
60
|
+
}
|
61
|
+
|
62
|
+
public String getNextPageToken()
|
63
|
+
{
|
64
|
+
return nextPageToken;
|
65
|
+
}
|
66
|
+
|
67
|
+
public void setNextPageToken(String nextPageToken)
|
68
|
+
{
|
69
|
+
this.nextPageToken = nextPageToken;
|
70
|
+
}
|
71
|
+
|
72
|
+
public boolean isMoreResult()
|
73
|
+
{
|
74
|
+
return moreResult;
|
75
|
+
}
|
76
|
+
|
77
|
+
public void setMoreResult(boolean moreResult)
|
78
|
+
{
|
79
|
+
this.moreResult = moreResult;
|
80
|
+
}
|
81
|
+
}
|