embulk-input-zendesk 0.3.4 → 0.3.5

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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -0
  3. data/README.md +32 -2
  4. data/build.gradle +1 -1
  5. data/src/main/java/org/embulk/input/zendesk/RecordImporter.java +134 -0
  6. data/src/main/java/org/embulk/input/zendesk/ZendeskInputPlugin.java +182 -202
  7. data/src/main/java/org/embulk/input/zendesk/clients/ZendeskRestClient.java +54 -52
  8. data/src/main/java/org/embulk/input/zendesk/models/Target.java +3 -3
  9. data/src/main/java/org/embulk/input/zendesk/models/ZendeskException.java +1 -1
  10. data/src/main/java/org/embulk/input/zendesk/services/ZendeskCustomObjectService.java +110 -0
  11. data/src/main/java/org/embulk/input/zendesk/services/ZendeskNPSService.java +30 -0
  12. data/src/main/java/org/embulk/input/zendesk/services/ZendeskNormalServices.java +239 -0
  13. data/src/main/java/org/embulk/input/zendesk/services/ZendeskService.java +14 -0
  14. data/src/main/java/org/embulk/input/zendesk/services/ZendeskSupportAPIService.java +25 -83
  15. data/src/main/java/org/embulk/input/zendesk/services/ZendeskUserEventService.java +158 -0
  16. data/src/main/java/org/embulk/input/zendesk/stream/PagingSpliterator.java +40 -0
  17. data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/CustomObjectSpliterator.java +42 -0
  18. data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/SunshineSpliterator.java +66 -0
  19. data/src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/UserEventSpliterator.java +35 -0
  20. data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/OrganizationSpliterator.java +13 -0
  21. data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/SupportSpliterator.java +44 -0
  22. data/src/main/java/org/embulk/input/zendesk/stream/paginator/support/UserSpliterator.java +13 -0
  23. data/src/main/java/org/embulk/input/zendesk/utils/ZendeskConstants.java +13 -1
  24. data/src/main/java/org/embulk/input/zendesk/utils/ZendeskDateUtils.java +22 -11
  25. data/src/main/java/org/embulk/input/zendesk/utils/ZendeskUtils.java +52 -114
  26. data/src/test/java/org/embulk/input/zendesk/TestRecordImporter.java +114 -0
  27. data/src/test/java/org/embulk/input/zendesk/TestZendeskInputPlugin.java +184 -99
  28. data/src/test/java/org/embulk/input/zendesk/clients/TestZendeskRestClient.java +6 -20
  29. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskCustomObjectService.java +161 -0
  30. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskNPSService.java +56 -0
  31. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskNormalService.java +189 -0
  32. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskSupportAPIService.java +18 -60
  33. data/src/test/java/org/embulk/input/zendesk/services/TestZendeskUserEventService.java +158 -0
  34. data/src/test/java/org/embulk/input/zendesk/utils/TestZendeskDateUtils.java +50 -2
  35. data/src/test/java/org/embulk/input/zendesk/utils/TestZendeskUtil.java +0 -138
  36. data/src/test/java/org/embulk/input/zendesk/utils/ZendeskTestHelper.java +16 -0
  37. data/src/test/resources/config/nps.yml +29 -0
  38. data/src/test/resources/config/object_records.yml +24 -0
  39. data/src/test/resources/config/relationship_records.yml +23 -0
  40. data/src/test/resources/config/user_events.yml +29 -0
  41. data/src/test/resources/data/duplicate_user.json +0 -0
  42. data/src/test/resources/data/empty_result.json +7 -0
  43. data/src/test/resources/data/expected/user_events_column.json +40 -0
  44. data/src/test/resources/data/object_records.json +30 -0
  45. data/src/test/resources/data/organization.json +39 -0
  46. data/src/test/resources/data/relationship_records.json +57 -0
  47. data/src/test/resources/data/scores.json +21 -0
  48. data/src/test/resources/data/scores_share_same_time_with_next_page.json +35 -0
  49. data/src/test/resources/data/scores_share_same_time_without_next_page.json +35 -0
  50. data/src/test/resources/data/simple_organization.json +23 -0
  51. data/src/test/resources/data/simple_user.json +50 -0
  52. data/src/test/resources/data/simple_user_event.json +19 -0
  53. data/src/test/resources/data/ticket_events_share_same_time_with_next_page.json +279 -0
  54. data/src/test/resources/data/ticket_events_share_same_time_without_next_page.json +279 -0
  55. data/src/test/resources/data/ticket_events_updated_by_system_records.json +279 -0
  56. data/src/test/resources/data/ticket_share_same_time_with_next_page.json +232 -0
  57. data/src/test/resources/data/ticket_share_same_time_without_next_page.json +232 -0
  58. data/src/test/resources/data/ticket_with_updated_by_system_records.json +187 -0
  59. data/src/test/resources/data/user_event.json +19 -0
  60. data/src/test/resources/data/user_event_contain_latter_create_at.json +19 -0
  61. data/src/test/resources/data/user_event_multiple.json +33 -0
  62. metadata +46 -5
  63. data/src/main/java/org/embulk/input/zendesk/utils/ZendeskValidatorUtils.java +0 -79
  64. data/src/test/java/org/embulk/input/zendesk/utils/TestZendeskValidatorUtils.java +0 -130
