embulk-input-marketo 0.6.11 → 0.6.12
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 +4 -4
- data/.gitignore +0 -1
- data/CHANGELOG.md +3 -0
- data/build.gradle +1 -1
- data/src/main/java/org/embulk/input/marketo/MarketoInputPluginDelegate.java +5 -2
- data/src/main/java/org/embulk/input/marketo/MarketoService.java +4 -0
- data/src/main/java/org/embulk/input/marketo/MarketoServiceImpl.java +12 -0
- data/src/main/java/org/embulk/input/marketo/delegate/CustomObjectInputPlugin.java +75 -0
- data/src/main/java/org/embulk/input/marketo/delegate/CustomObjectResponseMapperBuilder.java +80 -0
- data/src/main/java/org/embulk/input/marketo/rest/MarketoRESTEndpoint.java +3 -1
- data/src/main/java/org/embulk/input/marketo/rest/MarketoRestClient.java +99 -0
- data/src/main/java/org/embulk/input/marketo/rest/RecordPagingIterable.java +26 -0
- data/src/test/java/org/embulk/input/marketo/delegate/CustomObjectInputPluginTest.java +101 -0
- data/src/test/java/org/embulk/input/marketo/rest/MarketoRestClientTest.java +35 -0
- data/src/test/resources/config/custom_object_config.yaml +8 -0
- data/src/test/resources/fixtures/custom_object_describe.json +124 -0
- data/src/test/resources/fixtures/custom_object_describe_marketo_fields_full.json +22 -0
- data/src/test/resources/fixtures/custom_object_expected.json +66 -0
- data/src/test/resources/fixtures/custom_object_response.json +24 -0
- data/src/test/resources/fixtures/custom_object_response_full.json +23 -0
- metadata +12 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: edba80ca03303c028b5ca8a2d70f7a7c801ec844
|
4
|
+
data.tar.gz: 4d935d696fb3b8adca5a0ac3c44684378f3b67a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20c5faedf4785d9fc4bfc4f296a851a5b1c009b470ec91a86a870517b73a9333caf85c9a7e892a6d209cd9b52fb387d09b2b02937bb0cfa6a1676f41114a42b4
|
7
|
+
data.tar.gz: 8fa3f62aec0903509f2723cb08e1fb1af5b8dffd196fa6f3e5c519085cffe0fca726f453d730f021ba00a3ebed3c4ea8dadcaaa2846932b26c8743443e88f8e5
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
data/build.gradle
CHANGED
@@ -11,6 +11,7 @@ import org.embulk.config.ConfigDefault;
|
|
11
11
|
import org.embulk.config.ConfigException;
|
12
12
|
import org.embulk.input.marketo.delegate.ActivityBulkExtractInputPlugin;
|
13
13
|
import org.embulk.input.marketo.delegate.CampaignInputPlugin;
|
14
|
+
import org.embulk.input.marketo.delegate.CustomObjectInputPlugin;
|
14
15
|
import org.embulk.input.marketo.delegate.LeadBulkExtractInputPlugin;
|
15
16
|
import org.embulk.input.marketo.delegate.LeadWithListInputPlugin;
|
16
17
|
import org.embulk.input.marketo.delegate.LeadWithProgramInputPlugin;
|
@@ -29,7 +30,8 @@ public class MarketoInputPluginDelegate
|
|
29
30
|
ActivityBulkExtractInputPlugin.PluginTask,
|
30
31
|
CampaignInputPlugin.PluginTask,
|
31
32
|
ProgramInputPlugin.PluginTask,
|
32
|
-
MarketoRestClient.PluginTask
|
33
|
+
MarketoRestClient.PluginTask,
|
34
|
+
CustomObjectInputPlugin.PluginTask
|
33
35
|
{
|
34
36
|
@Config("target")
|
35
37
|
Target getTarget();
|
@@ -73,7 +75,8 @@ public class MarketoInputPluginDelegate
|
|
73
75
|
CAMPAIGN(new CampaignInputPlugin()),
|
74
76
|
ALL_LEAD_WITH_LIST_ID(new LeadWithListInputPlugin()),
|
75
77
|
ALL_LEAD_WITH_PROGRAM_ID(new LeadWithProgramInputPlugin()),
|
76
|
-
PROGRAM(new ProgramInputPlugin())
|
78
|
+
PROGRAM(new ProgramInputPlugin()),
|
79
|
+
CUSTOM_OBJECT(new CustomObjectInputPlugin());
|
77
80
|
|
78
81
|
private RestClientInputPluginDelegate restClientInputPluginDelegate;
|
79
82
|
|
@@ -29,4 +29,8 @@ public interface MarketoService
|
|
29
29
|
Iterable<ObjectNode> getProgramsByTag(String tagType, String tagValue);
|
30
30
|
|
31
31
|
Iterable<ObjectNode> getProgramsByDateRange(Date earliestUpdatedAt, Date latestUpdatedAt, String filterType, List<String> filterValues);
|
32
|
+
|
33
|
+
Iterable<ObjectNode> getCustomObject(String customObjectAPIName, String customObjectFilterType, String customObjectFields, Integer fromValue, Integer toValue);
|
34
|
+
|
35
|
+
List<MarketoField> describeCustomObject(String customObjectAPIName);
|
32
36
|
}
|
@@ -224,4 +224,16 @@ public class MarketoServiceImpl implements MarketoService
|
|
224
224
|
{
|
225
225
|
return marketoRestClient.getProgramsByDateRange(earliestUpdatedAt, latestUpdatedAt, filterType, filterValues);
|
226
226
|
}
|
227
|
+
|
228
|
+
@Override
|
229
|
+
public List<MarketoField> describeCustomObject(String customObjectAPIName)
|
230
|
+
{
|
231
|
+
return marketoRestClient.describeCustomObject(customObjectAPIName);
|
232
|
+
}
|
233
|
+
|
234
|
+
@Override
|
235
|
+
public Iterable<ObjectNode> getCustomObject(String customObjectAPIName, String customObjectFilterType, String customObjectFields, Integer fromValue, Integer toValue)
|
236
|
+
{
|
237
|
+
return marketoRestClient.getCustomObject(customObjectAPIName, customObjectFilterType, customObjectFields, fromValue, toValue);
|
238
|
+
}
|
227
239
|
}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
package org.embulk.input.marketo.delegate;
|
2
|
+
|
3
|
+
import com.google.common.base.Optional;
|
4
|
+
import com.google.common.collect.FluentIterable;
|
5
|
+
import org.apache.commons.lang3.StringUtils;
|
6
|
+
import org.embulk.base.restclient.ServiceResponseMapper;
|
7
|
+
import org.embulk.base.restclient.record.ServiceRecord;
|
8
|
+
import org.embulk.base.restclient.record.ValueLocator;
|
9
|
+
import org.embulk.config.Config;
|
10
|
+
import org.embulk.config.ConfigDefault;
|
11
|
+
import org.embulk.config.ConfigException;
|
12
|
+
import org.embulk.input.marketo.MarketoService;
|
13
|
+
import org.embulk.input.marketo.MarketoServiceImpl;
|
14
|
+
import org.embulk.input.marketo.MarketoUtils;
|
15
|
+
import org.embulk.input.marketo.rest.MarketoRestClient;
|
16
|
+
import org.embulk.spi.Exec;
|
17
|
+
import org.slf4j.Logger;
|
18
|
+
import java.util.Iterator;
|
19
|
+
|
20
|
+
public class CustomObjectInputPlugin extends MarketoBaseInputPluginDelegate<CustomObjectInputPlugin.PluginTask>
|
21
|
+
{
|
22
|
+
private final Logger logger = Exec.getLogger(getClass());
|
23
|
+
|
24
|
+
public interface PluginTask extends MarketoBaseInputPluginDelegate.PluginTask, CustomObjectResponseMapperBuilder.PluginTask
|
25
|
+
{
|
26
|
+
@Config("custom_object_filter_type")
|
27
|
+
@ConfigDefault("\"\"")
|
28
|
+
String getCustomObjectFilterType();
|
29
|
+
|
30
|
+
@Config("custom_object_filter_from_value")
|
31
|
+
@ConfigDefault("1")
|
32
|
+
Integer getFromValue();
|
33
|
+
|
34
|
+
@Config("custom_object_filter_to_value")
|
35
|
+
@ConfigDefault("null")
|
36
|
+
Optional<Integer> getToValue();
|
37
|
+
}
|
38
|
+
|
39
|
+
public CustomObjectInputPlugin()
|
40
|
+
{
|
41
|
+
}
|
42
|
+
|
43
|
+
@Override
|
44
|
+
public void validateInputTask(PluginTask task)
|
45
|
+
{
|
46
|
+
super.validateInputTask(task);
|
47
|
+
if (StringUtils.isBlank(task.getCustomObjectFilterType())) {
|
48
|
+
throw new ConfigException("`custom_object_filter_type` cannot be empty");
|
49
|
+
}
|
50
|
+
if (StringUtils.isBlank(task.getCustomObjectAPIName())) {
|
51
|
+
throw new ConfigException("`custom_object_api_name` cannot be empty");
|
52
|
+
}
|
53
|
+
if (task.getToValue().isPresent() && task.getToValue().get() < task.getFromValue()) {
|
54
|
+
throw new ConfigException(String.format("`to_value` (%s) cannot be less than the `from_value` (%s)", task.getToValue().get(), task.getFromValue()));
|
55
|
+
}
|
56
|
+
}
|
57
|
+
@Override
|
58
|
+
protected Iterator<ServiceRecord> getServiceRecords(MarketoService marketoService, PluginTask task)
|
59
|
+
{
|
60
|
+
return FluentIterable
|
61
|
+
.from(marketoService.getCustomObject(task.getCustomObjectAPIName(), task.getCustomObjectFilterType(), task.getCustomObjectFields().orNull(), task.getFromValue(), task.getToValue().orNull()))
|
62
|
+
.transform(MarketoUtils.TRANSFORM_OBJECT_TO_JACKSON_SERVICE_RECORD_FUNCTION).iterator();
|
63
|
+
}
|
64
|
+
|
65
|
+
@Override
|
66
|
+
public ServiceResponseMapper<? extends ValueLocator> buildServiceResponseMapper(PluginTask task)
|
67
|
+
{
|
68
|
+
try (MarketoRestClient marketoRestClient = createMarketoRestClient(task)) {
|
69
|
+
MarketoService marketoService = new MarketoServiceImpl(marketoRestClient);
|
70
|
+
CustomObjectResponseMapperBuilder<PluginTask> customObjectResponseMapperBuilder = new CustomObjectResponseMapperBuilder<>(task, marketoService);
|
71
|
+
return customObjectResponseMapperBuilder.buildServiceResponseMapper(task);
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
}
|
@@ -0,0 +1,80 @@
|
|
1
|
+
package org.embulk.input.marketo.delegate;
|
2
|
+
|
3
|
+
import com.google.common.base.Optional;
|
4
|
+
import org.apache.commons.lang3.StringUtils;
|
5
|
+
import org.embulk.base.restclient.ServiceResponseMapper;
|
6
|
+
import org.embulk.base.restclient.ServiceResponseMapperBuildable;
|
7
|
+
import org.embulk.base.restclient.record.ValueLocator;
|
8
|
+
import org.embulk.config.Config;
|
9
|
+
import org.embulk.config.ConfigDefault;
|
10
|
+
import org.embulk.input.marketo.MarketoService;
|
11
|
+
import org.embulk.input.marketo.MarketoUtils;
|
12
|
+
import org.embulk.input.marketo.model.MarketoField;
|
13
|
+
import org.embulk.spi.Exec;
|
14
|
+
import org.slf4j.Logger;
|
15
|
+
import java.util.ArrayList;
|
16
|
+
import java.util.Arrays;
|
17
|
+
import java.util.List;
|
18
|
+
|
19
|
+
public class CustomObjectResponseMapperBuilder<T extends CustomObjectResponseMapperBuilder.PluginTask> implements ServiceResponseMapperBuildable<T>
|
20
|
+
{
|
21
|
+
private static final Logger LOGGER = Exec.getLogger(CustomObjectResponseMapperBuilder.class);
|
22
|
+
private MarketoService marketoService;
|
23
|
+
|
24
|
+
private T pluginTask;
|
25
|
+
|
26
|
+
public interface PluginTask extends MarketoBaseInputPluginDelegate.PluginTask
|
27
|
+
{
|
28
|
+
@Config("custom_object_api_name")
|
29
|
+
@ConfigDefault("\"\"")
|
30
|
+
String getCustomObjectAPIName();
|
31
|
+
|
32
|
+
@Config("custom_object_fields")
|
33
|
+
@ConfigDefault("null")
|
34
|
+
Optional<String> getCustomObjectFields();
|
35
|
+
}
|
36
|
+
|
37
|
+
public CustomObjectResponseMapperBuilder(T task, MarketoService marketoService)
|
38
|
+
{
|
39
|
+
this.pluginTask = task;
|
40
|
+
this.marketoService = marketoService;
|
41
|
+
}
|
42
|
+
|
43
|
+
protected List<MarketoField> getCustomObjectColumns()
|
44
|
+
{
|
45
|
+
List<MarketoField> columns = marketoService.describeCustomObject(pluginTask.getCustomObjectAPIName());
|
46
|
+
if (pluginTask.getCustomObjectFields().isPresent() && StringUtils.isNotBlank(pluginTask.getCustomObjectFields().get())) {
|
47
|
+
List<MarketoField> filteredColumns = new ArrayList<>();
|
48
|
+
List<String> includedFields = Arrays.asList(pluginTask.getCustomObjectFields().get().split(","));
|
49
|
+
for (String fieldName : includedFields) {
|
50
|
+
Optional<MarketoField> includedField = lookupFieldIgnoreCase(columns, fieldName);
|
51
|
+
if (includedField.isPresent()) {
|
52
|
+
filteredColumns.add(includedField.get());
|
53
|
+
}
|
54
|
+
else {
|
55
|
+
LOGGER.warn("Included field [{}] not found in Marketo Custom Object [{}] field", fieldName, pluginTask.getCustomObjectAPIName());
|
56
|
+
}
|
57
|
+
}
|
58
|
+
columns = filteredColumns;
|
59
|
+
LOGGER.info("Included Fields option is set, included columns: [{}]", columns);
|
60
|
+
}
|
61
|
+
return columns;
|
62
|
+
}
|
63
|
+
|
64
|
+
private static Optional<MarketoField> lookupFieldIgnoreCase(List<MarketoField> inputList, String lookupFieldName)
|
65
|
+
{
|
66
|
+
for (MarketoField marketoField : inputList) {
|
67
|
+
if (marketoField.getName().equalsIgnoreCase(lookupFieldName)) {
|
68
|
+
return Optional.of(marketoField);
|
69
|
+
}
|
70
|
+
}
|
71
|
+
return Optional.absent();
|
72
|
+
}
|
73
|
+
|
74
|
+
@Override
|
75
|
+
public ServiceResponseMapper<? extends ValueLocator> buildServiceResponseMapper(T task)
|
76
|
+
{
|
77
|
+
List<MarketoField> customObjectColumns = getCustomObjectColumns();
|
78
|
+
return MarketoUtils.buildDynamicResponseMapper(pluginTask.getSchemaColumnPrefix(), customObjectColumns);
|
79
|
+
}
|
80
|
+
}
|
@@ -24,7 +24,9 @@ public enum MarketoRESTEndpoint
|
|
24
24
|
GET_PROGRAMS("/rest/asset/v1/programs.json"),
|
25
25
|
GET_LEADS_BY_PROGRAM("/rest/v1/leads/programs/${program_id}.json"),
|
26
26
|
GET_CAMPAIGN("/rest/v1/campaigns.json"),
|
27
|
-
GET_PROGRAMS_BY_TAG("/rest/asset/v1/program/byTag.json")
|
27
|
+
GET_PROGRAMS_BY_TAG("/rest/asset/v1/program/byTag.json"),
|
28
|
+
GET_CUSTOM_OBJECT("/rest/v1/customobjects/${api_name}.json"),
|
29
|
+
GET_CUSTOM_OBJECT_DESCRIBE("/rest/v1/customobjects/${api_name}/describe.json");
|
28
30
|
|
29
31
|
private String endpoint;
|
30
32
|
|
@@ -1,16 +1,19 @@
|
|
1
1
|
package org.embulk.input.marketo.rest;
|
2
2
|
|
3
3
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
4
|
+
import com.fasterxml.jackson.databind.JsonNode;
|
4
5
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
5
6
|
import com.google.common.collect.ArrayListMultimap;
|
6
7
|
import com.google.common.collect.ImmutableListMultimap;
|
7
8
|
import com.google.common.collect.ImmutableMap;
|
8
9
|
import com.google.common.collect.Multimap;
|
9
10
|
|
11
|
+
import org.apache.commons.lang3.StringUtils;
|
10
12
|
import org.eclipse.jetty.client.util.FormContentProvider;
|
11
13
|
import org.eclipse.jetty.util.Fields;
|
12
14
|
import org.embulk.config.Config;
|
13
15
|
import org.embulk.config.ConfigDefault;
|
16
|
+
import org.embulk.config.ConfigException;
|
14
17
|
import org.embulk.config.Task;
|
15
18
|
import org.embulk.input.marketo.MarketoUtils;
|
16
19
|
import org.embulk.input.marketo.model.BulkExtractRangeHeader;
|
@@ -55,6 +58,14 @@ public class MarketoRestClient extends MarketoBaseRestClient
|
|
55
58
|
|
56
59
|
private static final String RANGE_HEADER = "Range";
|
57
60
|
|
61
|
+
private static final String FILTER_TYPE = "filterType";
|
62
|
+
|
63
|
+
private static final String FILTER_VALUES = "filterValues";
|
64
|
+
|
65
|
+
private static final String FIELDS = "fields";
|
66
|
+
|
67
|
+
private static final int MAX_REQUEST_SIZE = 300;
|
68
|
+
|
58
69
|
private static final int CONNECT_TIMEOUT_IN_MILLIS = 30000;
|
59
70
|
private static final int IDLE_TIMEOUT_IN_MILLIS = 60000;
|
60
71
|
|
@@ -435,4 +446,92 @@ public class MarketoRestClient extends MarketoBaseRestClient
|
|
435
446
|
}
|
436
447
|
return getRecordWithOffsetPagination(endPoint + MarketoRESTEndpoint.GET_PROGRAMS.getEndpoint(), multimap, ObjectNode.class);
|
437
448
|
}
|
449
|
+
|
450
|
+
public List<MarketoField> describeCustomObject(String apiName)
|
451
|
+
{
|
452
|
+
MarketoResponse<ObjectNode> jsonResponse = doGet(endPoint + MarketoRESTEndpoint.GET_CUSTOM_OBJECT_DESCRIBE.getEndpoint(new ImmutableMap.Builder().put("api_name", apiName).build()), null, null, new MarketoResponseJetty92EntityReader<ObjectNode>(this.readTimeoutMillis));
|
453
|
+
if (jsonResponse.getResult().size() == 0) {
|
454
|
+
throw new ConfigException(String.format("Custom Object %s is not exits.", apiName));
|
455
|
+
}
|
456
|
+
List<MarketoField> marketoFields = new ArrayList<>();
|
457
|
+
JsonNode fieldNodes = jsonResponse.getResult().get(0).path("fields");
|
458
|
+
for (JsonNode node : fieldNodes) {
|
459
|
+
String dataType = node.get("dataType").asText();
|
460
|
+
String name = node.get("name").asText();
|
461
|
+
marketoFields.add(new MarketoField(name, dataType));
|
462
|
+
}
|
463
|
+
if (marketoFields.size() == 0) {
|
464
|
+
throw new ConfigException(String.format("Custom Object %s don't have any field data.", apiName));
|
465
|
+
}
|
466
|
+
return marketoFields;
|
467
|
+
}
|
468
|
+
private <T> RecordPagingIterable<T> getCustomObjectRecordWithPagination(final String endPoint, final String customObjectFilterType, final String customObjectFields, final Integer fromValue, final Integer toValue, final Class<T> recordClass)
|
469
|
+
{
|
470
|
+
return new RecordPagingIterable<>(new RecordPagingIterable.PagingFunction<RecordPagingIterable.OffsetWithTokenPage<T>>()
|
471
|
+
{
|
472
|
+
@Override
|
473
|
+
public RecordPagingIterable.OffsetWithTokenPage<T> getNextPage(RecordPagingIterable.OffsetWithTokenPage<T> currentPage)
|
474
|
+
{
|
475
|
+
return getOffsetPage(currentPage.getNextOffSet(), currentPage.getNextPageToken());
|
476
|
+
}
|
477
|
+
|
478
|
+
@Override
|
479
|
+
public RecordPagingIterable.OffsetWithTokenPage<T> getFirstPage()
|
480
|
+
{
|
481
|
+
return getOffsetPage(fromValue, "");
|
482
|
+
}
|
483
|
+
|
484
|
+
private RecordPagingIterable.OffsetWithTokenPage<T> getOffsetPage(int offset, String nextPageToken)
|
485
|
+
{
|
486
|
+
boolean isMoreResult = true;
|
487
|
+
boolean isEndOffset = false;
|
488
|
+
int nextOffset = offset + MAX_REQUEST_SIZE;
|
489
|
+
|
490
|
+
if (toValue != null) {
|
491
|
+
if (toValue <= nextOffset) {
|
492
|
+
nextOffset = toValue + 1;
|
493
|
+
isEndOffset = true;
|
494
|
+
}
|
495
|
+
}
|
496
|
+
StringBuilder filterValues = new StringBuilder();
|
497
|
+
for (int i = offset; i < (nextOffset - 1); i++) {
|
498
|
+
filterValues.append(String.valueOf(i)).append(",");
|
499
|
+
}
|
500
|
+
filterValues.append(String.valueOf(nextOffset - 1));
|
501
|
+
|
502
|
+
ImmutableListMultimap.Builder<String, String> params = new ImmutableListMultimap.Builder<>();
|
503
|
+
params.put(FILTER_TYPE, customObjectFilterType);
|
504
|
+
params.put(FILTER_VALUES, filterValues.toString());
|
505
|
+
if (StringUtils.isNotBlank(nextPageToken)) {
|
506
|
+
params.put(NEXT_PAGE_TOKEN, nextPageToken);
|
507
|
+
}
|
508
|
+
if (customObjectFields != null) {
|
509
|
+
params.put(FIELDS, customObjectFields);
|
510
|
+
}
|
511
|
+
MarketoResponse<T> marketoResponse = doGet(endPoint, null, params.build(), new MarketoResponseJetty92EntityReader<>(readTimeoutMillis, recordClass));
|
512
|
+
String nextToken = "";
|
513
|
+
if (StringUtils.isNotBlank(marketoResponse.getNextPageToken())) {
|
514
|
+
nextToken = marketoResponse.getNextPageToken();
|
515
|
+
//skip offset when nextPageToken is exits.
|
516
|
+
nextOffset = offset;
|
517
|
+
}
|
518
|
+
|
519
|
+
if (toValue == null) {
|
520
|
+
if (marketoResponse.getResult().isEmpty()) {
|
521
|
+
isMoreResult = false;
|
522
|
+
}
|
523
|
+
}
|
524
|
+
else {
|
525
|
+
if (isEndOffset && StringUtils.isBlank(nextToken)) {
|
526
|
+
isMoreResult = false;
|
527
|
+
}
|
528
|
+
}
|
529
|
+
return new RecordPagingIterable.OffsetWithTokenPage<>(marketoResponse.getResult(), nextOffset, nextToken, isMoreResult);
|
530
|
+
}
|
531
|
+
});
|
532
|
+
}
|
533
|
+
public Iterable<ObjectNode> getCustomObject(String customObjectAPIName, String customObjectFilterType, String customObjectFields, Integer fromValue, Integer toValue)
|
534
|
+
{
|
535
|
+
return getCustomObjectRecordWithPagination(endPoint + MarketoRESTEndpoint.GET_CUSTOM_OBJECT.getEndpoint(new ImmutableMap.Builder().put("api_name", customObjectAPIName).build()), customObjectFilterType, customObjectFields, fromValue, toValue, ObjectNode.class);
|
536
|
+
}
|
438
537
|
}
|
@@ -151,4 +151,30 @@ public class RecordPagingIterable<T> implements Iterable<T>
|
|
151
151
|
return nextOffSet;
|
152
152
|
}
|
153
153
|
}
|
154
|
+
public static class OffsetWithTokenPage<T> extends Page<T>
|
155
|
+
{
|
156
|
+
private int nextOffSet;
|
157
|
+
private String nextPageToken;
|
158
|
+
public OffsetWithTokenPage(Iterable<T> records, int nextOffSet, String nextPageToken, boolean moreResult)
|
159
|
+
{
|
160
|
+
super(records, moreResult);
|
161
|
+
this.nextOffSet = nextOffSet;
|
162
|
+
this.nextPageToken = nextPageToken;
|
163
|
+
}
|
164
|
+
|
165
|
+
public int getNextOffSet()
|
166
|
+
{
|
167
|
+
return nextOffSet;
|
168
|
+
}
|
169
|
+
|
170
|
+
public String getNextPageToken()
|
171
|
+
{
|
172
|
+
return nextPageToken;
|
173
|
+
}
|
174
|
+
|
175
|
+
public void setNextPageToken(String nextPageToken)
|
176
|
+
{
|
177
|
+
this.nextPageToken = nextPageToken;
|
178
|
+
}
|
179
|
+
}
|
154
180
|
}
|
@@ -0,0 +1,101 @@
|
|
1
|
+
package org.embulk.input.marketo.delegate;
|
2
|
+
|
3
|
+
import com.fasterxml.jackson.databind.JavaType;
|
4
|
+
import com.fasterxml.jackson.databind.ObjectMapper;
|
5
|
+
import com.fasterxml.jackson.databind.node.ObjectNode;
|
6
|
+
import com.google.common.base.Optional;
|
7
|
+
import org.embulk.EmbulkTestRuntime;
|
8
|
+
import org.embulk.base.restclient.ServiceResponseMapper;
|
9
|
+
import org.embulk.base.restclient.record.RecordImporter;
|
10
|
+
import org.embulk.base.restclient.record.ValueLocator;
|
11
|
+
import org.embulk.config.ConfigException;
|
12
|
+
import org.embulk.config.ConfigLoader;
|
13
|
+
import org.embulk.config.ConfigSource;
|
14
|
+
import org.embulk.input.marketo.model.MarketoField;
|
15
|
+
import org.embulk.input.marketo.rest.MarketoRestClient;
|
16
|
+
import org.embulk.input.marketo.rest.RecordPagingIterable;
|
17
|
+
import org.embulk.spi.PageBuilder;
|
18
|
+
import org.embulk.spi.Schema;
|
19
|
+
import org.junit.Before;
|
20
|
+
import org.junit.Rule;
|
21
|
+
import org.junit.Test;
|
22
|
+
import org.mockito.ArgumentCaptor;
|
23
|
+
import org.mockito.Mockito;
|
24
|
+
import java.io.IOException;
|
25
|
+
import java.util.List;
|
26
|
+
|
27
|
+
import static org.junit.Assert.assertArrayEquals;
|
28
|
+
|
29
|
+
public class CustomObjectInputPluginTest
|
30
|
+
{
|
31
|
+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
|
32
|
+
|
33
|
+
@Rule
|
34
|
+
public EmbulkTestRuntime embulkTestRuntime = new EmbulkTestRuntime();
|
35
|
+
|
36
|
+
private CustomObjectInputPlugin customObjectInputPlugin;
|
37
|
+
|
38
|
+
private ConfigSource configSource;
|
39
|
+
|
40
|
+
private MarketoRestClient mockMarketoRestClient;
|
41
|
+
|
42
|
+
@Before
|
43
|
+
public void setUp() throws Exception
|
44
|
+
{
|
45
|
+
customObjectInputPlugin = Mockito.spy(new CustomObjectInputPlugin());
|
46
|
+
ConfigLoader configLoader = embulkTestRuntime.getInjector().getInstance(ConfigLoader.class);
|
47
|
+
configSource = configLoader.fromYaml(this.getClass().getResourceAsStream("/config/custom_object_config.yaml"));
|
48
|
+
mockMarketoRestClient = Mockito.mock(MarketoRestClient.class);
|
49
|
+
Mockito.doReturn(mockMarketoRestClient).when(customObjectInputPlugin).createMarketoRestClient(Mockito.any(CustomObjectInputPlugin.PluginTask.class));
|
50
|
+
}
|
51
|
+
|
52
|
+
@Test(expected = ConfigException.class)
|
53
|
+
public void validateCustomObjectFilterTypeError()
|
54
|
+
{
|
55
|
+
CustomObjectInputPlugin.PluginTask pluginTask = Mockito.mock(CustomObjectInputPlugin.PluginTask.class);
|
56
|
+
Mockito.when(pluginTask.getCustomObjectFilterType()).thenReturn("");
|
57
|
+
customObjectInputPlugin.validateInputTask(pluginTask);
|
58
|
+
}
|
59
|
+
|
60
|
+
@Test(expected = ConfigException.class)
|
61
|
+
public void validateCustomObjectAPINameError()
|
62
|
+
{
|
63
|
+
CustomObjectInputPlugin.PluginTask pluginTask = Mockito.mock(CustomObjectInputPlugin.PluginTask.class);
|
64
|
+
Mockito.when(pluginTask.getCustomObjectAPIName()).thenReturn("");
|
65
|
+
customObjectInputPlugin.validateInputTask(pluginTask);
|
66
|
+
}
|
67
|
+
|
68
|
+
@Test(expected = ConfigException.class)
|
69
|
+
public void validateFromValueGreaterThanToValueError()
|
70
|
+
{
|
71
|
+
CustomObjectInputPlugin.PluginTask pluginTask = Mockito.mock(CustomObjectInputPlugin.PluginTask.class);
|
72
|
+
Mockito.when(pluginTask.getFromValue()).thenReturn(100);
|
73
|
+
Mockito.when(pluginTask.getToValue()).thenReturn(Optional.of(90));
|
74
|
+
customObjectInputPlugin.validateInputTask(pluginTask);
|
75
|
+
}
|
76
|
+
|
77
|
+
@Test
|
78
|
+
public void testRun() throws IOException
|
79
|
+
{
|
80
|
+
RecordPagingIterable<ObjectNode> mockRecordPagingIterable = Mockito.mock(RecordPagingIterable.class);
|
81
|
+
JavaType javaType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, ObjectNode.class);
|
82
|
+
List<ObjectNode> objectNodeList = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/custom_object_response_full.json"), javaType);
|
83
|
+
JavaType marketoFieldsType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, MarketoField.class);
|
84
|
+
List<MarketoField> marketoFields = OBJECT_MAPPER.readValue(this.getClass().getResourceAsStream("/fixtures/custom_object_describe_marketo_fields_full.json"), marketoFieldsType);
|
85
|
+
Mockito.when(mockRecordPagingIterable.iterator()).thenReturn(objectNodeList.iterator());
|
86
|
+
Mockito.when(mockMarketoRestClient.getCustomObject(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt())).thenReturn(mockRecordPagingIterable);
|
87
|
+
Mockito.when(mockMarketoRestClient.describeCustomObject(Mockito.anyString())).thenReturn(marketoFields);
|
88
|
+
CustomObjectInputPlugin.PluginTask task = configSource.loadConfig(CustomObjectInputPlugin.PluginTask.class);
|
89
|
+
ServiceResponseMapper<? extends ValueLocator> mapper = customObjectInputPlugin.buildServiceResponseMapper(task);
|
90
|
+
RecordImporter recordImporter = mapper.createRecordImporter();
|
91
|
+
PageBuilder mockPageBuilder = Mockito.mock(PageBuilder.class);
|
92
|
+
customObjectInputPlugin.ingestServiceData(task, recordImporter, 1, mockPageBuilder);
|
93
|
+
Mockito.verify(mockMarketoRestClient, Mockito.times(1)).getCustomObject(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt());
|
94
|
+
Mockito.verify(mockMarketoRestClient, Mockito.times(1)).describeCustomObject(Mockito.anyString());
|
95
|
+
Schema embulkSchema = mapper.getEmbulkSchema();
|
96
|
+
ArgumentCaptor<Long> longArgumentCaptor = ArgumentCaptor.forClass(Long.class);
|
97
|
+
Mockito.verify(mockPageBuilder, Mockito.times(3)).setLong(Mockito.eq(embulkSchema.lookupColumn("mk_id")), longArgumentCaptor.capture());
|
98
|
+
List<Long> allValues = longArgumentCaptor.getAllValues();
|
99
|
+
assertArrayEquals(new Long[]{1L, 2L, 3L}, allValues.toArray());
|
100
|
+
}
|
101
|
+
}
|
@@ -544,4 +544,39 @@ public class MarketoRestClientTest
|
|
544
544
|
Assert.assertEquals("filter1", params2.get("filterType").get(0));
|
545
545
|
Assert.assertEquals(String.join(",", filterValues), params2.get("filterValues").get(0));
|
546
546
|
}
|
547
|
+
|
548
|
+
@Test
|
549
|
+
public void describeCustomObject() throws Exception
|
550
|
+
{
|
551
|
+
String customObjectSchema = new String(ByteStreams.toByteArray(this.getClass().getResourceAsStream("/fixtures/custom_object_describe.json")));
|
552
|
+
MarketoResponse<ObjectNode> marketoResponse = OBJECT_MAPPER.readValue(customObjectSchema, RESPONSE_TYPE);
|
553
|
+
String apiName = "custom_object";
|
554
|
+
Map<String, String> pathParams = new HashMap<>();
|
555
|
+
pathParams.put("api_name", apiName);
|
556
|
+
Mockito.doReturn(marketoResponse).when(marketoRestClient).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_CUSTOM_OBJECT_DESCRIBE.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.isNull(ImmutableListMultimap.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
|
557
|
+
List<MarketoField> marketoFields = marketoRestClient.describeCustomObject(apiName);
|
558
|
+
Assert.assertEquals(16, marketoFields.size());
|
559
|
+
JavaType marketoFieldType = OBJECT_MAPPER.getTypeFactory().constructParametrizedType(List.class, List.class, MarketoField.class);
|
560
|
+
List<MarketoField> expectedFields = OBJECT_MAPPER.readValue(new String(ByteStreams.toByteArray(this.getClass().getResourceAsStream("/fixtures/custom_object_expected.json"))), marketoFieldType);
|
561
|
+
Assert.assertArrayEquals(expectedFields.toArray(), marketoFields.toArray());
|
562
|
+
}
|
563
|
+
|
564
|
+
@Test
|
565
|
+
public void getCustomObject() throws Exception
|
566
|
+
{
|
567
|
+
String apiName = "custom_object";
|
568
|
+
Map<String, String> pathParams = new HashMap<>();
|
569
|
+
pathParams.put("api_name", apiName);
|
570
|
+
|
571
|
+
ArrayNode listPages = (ArrayNode) OBJECT_MAPPER.readTree(new String(ByteStreams.toByteArray(this.getClass().getResourceAsStream("/fixtures/custom_object_response.json")))).get("responses");
|
572
|
+
MarketoResponse<ObjectNode> page1 = OBJECT_MAPPER.readValue(listPages.get(0).toString(), RESPONSE_TYPE);
|
573
|
+
Mockito.doReturn(page1).when(marketoRestClient).doGet(Mockito.eq(END_POINT + MarketoRESTEndpoint.GET_CUSTOM_OBJECT.getEndpoint(pathParams)), Mockito.isNull(Map.class), Mockito.any(ImmutableListMultimap.class), Mockito.any(MarketoResponseJetty92EntityReader.class));
|
574
|
+
RecordPagingIterable<ObjectNode> pages = (RecordPagingIterable<ObjectNode>) marketoRestClient.getCustomObject(apiName, "id", null, 1, 2);
|
575
|
+
Iterator<ObjectNode> iterator = pages.iterator();
|
576
|
+
ObjectNode customObject1 = iterator.next();
|
577
|
+
ObjectNode customObject2 = iterator.next();
|
578
|
+
Assert.assertFalse(iterator.hasNext());
|
579
|
+
Assert.assertEquals("1", customObject1.get("id").asText());
|
580
|
+
Assert.assertEquals("2", customObject2.get("id").asText());
|
581
|
+
}
|
547
582
|
}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
account_id: 'account_id'
|
2
|
+
client_id: client_id
|
3
|
+
client_secret: client_secret
|
4
|
+
custom_object_api_name: custom_object_api_name
|
5
|
+
custom_object_filter_type: custom_object_filter_type
|
6
|
+
custom_object_fields: ""
|
7
|
+
custom_object_filter_from_value: 1
|
8
|
+
custom_object_filter_to_value: 2
|
@@ -0,0 +1,124 @@
|
|
1
|
+
{
|
2
|
+
"requestId":"185d6#14b51985ff0",
|
3
|
+
"success":true,
|
4
|
+
"result":[
|
5
|
+
{
|
6
|
+
"name":"custom_object",
|
7
|
+
"displayName":"Custom Object",
|
8
|
+
"description":"Custom Object",
|
9
|
+
"createdAt":"2015-02-03T22:36:23Z",
|
10
|
+
"updatedAt":"2015-02-03T22:36:24Z",
|
11
|
+
"idField":"marketoGUID",
|
12
|
+
"dedupeFields":["mKtestcurrency"],
|
13
|
+
"searchableFields":[
|
14
|
+
["mKtestcurrency"],
|
15
|
+
["marketoGUID"]
|
16
|
+
],
|
17
|
+
"fields":[
|
18
|
+
{
|
19
|
+
"updateable":true,
|
20
|
+
"displayName": "Marketo_test_boolean",
|
21
|
+
"dataType": "boolean",
|
22
|
+
"name": "mKtestboolean"
|
23
|
+
},
|
24
|
+
{
|
25
|
+
"updateable":true,
|
26
|
+
"displayName": "Marketo_test_currency",
|
27
|
+
"dataType": "currency",
|
28
|
+
"length": 255,
|
29
|
+
"name": "mKtestcurrency"
|
30
|
+
},
|
31
|
+
{
|
32
|
+
"updateable":true,
|
33
|
+
"displayName": "Marketo_test_date",
|
34
|
+
"dataType": "date",
|
35
|
+
"name": "mKtestdate"
|
36
|
+
},
|
37
|
+
{
|
38
|
+
"updateable":true,
|
39
|
+
"displayName": "Marketo_test_Datetime",
|
40
|
+
"dataType": "datetime",
|
41
|
+
"name": "mKtestDatetime"
|
42
|
+
},
|
43
|
+
{
|
44
|
+
"updateable":true,
|
45
|
+
"displayName": "Marketo_test_email",
|
46
|
+
"dataType": "email",
|
47
|
+
"length": 255,
|
48
|
+
"name": "mKtestemail"
|
49
|
+
},
|
50
|
+
{
|
51
|
+
"updateable":true,
|
52
|
+
"displayName": "Marketo_test_float",
|
53
|
+
"dataType": "float",
|
54
|
+
"name": "mKtestfloat"
|
55
|
+
},
|
56
|
+
{
|
57
|
+
"updateable":true,
|
58
|
+
"displayName": "Marketo_test_integer",
|
59
|
+
"dataType": "integer",
|
60
|
+
"name": "mKtestinteger"
|
61
|
+
},
|
62
|
+
{
|
63
|
+
"updateable":true,
|
64
|
+
"displayName": "Marketo_test_percent",
|
65
|
+
"dataType": "percent",
|
66
|
+
"name": "mKtestpercent"
|
67
|
+
},
|
68
|
+
{
|
69
|
+
"updateable":true,
|
70
|
+
"displayName": "Marketo_test_phone",
|
71
|
+
"dataType": "phone",
|
72
|
+
"length": 255,
|
73
|
+
"name": "mKtestphone"
|
74
|
+
},
|
75
|
+
{
|
76
|
+
"updateable":true,
|
77
|
+
"displayName": "Marketo_test_score",
|
78
|
+
"dataType": "score",
|
79
|
+
"name": "mKtestscore"
|
80
|
+
},
|
81
|
+
{
|
82
|
+
"updateable":true,
|
83
|
+
"displayName": "Marketo_test_string",
|
84
|
+
"dataType": "string",
|
85
|
+
"length": 255,
|
86
|
+
"name": "mKteststring"
|
87
|
+
},
|
88
|
+
{
|
89
|
+
"updateable":true,
|
90
|
+
"displayName": "Marketo_test_textarea",
|
91
|
+
"dataType": "textarea",
|
92
|
+
"name": "mKtesttextarea"
|
93
|
+
},
|
94
|
+
{
|
95
|
+
"updateable":true,
|
96
|
+
"displayName": "Marketo_test_url",
|
97
|
+
"dataType": "url",
|
98
|
+
"length": 255,
|
99
|
+
"name": "mKtesturl"
|
100
|
+
},
|
101
|
+
{
|
102
|
+
"updateable":true,
|
103
|
+
"displayName": "Marketo_test_reference",
|
104
|
+
"dataType": "reference",
|
105
|
+
"length": 255,
|
106
|
+
"name": "mKTestReference"
|
107
|
+
},
|
108
|
+
{
|
109
|
+
"updateable":true,
|
110
|
+
"displayName": "Marketo_test_formula",
|
111
|
+
"dataType": "formula",
|
112
|
+
"length": 255,
|
113
|
+
"name": "mKTestFormula"
|
114
|
+
},
|
115
|
+
{
|
116
|
+
"updateable":true,
|
117
|
+
"displayName": "Marketo_test_text",
|
118
|
+
"dataType": "text",
|
119
|
+
"name": "mKtesttext"
|
120
|
+
}
|
121
|
+
]
|
122
|
+
}
|
123
|
+
]
|
124
|
+
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"name": "seq",
|
4
|
+
"marketoDataType": "INTEGER"
|
5
|
+
},
|
6
|
+
{
|
7
|
+
"name": "marketoGUID",
|
8
|
+
"marketoDataType": "STRING"
|
9
|
+
},
|
10
|
+
{
|
11
|
+
"name": "id",
|
12
|
+
"marketoDataType": "INTEGER"
|
13
|
+
},
|
14
|
+
{
|
15
|
+
"name": "createdAt",
|
16
|
+
"marketoDataType": "DATETIME"
|
17
|
+
},
|
18
|
+
{
|
19
|
+
"name": "updatedAt",
|
20
|
+
"marketoDataType": "DATETIME"
|
21
|
+
}
|
22
|
+
]
|
@@ -0,0 +1,66 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"name": "mKtestboolean",
|
4
|
+
"marketoDataType": "BOOLEAN"
|
5
|
+
},
|
6
|
+
{
|
7
|
+
"name": "mKtestcurrency",
|
8
|
+
"marketoDataType": "CURRENCY"
|
9
|
+
},
|
10
|
+
{
|
11
|
+
"name": "mKtestdate",
|
12
|
+
"marketoDataType": "DATE"
|
13
|
+
},
|
14
|
+
{
|
15
|
+
"name": "mKtestDatetime",
|
16
|
+
"marketoDataType": "DATETIME"
|
17
|
+
},
|
18
|
+
{
|
19
|
+
"name": "mKtestemail",
|
20
|
+
"marketoDataType": "EMAIL"
|
21
|
+
},
|
22
|
+
{
|
23
|
+
"name": "mKtestfloat",
|
24
|
+
"marketoDataType": "FLOAT"
|
25
|
+
},
|
26
|
+
{
|
27
|
+
"name": "mKtestinteger",
|
28
|
+
"marketoDataType": "INTEGER"
|
29
|
+
},
|
30
|
+
{
|
31
|
+
"name": "mKtestpercent",
|
32
|
+
"marketoDataType": "PERCENT"
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"name": "mKtestphone",
|
36
|
+
"marketoDataType": "PHONE"
|
37
|
+
},
|
38
|
+
{
|
39
|
+
"name": "mKtestscore",
|
40
|
+
"marketoDataType": "SCORE"
|
41
|
+
},
|
42
|
+
{
|
43
|
+
"name": "mKteststring",
|
44
|
+
"marketoDataType": "STRING"
|
45
|
+
},
|
46
|
+
{
|
47
|
+
"name": "mKtesttextarea",
|
48
|
+
"marketoDataType": "TEXTAREA"
|
49
|
+
},
|
50
|
+
{
|
51
|
+
"name": "mKtesturl",
|
52
|
+
"marketoDataType": "URL"
|
53
|
+
},
|
54
|
+
{
|
55
|
+
"name": "mKTestReference",
|
56
|
+
"marketoDataType": "REFERENCE"
|
57
|
+
},
|
58
|
+
{
|
59
|
+
"name": "mKTestFormula",
|
60
|
+
"marketoDataType": "FORMULA"
|
61
|
+
},
|
62
|
+
{
|
63
|
+
"name": "mKtesttext",
|
64
|
+
"marketoDataType": "TEXT"
|
65
|
+
}
|
66
|
+
]
|
@@ -0,0 +1,24 @@
|
|
1
|
+
{
|
2
|
+
"responses":[
|
3
|
+
{
|
4
|
+
"requestId": "83e9#166f835a592",
|
5
|
+
"result": [
|
6
|
+
{
|
7
|
+
"seq": 0,
|
8
|
+
"marketoGUID": "aa168cfa-626d-49b4-b735-526e0b8c069e",
|
9
|
+
"id": 1,
|
10
|
+
"createdAt": "2018-11-06T12:01:49Z",
|
11
|
+
"updatedAt": "2018-11-06T12:01:49Z"
|
12
|
+
},
|
13
|
+
{
|
14
|
+
"seq": 1,
|
15
|
+
"marketoGUID": "da7c347d-754b-44f3-9821-d1233f0852f6",
|
16
|
+
"id": 2,
|
17
|
+
"createdAt": "2018-11-06T12:01:49Z",
|
18
|
+
"updatedAt": "2018-11-06T12:01:49Z"
|
19
|
+
}
|
20
|
+
],
|
21
|
+
"success": true
|
22
|
+
}
|
23
|
+
]
|
24
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"seq": 0,
|
4
|
+
"marketoGUID": "aa168cfa-626d-49b4-b735-526e0b8c069e",
|
5
|
+
"id": 1,
|
6
|
+
"createdAt": "2018-11-06T12:01:49Z",
|
7
|
+
"updatedAt": "2018-11-06T12:01:49Z"
|
8
|
+
},
|
9
|
+
{
|
10
|
+
"seq": 1,
|
11
|
+
"marketoGUID": "da7c347d-754b-44f3-9821-d1233f0852f6",
|
12
|
+
"id": 2,
|
13
|
+
"createdAt": "2018-11-06T12:01:49Z",
|
14
|
+
"updatedAt": "2018-11-06T12:01:49Z"
|
15
|
+
},
|
16
|
+
{
|
17
|
+
"seq": 2,
|
18
|
+
"marketoGUID": "sdfdc347d-754b-5645-9821-d1233f065456",
|
19
|
+
"id": 3,
|
20
|
+
"createdAt": "2018-11-06T12:01:49Z",
|
21
|
+
"updatedAt": "2018-11-06T12:01:49Z"
|
22
|
+
}
|
23
|
+
]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk-input-marketo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.12
|
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: 2018-
|
13
|
+
date: 2018-11-19 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,6 +72,8 @@ files:
|
|
72
72
|
- src/main/java/org/embulk/input/marketo/MarketoUtils.java
|
73
73
|
- src/main/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPlugin.java
|
74
74
|
- src/main/java/org/embulk/input/marketo/delegate/CampaignInputPlugin.java
|
75
|
+
- src/main/java/org/embulk/input/marketo/delegate/CustomObjectInputPlugin.java
|
76
|
+
- src/main/java/org/embulk/input/marketo/delegate/CustomObjectResponseMapperBuilder.java
|
75
77
|
- src/main/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPlugin.java
|
76
78
|
- src/main/java/org/embulk/input/marketo/delegate/LeadServiceResponseMapperBuilder.java
|
77
79
|
- src/main/java/org/embulk/input/marketo/delegate/LeadWithListInputPlugin.java
|
@@ -98,6 +100,7 @@ files:
|
|
98
100
|
- src/test/java/org/embulk/input/marketo/MarketoUtilsTest.java
|
99
101
|
- src/test/java/org/embulk/input/marketo/delegate/ActivityBulkExtractInputPluginTest.java
|
100
102
|
- src/test/java/org/embulk/input/marketo/delegate/CampaignInputPluginTest.java
|
103
|
+
- src/test/java/org/embulk/input/marketo/delegate/CustomObjectInputPluginTest.java
|
101
104
|
- src/test/java/org/embulk/input/marketo/delegate/LeadBulkExtractInputPluginTest.java
|
102
105
|
- src/test/java/org/embulk/input/marketo/delegate/LeadServiceResponseMapperBuilderTest.java
|
103
106
|
- src/test/java/org/embulk/input/marketo/delegate/LeadWithListInputPluginTest.java
|
@@ -107,6 +110,7 @@ files:
|
|
107
110
|
- src/test/java/org/embulk/input/marketo/rest/MarketoBaseRestClientTest.java
|
108
111
|
- src/test/java/org/embulk/input/marketo/rest/MarketoRestClientTest.java
|
109
112
|
- src/test/resources/config/activity_bulk_extract_config.yaml
|
113
|
+
- src/test/resources/config/custom_object_config.yaml
|
110
114
|
- src/test/resources/config/lead_bulk_extract_config.yaml
|
111
115
|
- src/test/resources/config/rest_config.yaml
|
112
116
|
- src/test/resources/fixtures/activity_extract1.csv
|
@@ -114,6 +118,11 @@ files:
|
|
114
118
|
- src/test/resources/fixtures/all_program_full.json
|
115
119
|
- src/test/resources/fixtures/campaign_response.json
|
116
120
|
- src/test/resources/fixtures/campaign_response_full.json
|
121
|
+
- src/test/resources/fixtures/custom_object_describe.json
|
122
|
+
- src/test/resources/fixtures/custom_object_describe_marketo_fields_full.json
|
123
|
+
- src/test/resources/fixtures/custom_object_expected.json
|
124
|
+
- src/test/resources/fixtures/custom_object_response.json
|
125
|
+
- src/test/resources/fixtures/custom_object_response_full.json
|
117
126
|
- src/test/resources/fixtures/lead_by_list.json
|
118
127
|
- src/test/resources/fixtures/lead_by_program_response.json
|
119
128
|
- src/test/resources/fixtures/lead_describe.json
|
@@ -130,8 +139,8 @@ files:
|
|
130
139
|
- classpath/jetty-util-9.2.14.v20151106.jar
|
131
140
|
- classpath/jetty-http-9.2.14.v20151106.jar
|
132
141
|
- classpath/jetty-client-9.2.14.v20151106.jar
|
142
|
+
- classpath/embulk-input-marketo-0.6.12.jar
|
133
143
|
- classpath/embulk-base-restclient-0.5.3.jar
|
134
|
-
- classpath/embulk-input-marketo-0.6.11.jar
|
135
144
|
- classpath/embulk-util-retryhelper-jetty92-0.5.3.jar
|
136
145
|
homepage: https://github.com/treasure-data/embulk-input-marketo
|
137
146
|
licenses:
|