embulk 0.8.14 → 0.8.15

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ dependencies {
2
+ compile 'junit:junit:4.12'
3
+ compile 'org.hamcrest:hamcrest-library:1.3'
4
+
5
+ compile project(':embulk-core')
6
+ }
@@ -0,0 +1,75 @@
1
+ package org.embulk.test;
2
+
3
+ import com.google.common.base.Throwables;
4
+ import com.google.common.io.CharStreams;
5
+ import com.google.common.io.Resources;
6
+ import java.io.File;
7
+ import java.io.IOException;
8
+ import java.io.InputStream;
9
+ import java.io.InputStreamReader;
10
+ import java.nio.file.Files;
11
+ import java.nio.file.Path;
12
+ import java.util.Collections;
13
+ import java.util.List;
14
+ import org.embulk.EmbulkEmbed;
15
+ import org.embulk.config.ConfigSource;
16
+ import static com.google.common.base.Strings.isNullOrEmpty;
17
+ import static java.nio.charset.StandardCharsets.UTF_8;
18
+ import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
19
+ import static org.hamcrest.Matchers.is;
20
+ import static org.junit.Assume.assumeThat;
21
+
22
+ public class EmbulkTests
23
+ {
24
+ private EmbulkTests()
25
+ { }
26
+
27
+ public static ConfigSource config(String envName)
28
+ {
29
+ String path = System.getenv(envName);
30
+ assumeThat(isNullOrEmpty(path), is(false));
31
+ try {
32
+ return EmbulkEmbed.newSystemConfigLoader().fromYamlFile(new File(path));
33
+ } catch (IOException ex) {
34
+ throw Throwables.propagate(ex);
35
+ }
36
+ }
37
+
38
+ public static String readResource(String name)
39
+ {
40
+ try (InputStream in = Resources.getResource(name).openStream()) {
41
+ return CharStreams.toString(new InputStreamReader(in, UTF_8));
42
+ }
43
+ catch (IOException ex) {
44
+ throw new RuntimeException(ex);
45
+ }
46
+ }
47
+
48
+ public static void copyResource(String resource, Path dest)
49
+ throws IOException
50
+ {
51
+ Files.createDirectories(dest.getParent());
52
+ try (InputStream input = Resources.getResource(resource).openStream()) {
53
+ Files.copy(input, dest, REPLACE_EXISTING);
54
+ }
55
+ }
56
+
57
+ public static String readFile(Path path) throws IOException
58
+ {
59
+ try (InputStream in = Files.newInputStream(path)) {
60
+ return CharStreams.toString(new InputStreamReader(in, UTF_8));
61
+ }
62
+ }
63
+
64
+ public static String readSortedFile(Path path) throws IOException
65
+ {
66
+ List<String> lines = Files.readAllLines(path, UTF_8);
67
+ Collections.sort(lines);
68
+ StringBuilder sb = new StringBuilder();
69
+ for (String line : lines) {
70
+ sb.append(line);
71
+ sb.append("\n");
72
+ }
73
+ return sb.toString();
74
+ }
75
+ }
@@ -0,0 +1,124 @@
1
+ package org.embulk.test;
2
+
3
+ import com.google.common.base.Function;
4
+ import com.google.common.base.Optional;
5
+ import com.google.common.collect.ImmutableList;
6
+ import com.google.inject.Binder;
7
+ import com.google.inject.Inject;
8
+ import com.google.inject.Injector;
9
+ import com.google.inject.Module;
10
+ import com.google.inject.util.Modules;
11
+ import java.util.List;
12
+ import org.embulk.config.ConfigSource;
13
+ import org.embulk.config.TaskReport;
14
+ import org.embulk.exec.BulkLoader;
15
+ import org.embulk.exec.ExecutionResult;
16
+ import org.embulk.exec.ForSystemConfig;
17
+ import org.embulk.exec.ResumeState;
18
+ import org.embulk.spi.Exec;
19
+ import org.embulk.spi.ExecSession;
20
+ import org.embulk.spi.Schema;
21
+ import org.slf4j.Logger;
22
+
23
+ class TestingBulkLoader
24
+ extends BulkLoader
25
+ {
26
+ static Function<List<Module>, List<Module>> override()
27
+ {
28
+ return new Function<List<Module>, List<Module>>() {
29
+ @Override
30
+ public List<Module> apply(List<Module> modules)
31
+ {
32
+ Module override = new Module() {
33
+ public void configure(Binder binder)
34
+ {
35
+ binder.bind(BulkLoader.class).to(TestingBulkLoader.class);
36
+ }
37
+ };
38
+ return ImmutableList.of(Modules.override(modules).with(ImmutableList.of(override)));
39
+ }
40
+ };
41
+ }
42
+
43
+ @Inject
44
+ public TestingBulkLoader(Injector injector,
45
+ @ForSystemConfig ConfigSource systemConfig)
46
+ {
47
+ super(injector, systemConfig);
48
+ }
49
+
50
+ @Override
51
+ protected LoaderState newLoaderState(Logger logger, ProcessPluginSet plugins)
52
+ {
53
+ return new TestingLoaderState(logger, plugins);
54
+ }
55
+
56
+ protected static class TestingLoaderState
57
+ extends LoaderState
58
+ {
59
+ public TestingLoaderState(Logger logger, ProcessPluginSet plugins)
60
+ {
61
+ super(logger, plugins);
62
+ }
63
+
64
+ @Override
65
+ public ExecutionResult buildExecuteResultWithWarningException(Throwable ex)
66
+ {
67
+ ExecutionResult result = super.buildExecuteResultWithWarningException(ex);
68
+ return new TestingExecutionResult(result, buildResumeState(Exec.session()), Exec.session());
69
+ }
70
+ }
71
+
72
+ static class TestingExecutionResult
73
+ extends ExecutionResult
74
+ implements TestingEmbulk.RunResult
75
+ {
76
+ private final Schema inputSchema;
77
+ private final Schema outputSchema;
78
+ private final List<TaskReport> inputTaskReports;
79
+ private final List<TaskReport> outputTaskReports;
80
+
81
+ public TestingExecutionResult(ExecutionResult orig,
82
+ ResumeState resumeState, ExecSession session)
83
+ {
84
+ super(orig.getConfigDiff(), orig.isSkipped(), orig.getIgnoredExceptions());
85
+ this.inputSchema = resumeState.getInputSchema();
86
+ this.outputSchema = resumeState.getOutputSchema();
87
+ this.inputTaskReports = buildReports(resumeState.getInputTaskReports(), session);
88
+ this.outputTaskReports = buildReports(resumeState.getOutputTaskReports(), session);
89
+ }
90
+
91
+ private static List<TaskReport> buildReports(List<Optional<TaskReport>> optionalReports, ExecSession session)
92
+ {
93
+ ImmutableList.Builder<TaskReport> reports = ImmutableList.builder();
94
+ for (Optional<TaskReport> report : optionalReports) {
95
+ reports.add(report.or(session.newTaskReport()));
96
+ }
97
+ return reports.build();
98
+ }
99
+
100
+ @Override
101
+ public Schema getInputSchema()
102
+ {
103
+ return inputSchema;
104
+ }
105
+
106
+ @Override
107
+ public Schema getOutputSchema()
108
+ {
109
+ return outputSchema;
110
+ }
111
+
112
+ @Override
113
+ public List<TaskReport> getInputTaskReports()
114
+ {
115
+ return inputTaskReports;
116
+ }
117
+
118
+ @Override
119
+ public List<TaskReport> getOutputTaskReports()
120
+ {
121
+ return outputTaskReports;
122
+ }
123
+ }
124
+ }
@@ -0,0 +1,223 @@
1
+ package org.embulk.test;
2
+
3
+ import com.google.common.collect.ImmutableList;
4
+ import com.google.common.base.Optional;
5
+ import com.google.common.io.ByteStreams;
6
+ import com.google.inject.Binder;
7
+ import com.google.inject.Injector;
8
+ import com.google.inject.Module;
9
+ import java.io.IOException;
10
+ import java.io.InputStream;
11
+ import java.io.OutputStream;
12
+ import java.nio.file.DirectoryStream;
13
+ import java.nio.file.Files;
14
+ import java.nio.file.Path;
15
+ import java.util.ArrayList;
16
+ import java.util.Collections;
17
+ import java.util.List;
18
+ import org.embulk.EmbulkEmbed;
19
+ import org.embulk.config.Config;
20
+ import org.embulk.config.ConfigDiff;
21
+ import org.embulk.config.ConfigLoader;
22
+ import org.embulk.config.ConfigSource;
23
+ import org.embulk.config.TaskReport;
24
+ import org.embulk.exec.ExecutionResult;
25
+ import org.embulk.spi.Schema;
26
+ import org.embulk.spi.TempFileException;
27
+ import org.embulk.spi.TempFileSpace;
28
+ import org.junit.rules.TestRule;
29
+ import org.junit.rules.TestWatcher;
30
+ import org.junit.runner.Description;
31
+ import org.junit.runners.model.Statement;
32
+ import static com.google.common.base.Preconditions.checkArgument;
33
+ import static org.embulk.plugin.InjectedPluginSource.registerPluginTo;
34
+
35
+ public class TestingEmbulk
36
+ implements TestRule
37
+ {
38
+ public static class Builder
39
+ {
40
+ private List<Module> modules = new ArrayList<>();
41
+
42
+ Builder()
43
+ { }
44
+
45
+ public <T> Builder registerPlugin(final Class<T> iface, final String name, final Class<?> impl)
46
+ {
47
+ modules.add(new Module() {
48
+ public void configure(Binder binder)
49
+ {
50
+ registerPluginTo(binder, iface, name, impl);
51
+ }
52
+ });
53
+ return this;
54
+ }
55
+
56
+ public TestingEmbulk build()
57
+ {
58
+ return new TestingEmbulk(this);
59
+ }
60
+ }
61
+
62
+ public static Builder builder()
63
+ {
64
+ return new Builder();
65
+ }
66
+
67
+ private final List<Module> modules;
68
+
69
+ private EmbulkEmbed embed;
70
+ private TempFileSpace tempFiles;
71
+
72
+ TestingEmbulk(Builder builder)
73
+ {
74
+ this.modules = ImmutableList.copyOf(builder.modules);
75
+ reset();
76
+ }
77
+
78
+ public void reset()
79
+ {
80
+ destroy();
81
+
82
+ this.embed = new EmbulkEmbed.Bootstrap()
83
+ .addModules(modules)
84
+ .overrideModules(TestingBulkLoader.override())
85
+ .initializeCloseable();
86
+
87
+ try {
88
+ this.tempFiles = new TempFileSpace(Files.createTempDirectory("embulk-test-temp-").toFile());
89
+ }
90
+ catch (IOException ex) {
91
+ throw new TempFileException(ex);
92
+ }
93
+ }
94
+
95
+ public void destroy()
96
+ {
97
+ if (embed != null) {
98
+ embed.destroy();
99
+ embed = null;
100
+ }
101
+ if (tempFiles != null) {
102
+ tempFiles.cleanup();
103
+ tempFiles = null;
104
+ }
105
+ }
106
+
107
+ @Override
108
+ public Statement apply(Statement base, Description description)
109
+ {
110
+ return new EmbulkTestingEmbedWatcher().apply(base, description);
111
+ }
112
+
113
+ private class EmbulkTestingEmbedWatcher
114
+ extends TestWatcher
115
+ {
116
+ @Override
117
+ protected void starting(Description description)
118
+ {
119
+ reset();
120
+ }
121
+
122
+ @Override
123
+ protected void finished(Description description)
124
+ {
125
+ destroy();
126
+ }
127
+ }
128
+
129
+ public Path createTempFile(String suffix)
130
+ {
131
+ return tempFiles.createTempFile(suffix).toPath();
132
+ }
133
+
134
+ public Injector injector()
135
+ {
136
+ return embed.getInjector();
137
+ }
138
+
139
+ public ConfigLoader configLoader()
140
+ {
141
+ return embed.newConfigLoader();
142
+ }
143
+
144
+ public ConfigSource newConfig()
145
+ {
146
+ return configLoader().newConfigSource();
147
+ }
148
+
149
+ public ConfigSource loadYamlResource(String name)
150
+ {
151
+ return configLoader()
152
+ .fromYamlString(EmbulkTests.readResource(name));
153
+ }
154
+
155
+ public static interface RunResult
156
+ {
157
+ ConfigDiff getConfigDiff();
158
+
159
+ List<Throwable> getIgnoredExceptions();
160
+
161
+ Schema getInputSchema();
162
+
163
+ Schema getOutputSchema();
164
+
165
+ List<TaskReport> getInputTaskReports();
166
+
167
+ List<TaskReport> getOutputTaskReports();
168
+ }
169
+
170
+ public RunResult runInput(ConfigSource inConfig, Path outputPath)
171
+ throws IOException
172
+ {
173
+ String fileName = outputPath.getFileName().toString();
174
+ checkArgument(fileName.endsWith(".csv"), "outputPath must end with .csv");
175
+ Path dir = outputPath.getParent().resolve(fileName.substring(0, fileName.length() - 4));
176
+
177
+ Files.createDirectories(dir);
178
+
179
+ ConfigSource execConfig = newConfig()
180
+ .set("min_output_tasks", 1);
181
+
182
+ ConfigSource outConfig = newConfig()
183
+ .set("type", "file")
184
+ .set("path_prefix", dir.resolve("fragments_").toString())
185
+ .set("file_ext", "csv")
186
+ .set("formatter", newConfig()
187
+ .set("type", "csv")
188
+ .set("header_line", false)
189
+ .set("newline", "LF"));
190
+
191
+ ConfigSource config = newConfig()
192
+ .set("exec", execConfig)
193
+ .set("in", inConfig)
194
+ .set("out", outConfig);
195
+
196
+ // embed.run returns TestingBulkLoader.TestingExecutionResult because
197
+ RunResult result = (RunResult) embed.run(config);
198
+
199
+ try (OutputStream out = Files.newOutputStream(outputPath)) {
200
+ List<Path> fragments = new ArrayList<Path>();
201
+ try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "fragments_*.csv")) {
202
+ for (Path fragment : stream) {
203
+ fragments.add(fragment);
204
+ }
205
+ }
206
+ Collections.sort(fragments);
207
+ for (Path fragment : fragments) {
208
+ try (InputStream in = Files.newInputStream(fragment)) {
209
+ ByteStreams.copy(in, out);
210
+ }
211
+ }
212
+ }
213
+
214
+ return result;
215
+ }
216
+
217
+ // TODO add runOutput(ConfigSource outConfig, Path inputPath) where inputPath is a path to a CSV file
218
+ // whose column types can be naturally guessed using csv guess plugin. Callers use EmbulkTests.copyResource
219
+ // to copy a resource file to a temp file before calling it.
220
+
221
+ // TODO add runFilter(ConfigSource filterConfig, Path inputPath, Path outputPath) where inputPath is a path to
222
+ // a CSV file whose column types can be naturally guessed using csv guess plugin.
223
+ }
@@ -1,3 +1,3 @@
1
1
  module Embulk