@@ -0,0 +1,33 @@
1
+ {
2
+ "data": [
3
+ {
4
+ "id": "5c7f31aef8df240001e60bbf",
5
+ "type": "remove_from_cart",
6
+ "source": "shopify",
7
+ "description": "",
8
+ "authenticated": true,
9
+ "created_at": "2019-03-06T02:34:22Z",
10
+ "received_at": "2019-03-06T02:34:22Z",
11
+ "properties": {
12
+ "model": 221,
13
+ "size": 6
14
+ },
15
+ "user_id": "123123121232"
16
+ },
17
+ {
18
+ "id": "5c7f31aef8df240001e60b3f",
19
+ "type": "remove_from_cart2",
20
+ "source": "shopify",
21
+ "description": "",
22
+ "authenticated": true,
23
+ "created_at": "2019-03-06T02:34:30Z",
24
+ "received_at": "2019-03-06T02:34:30Z",
25
+ "properties": {
26
+ "model": 221,
27
+ "size": 6
28
+ },
29
+ "user_id": "123123121232"
30
+ }
31
+ ],
32
+ "links": null
33
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-input-zendesk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - hieu.duong
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-11 00:00:00.000000000 Z
11
+ date: 2019-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -59,45 +59,86 @@ files:
59
59
  - gradlew.bat
60
60
  - lib/embulk/guess/zendesk.rb
61
61
  - lib/embulk/input/zendesk.rb
62
+ - src/main/java/org/embulk/input/zendesk/RecordImporter.java
62
63
  - src/main/java/org/embulk/input/zendesk/ZendeskInputPlugin.java
63
64
  - src/main/java/org/embulk/input/zendesk/clients/ZendeskRestClient.java
64
65
  - src/main/java/org/embulk/input/zendesk/models/AuthenticationMethod.java
65
66
  - src/main/java/org/embulk/input/zendesk/models/Target.java
66
67
  - src/main/java/org/embulk/input/zendesk/models/ZendeskException.java
68
+ - src/main/java/org/embulk/input/zendesk/services/ZendeskCustomObjectService.java
69
+ - src/main/java/org/embulk/input/zendesk/services/ZendeskNPSService.java
70
+ - src/main/java/org/embulk/input/zendesk/services/ZendeskNormalServices.java
71
+ - src/main/java/org/embulk/input/zendesk/services/ZendeskService.java
67
72
  - src/main/java/org/embulk/input/zendesk/services/ZendeskSupportAPIService.java
73
+ - src/main/java/org/embulk/input/zendesk/services/ZendeskUserEventService.java
74
+ - src/main/java/org/embulk/input/zendesk/stream/PagingSpliterator.java
75
+ - src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/CustomObjectSpliterator.java
76
+ - src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/SunshineSpliterator.java
77
+ - src/main/java/org/embulk/input/zendesk/stream/paginator/sunshine/UserEventSpliterator.java
78
+ - src/main/java/org/embulk/input/zendesk/stream/paginator/support/OrganizationSpliterator.java
79
+ - src/main/java/org/embulk/input/zendesk/stream/paginator/support/SupportSpliterator.java
80
+ - src/main/java/org/embulk/input/zendesk/stream/paginator/support/UserSpliterator.java
68
81
  - src/main/java/org/embulk/input/zendesk/utils/ZendeskConstants.java
69
82
  - src/main/java/org/embulk/input/zendesk/utils/ZendeskDateUtils.java
70
83
  - src/main/java/org/embulk/input/zendesk/utils/ZendeskUtils.java
71
- - src/main/java/org/embulk/input/zendesk/utils/ZendeskValidatorUtils.java
84
+ - src/test/java/org/embulk/input/zendesk/TestRecordImporter.java
72
85
  - src/test/java/org/embulk/input/zendesk/TestZendeskInputPlugin.java
73
86
  - src/test/java/org/embulk/input/zendesk/clients/TestZendeskRestClient.java
87
+ - src/test/java/org/embulk/input/zendesk/services/TestZendeskCustomObjectService.java
88
+ - src/test/java/org/embulk/input/zendesk/services/TestZendeskNPSService.java
89
+ - src/test/java/org/embulk/input/zendesk/services/TestZendeskNormalService.java
74
90
  - src/test/java/org/embulk/input/zendesk/services/TestZendeskSupportAPIService.java
91
+ - src/test/java/org/embulk/input/zendesk/services/TestZendeskUserEventService.java
75
92
  - src/test/java/org/embulk/input/zendesk/utils/TestZendeskDateUtils.java
76
93
  - src/test/java/org/embulk/input/zendesk/utils/TestZendeskUtil.java
77
- - src/test/java/org/embulk/input/zendesk/utils/TestZendeskValidatorUtils.java
78
94
  - src/test/java/org/embulk/input/zendesk/utils/ZendeskPluginTestRuntime.java
79
95
  - src/test/java/org/embulk/input/zendesk/utils/ZendeskTestHelper.java
80
96
  - src/test/resources/config/base.yml
81
97
  - src/test/resources/config/base_validator.yml
82
98
  - src/test/resources/config/incremental.yml
83
99
  - src/test/resources/config/non-incremental.yml
100
+ - src/test/resources/config/nps.yml
101
+ - src/test/resources/config/object_records.yml
102
+ - src/test/resources/config/relationship_records.yml
103
+ - src/test/resources/config/user_events.yml
84
104
  - src/test/resources/config/util.yml
85
105
  - src/test/resources/data/client.json
106
+ - src/test/resources/data/duplicate_user.json
107
+ - src/test/resources/data/empty_result.json
86
108
  - src/test/resources/data/error_data.json
87
109
  - src/test/resources/data/expected/ticket_column.json
88
110
  - src/test/resources/data/expected/ticket_column_with_related_objects.json
89
111
  - src/test/resources/data/expected/ticket_fields_column.json
90
112
  - src/test/resources/data/expected/ticket_metrics_column.json
113
+ - src/test/resources/data/expected/user_events_column.json
114
+ - src/test/resources/data/object_records.json
115
+ - src/test/resources/data/organization.json
116
+ - src/test/resources/data/relationship_records.json
117
+ - src/test/resources/data/scores.json
118
+ - src/test/resources/data/scores_share_same_time_with_next_page.json
119
+ - src/test/resources/data/scores_share_same_time_without_next_page.json
120
+ - src/test/resources/data/simple_organization.json
121
+ - src/test/resources/data/simple_user.json
122
+ - src/test/resources/data/simple_user_event.json
123
+ - src/test/resources/data/ticket_events_share_same_time_with_next_page.json
124
+ - src/test/resources/data/ticket_events_share_same_time_without_next_page.json
125
+ - src/test/resources/data/ticket_events_updated_by_system_records.json
91
126
  - src/test/resources/data/ticket_fields.json
92
127
  - src/test/resources/data/ticket_metrics.json
128
+ - src/test/resources/data/ticket_share_same_time_with_next_page.json
129
+ - src/test/resources/data/ticket_share_same_time_without_next_page.json
93
130
  - src/test/resources/data/ticket_with_related_objects.json
131
+ - src/test/resources/data/ticket_with_updated_by_system_records.json
94
132
  - src/test/resources/data/tickets.json
95
133
  - src/test/resources/data/tickets_continue.json
134
+ - src/test/resources/data/user_event.json
135
+ - src/test/resources/data/user_event_contain_latter_create_at.json
136
+ - src/test/resources/data/user_event_multiple.json
96
137
  - src/test/resources/data/util.json
97
138
  - src/test/resources/data/util_page.json
98
139
  - classpath/commons-logging-1.2.jar
99
- - classpath/embulk-input-zendesk-0.3.4.jar
100
140
  - classpath/httpcore-4.4.10.jar
141
+ - classpath/embulk-input-zendesk-0.3.5.jar
101
142
  - classpath/httpclient-4.5.6.jar
102
143
  - classpath/commons-codec-1.10.jar
103
144
  homepage: https://github.com/treasure-data/embulk-input-zendesk
@@ -1,79 +0,0 @@
1
- package org.embulk.input.zendesk.utils;
2
-
3
- import org.embulk.config.ConfigException;
4
- import org.embulk.input.zendesk.ZendeskInputPlugin;
5
- import org.embulk.input.zendesk.services.ZendeskSupportAPIService;
6
- import org.embulk.spi.Exec;
7
- import org.slf4j.Logger;
8
-
9
- public class ZendeskValidatorUtils
10
- {
11
- private ZendeskValidatorUtils(){}
12
-
13
- private static final Logger logger = Exec.getLogger(ZendeskValidatorUtils.class);
14
-
15
- public static void validateInputTask(final ZendeskInputPlugin.PluginTask task, final ZendeskSupportAPIService zendeskSupportAPIService)
16
- {
17
- validateAppMarketPlace(task.getAppMarketPlaceIntegrationName().isPresent(),
18
- task.getAppMarketPlaceAppId().isPresent(),
19
- task.getAppMarketPlaceOrgId().isPresent());
20
- validateCredentials(task);
21
- validateIncremental(task);
22
- }
23
-
24
- private static void validateCredentials(final ZendeskInputPlugin.PluginTask task)
25
- {
26
- switch (task.getAuthenticationMethod()) {
27
- case OAUTH:
28
- if (!task.getAccessToken().isPresent()) {
29
- throw new ConfigException(String.format("access_token is required for authentication method '%s'",
30
- task.getAuthenticationMethod().name().toLowerCase()));
31
- }
32
- break;
33
- case TOKEN:
34
- if (!task.getUsername().isPresent() || !task.getToken().isPresent()) {
35
- throw new ConfigException(String.format("username and token are required for authentication method '%s'",
36
- task.getAuthenticationMethod().name().toLowerCase()));
37
- }
38
- break;
39
- case BASIC:
40
- if (!task.getUsername().isPresent() || !task.getPassword().isPresent()) {
41
- throw new ConfigException(String.format("username and password are required for authentication method '%s'",
42
- task.getAuthenticationMethod().name().toLowerCase()));
43
- }
44
- break;
45
- default:
46
- throw new ConfigException("Unknown authentication method");
47
- }
48
- }
49
-
50
- private static void validateAppMarketPlace(final boolean isAppMarketIntegrationNamePresent,
51
- final boolean isAppMarketAppIdPresent,
52
- final boolean isAppMarketOrgIdPresent)
53
- {
54
- final boolean isAllAvailable =
55
- isAppMarketIntegrationNamePresent && isAppMarketAppIdPresent && isAppMarketOrgIdPresent;
56
- final boolean isAllUnAvailable =
57
- !isAppMarketIntegrationNamePresent && !isAppMarketAppIdPresent && !isAppMarketOrgIdPresent;
58
- // All or nothing needed
59
- if (!(isAllAvailable || isAllUnAvailable)) {
60
- throw new ConfigException("All of app_marketplace_integration_name, app_marketplace_org_id, " +
61
- "app_marketplace_app_id " +
62
- "are required to fill out for Apps Marketplace API header");
63
- }
64
- }
65
-
66
- private static void validateIncremental(final ZendeskInputPlugin.PluginTask task)
67
- {
68
- if (task.getIncremental()) {
69
- if (!task.getDedup()) {
70
- logger.warn("You've selected to skip de-duplicating records, result may contain duplicated data");
71
- }
72
-
73
- if (!ZendeskUtils.isSupportAPIIncremental(task.getTarget()) && task.getStartTime().isPresent()) {
74
- logger.warn(String.format("Target: '%s' doesn't support incremental export API. Will be ignored start_time option",
75
- task.getTarget()));
76
- }
77
- }
78
- }
79
- }
@@ -1,130 +0,0 @@
1
- package org.embulk.input.zendesk.utils;
2
-
3
- import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
4
- import org.embulk.config.ConfigSource;
5
-
6
- import org.embulk.input.zendesk.ZendeskInputPlugin;
7
- import org.embulk.input.zendesk.services.ZendeskSupportAPIService;
8
-
9
- import org.embulk.spi.InputPlugin;
10
- import org.embulk.test.TestingEmbulk;
11
-
12
- import org.junit.Before;
13
- import org.junit.Rule;
14
- import org.junit.Test;
15
- import org.junit.rules.ExpectedException;
16
- import org.junit.rules.RuleChain;
17
- import org.junit.rules.TestRule;
18
-
19
- import static org.junit.Assert.assertEquals;
20
- import static org.junit.Assert.fail;
21
-
22
- import static org.mockito.Mockito.mock;
23
-
24
- import java.util.Collections;
25
-
26
- public class TestZendeskValidatorUtils
27
- {
28
- private final ExpectedException thrown = ExpectedException.none();
29
- private final TestingEmbulk embulk = TestingEmbulk.builder()
30
- .registerPlugin(InputPlugin.class, "zendesk", ZendeskInputPlugin.class)
31
- .build();
32
- public ZendeskPluginTestRuntime runtime = new ZendeskPluginTestRuntime();
33
- ConfigSource configSource;
34
-
35
- @Rule
36
- @SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
37
- public TestRule chain = RuleChain.outerRule(embulk).around(runtime).around(thrown);
38
-
39
- private ZendeskSupportAPIService zendeskSupportAPIService = mock(ZendeskSupportAPIService.class);
40
-
41
- @Before
42
- public void prepare()
43
- {
44
- configSource = getBaseConfigSource();
45
- }
46
-
47
- @Test
48
- public void validateCredentialOauthShouldThrowException()
49
- {
50
- configSource.set("auth_method", "oauth");
51
- configSource.remove("access_token");
52
- final ZendeskInputPlugin.PluginTask task = configSource.loadConfig(ZendeskInputPlugin.PluginTask.class);
53
- assertValidation(task, "access_token is required for authentication method 'oauth'");
54
- }
55
-
56
- @Test
57
- public void validateCredentialBasicShouldThrowException()
58
- {
59
- configSource.set("auth_method", "basic");
60
- configSource.remove("username");
61
- ZendeskInputPlugin.PluginTask task = configSource.loadConfig(ZendeskInputPlugin.PluginTask.class);
62
- assertValidation(task, "username and password are required for authentication method 'basic'");
63
-
64
- configSource.set("username", "");
65
- configSource.remove("password");
66
- task = configSource.loadConfig(ZendeskInputPlugin.PluginTask.class);
67
- assertValidation(task, "username and password are required for authentication method 'basic'");
68
- }
69
-
70
- @Test
71
- public void validateCredentialTokenShouldThrowException()
72
- {
73
- configSource.set("auth_method", "token");
74
- configSource.remove("token");
75
- ZendeskInputPlugin.PluginTask task = configSource.loadConfig(ZendeskInputPlugin.PluginTask.class);
76
- assertValidation(task, "username and token are required for authentication method 'token'");
77
-
78
- configSource.set("token", "");
79
- configSource.remove("username");
80
- task = configSource.loadConfig(ZendeskInputPlugin.PluginTask.class);
81
- assertValidation(task, "username and token are required for authentication method 'token'");
82
- }
83
-
84
- @Test
85
- public void validateAppMarketPlaceShouldThrowException()
86
- {
87
- configSource.remove("app_marketplace_integration_name");
88
- ZendeskInputPlugin.PluginTask task = configSource.loadConfig(ZendeskInputPlugin.PluginTask.class);
89
- assertValidation(task, "All of app_marketplace_integration_name, app_marketplace_org_id, " +
90
- "app_marketplace_app_id " +
91
- "are required to fill out for Apps Marketplace API header");
92
- }
93
-
94
- @Test
95
- public void validateInclude()
96
- {
97
- configSource.set("target", "ticket_fields");
98
- configSource.set("includes", Collections.singletonList("organizations"));
99
- final ZendeskInputPlugin.PluginTask task = configSource.loadConfig(ZendeskInputPlugin.PluginTask.class);
100
- ZendeskValidatorUtils.validateInputTask(task, zendeskSupportAPIService);
101
- }
102
-
103
- @Test
104
- public void validateIncremental()
105
- {
106
- configSource.set("target", "ticket_fields");
107
- configSource.set("incremental", true);
108
- configSource.set("dedup", false);
109
- configSource.set(ZendeskConstants.Field.START_TIME, "");
110
-
111
- final ZendeskInputPlugin.PluginTask task = configSource.loadConfig(ZendeskInputPlugin.PluginTask.class);
112
- ZendeskValidatorUtils.validateInputTask(task, zendeskSupportAPIService);
113
- }
114
-
115
- private static ConfigSource getBaseConfigSource()
116
- {
117
- return ZendeskTestHelper.getConfigSource("base_validator.yml");
118
- }
119
-
120
- private void assertValidation(final ZendeskInputPlugin.PluginTask task, final String message)
121
- {
122
- try {
123
- ZendeskValidatorUtils.validateInputTask(task, zendeskSupportAPIService);
124
- fail("Should not reach here");
125
- }
126
- catch (final Exception e) {
127
- assertEquals(message, e.getMessage());
128
- }
129
- }
130
- }