embulk 0.6.20 → 0.6.21

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: c20e3bb56bb0cfa868416afdc65bf0bc199600e1
4
- data.tar.gz: 3821ab6ab119ac969f13b275a6d14f9b6dbc68c1
3
+ metadata.gz: 90d6280d5bdcffb92922bfd929eae4bcc6d83b92
4
+ data.tar.gz: 0e2c0d5e8a9f990cdfbb7006be196f9bfef19030
5
5
  SHA512:
6
- metadata.gz: 98746e5f4bdd45986aadafcd3a7534cb2ae075c4eb69a7ec69634a52b34ed033da4599ab71ef1ca260d35b20e4133bd5c88769b024d2fef34f37b3d10cc416fe
7
- data.tar.gz: 989a5fb745b0893d1c79dd799065fc35d866986e71a3998686c40bd2eeb97b44f3592900f40e04c835c4165c6615d249b7b6f3ba1e0379f187190f6d28055eb9
6
+ metadata.gz: e2ccbee9c830dd29e86734c1615354083fca35068476a30d0a06944926c3eb63b0386ab5db39d0ad7ed660a2c395da84e68d8433ee222274102dc01b30312de6
7
+ data.tar.gz: 27174e4750c66516ead7b0ff90df6dc804e8d45694354cd03602654680b30dd0464fef0221aa18a9c28e6495ad6709e44e0c4469b12e55f3ca81d8b1bdb06fdc
@@ -11,7 +11,7 @@ def release_projects = [project(":embulk-core"), project(":embulk-standards")]
11
11
 
