embulk 0.7.4-java → 0.7.5-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +7 -0
- data/build.gradle +3 -2
- data/embulk-core/src/main/java/org/embulk/EmbulkEmbed.java +1 -1
- data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +3 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigDiff.java +3 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigSource.java +3 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSource.java +2 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +12 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskReport.java +3 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskSource.java +3 -0
- data/embulk-core/src/main/java/org/embulk/exec/ConfigurableGuessInputPlugin.java +9 -0
- data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +11 -5
- data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +0 -1
- data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +8 -2
- data/embulk-core/src/main/java/org/embulk/spi/time/Timestamp.java +5 -5
- data/embulk-core/src/test/java/org/embulk/spi/util/TestLineDecoder.java +125 -20
- data/embulk-docs/src/index.rst +4 -0
- data/embulk-docs/src/recipe/scheduled-csv-load-to-elasticsearch-kibana4.rst +7 -0
- data/embulk-docs/src/release.rst +2 -0
- data/embulk-docs/src/release/release-0.6.27.rst +11 -0
- data/embulk-docs/src/release/release-0.7.5.rst +22 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +3 -4
- data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +13 -4
- data/lib/embulk.rb +4 -18
- data/lib/embulk/command/embulk_new_plugin.rb +2 -2
- data/lib/embulk/command/embulk_run.rb +5 -3
- data/lib/embulk/command/embulk_selfupdate.rb +3 -2
- data/lib/embulk/data/new/gitignore.erb +4 -0
- data/lib/embulk/data/new/java/decoder.java.erb +2 -2
- data/lib/embulk/data/new/java/encoder.java.erb +2 -2
- data/lib/embulk/data/new/java/file_input.java.erb +2 -2
- data/lib/embulk/data/new/java/file_output.java.erb +2 -2
- data/lib/embulk/data/new/java/filter.java.erb +2 -2
- data/lib/embulk/data/new/java/formatter.java.erb +2 -2
- data/lib/embulk/data/new/java/input.java.erb +2 -2
- data/lib/embulk/data/new/java/output.java.erb +2 -2
- data/lib/embulk/data/new/java/parser.java.erb +2 -2
- data/lib/embulk/data/package_data.rb +10 -5
- data/lib/embulk/guess/csv.rb +17 -1
- data/lib/embulk/logger.rb +2 -2
- data/lib/embulk/runner.rb +1 -1
- data/lib/embulk/version.rb +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63f5bc3b3bb2ba976677b032b93b0cb74d42a320
|
4
|
+
data.tar.gz: a0e9978b430cbca4901d709691fabbb5950981eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56244b996db3d9381cbf9ef601458f361a36faa607f804ade930b41a489070cf968e61a9084a9841ab9d5954c785adbda6f68b388662b187da253b5802cd1460
|
7
|
+
data.tar.gz: 5fa872f8a6f9485e639831ae099429c8e47697638cd746647befc88a5bbe2d07ac3849b77d514b9dcd2621d0811c0e074f33385b61cf15a892c4bca797cc727f
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -129,6 +129,13 @@ Following command updates embulk itself to the latest released version.
|
|
129
129
|
embulk selfupdate
|
130
130
|
```
|
131
131
|
|
132
|
+
Following command updates embulk itself to the specific released version.
|
133
|
+
|
134
|
+
```sh
|
135
|
+
embulk selfupdate x.y.z
|
136
|
+
```
|
137
|
+
|
138
|
+
|
132
139
|
## Embulk Development
|
133
140
|
|
134
141
|
### Build
|
data/build.gradle
CHANGED
@@ -16,7 +16,7 @@ def release_projects = [project(":embulk-core"), project(":embulk-standards")]
|
|
16
16
|
|
17
17
|
allprojects {
|
18
18
|
group = 'org.embulk'
|
19
|
-
version = '0.7.
|
19
|
+
version = '0.7.5'
|
20
20
|
|
21
21
|
ext {
|
22
22
|
jrubyVersion = '9.0.0.0'
|
@@ -88,10 +88,11 @@ subprojects {
|
|
88
88
|
jcenter()
|
89
89
|
}
|
90
90
|
|
91
|
-
compileJava.options.encoding = 'UTF-8' // source encoding
|
92
91
|
sourceCompatibility = 1.7
|
93
92
|
targetCompatibility = 1.7
|
94
93
|
|
94
|
+
def defaultEncoding = 'UTF-8'
|
95
|
+
[compileJava, compileTestJava]*.options*.encoding = defaultEncoding
|
95
96
|
dependencies {
|
96
97
|
testCompile 'junit:junit:4.12'
|
97
98
|
}
|
@@ -224,7 +224,7 @@ public class EmbulkEmbed
|
|
224
224
|
|
225
225
|
private ExecSession newExecSession(ConfigSource config)
|
226
226
|
{
|
227
|
-
ConfigSource execConfig = config.deepCopy().
|
227
|
+
ConfigSource execConfig = config.deepCopy().getNestedOrGetEmpty("exec");
|
228
228
|
return ExecSession.builder(injector).fromExecConfig(execConfig).build();
|
229
229
|
}
|
230
230
|
|
@@ -114,6 +114,18 @@ public class DataSourceImpl
|
|
114
114
|
return newInstance(model, (ObjectNode) json);
|
115
115
|
}
|
116
116
|
|
117
|
+
@Override
|
118
|
+
public DataSourceImpl getNestedOrGetEmpty(String attrName)
|
119
|
+
{
|
120
|
+
JsonNode json = data.get(attrName);
|
121
|
+
if (json == null) {
|
122
|
+
json = data.objectNode();
|
123
|
+
} else if (!json.isObject()) {
|
124
|
+
throw new ConfigException("Attribute "+attrName+" must be an object");
|
125
|
+
}
|
126
|
+
return newInstance(model, (ObjectNode) json);
|
127
|
+
}
|
128
|
+
|
117
129
|
@Override
|
118
130
|
public DataSourceImpl set(String attrName, Object v)
|
119
131
|
{
|
@@ -98,15 +98,21 @@ public class GuessExecutor
|
|
98
98
|
private ConfigDiff doGuess(ConfigSource config)
|
99
99
|
{
|
100
100
|
ConfigSource inputConfig = config.getNested("in");
|
101
|
+
ConfigSource execConfig = config.getNestedOrGetEmpty("exec");
|
101
102
|
|
102
103
|
InputPlugin input = newInputPlugin(inputConfig);
|
103
104
|
|
104
105
|
ConfigDiff inputGuessed;
|
105
|
-
|
106
|
-
inputGuessed = input.guess(inputConfig);
|
107
|
-
}
|
108
|
-
|
109
|
-
|
106
|
+
if (input instanceof ConfigurableGuessInputPlugin) {
|
107
|
+
inputGuessed = ((ConfigurableGuessInputPlugin) input).guess(execConfig, inputConfig);
|
108
|
+
}
|
109
|
+
else {
|
110
|
+
try {
|
111
|
+
inputGuessed = input.guess(inputConfig);
|
112
|
+
} catch (AbstractMethodError ex) {
|
113
|
+
// for backward compatibility with embulk v0.4 interface
|
114
|
+
throw new UnsupportedOperationException(input.getClass().getSimpleName()+".guess(ConfigSource) is not implemented. This input plugin does not support guessing.");
|
115
|
+
}
|
110
116
|
}
|
111
117
|
|
112
118
|
ConfigDiff wrapped = Exec.newConfigDiff();
|
@@ -62,7 +62,6 @@ public class JRubyScriptingModule
|
|
62
62
|
{
|
63
63
|
LocalContextScope scope = (useGlobalRubyRuntime ? LocalContextScope.SINGLETON : LocalContextScope.SINGLETHREAD);
|
64
64
|
ScriptingContainer jruby = new ScriptingContainer(scope);
|
65
|
-
jruby.setCompatVersion(CompatVersion.RUBY1_9);
|
66
65
|
|
67
66
|
// Search embulk/java/bootstrap.rb from a $LOAD_PATH.
|
68
67
|
// $LOAD_PATH is set by lib/embulk/command/embulk_run.rb if Embulk starts
|
@@ -14,10 +14,11 @@ import org.embulk.plugin.compat.PluginWrappers;
|
|
14
14
|
import org.embulk.spi.util.Decoders;
|
15
15
|
import org.embulk.exec.GuessExecutor;
|
16
16
|
import org.embulk.exec.SamplingParserPlugin;
|
17
|
+
import org.embulk.exec.ConfigurableGuessInputPlugin;
|
17
18
|
import org.embulk.exec.NoSampleException;
|
18
19
|
|
19
20
|
public class FileInputRunner
|
20
|
-
implements InputPlugin
|
21
|
+
implements InputPlugin, ConfigurableGuessInputPlugin
|
21
22
|
{
|
22
23
|
private final FileInputPlugin fileInputPlugin;
|
23
24
|
|
@@ -75,6 +76,11 @@ public class FileInputRunner
|
|
75
76
|
|
76
77
|
@Override
|
77
78
|
public ConfigDiff guess(ConfigSource config)
|
79
|
+
{
|
80
|
+
return guess(Exec.newConfigSource(), config);
|
81
|
+
}
|
82
|
+
|
83
|
+
public ConfigDiff guess(ConfigSource execConfig, ConfigSource config)
|
78
84
|
{
|
79
85
|
Buffer sample = SamplingParserPlugin.runFileInputSampling(this, config);
|
80
86
|
if (sample.limit() == 0) {
|
@@ -82,7 +88,7 @@ public class FileInputRunner
|
|
82
88
|
}
|
83
89
|
|
84
90
|
GuessExecutor guessExecutor = Exec.getInjector().getInstance(GuessExecutor.class);
|
85
|
-
return guessExecutor.guessParserConfig(sample, config,
|
91
|
+
return guessExecutor.guessParserConfig(sample, config, execConfig);
|
86
92
|
}
|
87
93
|
|
88
94
|
private class RunnerControl
|
@@ -11,10 +11,10 @@ import org.jruby.RubyTime;
|
|
11
11
|
public class Timestamp
|
12
12
|
implements Comparable<Timestamp>
|
13
13
|
{
|
14
|
-
private final static DateTimeFormatter TO_STRING_FORMATTER_SECONDS = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss
|
15
|
-
private final static DateTimeFormatter TO_STRING_FORMATTER_MILLIS = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS
|
14
|
+
private final static DateTimeFormatter TO_STRING_FORMATTER_SECONDS = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss ").withZoneUTC();
|
15
|
+
private final static DateTimeFormatter TO_STRING_FORMATTER_MILLIS = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS ").withZoneUTC();
|
16
16
|
private final static DateTimeFormatter TO_STRING_FORMATTER_CUSTOM = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withZoneUTC();
|
17
|
-
private static final Pattern FROM_STRING_PATTERN = Pattern.compile("(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})(?:\\.(\\d{1,9}))? UTC");
|
17
|
+
private static final Pattern FROM_STRING_PATTERN = Pattern.compile("(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})(?:\\.(\\d{1,9}))? (?:UTC|\\+?00\\:?00)");
|
18
18
|
|
19
19
|
private final long seconds;
|
20
20
|
private final int nano;
|
@@ -107,10 +107,10 @@ public class Timestamp
|
|
107
107
|
public String toString()
|
108
108
|
{
|
109
109
|
if (nano == 0) {
|
110
|
-
return TO_STRING_FORMATTER_SECONDS.print(getEpochSecond() * 1000);
|
110
|
+
return TO_STRING_FORMATTER_SECONDS.print(getEpochSecond() * 1000) + "UTC";
|
111
111
|
|
112
112
|
} else if (nano % 1000000 == 0) {
|
113
|
-
return TO_STRING_FORMATTER_MILLIS.print(toEpochMilli());
|
113
|
+
return TO_STRING_FORMATTER_MILLIS.print(toEpochMilli()) + "UTC";
|
114
114
|
|
115
115
|
} else {
|
116
116
|
StringBuffer sb = new StringBuffer();
|
@@ -4,6 +4,7 @@ import java.util.List;
|
|
4
4
|
import java.util.ArrayList;
|
5
5
|
import java.nio.ByteBuffer;
|
6
6
|
import java.nio.charset.Charset;
|
7
|
+
import java.nio.charset.StandardCharsets;
|
7
8
|
import java.nio.charset.UnsupportedCharsetException;
|
8
9
|
import com.google.common.collect.ImmutableList;
|
9
10
|
import org.junit.Rule;
|
@@ -26,7 +27,7 @@ public class TestLineDecoder
|
|
26
27
|
{
|
27
28
|
ConfigSource config = Exec.newConfigSource();
|
28
29
|
LineDecoder.DecoderTask task = config.loadConfig(LineDecoder.DecoderTask.class);
|
29
|
-
assertEquals(
|
30
|
+
assertEquals(StandardCharsets.UTF_8, task.getCharset());
|
30
31
|
assertEquals(Newline.CRLF, task.getNewline());
|
31
32
|
}
|
32
33
|
|
@@ -37,22 +38,22 @@ public class TestLineDecoder
|
|
37
38
|
.set("charset", "utf-16")
|
38
39
|
.set("newline", "CRLF");
|
39
40
|
LineDecoder.DecoderTask task = config.loadConfig(LineDecoder.DecoderTask.class);
|
40
|
-
assertEquals(
|
41
|
+
assertEquals(StandardCharsets.UTF_16, task.getCharset());
|
41
42
|
assertEquals(Newline.CRLF, task.getNewline());
|
42
43
|
}
|
43
44
|
|
44
|
-
private static LineDecoder.DecoderTask getExampleConfig()
|
45
|
+
private static LineDecoder.DecoderTask getExampleConfig(Charset charset, Newline newline)
|
45
46
|
{
|
46
47
|
ConfigSource config = Exec.newConfigSource()
|
47
|
-
.set("charset",
|
48
|
-
.set("newline",
|
48
|
+
.set("charset", charset)
|
49
|
+
.set("newline", newline);
|
49
50
|
return config.loadConfig(LineDecoder.DecoderTask.class);
|
50
51
|
}
|
51
52
|
|
52
53
|
private static LineDecoder newDecoder(Charset charset, Newline newline, List<Buffer> buffers)
|
53
54
|
{
|
54
55
|
ListFileInput input = new ListFileInput(ImmutableList.of(buffers));
|
55
|
-
return new LineDecoder(input, getExampleConfig());
|
56
|
+
return new LineDecoder(input, getExampleConfig(charset, newline));
|
56
57
|
}
|
57
58
|
|
58
59
|
private static List<String> doDecode(Charset charset, Newline newline, List<Buffer> buffers)
|
@@ -70,10 +71,8 @@ public class TestLineDecoder
|
|
70
71
|
return builder.build();
|
71
72
|
}
|
72
73
|
|
73
|
-
private static List<Buffer> bufferList(
|
74
|
+
private static List<Buffer> bufferList(Charset charset, String... sources) throws UnsupportedCharsetException
|
74
75
|
{
|
75
|
-
Charset charset = Charset.forName(charsetName);
|
76
|
-
|
77
76
|
List<Buffer> buffers = new ArrayList<Buffer>();
|
78
77
|
for (String source : sources) {
|
79
78
|
ByteBuffer buffer = charset.encode(source);
|
@@ -87,8 +86,8 @@ public class TestLineDecoder
|
|
87
86
|
public void testDecodeBasicAscii() throws Exception
|
88
87
|
{
|
89
88
|
List<String> decoded = doDecode(
|
90
|
-
|
91
|
-
bufferList(
|
89
|
+
StandardCharsets.UTF_8, Newline.LF,
|
90
|
+
bufferList(StandardCharsets.UTF_8, "test1\ntest2\ntest3\n"));
|
92
91
|
assertEquals(ImmutableList.of("test1", "test2", "test3"), decoded);
|
93
92
|
}
|
94
93
|
|
@@ -96,8 +95,8 @@ public class TestLineDecoder
|
|
96
95
|
public void testDecodeBasicAsciiCRLF() throws Exception
|
97
96
|
{
|
98
97
|
List<String> decoded = doDecode(
|
99
|
-
|
100
|
-
bufferList(
|
98
|
+
StandardCharsets.UTF_8, Newline.CRLF,
|
99
|
+
bufferList(StandardCharsets.UTF_8, "test1\r\ntest2\r\ntest3\r\n"));
|
101
100
|
assertEquals(ImmutableList.of("test1", "test2", "test3"), decoded);
|
102
101
|
}
|
103
102
|
|
@@ -105,8 +104,8 @@ public class TestLineDecoder
|
|
105
104
|
public void testDecodeBasicAsciiTail() throws Exception
|
106
105
|
{
|
107
106
|
List<String> decoded = doDecode(
|
108
|
-
|
109
|
-
bufferList(
|
107
|
+
StandardCharsets.UTF_8, Newline.LF,
|
108
|
+
bufferList(StandardCharsets.UTF_8, "test1"));
|
110
109
|
assertEquals(ImmutableList.of("test1"), decoded);
|
111
110
|
}
|
112
111
|
|
@@ -114,8 +113,8 @@ public class TestLineDecoder
|
|
114
113
|
public void testDecodeChunksLF() throws Exception
|
115
114
|
{
|
116
115
|
List<String> decoded = doDecode(
|
117
|
-
|
118
|
-
bufferList(
|
116
|
+
StandardCharsets.UTF_8, Newline.LF,
|
117
|
+
bufferList(StandardCharsets.UTF_8, "t", "1", "\n", "t", "2"));
|
119
118
|
assertEquals(ImmutableList.of("t1", "t2"), decoded);
|
120
119
|
}
|
121
120
|
|
@@ -123,10 +122,116 @@ public class TestLineDecoder
|
|
123
122
|
public void testDecodeChunksCRLF() throws Exception
|
124
123
|
{
|
125
124
|
List<String> decoded = doDecode(
|
126
|
-
|
127
|
-
bufferList(
|
125
|
+
StandardCharsets.UTF_8, Newline.CRLF,
|
126
|
+
bufferList(StandardCharsets.UTF_8, "t", "1", "\r\n", "t", "2", "\r", "\n", "t3"));
|
128
127
|
assertEquals(ImmutableList.of("t1", "t2", "t3"), decoded);
|
129
128
|
}
|
130
129
|
|
131
|
-
|
130
|
+
@Test
|
131
|
+
public void testDecodeBasicUTF8() throws Exception
|
132
|
+
{
|
133
|
+
List<String> decoded = doDecode(
|
134
|
+
StandardCharsets.UTF_8, Newline.LF,
|
135
|
+
bufferList(StandardCharsets.UTF_8, "てすと1\nテスト2\nてすと3\n"));
|
136
|
+
assertEquals(ImmutableList.of("てすと1", "テスト2", "てすと3"), decoded);
|
137
|
+
}
|
138
|
+
|
139
|
+
@Test
|
140
|
+
public void testDecodeBasicUTF8Tail() throws Exception
|
141
|
+
{
|
142
|
+
List<String> decoded = doDecode(
|
143
|
+
StandardCharsets.UTF_8, Newline.LF,
|
144
|
+
bufferList(StandardCharsets.UTF_8, "てすと1"));
|
145
|
+
assertEquals(ImmutableList.of("てすと1"), decoded);
|
146
|
+
}
|
147
|
+
|
148
|
+
@Test
|
149
|
+
public void testDecodeChunksUTF8LF() throws Exception
|
150
|
+
{
|
151
|
+
List<String> decoded = doDecode(
|
152
|
+
StandardCharsets.UTF_8, Newline.LF,
|
153
|
+
bufferList(StandardCharsets.UTF_8, "て", "1", "\n", "す", "2"));
|
154
|
+
assertEquals(ImmutableList.of("て1", "す2"), decoded);
|
155
|
+
}
|
156
|
+
|
157
|
+
@Test
|
158
|
+
public void testDecodeChunksUTF8CRLF() throws Exception
|
159
|
+
{
|
160
|
+
List<String> decoded = doDecode(
|
161
|
+
StandardCharsets.UTF_8, Newline.CRLF,
|
162
|
+
bufferList(StandardCharsets.UTF_8, "て", "1", "\r\n", "す", "2", "\r", "\n", "と3"));
|
163
|
+
assertEquals(ImmutableList.of("て1", "す2", "と3"), decoded);
|
164
|
+
}
|
165
|
+
|
166
|
+
@Test
|
167
|
+
public void testDecodeBasicUTF16LE() throws Exception
|
168
|
+
{
|
169
|
+
List<String> decoded = doDecode(
|
170
|
+
StandardCharsets.UTF_16LE, Newline.LF,
|
171
|
+
bufferList(StandardCharsets.UTF_16LE, "てすと1\nテスト2\nてすと3\n"));
|
172
|
+
assertEquals(ImmutableList.of("てすと1", "テスト2", "てすと3"), decoded);
|
173
|
+
}
|
174
|
+
|
175
|
+
@Test
|
176
|
+
public void testDecodeBasicUTF16LETail() throws Exception
|
177
|
+
{
|
178
|
+
List<String> decoded = doDecode(
|
179
|
+
StandardCharsets.UTF_16LE, Newline.LF,
|
180
|
+
bufferList(StandardCharsets.UTF_16LE, "てすと1"));
|
181
|
+
assertEquals(ImmutableList.of("てすと1"), decoded);
|
182
|
+
}
|
183
|
+
|
184
|
+
@Test
|
185
|
+
public void testDecodeChunksUTF16LELF() throws Exception
|
186
|
+
{
|
187
|
+
List<String> decoded = doDecode(
|
188
|
+
StandardCharsets.UTF_16LE, Newline.LF,
|
189
|
+
bufferList(StandardCharsets.UTF_16LE, "て", "1", "\n", "す", "2"));
|
190
|
+
assertEquals(ImmutableList.of("て1", "す2"), decoded);
|
191
|
+
}
|
192
|
+
|
193
|
+
@Test
|
194
|
+
public void testDecodeChunksUTF16LECRLF() throws Exception
|
195
|
+
{
|
196
|
+
List<String> decoded = doDecode(
|
197
|
+
StandardCharsets.UTF_16LE, Newline.CRLF,
|
198
|
+
bufferList(StandardCharsets.UTF_16LE, "て", "1", "\r\n", "す", "2", "\r", "\n", "と3"));
|
199
|
+
assertEquals(ImmutableList.of("て1", "す2", "と3"), decoded);
|
200
|
+
}
|
201
|
+
|
202
|
+
@Test
|
203
|
+
public void testDecodeBasicMS932() throws Exception
|
204
|
+
{
|
205
|
+
List<String> decoded = doDecode(
|
206
|
+
Charset.forName("ms932"), Newline.LF,
|
207
|
+
bufferList(Charset.forName("ms932"), "てすと1\nテスト2\nてすと3\n"));
|
208
|
+
assertEquals(ImmutableList.of("てすと1", "テスト2", "てすと3"), decoded);
|
209
|
+
}
|
210
|
+
|
211
|
+
@Test
|
212
|
+
public void testDecodeBasicMS932Tail() throws Exception
|
213
|
+
{
|
214
|
+
List<String> decoded = doDecode(
|
215
|
+
Charset.forName("ms932"), Newline.LF,
|
216
|
+
bufferList(Charset.forName("ms932"), "てすと1"));
|
217
|
+
assertEquals(ImmutableList.of("てすと1"), decoded);
|
218
|
+
}
|
219
|
+
|
220
|
+
@Test
|
221
|
+
public void testDecodeChunksMS932LF() throws Exception
|
222
|
+
{
|
223
|
+
List<String> decoded = doDecode(
|
224
|
+
Charset.forName("ms932"), Newline.LF,
|
225
|
+
bufferList(Charset.forName("ms932"), "て", "1", "\n", "す", "2"));
|
226
|
+
assertEquals(ImmutableList.of("て1", "す2"), decoded);
|
227
|
+
}
|
228
|
+
|
229
|
+
@Test
|
230
|
+
public void testDecodeChunksMS932CRLF() throws Exception
|
231
|
+
{
|
232
|
+
List<String> decoded = doDecode(
|
233
|
+
Charset.forName("ms932"), Newline.CRLF,
|
234
|
+
bufferList(Charset.forName("ms932"), "て", "1", "\r\n", "す", "2", "\r", "\n", "と3"));
|
235
|
+
assertEquals(ImmutableList.of("て1", "す2", "と3"), decoded);
|
236
|
+
}
|
132
237
|
}
|
data/embulk-docs/src/index.rst
CHANGED
@@ -55,10 +55,14 @@ Documents
|
|
55
55
|
|
56
56
|
* `File parser plugins <http://www.embulk.org/plugins/#file-parser>`_
|
57
57
|
|
58
|
+
* `File decoder plugins <http://www.embulk.org/plugins/#file-decoder>`_
|
59
|
+
|
58
60
|
* `File formatter plugins <http://www.embulk.org/plugins/#file-formatter>`_
|
59
61
|
|
60
62
|
* `Filter plugins <http://www.embulk.org/plugins/#filter>`_
|
61
63
|
|
64
|
+
* `File encoder plugins <http://www.embulk.org/plugins/#file-encoder>`_
|
65
|
+
|
62
66
|
* `Executor plugins <http://www.embulk.org/plugins/#executor>`_
|
63
67
|
|
64
68
|
.. toctree::
|
@@ -126,6 +126,13 @@ The generated config-complete.yml file should include complete information as fo
|
|
126
126
|
nodes:
|
127
127
|
- {host: localhost}
|
128
128
|
|
129
|
+
Note: If the CSV file contains timestamp in local time zone, set default_timezone parameter to parser config as following (since time zone is assumed as UTC by default).
|
130
|
+
|
131
|
+
.. code-block:: yaml
|
132
|
+
|
133
|
+
parser:
|
134
|
+
default_timezone: 'Asia/Tokyo'
|
135
|
+
|
129
136
|
Now, you can run the bulk loading:
|
130
137
|
|
131
138
|
.. code-block:: console
|
data/embulk-docs/src/release.rst
CHANGED
@@ -4,11 +4,13 @@ Release Notes
|
|
4
4
|
.. toctree::
|
5
5
|
:maxdepth: 1
|
6
6
|
|
7
|
+
release/release-0.7.5
|
7
8
|
release/release-0.7.4
|
8
9
|
release/release-0.7.3
|
9
10
|
release/release-0.7.2
|
10
11
|
release/release-0.7.1
|
11
12
|
release/release-0.7.0
|
13
|
+
release/release-0.6.27
|
12
14
|
release/release-0.6.26
|
13
15
|
release/release-0.6.25
|
14
16
|
release/release-0.6.24
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Release 0.7.5
|
2
|
+
==================================
|
3
|
+
|
4
|
+
General Changes
|
5
|
+
------------------
|
6
|
+
|
7
|
+
* ``guess`` uses guess plugins configured at ``guess_plugins: [string]`` in ``exec:`` section in addition to ``-g, --guess NAMES`` command line argument.
|
8
|
+
* ``guess`` doesn't create unnecessary ``exec:`` section.
|
9
|
+
* Fixed timestamp deserialization error happens when a bulkload fails and cleanup runs.
|
10
|
+
* Fixed permissions of files generated by ``new`` command.
|
11
|
+
|
12
|
+
|
13
|
+
Built-in plugins
|
14
|
+
------------------
|
15
|
+
|
16
|
+
* ``guess-csv``: Guesses header line as much as possible when all column types are string or boolean
|
17
|
+
* ``parser-csv``: Fixed line number shown in 'Skipped line' warning message
|
18
|
+
|
19
|
+
|
20
|
+
Release Date
|
21
|
+
------------------
|
22
|
+
2015-10-01
|
@@ -229,8 +229,7 @@ public class CsvParserPlugin
|
|
229
229
|
{
|
230
230
|
PluginTask task = taskSource.loadTask(PluginTask.class);
|
231
231
|
final TimestampParser[] timestampParsers = Timestamps.newTimestampColumnParsers(task, task.getSchemaConfig());
|
232
|
-
|
233
|
-
final CsvTokenizer tokenizer = new CsvTokenizer(lineDecoder, task);
|
232
|
+
final CsvTokenizer tokenizer = new CsvTokenizer(new LineDecoder(input, task), task);
|
234
233
|
final String nullStringOrNull = task.getNullString().orNull();
|
235
234
|
final boolean allowOptionalColumns = task.getAllowOptionalColumns();
|
236
235
|
final boolean allowExtraColumns = task.getAllowExtraColumns();
|
@@ -241,7 +240,7 @@ public class CsvParserPlugin
|
|
241
240
|
while (tokenizer.nextFile()) {
|
242
241
|
// skip the header lines for each file
|
243
242
|
for (; skipHeaderLines > 0; skipHeaderLines--) {
|
244
|
-
if (
|
243
|
+
if (!tokenizer.skipHeaderLine()) {
|
245
244
|
break;
|
246
245
|
}
|
247
246
|
}
|
@@ -356,8 +355,8 @@ public class CsvParserPlugin
|
|
356
355
|
pageBuilder.addRecord();
|
357
356
|
|
358
357
|
} catch (CsvTokenizer.InvalidFormatException | CsvTokenizer.InvalidValueException | CsvRecordValidateException e) {
|
359
|
-
long lineNumber = tokenizer.getCurrentLineNumber();
|
360
358
|
String skippedLine = tokenizer.skipCurrentLine();
|
359
|
+
long lineNumber = tokenizer.getCurrentLineNumber();
|
361
360
|
if (stopOnInvalidRecord) {
|
362
361
|
throw new DataException(String.format("Invalid record at line %d: %s", lineNumber, skippedLine), e);
|
363
362
|
}
|
@@ -56,8 +56,16 @@ public class CsvTokenizer
|
|
56
56
|
|
57
57
|
public long getCurrentLineNumber()
|
58
58
|
{
|
59
|
-
|
60
|
-
|
59
|
+
return lineNumber;
|
60
|
+
}
|
61
|
+
|
62
|
+
public boolean skipHeaderLine()
|
63
|
+
{
|
64
|
+
boolean skipped = input.poll() != null;
|
65
|
+
if (skipped) {
|
66
|
+
lineNumber++;
|
67
|
+
}
|
68
|
+
return skipped;
|
61
69
|
}
|
62
70
|
|
63
71
|
// returns skipped line
|
@@ -70,10 +78,11 @@ public class CsvTokenizer
|
|
70
78
|
// recover lines of quoted value
|
71
79
|
skippedLine = quotedValueLines.remove(0); // TODO optimize performance
|
72
80
|
unreadLines.addAll(quotedValueLines);
|
81
|
+
lineNumber -= quotedValueLines.size();
|
73
82
|
if (line != null) {
|
74
83
|
unreadLines.add(line);
|
84
|
+
lineNumber -= 1;
|
75
85
|
}
|
76
|
-
lineNumber -= quotedValueLines.size();
|
77
86
|
quotedValueLines.clear();
|
78
87
|
}
|
79
88
|
recordState = RecordState.END;
|
@@ -305,7 +314,7 @@ public class CsvTokenizer
|
|
305
314
|
// column has trailing spaces and quoted. TODO should this be rejected?
|
306
315
|
|
307
316
|
} else {
|
308
|
-
throw new InvalidValueException(String.format("Unexpected extra character
|
317
|
+
throw new InvalidValueException(String.format("Unexpected extra character '%c' after quoted value in '%s'", c, line));
|
309
318
|
}
|
310
319
|
break;
|
311
320
|
|
data/lib/embulk.rb
CHANGED
@@ -1,14 +1,4 @@
|
|
1
1
|
module Embulk
|
2
|
-
if RUBY_PLATFORM =~ /java/i
|
3
|
-
def self.java?
|
4
|
-
true
|
5
|
-
end
|
6
|
-
else
|
7
|
-
def self.java?
|
8
|
-
false
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
2
|
# logger should be setup first
|
13
3
|
require 'embulk/logger'
|
14
4
|
|
@@ -29,19 +19,15 @@ module Embulk
|
|
29
19
|
|
30
20
|
def self.require_classpath
|
31
21
|
if __FILE__.include?("!")
|
32
|
-
# single jar
|
33
|
-
jar
|
34
|
-
begin
|
35
|
-
require File.expand_path(jar)
|
36
|
-
rescue LoadError
|
37
|
-
# TODO fails if jar doesn't end with ".rb" or ".jar" but ignorable
|
38
|
-
end
|
22
|
+
# single jar. __FILE__ should point path/to/embulk.jar!/embulk.rb
|
23
|
+
# which means that embulk.jar is already loaded in this JVM.
|
39
24
|
|
40
25
|
elsif __FILE__ =~ /^classpath:/
|
41
26
|
# already in classpath
|
42
27
|
|
43
28
|
else
|
44
|
-
# gem package
|
29
|
+
# gem package. __FILE__ should point path/to/embulk/lib/embulk.rb
|
30
|
+
# that requires here to load ../classpath/*.jar to start EmbulkEmbed.
|
45
31
|
gem_root = File.expand_path('..', File.dirname(__FILE__))
|
46
32
|
classpath_dir = File.join(gem_root, "classpath")
|
47
33
|
jars = Dir.entries(classpath_dir).select{|f| f =~ /\.jar$/ }.sort
|
@@ -26,9 +26,9 @@ module Embulk
|
|
26
26
|
#
|
27
27
|
# Generate gemspec
|
28
28
|
#
|
29
|
-
author = `git config user.name`.strip
|
29
|
+
author = `git config user.name`.strip rescue ""
|
30
30
|
author = "YOUR_NAME" if author.empty?
|
31
|
-
email = `git config user.email`.strip
|
31
|
+
email = `git config user.email`.strip rescue ""
|
32
32
|
email = "YOUR_NAME" if email.empty?
|
33
33
|
|
34
34
|
# variables used in erb templates
|
@@ -130,7 +130,7 @@ module Embulk
|
|
130
130
|
elsif File.exists?('Gemfile')
|
131
131
|
bundle_path = '.'
|
132
132
|
else
|
133
|
-
system_exit "'#{
|
133
|
+
system_exit "'#{gemfile_path}' already exists. You already ran 'embulk bundle new'. Please remove it, or run \"cd #{gemfile_path}\" and \"embulk bundle\" instead"
|
134
134
|
end
|
135
135
|
|
136
136
|
run_bundler(argv)
|
@@ -262,12 +262,14 @@ examples:
|
|
262
262
|
else
|
263
263
|
require 'json'
|
264
264
|
|
265
|
-
Embulk.setup(options.delete(:system_config))
|
266
|
-
|
267
265
|
setup_plugin_paths(plugin_paths)
|
268
266
|
setup_load_paths(load_paths)
|
269
267
|
setup_classpaths(classpaths)
|
270
268
|
|
269
|
+
# call setup after setup_classpaths to allow users to overwrite
|
270
|
+
# embulk classes
|
271
|
+
Embulk.setup(options.delete(:system_config))
|
272
|
+
|
271
273
|
begin
|
272
274
|
case subcmd
|
273
275
|
when :guess
|
@@ -29,8 +29,9 @@ module Embulk
|
|
29
29
|
puts "Checking the latest version..."
|
30
30
|
target_version = check_latest_version
|
31
31
|
|
32
|
-
|
33
|
-
|
32
|
+
current_version = Gem::Version.new(Embulk::VERSION)
|
33
|
+
if Gem::Version.new(target_version) <= current_version
|
34
|
+
puts "Already up-to-date. #{current_version} is the latest version."
|
34
35
|
return
|
35
36
|
end
|
36
37
|
|
@@ -26,12 +26,12 @@ public class <%= java_class_name %>
|
|
26
26
|
public int getOption1();
|
27
27
|
|
28
28
|
// configuration option 2 (optional string, null is not allowed)
|
29
|
-
@Config("
|
29
|
+
@Config("option2")
|
30
30
|
@ConfigDefault("\"myvalue\"")
|
31
31
|
public String getOption2();
|
32
32
|
|
33
33
|
// configuration option 3 (optional string, null is allowed)
|
34
|
-
@Config("
|
34
|
+
@Config("option3")
|
35
35
|
@ConfigDefault("null")
|
36
36
|
public Optional<String> getOption3();
|
37
37
|
|
@@ -26,12 +26,12 @@ public class <%= java_class_name %>
|
|
26
26
|
public int getOption1();
|
27
27
|
|
28
28
|
// configuration option 2 (optional string, null is not allowed)
|
29
|
-
@Config("
|
29
|
+
@Config("option2")
|
30
30
|
@ConfigDefault("\"myvalue\"")
|
31
31
|
public String getOption2();
|
32
32
|
|
33
33
|
// configuration option 3 (optional string, null is allowed)
|
34
|
-
@Config("
|
34
|
+
@Config("option3")
|
35
35
|
@ConfigDefault("null")
|
36
36
|
public Optional<String> getOption3();
|
37
37
|
|
@@ -29,12 +29,12 @@ public class <%= java_class_name %>
|
|
29
29
|
public int getOption1();
|
30
30
|
|
31
31
|
// configuration option 2 (optional string, null is not allowed)
|
32
|
-
@Config("
|
32
|
+
@Config("option2")
|
33
33
|
@ConfigDefault("\"myvalue\"")
|
34
34
|
public String getOption2();
|
35
35
|
|
36
36
|
// configuration option 3 (optional string, null is allowed)
|
37
|
-
@Config("
|
37
|
+
@Config("option3")
|
38
38
|
@ConfigDefault("null")
|
39
39
|
public Optional<String> getOption3();
|
40
40
|
|
@@ -24,12 +24,12 @@ public class <%= java_class_name %>
|
|
24
24
|
public int getOption1();
|
25
25
|
|
26
26
|
// configuration option 2 (optional string, null is not allowed)
|
27
|
-
@Config("
|
27
|
+
@Config("option2")
|
28
28
|
@ConfigDefault("\"myvalue\"")
|
29
29
|
public String getOption2();
|
30
30
|
|
31
31
|
// configuration option 3 (optional string, null is allowed)
|
32
|
-
@Config("
|
32
|
+
@Config("option3")
|
33
33
|
@ConfigDefault("null")
|
34
34
|
public Optional<String> getOption3();
|
35
35
|
|
@@ -23,12 +23,12 @@ public class <%= java_class_name %>
|
|
23
23
|
public int getOption1();
|
24
24
|
|
25
25
|
// configuration option 2 (optional string, null is not allowed)
|
26
|
-
@Config("
|
26
|
+
@Config("option2")
|
27
27
|
@ConfigDefault("\"myvalue\"")
|
28
28
|
public String getOption2();
|
29
29
|
|
30
30
|
// configuration option 3 (optional string, null is allowed)
|
31
|
-
@Config("
|
31
|
+
@Config("option3")
|
32
32
|
@ConfigDefault("null")
|
33
33
|
public Optional<String> getOption3();
|
34
34
|
}
|
@@ -23,12 +23,12 @@ public class <%= java_class_name %>
|
|
23
23
|
public int getOption1();
|
24
24
|
|
25
25
|
// configuration option 2 (optional string, null is not allowed)
|
26
|
-
@Config("
|
26
|
+
@Config("option2")
|
27
27
|
@ConfigDefault("\"myvalue\"")
|
28
28
|
public String getOption2();
|
29
29
|
|
30
30
|
// configuration option 3 (optional string, null is allowed)
|
31
|
-
@Config("
|
31
|
+
@Config("option3")
|
32
32
|
@ConfigDefault("null")
|
33
33
|
public Optional<String> getOption3();
|
34
34
|
}
|
@@ -26,12 +26,12 @@ public class <%= java_class_name %>
|
|
26
26
|
public int getOption1();
|
27
27
|
|
28
28
|
// configuration option 2 (optional string, null is not allowed)
|
29
|
-
@Config("
|
29
|
+
@Config("option2")
|
30
30
|
@ConfigDefault("\"myvalue\"")
|
31
31
|
public String getOption2();
|
32
32
|
|
33
33
|
// configuration option 3 (optional string, null is allowed)
|
34
|
-
@Config("
|
34
|
+
@Config("option3")
|
35
35
|
@ConfigDefault("null")
|
36
36
|
public Optional<String> getOption3();
|
37
37
|
|
@@ -26,12 +26,12 @@ public class <%= java_class_name %>
|
|
26
26
|
public int getOption1();
|
27
27
|
|
28
28
|
// configuration option 2 (optional string, null is not allowed)
|
29
|
-
@Config("
|
29
|
+
@Config("option2")
|
30
30
|
@ConfigDefault("\"myvalue\"")
|
31
31
|
public String getOption2();
|
32
32
|
|
33
33
|
// configuration option 3 (optional string, null is allowed)
|
34
|
-
@Config("
|
34
|
+
@Config("option3")
|
35
35
|
@ConfigDefault("null")
|
36
36
|
public Optional<String> getOption3();
|
37
37
|
}
|
@@ -24,12 +24,12 @@ public class <%= java_class_name %>
|
|
24
24
|
public int getOption1();
|
25
25
|
|
26
26
|
// configuration option 2 (optional string, null is not allowed)
|
27
|
-
@Config("
|
27
|
+
@Config("option2")
|
28
28
|
@ConfigDefault("\"myvalue\"")
|
29
29
|
public String getOption2();
|
30
30
|
|
31
31
|
// configuration option 3 (optional string, null is allowed)
|
32
|
-
@Config("
|
32
|
+
@Config("option3")
|
33
33
|
@ConfigDefault("null")
|
34
34
|
public Optional<String> getOption3();
|
35
35
|
|
@@ -26,13 +26,17 @@ module Embulk
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def cp(src, dest_name)
|
29
|
-
|
30
|
-
|
29
|
+
dest = dest_path_message(dest_name)
|
30
|
+
File.open(dest, "wb") do |dst_io|
|
31
|
+
File.open(path(src), "rb") do |src_io|
|
32
|
+
FileUtils.copy_stream src_io, dst_io
|
33
|
+
end
|
34
|
+
end
|
31
35
|
end
|
32
36
|
|
33
37
|
def cp_erb(src, dest_name)
|
34
|
-
|
35
|
-
File.open(
|
38
|
+
dest = dest_path_message(dest_name)
|
39
|
+
File.open(dest, "wb") {|f| f.write erb(src) }
|
36
40
|
end
|
37
41
|
|
38
42
|
def dest_path(dest_name)
|
@@ -47,7 +51,8 @@ module Embulk
|
|
47
51
|
end
|
48
52
|
|
49
53
|
def set_executable(dest_name)
|
50
|
-
|
54
|
+
dest = dest_path(dest_name)
|
55
|
+
File.chmod(File.stat(dest).mode | 0111, dest)
|
51
56
|
end
|
52
57
|
end
|
53
58
|
|
data/lib/embulk/guess/csv.rb
CHANGED
@@ -123,7 +123,7 @@ module Embulk
|
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
|
-
header_line = (first_types != other_types && first_types.all? {|t| ["string", "boolean"].include?(t) })
|
126
|
+
header_line = (first_types != other_types && first_types.all? {|t| ["string", "boolean"].include?(t) }) || guess_string_header_line(sample_records)
|
127
127
|
|
128
128
|
if header_line
|
129
129
|
parser_guessed["skip_header_lines"] = skip_header_lines + 1
|
@@ -305,6 +305,22 @@ module Embulk
|
|
305
305
|
end
|
306
306
|
end
|
307
307
|
|
308
|
+
def guess_string_header_line(sample_records)
|
309
|
+
first = sample_records.first
|
310
|
+
first.count.times do |column_index|
|
311
|
+
lengths = sample_records.map {|row| row[column_index] }.compact.map {|v| v.to_s.size }
|
312
|
+
if lengths.size > 2
|
313
|
+
if array_variance(lengths[1..-1]) <= 0.2
|
314
|
+
avg = array_avg(lengths[1..-1])
|
315
|
+
if avg == 0.0 ? lengths[0] > 1 : (avg - lengths[0]).abs / avg > 0.7
|
316
|
+
return true
|
317
|
+
end
|
318
|
+
end
|
319
|
+
end
|
320
|
+
end
|
321
|
+
return false
|
322
|
+
end
|
323
|
+
|
308
324
|
def array_sum(array)
|
309
325
|
array.inject(0) {|r,i| r += i }
|
310
326
|
end
|
data/lib/embulk/logger.rb
CHANGED
@@ -12,7 +12,7 @@ module Embulk
|
|
12
12
|
@logger = a
|
13
13
|
elsif a.is_a?(::Logger)
|
14
14
|
@logger = StandardLoggerAdapter.new(a)
|
15
|
-
elsif
|
15
|
+
elsif RUBY_PLATFORM =~ /java/i && (org.slf4j.Logger rescue nil) && a.is_a?(org.slf4j.Logger)
|
16
16
|
@logger = Slf4jAdapter.new(a)
|
17
17
|
else
|
18
18
|
@logger = StandardLoggerAdapter.new(*args)
|
@@ -43,7 +43,7 @@ module Embulk
|
|
43
43
|
|
44
44
|
def initialize(*args)
|
45
45
|
super
|
46
|
-
if
|
46
|
+
if RUBY_PLATFORM =~ /java/i
|
47
47
|
self.formatter = lambda do |severity,datetime,progname,message|
|
48
48
|
"#{datetime.strftime("%Y-%m-%d %H:%M:%S.%3N %z")} [#{severity}] (#{java.lang.Thread.currentThread.name}): #{message}\n"
|
49
49
|
end
|
data/lib/embulk/runner.rb
CHANGED
@@ -117,7 +117,7 @@ module Embulk
|
|
117
117
|
when /\.yml$/
|
118
118
|
@embed.newConfigLoader.fromYamlString File.read(config)
|
119
119
|
else
|
120
|
-
raise ConfigError
|
120
|
+
raise ConfigError.new("Unsupported file extension. Supported file extensions are .yml and .yml.liquid: #{config}")
|
121
121
|
end
|
122
122
|
|
123
123
|
when Hash, DataSource
|
data/lib/embulk/version.rb
CHANGED
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.7.
|
4
|
+
version: 0.7.5
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: liquid
|
@@ -133,8 +133,8 @@ files:
|
|
133
133
|
- classpath/bval-jsr303-0.5.jar
|
134
134
|
- classpath/commons-beanutils-core-1.8.3.jar
|
135
135
|
- classpath/commons-lang3-3.1.jar
|
136
|
-
- classpath/embulk-core-0.7.
|
137
|
-
- classpath/embulk-standards-0.7.
|
136
|
+
- classpath/embulk-core-0.7.5.jar
|
137
|
+
- classpath/embulk-standards-0.7.5.jar
|
138
138
|
- classpath/guava-18.0.jar
|
139
139
|
- classpath/guice-4.0.jar
|
140
140
|
- classpath/guice-multibindings-4.0.jar
|
@@ -189,6 +189,7 @@ files:
|
|
189
189
|
- embulk-core/src/main/java/org/embulk/config/UserDataException.java
|
190
190
|
- embulk-core/src/main/java/org/embulk/config/UserDataExceptions.java
|
191
191
|
- embulk-core/src/main/java/org/embulk/exec/BulkLoader.java
|
192
|
+
- embulk-core/src/main/java/org/embulk/exec/ConfigurableGuessInputPlugin.java
|
192
193
|
- embulk-core/src/main/java/org/embulk/exec/ExecModule.java
|
193
194
|
- embulk-core/src/main/java/org/embulk/exec/ExecutionInterruptedException.java
|
194
195
|
- embulk-core/src/main/java/org/embulk/exec/ExecutionResult.java
|
@@ -422,6 +423,7 @@ files:
|
|
422
423
|
- embulk-docs/src/release/release-0.6.24.rst
|
423
424
|
- embulk-docs/src/release/release-0.6.25.rst
|
424
425
|
- embulk-docs/src/release/release-0.6.26.rst
|
426
|
+
- embulk-docs/src/release/release-0.6.27.rst
|
425
427
|
- embulk-docs/src/release/release-0.6.3.rst
|
426
428
|
- embulk-docs/src/release/release-0.6.4.rst
|
427
429
|
- embulk-docs/src/release/release-0.6.5.rst
|
@@ -434,6 +436,7 @@ files:
|
|
434
436
|
- embulk-docs/src/release/release-0.7.2.rst
|
435
437
|
- embulk-docs/src/release/release-0.7.3.rst
|
436
438
|
- embulk-docs/src/release/release-0.7.4.rst
|
439
|
+
- embulk-docs/src/release/release-0.7.5.rst
|
437
440
|
- embulk-standards/build.gradle
|
438
441
|
- embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java
|
439
442
|
- embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java
|