embulk-output-multi 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cdd6eeb1ca104b3fca01e57c679d0d52c5e483a2
4
- data.tar.gz: 03fdeb08212e6769baa2652f149d2e2b27a97f81
3
+ metadata.gz: bd9a500d9ed46b10465db1c1521c60324a90526b
4
+ data.tar.gz: fc26433a4aabf02ad3e474c503284801e816c0d8
5
5
  SHA512:
6
- metadata.gz: 4536fd0e3f5c31acbdcd78931282b776dbe6842f7c5e26ecaeb5c0bd899cf85d9979db6453f6bc8aa77277a0b0d6ec4aa58748e6c95e35a382de739bbe60bebe
7
- data.tar.gz: 890c8205e4b6ab4970bdfcb5b2faa9dc47dc5bd367a1c0cc6603c2dc9d4c4dab17724b2064d2bfbef7e078a0063e9971d31971f774f07dd3db7486ac97d467e1
6
+ metadata.gz: f65a6b68738a9af5638550666c3340d30f8e75fcbe7b142843a977492c98179c4d7f5c1dd875041771608e7e72c4f57113432ca55695b5f07bd378a191446cdd
7
+ data.tar.gz: 3a2cdbec13b5e9a507fc348ed69ef3270e5fbd90275e03ba1797713e12d609c489eb1dd626592d4bd13aa66879c6bc2cd771343dc292a4862557e65e7f91eb22
data/README.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  This plugin can copies an output to multiple destinations.
4
4
 
5
+ ### Notes
6
+ - It's still very experimental version, so might change its configuration names or styles without notification.
7
+ - It might have performance issues or bugs when loading large records.
8
+ - It might not working on other executors than LocalExecutor.
9
+ - I would appreciate it if you use this and give me reports/feedback!
10
+
5
11
  ## Overview
6
12
 
7
13
  * **Plugin type**: output
@@ -12,12 +18,13 @@ This plugin can copies an output to multiple destinations.
12
18
  ## Configuration
13
19
 
14
20
  - **outputs**: Configuration of output plugins (array, required)
21
+ - **stop_on_failed_output**: Set true if you want to immediately stop outputting of all plugins with a plugin's error (boolean, default "false")
15
22
 
16
23
  ## Example
17
24
 
18
25
  ```yaml
19
26
  out:
20
- type: copy
27
+ type: multi
21
28
  outputs:
22
29
  # Output to stdout
23
30
  - type: stdout
@@ -34,6 +41,8 @@ out:
34
41
  formatter:
35
42
  type: csv
36
43
  delimiter: "\t"
44
+ # And any outputs you want..
45
+ - type: ...
37
46
  ```
38
47
 
39
48
  ## Build
