embulk-input-zendesk-all 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.travis.yml +5 -0
  4. data/CHANGELOG.md +126 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +91 -0
  7. data/build.gradle +123 -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 +5 -0
  12. data/gradlew +172 -0
  13. data/gradlew.bat +84 -0
  14. data/lib/embulk/guess/zendesk.rb +21 -0
  15. data/lib/embulk/input/zendesk.rb +3 -0
  16. data/src/main/java/org/embulk/input/zendesk/RecordImporter.java +134 -0
  17. data/src/main/java/org/embulk/input/zendesk/ZendeskInputPlugin.java +513 -0
  18. data/src/main/java/org/embulk/input/zendesk/clients/ZendeskRestClient.java +291 -0
  19. data/src/main/java/org/embulk/input/zendesk/models/AuthenticationMethod.java +23 -0
  20. data/src/main/java/org/embulk/input/zendesk/models/Target.java +47 -0
  21. data/src/main/java/org/embulk/input/zendesk/models/ZendeskException.java +25 -0
  22. data/src/main/java/org/embulk/input/zendesk/services/ZendeskCustomObjectService.java +110 -0
  23. data/src/main/java/org/embulk/input/zendesk/services/ZendeskNPSService.java +30 -0
  24. data/src/main/java/org/embulk/input/zendesk/services/ZendeskNormalServices.java +347 -0
  25. data/src/main/java/org/embulk/input/zendesk/services/ZendeskService.java +14 -0
  26. data/src/main/java/org/embulk/input/zendesk/services/ZendeskSupportAPIService.java +63 -0
  27. data/src/main/java/org/embulk/input/zendesk/services/ZendeskUserEventService.java +158 -0
  28. data/src/main/java/org/embulk/input/zendesk/stream/PagingSpliterator.java +40 -0
  29. data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/CustomObjectSpliterator.java +42 -0
  30. data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/SunshineSpliterator.java +66 -0
  31. data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/UserEventSpliterator.java +35 -0
  32. data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/OrganizationSpliterator.java +13 -0
  33. data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/SupportSpliterator.java +44 -0
  34. data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/UserSpliterator.java +13 -0
  35. data/src/main/java/org/embulk/input/zendesk/utils/ZendeskConstants.java +72 -0
  36. data/src/main/java/org/embulk/input/zendesk/utils/ZendeskDateUtils.java +68 -0
  37. data/src/main/java/org/embulk/input/zendesk/utils/ZendeskUtils.java +92 -0
  38. data/src/test/java/org/embulk/input/zendesk/TestRecordImporter.java +114 -0
  39. data/src/test/java/org/embulk/input/zendesk/TestZendeskInputPlugin.java +402 -0
  40. data/src/test/java/org/embulk/input/zendesk/clients/TestZendeskRestClient.java +337 -0
  41. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskCustomObjectService.java +161 -0
  42. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskNPSService.java +56 -0
  43. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskNormalService.java +261 -0
  44. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskSupportAPIService.java +130 -0
  45. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskUserEventService.java +158 -0
  46. data/src/test/java/org/embulk/input/zendesk/utils/TestZendeskDateUtils.java +87 -0
  47. data/src/test/java/org/embulk/input/zendesk/utils/TestZendeskUtil.java +22 -0
  48. data/src/test/java/org/embulk/input/zendesk/utils/ZendeskPluginTestRuntime.java +133 -0
  49. data/src/test/java/org/embulk/input/zendesk/utils/ZendeskTestHelper.java +92 -0
  50. data/src/test/resources/config/base.yml +14 -0
  51. data/src/test/resources/config/base_validator.yml +48 -0
  52. data/src/test/resources/config/incremental.yml +54 -0
  53. data/src/test/resources/config/non-incremental.yml +39 -0
  54. data/src/test/resources/config/nps.yml +31 -0
  55. data/src/test/resources/config/object_records.yml +24 -0
  56. data/src/test/resources/config/relationship_records.yml +23 -0
  57. data/src/test/resources/config/user_events.yml +29 -0
  58. data/src/test/resources/config/util.yml +18 -0
  59. data/src/test/resources/data/client.json +293 -0
  60. data/src/test/resources/data/duplicate_user.json +0 -0
  61. data/src/test/resources/data/empty_result.json +7 -0
  62. data/src/test/resources/data/error_data.json +187 -0
  63. data/src/test/resources/data/expected/ticket_column.json +148 -0
  64. data/src/test/resources/data/expected/ticket_column_with_related_objects.json +152 -0
  65. data/src/test/resources/data/expected/ticket_fields_column.json +92 -0
  66. data/src/test/resources/data/expected/ticket_metrics_column.json +98 -0
  67. data/src/test/resources/data/expected/user_events_column.json +40 -0
  68. data/src/test/resources/data/object_records.json +30 -0
  69. data/src/test/resources/data/organization.json +39 -0
  70. data/src/test/resources/data/relationship_records.json +57 -0
  71. data/src/test/resources/data/scores.json +21 -0
  72. data/src/test/resources/data/scores_share_same_time_with_next_page.json +35 -0
  73. data/src/test/resources/data/scores_share_same_time_without_next_page.json +35 -0
  74. data/src/test/resources/data/simple_organization.json +23 -0
  75. data/src/test/resources/data/simple_user.json +50 -0
  76. data/src/test/resources/data/simple_user_event.json +19 -0
  77. data/src/test/resources/data/ticket_events_share_same_time_with_next_page.json +279 -0
  78. data/src/test/resources/data/ticket_events_share_same_time_without_next_page.json +279 -0
  79. data/src/test/resources/data/ticket_events_updated_by_system_records.json +279 -0
  80. data/src/test/resources/data/ticket_fields.json +225 -0
  81. data/src/test/resources/data/ticket_metrics.json +397 -0
  82. data/src/test/resources/data/ticket_share_same_time_with_next_page.json +232 -0
  83. data/src/test/resources/data/ticket_share_same_time_without_next_page.json +232 -0
  84. data/src/test/resources/data/ticket_with_related_objects.json +67 -0
  85. data/src/test/resources/data/ticket_with_updated_by_system_records.json +187 -0
  86. data/src/test/resources/data/tickets.json +232 -0
  87. data/src/test/resources/data/tickets_continue.json +52 -0
  88. data/src/test/resources/data/user_event.json +19 -0
  89. data/src/test/resources/data/user_event_contain_latter_create_at.json +19 -0
  90. data/src/test/resources/data/user_event_multiple.json +33 -0
  91. data/src/test/resources/data/util.json +19 -0
  92. data/src/test/resources/data/util_page.json +227 -0
  93. metadata +168 -0