2
- VERSION = '0.8.14'
2
+ VERSION = '0.8.15'
3
3
  end
data/settings.gradle CHANGED
@@ -3,4 +3,5 @@ rootProject.name = 'embulk'
3
3
  include 'embulk-core'
4
4
  include 'embulk-standards'
5
5
  include 'embulk-cli'
6
+ include 'embulk-test'
6
7
  include 'embulk-docs'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.14
4
+ version: 0.8.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sadayuki Furuhashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-22 00:00:00.000000000 Z
11
+ date: 2016-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jruby-jars
@@ -108,9 +108,9 @@ files:
108
108
  - classpath/commons-beanutils-core-1.8.3.jar
109
109
  - classpath/commons-compress-1.10.jar
110
110
  - classpath/commons-lang3-3.1.jar
111
- - classpath/embulk-cli-0.8.14.jar
112
- - classpath/embulk-core-0.8.14.jar
113
- - classpath/embulk-standards-0.8.14.jar
111
+ - classpath/embulk-cli-0.8.15.jar
112
+ - classpath/embulk-core-0.8.15.jar
113
+ - classpath/embulk-standards-0.8.15.jar
114
114
  - classpath/guava-18.0.jar
115
115
  - classpath/guice-4.0.jar
116
116
  - classpath/guice-bootstrap-0.1.1.jar