12
12
  allprojects {
13
13
  group = 'org.embulk'
14
- version = '0.6.20'
14
+ version = '0.6.21'
15
15
 
16
16
  ext {
17
17
  jrubyVersion = '1.7.19'
@@ -13,6 +13,8 @@ public interface DataSource
13
13
 
14
14
  public boolean isEmpty();
15
15
 
16
+ public boolean has(String attrName);
17
+
16
18
  public <E> E get(Class<E> type, String attrName);
17
19
 
18
20
  public <E> E get(Class<E> type, String attrName, E defaultValue);
@@ -65,6 +65,12 @@ public class DataSourceImpl
65
65
  return !data.fieldNames().hasNext();
66
66
  }
67
67
 
68
+ @Override
69
+ public boolean has(String attrName)
70
+ {
71
+ return data.has(attrName);
72
+ }
73
+
68
74
  @Override
69
75
  public <E> E get(Class<E> type, String attrName)
70
76
  {
@@ -23,7 +23,7 @@ Embulk uses a YAML file to define a bulk data loading. Here is an example of the
23
23
  type: csv
24
24
  delimiter: ','
25
25
  quote: '"'
26
- escape: ''
26
+ escape: '"'
27
27
  null_string: 'NULL'
28
28
  skip_header_lines: 1
29
29
  columns:
@@ -133,9 +133,9 @@ Options
133
133
  +============================+==========+================================================================================================================+========================+
134
134
  | delimiter | string | Delimiter character such as ``,`` for CSV, ``"\t"`` for TSV, ``"|"`` or any single-byte character | ``,`` by default |
135
135
  +----------------------------+----------+----------------------------------------------------------------------------------------------------------------+------------------------+
136
- | quote | string | The character surrounding a quoted value | ``\"`` by default |
136
+ | quote | string | The character surrounding a quoted value. Setting ``null`` disables quoting. | ``\"`` by default |
137
137
  +----------------------------+----------+----------------------------------------------------------------------------------------------------------------+------------------------+
138
- | escape | string | Escape character to escape a special character | ``\\`` by default |
138
+ | escape | string | Escape character to escape a special character. Setting ``null`` disables escaping. | ``\\`` by default |
139
139
  +----------------------------+----------+----------------------------------------------------------------------------------------------------------------+------------------------+
140
140
  | skip\_header\_lines | integer | Skip this number of lines first. Set 1 if the file has header line. | ``0`` by default |
141
141
  +----------------------------+----------+----------------------------------------------------------------------------------------------------------------+------------------------+
@@ -203,7 +203,7 @@ Example
203
203
  newline: CRLF
204
204
  delimiter: "\t"
205
205
  quote: '"'
206
- escape: ''
206
+ escape: '"'
207
207
  null_string: 'NULL'
208
208
  skip_header_lines: 1
209
209
  comment_line_marker: '#'
@@ -383,3 +383,29 @@ Example
383
383
  - type: gzip
384
384
  level: 1
385
385
 
386
+ Rename filter plugin
387
+ ------------------
388
+
389
+ The ``rename`` filter plugin changes column names. This plugin has no impact on performance.
390
+
391
+ Options
392
+ ~~~~~~~~~~~~~~~~~~
393
+
394
+ +---------+----------+----------------------------------------------------------------------+--------------------+
395
+ | name | type | description | required? |
396
+ +=========+==========+======================================================================+====================+
397
+ | columns | hash | A map whose keys are existing column names. values are new names. | ``{}`` by default |
398
+ +---------+----------+----------------------------------------------------------------------+--------------------+
399
+
400
+ Example
401
+ ~~~~~~~~~~~~~~~~~~
402
+
403
+ .. code-block:: yaml
404
+
405
+ filters:
406
+ ...
407
+ - type: rename
408
+ columns:
409
+ my_existing_column1: new_column1
410
+ my_existing_column2: new_column2
411
+
@@ -4,6 +4,7 @@ Release Notes
4
4
  .. toctree::
5
5
  :maxdepth: 1
6
6
 
7
+ release/release-0.6.21
7
8
  release/release-0.6.20
8
9
  release/release-0.6.19
9
10
  release/release-0.6.18
@@ -11,7 +11,7 @@ General Changes
11
11
  ------------------
12
12
 
13
13
  * Change default size of page buffer from 8KB to 32KB.
14
- * Size of a page buffer is configurable by system config (@sonots++).
14
+ * Size of a page buffer is configurable by system config (@sonots++). On command line, ``embulk`` command accepts ``-X page_size=N[unit]`` argument (e.g. ``-X page_size=512KB``).
15
15
 
16
16
 
17
17
  Release Date
@@ -0,0 +1,20 @@
1
+ Release 0.6.21
2
+ ==================================
3
+
4
+ Built-in plugins
5
+ ------------------
6
+
7
+ * Added ``filter-rename`` plugin. We can rename name of columns. This plugin has no impact on performance.
8
+ * ``parser-csv`` plugin accepts ``null`` to ``quote`` and ``escape`` options to disable quoting or escaping. This is useful if a file includes ``"`` in a non-quoted value.
9
+ * ``parser-csv`` shows warning if empty string is set to ``quote`` or ``escape`` options. Behavior is kept backward-compatible but it will be rejected in the future.
10
+
11
+
12
+ Java Plugin API
13
+ ------------------
14
+
15
+ * Added ``config.DataSource.has`` method to check whether it contains a key or not.
16
+
17
+
18
+ Release Date
19
+ ------------------
20
+ 2015-08-05
@@ -2,6 +2,9 @@ package org.embulk.standards;
2
2
 
3
3
  import com.google.common.base.Optional;
4
4
  import com.google.common.collect.ImmutableSet;
5
+ import com.fasterxml.jackson.annotation.JsonCreator;
6
+ import com.fasterxml.jackson.annotation.JsonIgnore;
7
+ import com.fasterxml.jackson.annotation.JsonValue;
5
8
  import org.embulk.config.Task;
6
9
  import org.embulk.config.Config;
7
10
  import org.embulk.config.ConfigDefault;
@@ -57,11 +60,11 @@ public class CsvParserPlugin
57
60
 
58
61
  @Config("quote")
59
62
  @ConfigDefault("\"\\\"\"")
60
- public char getQuoteChar();
63
+ public Optional<QuoteCharacter> getQuoteChar();
61
64
 
62
65
  @Config("escape")
63
66
  @ConfigDefault("\"\\\\\"")
64
- public char getEscapeChar();
67
+ public Optional<EscapeCharacter> getEscapeChar();
65
68
 
66
69
  // Null value handling: if the CsvParser found 'non-quoted empty string's,
67
70
  // it replaces them to string that users specified like "\N", "NULL".
@@ -90,6 +93,106 @@ public class CsvParserPlugin
90
93
  public boolean getAllowExtraColumns();
91
94
  }
92
95
 
96
+ public static class QuoteCharacter
97
+ {
98
+ private final char character;
99
+
100
+ public QuoteCharacter(char character)
101
+ {
102
+ this.character = character;
103
+ }
104
+
105
+ public static QuoteCharacter noQuote()
106
+ {
107
+ return new QuoteCharacter(CsvTokenizer.NO_QUOTE);
108
+ }
109
+
110
+ @JsonCreator
111
+ public static QuoteCharacter ofString(String str)
112
+ {
113
+ if (str.length() >= 2) {
114
+ throw new ConfigException("\"quote\" option accepts only 1 character.");
115
+ } else if (str.isEmpty()) {
116
+ Exec.getLogger(CsvParserPlugin.class).warn("Setting '' (empty string) to \"quote\" option is obsoleted. Currently it becomes '\"' automatically but this behavior will be removed. Please set '\"' explicitly.");
117
+ return new QuoteCharacter('"');
118
+ } else {
119
+ return new QuoteCharacter(str.charAt(0));
120
+ }
121
+ }
122
+
123
+ @JsonIgnore
124
+ public char getCharacter()
125
+ {
126
+ return character;
127
+ }
128
+
129
+ @JsonValue
130
+ public String getOptionalString()
131
+ {
132
+ return new String(new char[] { character });
133
+ }
134
+
135
+ @Override
136
+ public boolean equals(Object obj)
137
+ {
138
+ if (!(obj instanceof QuoteCharacter)) {
139
+ return false;
140
+ }
141
+ QuoteCharacter o = (QuoteCharacter) obj;
142
+ return character == o.character;
143
+ }
144
+ }
145
+
146
+ public static class EscapeCharacter
147
+ {
148
+ private final char character;
149
+
150
+ public EscapeCharacter(char character)
151
+ {
152
+ this.character = character;
153
+ }
154
+
155
+ public static EscapeCharacter noEscape()
156
+ {
157
+ return new EscapeCharacter(CsvTokenizer.NO_ESCAPE);
158
+ }
159
+
160
+ @JsonCreator
161
+ public static EscapeCharacter ofString(String str)
162
+ {
163
+ if (str.length() >= 2) {
164
+ throw new ConfigException("\"escape\" option accepts only 1 character.");
165
+ } else if (str.isEmpty()) {
166
+ Exec.getLogger(CsvParserPlugin.class).warn("Setting '' (empty string) to \"escape\" option is obsoleted. Currently it becomes null automatically but this behavior will be removed. Please set \"escape: null\" explicitly.");
167
+ return noEscape();
168
+ } else {
169
+ return new EscapeCharacter(str.charAt(0));
170
+ }
171
+ }
172
+
173
+ @JsonIgnore
174
+ public char getCharacter()
175
+ {
176
+ return character;
177
+ }
178
+
179
+ @JsonValue
180
+ public String getOptionalString()
181
+ {
182
+ return new String(new char[] { character });
183
+ }
184
+
185
+ @Override
186
+ public boolean equals(Object obj)
187
+ {
188
+ if (!(obj instanceof EscapeCharacter)) {
189
+ return false;
190
+ }
191
+ EscapeCharacter o = (EscapeCharacter) obj;
192
+ return character == o.character;
193
+ }
194
+ }
195
+
93
196
  private final Logger log;
94
197
 
95
198
  public CsvParserPlugin()
@@ -5,7 +5,9 @@ import java.util.List;
5
5
  import java.util.ArrayList;
6
6
  import java.util.Deque;
7
7
  import java.util.ArrayDeque;
8
+ import org.embulk.config.ConfigException;
8
9
  import org.embulk.spi.util.LineDecoder;
10
+ import org.embulk.spi.Exec;
9
11
 
10
12
  public class CsvTokenizer
11
13
  {
@@ -20,6 +22,8 @@ public class CsvTokenizer
20
22
  }
21
23
 
22
24
  private static final char END_OF_LINE = '\0';
25
+ static final char NO_QUOTE = '\0';
26
+ static final char NO_ESCAPE = '\0';
23
27
 
24
28
  private final char delimiter;
25
29
  private final char quote;
@@ -42,8 +46,8 @@ public class CsvTokenizer
42
46
  public CsvTokenizer(LineDecoder input, CsvParserPlugin.PluginTask task)
43
47
  {
44
48
  delimiter = task.getDelimiterChar();
45
- quote = task.getQuoteChar() != '\0' ? task.getQuoteChar() : '"';
46
- escape = task.getEscapeChar();
49
+ quote = task.getQuoteChar().or(CsvParserPlugin.QuoteCharacter.noQuote()).getCharacter();
50
+ escape = task.getEscapeChar().or(CsvParserPlugin.EscapeCharacter.noEscape()).getCharacter();
47
51
  newline = task.getNewline().getString();
48
52
  trimIfNotQuoted = task.getTrimIfNotQuoted();
49
53
  maxQuotedSizeLimit = task.getMaxQuotedSizeLimit();
@@ -354,12 +358,12 @@ public class CsvTokenizer
354
358
 
355
359
  private boolean isQuote(char c)
356
360
  {
357
- return c == quote;
361
+ return quote != NO_QUOTE && c == quote;
358
362
  }
359
363
 
360
364
  private boolean isEscape(char c)
361
365
  {
362
- return c == escape;
366
+ return escape != NO_ESCAPE && c == escape;
363
367
  }
364
368
 
365
369
  public static class InvalidFormatException
@@ -0,0 +1,56 @@
1
+ package org.embulk.standards;
2
+
3
+ import org.embulk.config.Config;
4
+ import org.embulk.config.ConfigDefault;
5
+ import org.embulk.config.ConfigSource;
6
+ import org.embulk.config.Task;
7
+ import org.embulk.config.TaskSource;
8
+ import org.embulk.spi.Column;
9
+ import org.embulk.spi.FilterPlugin;
10
+ import org.embulk.spi.PageOutput;
11
+ import org.embulk.spi.Schema;
12
+
13
+ import java.util.Map;
14
+
15
+ public class RenameFilterPlugin
16
+ implements FilterPlugin
17
+ {
18
+ public interface PluginTask
19
+ extends Task
20
+ {
21
+ @Config("columns")
22
+ @ConfigDefault("{}")
23
+ Map<String, String> getRenameMap();
24
+ }
25
+
26
+ @Override
27
+ public void transaction(ConfigSource config, Schema inputSchema,
28
+ FilterPlugin.Control control)
29
+ {
30
+ PluginTask task = config.loadConfig(PluginTask.class);
31
+ Map<String, String> renameMap = task.getRenameMap();
32
+
33
+ // check column_options is valid or not
34
+ for (String columnName : renameMap.keySet()) {
35
+ inputSchema.lookupColumn(columnName); // throws SchemaConfigException
36
+ }
37
+
38
+ Schema.Builder builder = Schema.builder();
39
+ for (Column column : inputSchema.getColumns()) {
40
+ String name = column.getName();
41
+ if (renameMap.containsKey(name)) {
42
+ name = renameMap.get(name);
43
+ }
44
+ builder.add(name, column.getType());
45
+ }
46
+
47
+ control.run(task.dump(), builder.build());
48
+ }
49
+
50
+ @Override
51
+ public PageOutput open(TaskSource taskSource, Schema inputSchema,
52
+ Schema outputSchema, PageOutput output)
53
+ {
54
+ return output;
55
+ }
56
+ }
@@ -5,6 +5,7 @@ import com.google.inject.Binder;
5
5
  import com.google.inject.Module;
6
6
  import com.google.inject.name.Names;
7
7
  import com.google.inject.multibindings.Multibinder;
8
+ import org.embulk.spi.FilterPlugin;
8
9
  import org.embulk.spi.FormatterPlugin;
9
10
  import org.embulk.spi.InputPlugin;
10
11
  import org.embulk.spi.OutputPlugin;
@@ -44,6 +45,9 @@ public class StandardPluginModule
44
45
  // file encoder plugins
45
46
  registerPluginTo(binder, EncoderPlugin.class, "gzip", GzipFileEncoderPlugin.class);
46
47
 
48
+ // filter plugins
49
+ registerPluginTo(binder, FilterPlugin.class, "rename", RenameFilterPlugin.class);
50
+
47
51
  // default guess plugins
48
52
  registerDefaultGuessPluginTo(binder, new PluginType("gzip"));
49
53
  registerDefaultGuessPluginTo(binder, new PluginType("csv"));
@@ -4,6 +4,7 @@ import org.junit.Rule;
4
4
  import org.junit.Test;
5
5
  import static org.junit.Assert.assertEquals;
6
6
  import java.nio.charset.Charset;
7
+ import com.google.common.base.Optional;
7
8
  import com.google.common.collect.ImmutableList;
8
9
  import com.google.common.collect.ImmutableMap;
9
10
  import org.joda.time.DateTimeZone;
@@ -33,7 +34,7 @@ public class TestCsvParserPlugin
33
34
  assertEquals(Newline.CRLF, task.getNewline());
34
35
  assertEquals(false, task.getHeaderLine().or(false));
35
36
  assertEquals(',', task.getDelimiterChar());
36
- assertEquals('\"', task.getQuoteChar());
37
+ assertEquals(Optional.of(new CsvParserPlugin.QuoteCharacter('\"')), task.getQuoteChar());
37
38
  assertEquals(false, task.getAllowOptionalColumns());
38
39
  assertEquals(DateTimeZone.UTC, task.getDefaultTimeZone());
39
40
  assertEquals("%Y-%m-%d %H:%M:%S.%N %z", task.getDefaultTimestampFormat());
@@ -68,7 +69,7 @@ public class TestCsvParserPlugin
68
69
  assertEquals(Newline.LF, task.getNewline());
69
70
  assertEquals(true, task.getHeaderLine().or(false));
70
71
  assertEquals('\t', task.getDelimiterChar());
71
- assertEquals('\\', task.getQuoteChar());
72
+ assertEquals(Optional.of(new CsvParserPlugin.QuoteCharacter('\\')), task.getQuoteChar());
72
73
  assertEquals(true, task.getAllowOptionalColumns());
73
74
  }
74
75
  }
