embulk 0.6.7 → 0.6.8
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 +4 -4
- data/build.gradle +1 -1
- data/embulk-core/build.gradle +3 -6
- data/embulk-core/src/main/java/org/embulk/exec/BulkLoader.java +11 -6
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +5 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +5 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/ResumableInputStream.java +128 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/RetryExecutor.java +130 -0
- data/embulk-docs/src/built-in.rst +2 -0
- data/embulk-docs/src/release.rst +1 -0
- data/embulk-docs/src/release/release-0.6.8.rst +24 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +33 -5
- data/lib/embulk/guess/csv.rb +16 -15
- 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: a9e8a1f4e6ada76c6388248ae5ac9a2cdc6876ea
|
4
|
+
data.tar.gz: b21c680b792319509aa443b4e01809af8d3dcb56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7990996b97d6ae238dd20c8f997af9cb68f2d557b94b3d27388b8ede4e675c1c0f044072310d76ce37c4e4625497510ddecc9dee594a783ac91875f398c0137b
|
7
|
+
data.tar.gz: c2421ec9edd3f3e404302699526b1e226af19755186962b3b27074e53aebbfdb45dabf9e832c0b5a285bb40aad3e5a7aac7000724d735f43cae009b53150e2c9
|
data/build.gradle
CHANGED
data/embulk-core/build.gradle
CHANGED
@@ -1,9 +1,6 @@
|
|
1
|
-
// include ruby scripts
|
2
|
-
|
3
|
-
|
4
|
-
srcDirs "${rootProject.projectDir}/lib"
|
5
|
-
}
|
6
|
-
}
|
1
|
+
// include ruby scripts to jar. don't use sourceSets.main.resources.srcDirs
|
2
|
+
// because IntelliJ causes error if srcDirs includes files out of projectDir.
|
3
|
+
processResources.from "${rootProject.projectDir}/lib"
|
7
4
|
|
8
5
|
configurations {
|
9
6
|
// com.google.inject:guice depends on asm and cglib but version of the libraries conflict
|
@@ -164,7 +164,7 @@ public class BulkLoader
|
|
164
164
|
return outputTaskStates.get(outputTaskIndex);
|
165
165
|
}
|
166
166
|
|
167
|
-
public boolean
|
167
|
+
public boolean isAllTasksCommitted()
|
168
168
|
{
|
169
169
|
if (outputTaskStates == null) {
|
170
170
|
// not initialized
|
@@ -178,6 +178,11 @@ public class BulkLoader
|
|
178
178
|
return true;
|
179
179
|
}
|
180
180
|
|
181
|
+
public boolean isAllTransactionsCommitted()
|
182
|
+
{
|
183
|
+
return inputConfigDiff != null && outputConfigDiff != null;
|
184
|
+
}
|
185
|
+
|
181
186
|
public boolean isAnyStarted()
|
182
187
|
{
|
183
188
|
if (inputTaskStates == null) {
|
@@ -489,7 +494,7 @@ public class BulkLoader
|
|
489
494
|
|
490
495
|
state.initialize(inputTaskCount, outputTaskCount);
|
491
496
|
|
492
|
-
if (!state.
|
497
|
+
if (!state.isAllTasksCommitted()) { // inputTaskCount == 0
|
493
498
|
execute(task, executor, state);
|
494
499
|
}
|
495
500
|
|
@@ -511,7 +516,7 @@ public class BulkLoader
|
|
511
516
|
return state.buildExecuteResult();
|
512
517
|
|
513
518
|
} catch (Throwable ex) {
|
514
|
-
if (state.
|
519
|
+
if (state.isAllTasksCommitted() && state.isAllTransactionsCommitted()) {
|
515
520
|
// ignore the exception
|
516
521
|
return state.buildExecuteResultWithWarningException(ex);
|
517
522
|
}
|
@@ -554,7 +559,7 @@ public class BulkLoader
|
|
554
559
|
state.setOutputTaskSource(outputTask);
|
555
560
|
|
556
561
|
restoreResumedCommitReports(resume, state);
|
557
|
-
if (!state.
|
562
|
+
if (!state.isAllTasksCommitted()) {
|
558
563
|
execute(task, executor, state);
|
559
564
|
}
|
560
565
|
|
@@ -576,7 +581,7 @@ public class BulkLoader
|
|
576
581
|
return state.buildExecuteResult();
|
577
582
|
|
578
583
|
} catch (Throwable ex) {
|
579
|
-
if (state.
|
584
|
+
if (state.isAllTasksCommitted() && state.isAllTransactionsCommitted()) {
|
580
585
|
// ignore the exception
|
581
586
|
return state.buildExecuteResultWithWarningException(ex);
|
582
587
|
}
|
@@ -621,7 +626,7 @@ public class BulkLoader
|
|
621
626
|
|
622
627
|
executor.execute(procTask, state);
|
623
628
|
|
624
|
-
if (!state.
|
629
|
+
if (!state.isAllTasksCommitted()) {
|
625
630
|
throw state.getRepresentativeException();
|
626
631
|
}
|
627
632
|
}
|
@@ -39,6 +39,11 @@ public class TimestampFormatter
|
|
39
39
|
this.dateFormat = new RubyDateFormat(format, Locale.ENGLISH, true);
|
40
40
|
}
|
41
41
|
|
42
|
+
public DateTimeZone getTimeZone()
|
43
|
+
{
|
44
|
+
return timeZone;
|
45
|
+
}
|
46
|
+
|
42
47
|
public void format(Timestamp value, LineEncoder encoder)
|
43
48
|
{
|
44
49
|
// TODO optimize by directly appending to internal buffer
|
@@ -30,6 +30,11 @@ public class TimestampParser
|
|
30
30
|
this(task.getJRuby(), format, task.getDefaultTimeZone());
|
31
31
|
}
|
32
32
|
|
33
|
+
public DateTimeZone getDefaultTimeZone()
|
34
|
+
{
|
35
|
+
return defaultTimeZone;
|
36
|
+
}
|
37
|
+
|
33
38
|
// TODO this is still private because this might need current time
|
34
39
|
private TimestampParser(ScriptingContainer jruby, String format, DateTimeZone defaultTimeZone)
|
35
40
|
{
|
@@ -0,0 +1,128 @@
|
|
1
|
+
package org.embulk.spi.util;
|
2
|
+
|
3
|
+
import java.io.InputStream;
|
4
|
+
import java.io.IOException;
|
5
|
+
|
6
|
+
public class ResumableInputStream
|
7
|
+
extends InputStream
|
8
|
+
{
|
9
|
+
public interface Reopener
|
10
|
+
{
|
11
|
+
public InputStream reopen(long offset, Exception closedCause) throws IOException;
|
12
|
+
}
|
13
|
+
|
14
|
+
private final Reopener reopener;
|
15
|
+
protected InputStream in;
|
16
|
+
private long offset;
|
17
|
+
private long markedOffset;
|
18
|
+
|
19
|
+
public ResumableInputStream(InputStream initialInputStream, Reopener reopener)
|
20
|
+
{
|
21
|
+
this.reopener = reopener;
|
22
|
+
this.in = initialInputStream;
|
23
|
+
this.offset = 0L;
|
24
|
+
this.markedOffset = 0L;
|
25
|
+
}
|
26
|
+
|
27
|
+
public ResumableInputStream(Reopener reopener) throws IOException
|
28
|
+
{
|
29
|
+
this(reopener.reopen(0, null), reopener);
|
30
|
+
}
|
31
|
+
|
32
|
+
private void reopen(Exception closedCause) throws IOException
|
33
|
+
{
|
34
|
+
if (in != null) {
|
35
|
+
in.close();
|
36
|
+
in = null;
|
37
|
+
}
|
38
|
+
in = reopener.reopen(offset, closedCause);
|
39
|
+
}
|
40
|
+
|
41
|
+
@Override
|
42
|
+
public int read() throws IOException
|
43
|
+
{
|
44
|
+
while (true) {
|
45
|
+
try {
|
46
|
+
int v = in.read();
|
47
|
+
offset += 1;
|
48
|
+
return v;
|
49
|
+
} catch (IOException | RuntimeException ex) {
|
50
|
+
reopen(ex);
|
51
|
+
}
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
@Override
|
56
|
+
public int read(byte[] b) throws IOException
|
57
|
+
{
|
58
|
+
while (true) {
|
59
|
+
try {
|
60
|
+
int r = in.read(b);
|
61
|
+
offset += r;
|
62
|
+
return r;
|
63
|
+
} catch (IOException | RuntimeException ex) {
|
64
|
+
reopen(ex);
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
@Override
|
70
|
+
public int read(byte[] b, int off, int len) throws IOException
|
71
|
+
{
|
72
|
+
while (true) {
|
73
|
+
try {
|
74
|
+
int r = in.read(b, off, len);
|
75
|
+
offset += r;
|
76
|
+
return r;
|
77
|
+
} catch (IOException | RuntimeException ex) {
|
78
|
+
reopen(ex);
|
79
|
+
}
|
80
|
+
}
|
81
|
+
}
|
82
|
+
|
83
|
+
@Override
|
84
|
+
public long skip(long n) throws IOException
|
85
|
+
{
|
86
|
+
while (true) {
|
87
|
+
try {
|
88
|
+
long r = in.skip(n);
|
89
|
+
offset += r;
|
90
|
+
return r;
|
91
|
+
} catch (IOException | RuntimeException ex) {
|
92
|
+
reopen(ex);
|
93
|
+
}
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
97
|
+
@Override
|
98
|
+
public int available() throws IOException
|
99
|
+
{
|
100
|
+
return in.available();
|
101
|
+
}
|
102
|
+
|
103
|
+
@Override
|
104
|
+
public void close() throws IOException
|
105
|
+
{
|
106
|
+
in.close();
|
107
|
+
}
|
108
|
+
|
109
|
+
@Override
|
110
|
+
public void mark(int readlimit)
|
111
|
+
{
|
112
|
+
in.mark(readlimit);
|
113
|
+
markedOffset = offset;
|
114
|
+
}
|
115
|
+
|
116
|
+
@Override
|
117
|
+
public void reset() throws IOException
|
118
|
+
{
|
119
|
+
in.reset();
|
120
|
+
offset = markedOffset;
|
121
|
+
}
|
122
|
+
|
123
|
+
@Override
|
124
|
+
public boolean markSupported()
|
125
|
+
{
|
126
|
+
return in.markSupported();
|
127
|
+
}
|
128
|
+
}
|
@@ -0,0 +1,130 @@
|
|
1
|
+
package org.embulk.spi.util;
|
2
|
+
|
3
|
+
import java.util.concurrent.Callable;
|
4
|
+
import java.util.concurrent.ExecutionException;
|
5
|
+
|
6
|
+
public class RetryExecutor
|
7
|
+
{
|
8
|
+
public static RetryExecutor retryExecutor()
|
9
|
+
{
|
10
|
+
// TODO default configuration
|
11
|
+
return new RetryExecutor(3, 500, 30*60*1000);
|
12
|
+
}
|
13
|
+
|
14
|
+
public static class RetryGiveupException
|
15
|
+
extends ExecutionException
|
16
|
+
{
|
17
|
+
public RetryGiveupException(String message, Exception cause)
|
18
|
+
{
|
19
|
+
super(cause);
|
20
|
+
}
|
21
|
+
|
22
|
+
public RetryGiveupException(Exception cause)
|
23
|
+
{
|
24
|
+
super(cause);
|
25
|
+
}
|
26
|
+
|
27
|
+
public Exception getCause()
|
28
|
+
{
|
29
|
+
return (Exception) super.getCause();
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
public static interface Retryable<T>
|
34
|
+
extends Callable<T>
|
35
|
+
{
|
36
|
+
public T call()
|
37
|
+
throws Exception;
|
38
|
+
|
39
|
+
public boolean isRetryableException(Exception exception);
|
40
|
+
|
41
|
+
public void onRetry(Exception exception, int retryCount, int retryLimit, int retryWait)
|
42
|
+
throws RetryGiveupException;
|
43
|
+
|
44
|
+
public void onGiveup(Exception firstException, Exception lastException)
|
45
|
+
throws RetryGiveupException;
|
46
|
+
}
|
47
|
+
|
48
|
+
private final int retryLimit;
|
49
|
+
private final int initialRetryWait;
|
50
|
+
private final int maxRetryWait;
|
51
|
+
|
52
|
+
private RetryExecutor(int retryLimit, int initialRetryWait, int maxRetryWait)
|
53
|
+
{
|
54
|
+
this.retryLimit = retryLimit;
|
55
|
+
this.initialRetryWait = initialRetryWait;
|
56
|
+
this.maxRetryWait = maxRetryWait;
|
57
|
+
}
|
58
|
+
|
59
|
+
public RetryExecutor withRetryLimit(int count)
|
60
|
+
{
|
61
|
+
return new RetryExecutor(count, initialRetryWait, maxRetryWait);
|
62
|
+
}
|
63
|
+
|
64
|
+
public RetryExecutor withInitialRetryWait(int msec)
|
65
|
+
{
|
66
|
+
return new RetryExecutor(retryLimit, msec, maxRetryWait);
|
67
|
+
}
|
68
|
+
|
69
|
+
public RetryExecutor withMaxRetryWait(int msec)
|
70
|
+
{
|
71
|
+
return new RetryExecutor(retryLimit, initialRetryWait, msec);
|
72
|
+
}
|
73
|
+
|
74
|
+
public <T> T runInterruptible(Retryable<T> op)
|
75
|
+
throws InterruptedException, RetryGiveupException
|
76
|
+
{
|
77
|
+
return run(op, true);
|
78
|
+
}
|
79
|
+
|
80
|
+
public <T> T run(Retryable<T> op)
|
81
|
+
throws RetryGiveupException
|
82
|
+
{
|
83
|
+
try {
|
84
|
+
return run(op, false);
|
85
|
+
} catch (InterruptedException ex) {
|
86
|
+
throw new RetryGiveupException("Unexpected interruption", ex);
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
private <T> T run(Retryable<T> op, boolean interruptible)
|
91
|
+
throws InterruptedException, RetryGiveupException
|
92
|
+
{
|
93
|
+
int retryWait = initialRetryWait;
|
94
|
+
int retryCount = 0;
|
95
|
+
|
96
|
+
Exception firstException = null;
|
97
|
+
|
98
|
+
while(true) {
|
99
|
+
try {
|
100
|
+
return op.call();
|
101
|
+
} catch (Exception exception) {
|
102
|
+
if (firstException == null) {
|
103
|
+
firstException = exception;
|
104
|
+
}
|
105
|
+
if (!op.isRetryableException(exception) || retryCount >= retryLimit) {
|
106
|
+
op.onGiveup(firstException, exception);
|
107
|
+
throw new RetryGiveupException(firstException);
|
108
|
+
}
|
109
|
+
|
110
|
+
retryCount++;
|
111
|
+
op.onRetry(exception, retryCount, retryLimit, retryWait);
|
112
|
+
|
113
|
+
try {
|
114
|
+
Thread.sleep(retryWait);
|
115
|
+
} catch (InterruptedException ex) {
|
116
|
+
if (interruptible) {
|
117
|
+
throw ex;
|
118
|
+
}
|
119
|
+
}
|
120
|
+
|
121
|
+
// exponential back-off with hard limit
|
122
|
+
retryWait *= 2;
|
123
|
+
if (retryWait > maxRetryWait) {
|
124
|
+
retryWait = maxRetryWait;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
}
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
@@ -145,6 +145,8 @@ Options
|
|
145
145
|
+----------------------------+----------+----------------------------------------------------------------------------------------------------------------+------------------------+
|
146
146
|
| allow\_optional\_columns | boolean | If true, set null to insufficient columns. Otherwise, skip the row in case of insufficient number of columns | ``false`` by default |
|
147
147
|
+----------------------------+----------+----------------------------------------------------------------------------------------------------------------+------------------------+
|
148
|
+
| allow\_extra\_columns | boolean | If true, ignore too many columns. Otherwise, skip the row in case of too many columns | ``false`` by default |
|
149
|
+
+----------------------------+----------+----------------------------------------------------------------------------------------------------------------+------------------------+
|
148
150
|
| max\_quoted\_size\_limit | integer | Maximum number of bytes of a quoted value. If a value exceeds the limit, the row will be skipped | ``131072`` by default |
|
149
151
|
+----------------------------+----------+----------------------------------------------------------------------------------------------------------------+------------------------+
|
150
152
|
| default\_timezone | string | Time zone of timestamp columns if the value itself doesn't include time zone description (eg. Asia/Tokyo) | ``UTC`` by default |
|
data/embulk-docs/src/release.rst
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
Release 0.6.8
|
2
|
+
==================================
|
3
|
+
|
4
|
+
Plugin API
|
5
|
+
------------------
|
6
|
+
|
7
|
+
* Added utility class ``spi.util.ResumableInputStream``
|
8
|
+
* Added utility class ``spi.util.RetryExecutor``
|
9
|
+
|
10
|
+
Built-in plugins
|
11
|
+
------------------
|
12
|
+
|
13
|
+
* ``parser-csv`` rejects rows if one includes too many columns by default. Setting ``allow extra_columns`` option to ``true`` will make the behavior same with before.
|
14
|
+
* ``guess-csv`` guesses ``columns`` option every time.
|
15
|
+
|
16
|
+
General Changes
|
17
|
+
------------------
|
18
|
+
|
19
|
+
* Fixed a problem that IntelliJ IDEA causes problem when it imports embulk source code.
|
20
|
+
* Fixed a problem that transaction silently succeeds when an exception happens after all taks succeeded.
|
21
|
+
|
22
|
+
Release Date
|
23
|
+
------------------
|
24
|
+
2015-05-12
|
@@ -78,6 +78,10 @@ public class CsvParserPlugin
|
|
78
78
|
@Config("allow_optional_columns")
|
79
79
|
@ConfigDefault("false")
|
80
80
|
public boolean getAllowOptionalColumns();
|
81
|
+
|
82
|
+
@Config("allow_extra_columns")
|
83
|
+
@ConfigDefault("false")
|
84
|
+
public boolean getAllowExtraColumns();
|
81
85
|
}
|
82
86
|
|
83
87
|
private final Logger log;
|
@@ -130,6 +134,7 @@ public class CsvParserPlugin
|
|
130
134
|
final CsvTokenizer tokenizer = new CsvTokenizer(lineDecoder, task);
|
131
135
|
final String nullStringOrNull = task.getNullString().orNull();
|
132
136
|
final boolean allowOptionalColumns = task.getAllowOptionalColumns();
|
137
|
+
final boolean allowExtraColumns = task.getAllowExtraColumns();
|
133
138
|
int skipHeaderLines = task.getSkipHeaderLines();
|
134
139
|
|
135
140
|
try (final PageBuilder pageBuilder = new PageBuilder(Exec.getBufferAllocator(), schema, output)) {
|
@@ -141,12 +146,15 @@ public class CsvParserPlugin
|
|
141
146
|
}
|
142
147
|
}
|
143
148
|
|
149
|
+
if (!tokenizer.nextRecord()) {
|
150
|
+
// empty file
|
151
|
+
continue;
|
152
|
+
}
|
153
|
+
|
144
154
|
while (true) {
|
145
|
-
|
146
|
-
if (!tokenizer.nextRecord()) {
|
147
|
-
break;
|
148
|
-
}
|
155
|
+
boolean hasNextRecord;
|
149
156
|
|
157
|
+
try {
|
150
158
|
schema.visitColumns(new ColumnVisitor() {
|
151
159
|
public void booleanColumn(Column column)
|
152
160
|
{
|
@@ -216,6 +224,7 @@ public class CsvParserPlugin
|
|
216
224
|
private String nextColumn()
|
217
225
|
{
|
218
226
|
if (allowOptionalColumns && !tokenizer.hasNextColumn()) {
|
227
|
+
//TODO warning
|
219
228
|
return null;
|
220
229
|
}
|
221
230
|
String v = tokenizer.nextColumn();
|
@@ -231,13 +240,32 @@ public class CsvParserPlugin
|
|
231
240
|
}
|
232
241
|
}
|
233
242
|
});
|
243
|
+
|
244
|
+
try {
|
245
|
+
hasNextRecord = tokenizer.nextRecord();
|
246
|
+
} catch (CsvTokenizer.TooManyColumnsException ex) {
|
247
|
+
if (allowExtraColumns) {
|
248
|
+
String tooManyColumnsLine = tokenizer.skipCurrentLine();
|
249
|
+
// TODO warning
|
250
|
+
hasNextRecord = tokenizer.nextRecord();
|
251
|
+
} else {
|
252
|
+
// this line will be skipped at the following catch section
|
253
|
+
throw ex;
|
254
|
+
}
|
255
|
+
}
|
234
256
|
pageBuilder.addRecord();
|
235
257
|
|
236
258
|
} catch (CsvTokenizer.InvalidFormatException | CsvRecordValidateException e) {
|
237
259
|
long lineNumber = tokenizer.getCurrentLineNumber();
|
238
260
|
String skippedLine = tokenizer.skipCurrentLine();
|
239
|
-
log.warn(String.format("Skipped
|
261
|
+
log.warn(String.format("Skipped line %d (%s): %s", lineNumber, e.getMessage(), skippedLine));
|
240
262
|
//exec.notice().skippedLine(skippedLine);
|
263
|
+
|
264
|
+
hasNextRecord = tokenizer.nextRecord();
|
265
|
+
}
|
266
|
+
|
267
|
+
if (!hasNextRecord) {
|
268
|
+
break;
|
241
269
|
}
|
242
270
|
}
|
243
271
|
}
|
data/lib/embulk/guess/csv.rb
CHANGED
@@ -75,24 +75,25 @@ module Embulk
|
|
75
75
|
parser_guessed["skip_header_lines"] = skip_header_lines
|
76
76
|
end
|
77
77
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
78
|
+
parser_guessed["allow_extra_columns"] = false
|
79
|
+
parser_guessed["allow_optional_columns"] = false
|
80
|
+
|
81
|
+
if header_line
|
82
|
+
column_names = sample_records.first
|
83
|
+
else
|
84
|
+
column_names = (0..other_types.size).to_a.map {|i| "c#{i}" }
|
85
|
+
end
|
86
|
+
schema = []
|
87
|
+
column_names.zip(other_types).each do |name,type|
|
88
|
+
if name && type
|
89
|
+
if type.is_a?(SchemaGuess::TimestampTypeMatch)
|
90
|
+
schema << {"name" => name, "type" => type, "format" => type.format}
|
91
|
+
else
|
92
|
+
schema << {"name" => name, "type" => type}
|
92
93
|
end
|
93
94
|
end
|
94
|
-
parser_guessed["columns"] = schema
|
95
95
|
end
|
96
|
+
parser_guessed["columns"] = schema
|
96
97
|
|
97
98
|
return {"parser" => parser_guessed}
|
98
99
|
end
|
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.6.
|
4
|
+
version: 0.6.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -228,6 +228,8 @@ files:
|
|
228
228
|
- embulk-core/src/main/java/org/embulk/spi/util/OutputStreamFileOutput.java
|
229
229
|
- embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java
|
230
230
|
- embulk-core/src/main/java/org/embulk/spi/util/Pages.java
|
231
|
+
- embulk-core/src/main/java/org/embulk/spi/util/ResumableInputStream.java
|
232
|
+
- embulk-core/src/main/java/org/embulk/spi/util/RetryExecutor.java
|
231
233
|
- embulk-core/src/test/java/org/embulk/EmbulkTestRuntime.java
|
232
234
|
- embulk-core/src/test/java/org/embulk/GuiceBinder.java
|
233
235
|
- embulk-core/src/test/java/org/embulk/RandomManager.java
|
@@ -297,6 +299,7 @@ files:
|
|
297
299
|
- embulk-docs/src/release/release-0.6.5.rst
|
298
300
|
- embulk-docs/src/release/release-0.6.6.rst
|
299
301
|
- embulk-docs/src/release/release-0.6.7.rst
|
302
|
+
- embulk-docs/src/release/release-0.6.8.rst
|
300
303
|
- embulk-standards/build.gradle
|
301
304
|
- embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java
|
302
305
|
- embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java
|
@@ -403,8 +406,8 @@ files:
|
|
403
406
|
- classpath/bval-jsr303-0.5.jar
|
404
407
|
- classpath/commons-beanutils-core-1.8.3.jar
|
405
408
|
- classpath/commons-lang3-3.1.jar
|
406
|
-
- classpath/embulk-core-0.6.
|
407
|
-
- classpath/embulk-standards-0.6.
|
409
|
+
- classpath/embulk-core-0.6.8.jar
|
410
|
+
- classpath/embulk-standards-0.6.8.jar
|
408
411
|
- classpath/guava-18.0.jar
|
409
412
|
- classpath/guice-4.0.jar
|
410
413
|
- classpath/guice-multibindings-4.0.jar
|