@@ -188,6 +188,7 @@ files:
188
188
  - embulk-core/src/main/java/org/embulk/exec/ResumeState.java
189
189
  - embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java
190
190
  - embulk-core/src/main/java/org/embulk/exec/SetCurrentThreadName.java
191
+ - embulk-core/src/main/java/org/embulk/exec/SkipTransactionException.java
191
192
  - embulk-core/src/main/java/org/embulk/exec/SystemConfigModule.java
192
193
  - embulk-core/src/main/java/org/embulk/exec/TempFileAllocator.java
193
194
  - embulk-core/src/main/java/org/embulk/exec/TransactionStage.java
@@ -428,6 +429,7 @@ files:
428
429
  - embulk-docs/src/release/release-0.8.12.rst
429
430
  - embulk-docs/src/release/release-0.8.13.rst
430
431
  - embulk-docs/src/release/release-0.8.14.rst
432
+ - embulk-docs/src/release/release-0.8.15.rst
431
433
  - embulk-docs/src/release/release-0.8.2.rst
432
434
  - embulk-docs/src/release/release-0.8.3.rst
433
435
  - embulk-docs/src/release/release-0.8.4.rst
@@ -458,6 +460,10 @@ files:
458
460
  - embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java
459
461
  - embulk-standards/src/test/java/org/embulk/standards/TestJsonParserPlugin.java
460
462
  - embulk-standards/src/test/java/org/embulk/standards/TestRenameFilterPlugin.java
463
+ - embulk-test/build.gradle
464
+ - embulk-test/src/main/java/org/embulk/test/EmbulkTests.java
465
+ - embulk-test/src/main/java/org/embulk/test/TestingBulkLoader.java
466
+ - embulk-test/src/main/java/org/embulk/test/TestingEmbulk.java
461
467
  - embulk.gemspec
462
468
  - gradle/wrapper/gradle-wrapper.jar
463
469
  - gradle/wrapper/gradle-wrapper.properties