@@ -0,0 +1,88 @@
1
+ package org.embulk.standards;
2
+
3
+ import com.google.common.collect.ImmutableMap;
4
+ import org.embulk.EmbulkTestRuntime;
5
+ import org.embulk.config.ConfigSource;
6
+ import org.embulk.config.TaskSource;
7
+ import org.embulk.spi.Column;
8
+ import org.embulk.spi.FilterPlugin;
9
+ import org.embulk.spi.Exec;
10
+ import org.embulk.spi.Schema;
11
+ import org.embulk.spi.SchemaConfigException;
12
+ import org.embulk.standards.RenameFilterPlugin.PluginTask;
13
+ import org.junit.Before;
14
+ import org.junit.Rule;
15
+ import org.junit.Test;
16
+
17
+ import static org.embulk.spi.type.Types.STRING;
18
+ import static org.embulk.spi.type.Types.TIMESTAMP;
19
+ import static org.junit.Assert.assertEquals;
20
+ import static org.junit.Assert.assertTrue;
21
+ import static org.junit.Assert.fail;
22
+
23
+ public class TestRenameFilterPlugin
24
+ {
25
+ @Rule
26
+ public EmbulkTestRuntime runtime = new EmbulkTestRuntime();
27
+
28
+ private final Schema SCHEMA = Schema.builder()
29
+ .add("_c0", STRING)
30
+ .add("_c1", TIMESTAMP)
31
+ .build();
32
+
33
+ private RenameFilterPlugin filter;
34
+
35
+ @Before
36
+ public void createFilter()
37
+ {
38
+ filter = new RenameFilterPlugin();
39
+ }
40
+
41
+ @Test
42
+ public void checkDefaultValues()
43
+ {
44
+ PluginTask task = Exec.newConfigSource().loadConfig(PluginTask.class);
45
+ assertTrue(task.getRenameMap().isEmpty());
46
+ }
47
+
48
+ @Test
49
+ public void throwSchemaConfigExceptionIfColumnNotFound()
50
+ {
51
+ ConfigSource pluginConfig = Exec.newConfigSource()
52
+ .set("columns", ImmutableMap.of("not_found", "any_name"));
53
+
54
+ try {
55
+ filter.transaction(pluginConfig, SCHEMA, new FilterPlugin.Control() {
56
+ public void run(TaskSource task, Schema schema) { }
57
+ });
58
+ fail();
59
+ } catch (Throwable t) {
60
+ assertTrue(t instanceof SchemaConfigException);
61
+ }
62
+ }
63
+
64
+ @Test
65
+ public void checkRenaming()
66
+ {
67
+ ConfigSource pluginConfig = Exec.newConfigSource()
68
+ .set("columns", ImmutableMap.of("_c0", "_c0_new"));
69
+
70
+ filter.transaction(pluginConfig, SCHEMA, new FilterPlugin.Control() {
71
+ @Override
72
+ public void run(TaskSource task, Schema newSchema)
73
+ {
74
+ // _c0 -> _c0_new
75
+ Column old0 = SCHEMA.getColumn(0);
76
+ Column new0 = newSchema.getColumn(0);
77
+ assertEquals("_c0_new", new0.getName());
78
+ assertEquals(old0.getType(), new0.getType());
79
+
80
+ // _c1 is not changed
81
+ Column old1 = SCHEMA.getColumn(1);
82
+ Column new1 = newSchema.getColumn(1);
83
+ assertEquals("_c1", new1.getName());
84
+ assertEquals(old1.getType(), new1.getType());
85
+ }
86
+ });
87
+ }
88
+ }
@@ -14,7 +14,7 @@ module Embulk
14
14
  ]