data/build.gradle CHANGED
@@ -19,7 +19,7 @@ configurations {
19
19
  dependencies {
20
20
  testImplementation "org.embulk:embulk-standards:0.9.15"
21
21
  testImplementation "org.embulk:embulk-test:0.9.15"
22
- testImplementation "com.github.kamatama41:embulk-test-helpers:0.7.1"
22
+ testImplementation "com.github.kamatama41:embulk-test-helpers:0.7.2"
23
23
  testImplementation "org.junit.jupiter:junit-jupiter-api:5.3.2"
24
24
  testImplementation "org.junit.jupiter:junit-jupiter-engine:5.3.2"
25
25
  }
data/gradle.properties CHANGED
@@ -1 +1 @@
1
- version=0.1.0
1
+ version=0.1.1
@@ -9,7 +9,7 @@ com.fasterxml.jackson.datatype:jackson-datatype-guava:2.6.7
9
9
  com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.6.7
10
10
  com.fasterxml.jackson.datatype:jackson-datatype-joda:2.6.7
11
11
  com.fasterxml.jackson.module:jackson-module-guice:2.6.7
12
- com.github.kamatama41:embulk-test-helpers:0.7.1
12
+ com.github.kamatama41:embulk-test-helpers:0.7.2
13
13
  com.google.code.findbugs:annotations:3.0.0
14
14
  com.google.guava:guava:18.0
15
15
  com.google.inject.extensions:guice-multibindings:4.0
@@ -39,6 +39,10 @@ public class MultiOutputPlugin implements OutputPlugin {
39
39
  @Config("outputs")
40
40
  List<ConfigSource> getOutputConfigs();
41
41
 
42
+ @Config("stop_on_failed_output")
43
+ @ConfigDefault("false")
44
+ boolean getStopOnFailedOutput();
45
+
42
46
  @Config(CONFIG_NAME_OUTPUT_CONFIG_DIFFS)
43
47
  @ConfigDefault("null")
44
48
  Optional<List<ConfigDiff>> getOutputConfigDiffs();
@@ -95,8 +99,8 @@ public class MultiOutputPlugin implements OutputPlugin {
95
99
  public TransactionalPageOutput open(TaskSource taskSource, Schema schema, int taskIndex) {
96
100
  final PluginTask task = taskSource.loadTask(PluginTask.class);
97
101
  final ExecSession session = Exec.session();
98
- final List<TransactionalPageOutput> delegates = mapWithPluginDelegate(task, session, delegate ->
99
- delegate.open(schema, taskIndex)
102
+ final List<TransactionalPageOutputDelegate> delegates = mapWithPluginDelegate(task, session, delegate ->
103
+ new TransactionalPageOutputDelegate(delegate, delegate.open(schema, taskIndex), task.getStopOnFailedOutput())
100
104
  );
101
105
 
102
106
  return new TransactionalPageOutput() {
@@ -267,6 +271,68 @@ public class MultiOutputPlugin implements OutputPlugin {
267
271
  }
268
272
  }
269
273
 
274
+ private static class TransactionalPageOutputDelegate implements TransactionalPageOutput {
275
+ private final OutputPluginDelegate source;
276
+ private final TransactionalPageOutput delegate;
277
+ private final boolean isStopOnFailedOutput;
278
+
279
+ TransactionalPageOutputDelegate(
280
+ OutputPluginDelegate source, TransactionalPageOutput delegate, boolean isStopOnFailedOutput) {
281
+ this.source = source;
282
+ this.delegate = delegate;
283
+ this.isStopOnFailedOutput = isStopOnFailedOutput;
284
+ }
285
+
286
+ @Override
287
+ public void add(Page page) {
288
+ try {
289
+ delegate.add(page);
290
+ } catch (Exception e) {
291
+ warnOrException(e);
292
+ }
293
+ }
294
+
295
+ @Override
296
+ public void finish() {
297
+ try {
298
+ delegate.finish();
299
+ } catch (Exception e) {
300
+ warnOrException(e);
301
+ }
302
+ }
303
+
304
+ @Override
305
+ public void close() {
306
+ try {
307
+ delegate.close();
308
+ } catch (Exception e) {
309
+ warnOrException(e);
310
+ }
311
+ }
312
+
313
+ @Override
314
+ public void abort() {
315
+ try {
316
+ delegate.abort();
317
+ } catch (Exception e) {
318
+ warnOrException(e);
319
+ }
320
+ }
321
+
322
+ @Override
323
+ public TaskReport commit() {
324
+ return delegate.commit();
325
+ }
326
+
327
+ private void warnOrException(Exception e) {
328
+ final String message = String.format("Failed on output for %s.", source.getPluginNameForLogging());
329
+ if (isStopOnFailedOutput) {
330
+ throw new RuntimeException(message, e);
331
+ }
332
+ LOGGER.warn(message);
333
+ }
334
+ }
335
+
270
336
  private static class ControlDelegate implements OutputPlugin.Control {
271
337
  private final int pluginIndex;
272
338
  private final RunControlTask controlTask;
@@ -1,6 +1,7 @@
1
1
  package org.embulk.output.multi;
2
2
 
3
3
  import org.embulk.config.ConfigSource;
4
+ import org.embulk.exec.PartialExecutionException;
4
5
  import org.embulk.test.EmbulkPluginTest;
5
6
  import org.embulk.test.EmbulkTest;
6
7
  import org.embulk.test.Record;
@@ -22,6 +23,9 @@ import static org.embulk.test.LocalObjectOutputPlugin.assertRecords;
22
23
  import static org.embulk.test.Utils.configFromResource;
23
24
  import static org.embulk.test.Utils.record;
24
25
  import static org.junit.jupiter.api.Assertions.assertEquals;
26
+ import static org.junit.jupiter.api.Assertions.assertNull;
27
+ import static org.junit.jupiter.api.Assertions.assertTrue;
28
+ import static org.junit.jupiter.api.Assertions.fail;
25
29
 
26
30
  @EmbulkTest(MultiOutputPlugin.class)
27
31
  class TestMultiOutputPlugin extends EmbulkPluginTest {
@@ -111,6 +115,53 @@ class TestMultiOutputPlugin extends EmbulkPluginTest {
111
115
  assertRecords(records[3]);
112
116
  }
113
117
 
118
+ @Test
119
+ void testStopOnFailedOutputIsFalse() throws IOException {
120
+ final ConfigSource inConfig = configFromResource("yaml/in_base.yml");
121
+ final ConfigSource outConfig = configFromResource("yaml/out_stop_on_failed_output.yml");
122
+ final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
123
+ System.setOut(new PrintStream(outputStream));
124
+
125
+ // Run Embulk without error
126
+ runOutput(inConfig, outConfig);
127
+
128
+ // All records should be loaded for local_object output plugin.
129
+ final Record[] values = new Record[]{record(1, "user1", 20), record(2, "user2", 21)};
130
+ assertRecords(values);
131
+
132
+ // No record should be loaded for stdout output plugin
133
+ final BufferedReader reader = new BufferedReader(
134
+ new InputStreamReader(new ByteArrayInputStream(outputStream.toByteArray()))
135
+ );
136
+ assertNull(reader.readLine());
137
+ }
138
+
139
+ @Test
140
+ void testStopOnFailedOutputIsTrue() throws IOException {
141
+ final ConfigSource inConfig = configFromResource("yaml/in_base.yml");
142
+ final ConfigSource outConfig = configFromResource("yaml/out_stop_on_failed_output.yml")
143
+ .set("stop_on_failed_output", true);
144
+ final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
145
+ System.setOut(new PrintStream(outputStream));
146
+
147
+ // Run Embulk
148
+ try {
149
+ runOutput(inConfig, outConfig);
150
+ fail("No exception");
151
+ } catch (PartialExecutionException e) {
152
+ assertTrue(e.getMessage().contains("Failed on output for throw_exception output plugin (pluginIndex: 0)"));
153
+ }
154
+
155
+ // No record should be loaded for local_object output plugin.
156
+ assertRecords();
157
+
158
+ // No record should be loaded for stdout output plugin
159
+ final BufferedReader reader = new BufferedReader(
160
+ new InputStreamReader(new ByteArrayInputStream(outputStream.toByteArray()))
161
+ );
162
+ assertNull(reader.readLine());
163
+ }
164
+
114
165
  private static Object[][][] generateValues(int size) {
115
166
  Object[][][] values = new Object[size][1][3];
116
167
  for (int i = 0; i < size; i++) {
@@ -0,0 +1,9 @@
1
+ type: multi
2
+ outputs:
3
+ - type: throw_exception
4
+ thrown_on: ADD
5
+ source:
6
+ type: stdout
7
+ - type: local_object
8
+ incremental: true
9
+ incremental_column: id
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-output-multi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shinichi ISHIMURA
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-02 00:00:00.000000000 Z
11
+ date: 2019-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -50,7 +50,7 @@ files:
50
50
  - LICENSE
51
51
  - README.md
52
52
  - build.gradle
53
- - classpath/embulk-output-multi-0.1.0.jar
53
+ - classpath/embulk-output-multi-0.1.1.jar
54
54
  - gradle.properties
55
55
  - gradle/dependency-locks/compileClasspath.lockfile
56
56
  - gradle/dependency-locks/testCompileClasspath.lockfile
@@ -64,6 +64,7 @@ files:
64
64
  - src/test/java/org/embulk/output/multi/TestMultiOutputPlugin.java
65
65
  - src/test/resources/yaml/in_base.yml
66
66
  - src/test/resources/yaml/out_base.yml
67
+ - src/test/resources/yaml/out_stop_on_failed_output.yml
67
68
  homepage: https://github.com/kamatama41/embulk-output-multi
68
69
  licenses:
69
70
  - MIT