@@ -0,0 +1,87 @@
1
+ package org.embulk.input.zendesk.utils;
2
+
3
+ import org.embulk.spi.DataException;
4
+ import org.junit.Assert;
5
+ import org.junit.Test;
6
+
7
+ import java.util.Optional;
8
+
9
+ import static org.junit.Assert.assertEquals;
10
+ import static org.junit.Assert.assertFalse;
11
+ import static org.junit.Assert.assertThrows;
12
+ import static org.junit.Assert.assertTrue;
13
+
14
+ public class TestZendeskDateUtils
15
+ {
16
+ @Test
17
+ public void testIsoToEpochSecondShouldReturnCorrectValue()
18
+ {
19
+ long expectedValue = 1550645445;
20
+
21
+ long value = ZendeskDateUtils.isoToEpochSecond("2019-02-20T06:50:45Z");
22
+ Assert.assertEquals(expectedValue, value);
23
+
24
+ value = ZendeskDateUtils.isoToEpochSecond("2019-02-20 06:50:45 +0000");
25
+ Assert.assertEquals(expectedValue, value);
26
+
27
+ value = ZendeskDateUtils.isoToEpochSecond("2019-02-20T06:50:45.000Z");
28
+ Assert.assertEquals(expectedValue, value);
29
+
30
+ value = ZendeskDateUtils.isoToEpochSecond("2019-02-20T06:50:45+00:00");
31
+ Assert.assertEquals(expectedValue, value);
32
+
33
+ value = ZendeskDateUtils.isoToEpochSecond("2019-02-20 06:50:45+0000");
34
+ Assert.assertEquals(expectedValue, value);
35
+ }
36
+
37
+ @Test
38
+ public void testIsoToEpochSecondShouldThrowException()
39
+ {
40
+ assertThrows(DataException.class, () -> ZendeskDateUtils.isoToEpochSecond("2019-02asdasdasd-20T06:50:45Z"));
41
+ assertThrows(DataException.class, () -> ZendeskDateUtils.isoToEpochSecond("2019-002-20T06:50:45Z"));
42
+ assertThrows(DataException.class, () -> ZendeskDateUtils.isoToEpochSecond("2019-02-200T06:50:45.000Z"));
43
+ assertThrows(DataException.class, () -> ZendeskDateUtils.isoToEpochSecond("2019-02-20T24:01:00Z"));
44
+ }
45
+
46
+ @Test
47
+ public void testConvertToDateTimeFormat()
48
+ {
49
+ String expectedString = "2019-05-01T07:14:50Z";
50
+
51
+ String actualString = ZendeskDateUtils.convertToDateTimeFormat("2019-05-01 07:14:50 +0000", ZendeskConstants.Misc.ISO_INSTANT);
52
+ assertEquals(expectedString, actualString);
53
+
54
+ actualString = ZendeskDateUtils.convertToDateTimeFormat("2019-05-01 07:14:50+0000", ZendeskConstants.Misc.ISO_INSTANT);
55
+ assertEquals(expectedString, actualString);
56
+
57
+ actualString = ZendeskDateUtils.convertToDateTimeFormat("2019-05-01T07:14:50.000Z", ZendeskConstants.Misc.ISO_INSTANT);
58
+ assertEquals(expectedString, actualString);
59
+
60
+ actualString = ZendeskDateUtils.convertToDateTimeFormat("2019-05-01T07:14:50+00:00", ZendeskConstants.Misc.ISO_INSTANT);
61
+ assertEquals(expectedString, actualString);
62
+ }
63
+
64
+ @Test
65
+ public void testSupportedTimeFormat()
66
+ {
67
+ Optional optional = ZendeskDateUtils.supportedTimeFormat("2019-05-01 07:14:50+0000");
68
+ assertTrue(optional.isPresent());
69
+
70
+ optional = ZendeskDateUtils.supportedTimeFormat("2019-05-01T07:14:50");
71
+ assertFalse(optional.isPresent());
72
+ }
73
+
74
+ @Test
75
+ public void testGetStartTime()
76
+ {
77
+ long expectedValue = 1550645445;
78
+ long actualValue = ZendeskDateUtils.getStartTime("2019-02-20 06:512310:45 +0000");
79
+ assertEquals(0, actualValue);
80
+
81
+ actualValue = ZendeskDateUtils.getStartTime("2019-02-30 06:50:45 +0000");
82
+ assertEquals(0, actualValue);
83
+
84
+ actualValue = ZendeskDateUtils.getStartTime("2019-02-20 06:50:45 +0000");
85
+ assertEquals(expectedValue, actualValue);
86
+ }
87
+ }
@@ -0,0 +1,22 @@
1
+ package org.embulk.input.zendesk.utils;
2
+
3
+ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
4
+ import org.embulk.EmbulkTestRuntime;
5
+ import org.junit.Rule;
6
+ import org.junit.Test;
7
+ import static org.junit.Assert.assertEquals;
8
+
9
+ public class TestZendeskUtil
10
+ {
11
+ @Rule
12
+ @SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
13
+ public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
14
+
15
+ @Test
16
+ public void testConvertBase64()
17
+ {
18
+ String expectedResult = "YWhrc2RqZmhramFzZGhma2phaGRma2phaGRramZoYWtqZGY=";
19
+ String encode = ZendeskUtils.convertBase64("ahksdjfhkjasdhfkjahdfkjahdkjfhakjdf");
20
+ assertEquals(expectedResult, encode);
21
+ }
22
+ }
@@ -0,0 +1,133 @@
1
+ package org.embulk.input.zendesk.utils;
2
+
3
+ import com.fasterxml.jackson.databind.ObjectMapper;
4
+ import com.fasterxml.jackson.databind.node.JsonNodeFactory;
5
+ import com.fasterxml.jackson.databind.node.ObjectNode;
6
+ import com.google.inject.Binder;
7
+ import com.google.inject.Injector;
8
+ import com.google.inject.Module;
9
+ import org.embulk.GuiceBinder;
10
+ import org.embulk.RandomManager;
11
+ import org.embulk.TestPluginSourceModule;
12
+ import org.embulk.TestUtilityModule;
13
+ import org.embulk.config.ConfigSource;
14
+ import org.embulk.config.DataSourceImpl;
15
+ import org.embulk.config.ModelManager;
16
+ import org.embulk.exec.ExecModule;
17
+ import org.embulk.exec.ExtensionServiceLoaderModule;
18
+ import org.embulk.exec.SystemConfigModule;
19
+ import org.embulk.jruby.JRubyScriptingModule;
20
+ import org.embulk.plugin.BuiltinPluginSourceModule;
21
+ import org.embulk.plugin.PluginClassLoaderFactory;
22
+ import org.embulk.plugin.PluginClassLoaderModule;
23
+ import org.embulk.spi.BufferAllocator;
24
+ import org.embulk.spi.Exec;
25
+ import org.embulk.spi.ExecAction;
26
+ import org.embulk.spi.ExecSession;
27
+ import org.junit.runner.Description;
28
+ import org.junit.runners.model.Statement;
29
+
30
+ import java.util.Random;
31
+
32
+ /**
33
+ * This is a clone from {@link org.embulk.EmbulkTestRuntime}, since there is no easy way to extend it.
34
+ * The only modification is on the provided systemConfig, enable tests to run `embulk/guess/zendesk.rb`
35
+ */
36
+ public class ZendeskPluginTestRuntime extends GuiceBinder
37
+ {
38
+ public static class TestRuntimeModule implements Module
39
+ {
40
+ @Override
41
+ public void configure(Binder binder)
42
+ {
43
+ ConfigSource systemConfig = getSystemConfig();
44
+ new SystemConfigModule(systemConfig).configure(binder);
45
+ new ExecModule().configure(binder);
46
+ new ExtensionServiceLoaderModule(systemConfig).configure(binder);
47
+ new BuiltinPluginSourceModule().configure(binder);
48
+ new JRubyScriptingModule(systemConfig).configure(binder);
49
+ new PluginClassLoaderModule(systemConfig).configure(binder);
50
+ new TestUtilityModule().configure(binder);
51
+ new TestPluginSourceModule().configure(binder);
52
+ }
53
+ }
54
+
55
+ private ExecSession exec;
56
+
57
+ public ZendeskPluginTestRuntime()
58
+ {
59
+ super(new TestRuntimeModule());
60
+ Injector injector = getInjector();
61
+ ConfigSource execConfig = new DataSourceImpl(injector.getInstance(ModelManager.class));
62
+ this.exec = ExecSession.builder(injector).fromExecConfig(execConfig).build();
63
+ }
64
+
65
+ public ExecSession getExec()
66
+ {
67
+ return exec;
68
+ }
69
+
70
+ public BufferAllocator getBufferAllocator()
71
+ {
72
+ return getInstance(BufferAllocator.class);
73
+ }
74
+
75
+ public ModelManager getModelManager()
76
+ {
77
+ return getInstance(ModelManager.class);
78
+ }
79
+
80
+ public Random getRandom()
81
+ {
82
+ return getInstance(RandomManager.class).getRandom();
83
+ }
84
+
85
+ public PluginClassLoaderFactory getPluginClassLoaderFactory()
86
+ {
87
+ return getInstance(PluginClassLoaderFactory.class);
88
+ }
89
+
90
+ @Override
91
+ public Statement apply(Statement base, Description description)
92
+ {
93
+ final Statement superStatement = ZendeskPluginTestRuntime.super.apply(base, description);
94
+ return new Statement() {
95
+ public void evaluate() throws Throwable
96
+ {
97
+ try {
98
+ Exec.doWith(exec, (ExecAction<Void>) () -> {
99
+ try {
100
+ superStatement.evaluate();
101
+ }
102
+ catch (Throwable ex) {
103
+ throw new RuntimeExecutionException(ex);
104
+ }
105
+ return null;
106
+ });
107
+ }
108
+ catch (RuntimeException ex) {
109
+ throw ex.getCause();
110
+ }
111
+ finally {
112
+ exec.cleanup();
113
+ }
114
+ }
115
+ };
116
+ }
117
+
118
+ private static class RuntimeExecutionException extends RuntimeException
119
+ {
120
+ public RuntimeExecutionException(Throwable cause)
121
+ {
122
+ super(cause);
123
+ }
124
+ }
125
+
126
+ private static ConfigSource getSystemConfig()
127
+ {
128
+ ObjectNode configNode = JsonNodeFactory.instance.objectNode();
129
+ configNode.set("jruby_load_path", JsonNodeFactory.instance.arrayNode().add("lib"));
130
+
131
+ return new DataSourceImpl(new ModelManager(null, new ObjectMapper()), configNode);
132
+ }
133
+ }
@@ -0,0 +1,92 @@
1
+ package org.embulk.input.zendesk.utils;
2
+
3
+ import com.fasterxml.jackson.databind.JsonNode;
4
+ import com.fasterxml.jackson.databind.ObjectMapper;
5
+ import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
6
+
7
+ import org.embulk.EmbulkTestRuntime;
8
+ import org.embulk.config.ConfigLoader;
9
+ import org.embulk.config.ConfigSource;
10
+ import org.embulk.config.ModelManager;
11
+ import org.embulk.spi.ExecSession;
12
+ import org.embulk.test.EmbulkTests;
13
+ import org.junit.Assert;
14
+
15
+ import java.io.IOException;
16
+ import java.io.InputStream;
17
+ import java.lang.reflect.Field;
18
+
19
+ import static junit.framework.TestCase.fail;
20
+
21
+ public final class ZendeskTestHelper
22
+ {
23
+ private ZendeskTestHelper() {}
24
+
25
+ private static ObjectMapper mapper;
26
+ private static final ConfigLoader configLoader;
27
+
28
+ static {
29
+ mapper = new ObjectMapper();
30
+ mapper.registerModule(new Jdk8Module());
31
+ configLoader = new ConfigLoader(new ModelManager(null, mapper));
32
+ }
33
+
34
+ public static JsonNode getJsonFromFile(String fileName)
35
+ {
36
+ try {
37
+ return mapper.readTree(EmbulkTests.readResource(fileName));
38
+ }
39
+ catch (IOException e) {
40
+ fail("Fail to load file from " + fileName);
41
+ }
42
+ return null;
43
+ }
44
+
45
+ public static ConfigSource getConfigSource(String file)
46
+ {
47
+ ConfigSource configSource = null;
48
+ InputStream is = null;
49
+ try {
50
+ is = ZendeskTestHelper.class.getResourceAsStream("/config/" + file);
51
+ configSource = configLoader.fromYaml(is);
52
+ }
53
+ catch (IOException ex) {
54
+ Assert.fail(ex.getMessage());
55
+ }
56
+ finally {
57
+ if (is != null) {
58
+ try {
59
+ is.close();
60
+ }
61
+ catch (IOException ex) { }
62
+ }
63
+ }
64
+ return configSource;
65
+ }
66
+
67
+ public static void setPreviewMode(final EmbulkTestRuntime runtime, final boolean isPreview)
68
+ {
69
+ // A small hack to make the plugin executed in preview mode so
70
+ try {
71
+ final Field previewField = ExecSession.class.getDeclaredField("preview");
72
+ previewField.setAccessible(true);
73
+ previewField.set(runtime.getExec(), isPreview);
74
+ }
75
+ catch (NoSuchFieldException | IllegalAccessException e) {
76
+ Assert.fail(e.getMessage());
77
+ }
78
+ }
79
+
80
+ public static void setPreviewMode(final ZendeskPluginTestRuntime runtime, final boolean isPreview)
81
+ {
82
+ // A small hack to make the plugin executed in preview mode so
83
+ try {
84
+ final Field previewField = ExecSession.class.getDeclaredField("preview");
85
+ previewField.setAccessible(true);
86
+ previewField.set(runtime.getExec(), isPreview);
87
+ }
88
+ catch (NoSuchFieldException | IllegalAccessException e) {
89
+ Assert.fail(e.getMessage());
90
+ }
91
+ }
92
+ }
@@ -0,0 +1,14 @@
1
+ type: zendesk
2
+ login_url: https://abc.zendesk.com
3
+ auth_method: oauth
4
+ username: dummy
5
+ password: dummy
6
+ token: dummy
7
+ access_token: dummy
8
+ app_marketplace_integration_name: abc
9
+ app_marketplace_app_id: abc
10
+ app_marketplace_org_id: abc
11
+ retry_initial_wait_sec: 1
12
+ max_retry_wait_sec: 30
13
+ retry_limit: 2
14
+
@@ -0,0 +1,48 @@
1
+ type: zendesk
2
+ login_url: https://abc.zendesk.com
3
+ auth_method: oauth
4
+ username: dummy
5
+ password: dummy
6
+ token: dummy
7
+ access_token: dummy
8
+ app_marketplace_integration_name: abc
9
+ app_marketplace_app_id: abc
10
+ app_marketplace_org_id: abc
11
+ target: tickets
12
+ columns:
13
+ - {name: url, type: string}
14
+ - {name: id, type: long}
15
+ - {name: external_id, type: string}
16
+ - {name: via, type: json}
17
+ - {name: created_at, type: timestamp, format: '%Y-%m-%dT%H:%M:%S%z'}
18
+ - {name: updated_at, type: timestamp, format: '%Y-%m-%dT%H:%M:%S%z'}
19
+ - {name: type, type: string}
20
+ - {name: subject, type: string}
21
+ - {name: raw_subject, type: string}
22
+ - {name: description, type: string}
23
+ - {name: priority, type: string}
24
+ - {name: status, type: string}
25
+ - {name: recipient, type: string}
26
+ - {name: requester_id, type: long}
27
+ - {name: submitter_id, type: long}
28
+ - {name: assignee_id, type: long}
29
+ - {name: organization_id, type: long}
30
+ - {name: group_id, type: long}
31
+ - {name: collaborator_ids, type: json}
32
+ - {name: follower_ids, type: json}
33
+ - {name: email_cc_ids, type: json}
34
+ - {name: forum_topic_id, type: string}
35
+ - {name: problem_id, type: string}
36
+ - {name: has_incidents, type: boolean}
37
+ - {name: is_public, type: boolean}
38
+ - {name: due_at, type: string}
39
+ - {name: tags, type: json}
40
+ - {name: custom_fields, type: json}
41
+ - {name: satisfaction_rating, type: string}
42
+ - {name: sharing_agreement_ids, type: json}
43
+ - {name: fields, type: json}
44
+ - {name: followup_ids, type: json}
45
+ - {name: brand_id, type: long}
46
+ - {name: allow_channelback, type: boolean}
47
+ - {name: allow_attachments, type: boolean}
48
+ - {name: generated_timestamp, type: long}
@@ -0,0 +1,54 @@
1
+ type: zendesk
2
+ login_url: https://abc.zendesk.com
3
+ auth_method: oauth
4
+ username: dummy
5
+ password: dummy
6
+ token: dummy
7
+ access_token: dummy
8
+ target: tickets
9
+ app_marketplace_integration_name: abc
10
+ app_marketplace_app_id: abc
11
+ app_marketplace_org_id: abc
12
+ incremental: true
13
+ dedup: true
14
+ retry_initial_wait_sec: 1
15
+ max_retry_wait_sec: 30
16
+ retry_limit: 2
17
+ start_time: "2019-01-12 06:51:50 +0000"
18
+ columns:
19
+ - {name: url, type: string}
20
+ - {name: id, type: long}
21
+ - {name: external_id, type: string}
22
+ - {name: via, type: json}
23
+ - {name: created_at, type: timestamp, format: '%Y-%m-%dT%H:%M:%S%z'}
24
+ - {name: updated_at, type: timestamp, format: '%Y-%m-%dT%H:%M:%S%z'}
25
+ - {name: type, type: string}
26
+ - {name: subject, type: string}
27
+ - {name: raw_subject, type: string}
28
+ - {name: description, type: string}
29
+ - {name: priority, type: string}
30
+ - {name: status, type: string}
31
+ - {name: recipient, type: string}
32
+ - {name: requester_id, type: long}
33
+ - {name: submitter_id, type: long}
34
+ - {name: assignee_id, type: long}
35
+ - {name: organization_id, type: long}
36
+ - {name: group_id, type: long}
37
+ - {name: collaborator_ids, type: json}
38
+ - {name: follower_ids, type: json}
39
+ - {name: email_cc_ids, type: json}
40
+ - {name: forum_topic_id, type: string}
41
+ - {name: problem_id, type: string}
42
+ - {name: has_incidents, type: boolean}
43
+ - {name: is_public, type: boolean}
44
+ - {name: due_at, type: string}
45
+ - {name: tags, type: json}
46
+ - {name: custom_fields, type: json}
47
+ - {name: satisfaction_rating, type: string}
48
+ - {name: sharing_agreement_ids, type: json}
49
+ - {name: fields, type: json}
50
+ - {name: followup_ids, type: json}
51
+ - {name: brand_id, type: long}
52
+ - {name: allow_channelback, type: boolean}
53
+ - {name: allow_attachments, type: boolean}
54
+ - {name: generated_timestamp, type: long}