15
15
 
16
16
  ESCAPE_CANDIDATES = [
17
- "\\"
17
+ "\\", '"'
18
18
  ]
19
19
 
20
20
  NULL_STRING_CANDIDATES = [
@@ -50,12 +50,33 @@ module Embulk
50
50
 
51
51
  unless parser_guessed.has_key?("quote")
52
52
  quote = guess_quote(sample_lines, delim)
53
- parser_guessed["quote"] = quote ? quote : ''
53
+ unless quote
54
+ if !guess_force_no_quote(sample_lines, delim, '"')
55
+ # assuming CSV follows RFC for quoting
56
+ quote = '"'
57
+ else
58
+ # disable quoting (set null)
59
+ end
60
+ end
61
+ parser_guessed["quote"] = quote
54
62
  end
63
+ parser_guessed["quote"] = '"' if parser_guessed["quote"] == '' # setting '' is not allowed any more. this line converts obsoleted config syntax to explicit syntax.
55
64
 
56
65
  unless parser_guessed.has_key?("escape")
57
- escape = guess_escape(sample_lines, delim, quote)
58
- parser_guessed["escape"] = escape ? escape : ''
66
+ if quote = parser_guessed["quote"]
67
+ escape = guess_escape(sample_lines, delim, quote)
68
+ unless escape
69
+ if quote == '"'
70
+ # assuming this CSV follows RFC for escaping
71
+ escape = '"'
72
+ else
73
+ # disable escaping (set null)
74
+ end
75
+ parser_guessed["escape"] = escape
76
+ end
77
+ else
78
+ # escape does nothing if quote is disabled
79
+ end
59
80
  end
60
81
 
61
82
  unless parser_guessed.has_key?("null_string")
@@ -220,13 +241,18 @@ module Embulk
220
241
  end
221
242
  end
222
243
 
223
- def guess_escape(sample_lines, delim, optional_quote)
244
+ def guess_force_no_quote(sample_lines, delim, quote_candidate)
245
+ delim_regexp = Regexp.escape(delim)
246
+ q_regexp = Regexp.escape(quote_candidate)
247
+ sample_lines.any? do |line|
248
+ # quoting character appear at the middle of a non-quoted value
249
+ line =~ /(?:\A|#{delim_regexp})\s*[^#{q_regexp}]+#{q_regexp}/
250
+ end
251
+ end
252
+
253
+ def guess_escape(sample_lines, delim, quote)
224
254
  guessed = ESCAPE_CANDIDATES.map do |str|
225
- if optional_quote
226
- regexp = /#{Regexp.quote(str)}(?:#{Regexp.quote(delim)}|#{Regexp.quote(optional_quote)})/
227
- else
228
- regexp = /#{Regexp.quote(str)}#{Regexp.quote(delim)}/
229
- end
255
+ regexp = /#{Regexp.quote(str)}(?:#{Regexp.quote(delim)}|#{Regexp.quote(quote)})/
230
256
  counts = sample_lines.map {|line| line.scan(regexp).count }
231
257
  count = counts.inject(0) {|r,c| r + c }
232
258
  [str, count]
@@ -1,3 +1,3 @@
1
1
  module Embulk
2
- VERSION = '0.6.20'
2
+ VERSION = '0.6.21'
3
3
  end
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.20
4
+ version: 0.6.21
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-08-03 00:00:00.000000000 Z
11
+ date: 2015-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -340,6 +340,7 @@ files:
340
340
  - embulk-docs/src/release/release-0.6.19.rst
341
341
  - embulk-docs/src/release/release-0.6.2.rst
342
342
  - embulk-docs/src/release/release-0.6.20.rst
343
+ - embulk-docs/src/release/release-0.6.21.rst
343
344
  - embulk-docs/src/release/release-0.6.3.rst
344
345
  - embulk-docs/src/release/release-0.6.4.rst
345
346
  - embulk-docs/src/release/release-0.6.5.rst
@@ -356,6 +357,7 @@ files:
356
357
  - embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java
357
358
  - embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java
358
359
  - embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java
360
+ - embulk-standards/src/main/java/org/embulk/standards/RenameFilterPlugin.java
359
361
  - embulk-standards/src/main/java/org/embulk/standards/StandardPluginExtension.java
360
362
  - embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java
361
363
  - embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java
@@ -363,6 +365,7 @@ files:
363
365
  - embulk-standards/src/test/java/org/embulk/standards/TestCsvFormatterPlugin.java
364
366
  - embulk-standards/src/test/java/org/embulk/standards/TestCsvParserPlugin.java
365
367
  - embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java
368
+ - embulk-standards/src/test/java/org/embulk/standards/TestRenameFilterPlugin.java
366
369
  - embulk.gemspec
367
370
  - gradle/wrapper/gradle-wrapper.jar
368
371
  - gradle/wrapper/gradle-wrapper.properties
@@ -455,8 +458,8 @@ files:
455
458
  - classpath/bval-jsr303-0.5.jar
456
459
  - classpath/commons-beanutils-core-1.8.3.jar
457
460
  - classpath/commons-lang3-3.1.jar
458
- - classpath/embulk-core-0.6.20.jar
459
- - classpath/embulk-standards-0.6.20.jar
461
+ - classpath/embulk-core-0.6.21.jar
462
+ - classpath/embulk-standards-0.6.21.jar
460
463
  - classpath/guava-18.0.jar
461
464
  - classpath/guice-4.0.jar
462
465
  - classpath/guice-multibindings-4.0.jar