embulk 0.4.6 → 0.4.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b02e8762879a557c331e6fba758a1be4bd2d0575
4
- data.tar.gz: 1d75577656dbf789d30674e5e689abbb2048f28e
3
+ metadata.gz: 2f4db59dbfae683eff9877c8794fab684f562224
4
+ data.tar.gz: 7969e968bae40633fb8c3d70a9ed2f80a0ee4a37
5
5
  SHA512:
6
- metadata.gz: b3e674c5d0e1a9fa3a09b516339cba7a7f587ff70521287e11c64caa0ec8af1d4a229b88bb168e3d10135c1e574e34c40c264587ab4c3c169e194323ef2040be
7
- data.tar.gz: d51979854aa840ff03cbbf0ee118a93aae2066f06485503f3451d31486f222e56203ac11e819e2fa42238a9914b3023a276d0e6a2dbe5010367da837fc504938
6
+ metadata.gz: 592576af399e8f184b1b28dfa32c298fb7ff236f9d956a37e5587e073ee64af0280e481a4a568e114b04391e0cea6977b364f4d9ac03f0a1a194a12b3a7cd19e
7
+ data.tar.gz: f2238b2e4c0bb06c1ad33754b86f9944845565c75ea0f36fb801fd2c1e5b1a87255a5ddbad763dc2f72b36724692cd11cd862cb05ee64827655a7ca797df408c
data/README.md CHANGED
@@ -25,10 +25,10 @@ The single-file package is the simplest way to try Embulk. You can download the
25
25
 
26
26
  ### Linux & Mac & BSD
27
27
 
28
- Following 4 commans install embulk to your home directory:
28
+ Following 4 commands install embulk to your home directory:
29
29
 
30
30
  ```
31
- curl --create-dirs -o ~/.embulk/bin/embulk -L https://bintray.com/artifact/download/embulk/maven/embulk-0.4.6.jar
31
+ curl --create-dirs -o ~/.embulk/bin/embulk -L https://bintray.com/artifact/download/embulk/maven/embulk-0.4.7.jar
32
32
  chmod +x ~/.embulk/bin/embulk
33
33
  echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
34
34
  source ~/.bashrc
data/build.gradle CHANGED
@@ -12,7 +12,7 @@ def release_projects = [project(":embulk-core"), project(":embulk-standards")]
12
12
 
13
13
  allprojects {
14
14
  group = 'org.embulk'
15
- version = '0.4.6'
15
+ version = '0.4.7'
16
16
 
17
17
  apply plugin: 'java'
18
18
  apply plugin: 'maven-publish'
@@ -0,0 +1,84 @@
1
+ package org.embulk.command;
2
+
3
+ import java.util.List;
4
+ import java.util.Locale;
5
+ import java.io.PrintStream;
6
+ import java.io.Closeable;
7
+ import java.io.IOException;
8
+ import java.text.NumberFormat;
9
+ import org.embulk.config.ModelManager;
10
+ import org.embulk.spi.Schema;
11
+ import org.embulk.spi.time.Timestamp;
12
+ import org.embulk.spi.Page;
13
+ import org.embulk.spi.util.Pages;
14
+
15
+ public abstract class PreviewPrinter
16
+ implements Closeable
17
+ {
18
+ protected final PrintStream out;
19
+ protected final ModelManager modelManager;
20
+ protected final Schema schema;
21
+ private final String[] stringValues;
22
+
23
+ private final NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.ENGLISH);
24
+
25
+ public PreviewPrinter(PrintStream out, ModelManager modelManager, Schema schema)
26
+ {
27
+ this.out = out;
28
+ this.modelManager = modelManager;
29
+ this.schema = schema;
30
+ this.stringValues = new String[schema.getColumnCount()];
31
+ }
32
+
33
+ public void printAllPages(List<Page> pages) throws IOException
34
+ {
35
+ List<Object[]> records = Pages.toObjects(schema, pages);
36
+ for (Object[] record : records) {
37
+ printRecord(record);
38
+ }
39
+ }
40
+
41
+ public void printRecord(Object... values) throws IOException
42
+ {
43
+ int min = Math.min(schema.getColumnCount(), values.length);
44
+ for (int i=0; i < min; i++) {
45
+ stringValues[i] = valueToString(values[i]);
46
+ }
47
+ for (int i=min; i < schema.getColumnCount(); i++) {
48
+ stringValues[i] = valueToString(null);
49
+ }
50
+ printRecord(stringValues);
51
+ }
52
+
53
+ protected abstract void printRecord(String[] values) throws IOException;
54
+
55
+ protected String valueToString(Object obj)
56
+ {
57
+ if (obj == null) {
58
+ return "";
59
+ } else if (obj instanceof String) {
60
+ return (String) obj;
61
+ } else if (obj instanceof Number) {
62
+ if (obj instanceof Integer) {
63
+ return numberFormat.format(((Integer) obj).longValue());
64
+ }
65
+ if (obj instanceof Long) {
66
+ return numberFormat.format(((Long) obj).longValue());
67
+ }
68
+ return obj.toString();
69
+ } else if (obj instanceof Timestamp) {
70
+ return obj.toString();
71
+ } else {
72
+ return modelManager.writeObject(obj);
73
+ }
74
+ }
75
+
76
+ public void finish() throws IOException
77
+ { }
78
+
79
+ @Override
80
+ public void close() throws IOException
81
+ {
82
+ out.close();
83
+ }
84
+ }
@@ -3,16 +3,15 @@ package org.embulk.command;
3
3
  import java.util.List;
4
4
  import java.util.Map;
5
5
  import java.util.HashMap;
6
- import java.util.Locale;
7
6
  import java.io.File;
8
7
  import java.io.IOException;
9
8
  import java.io.FileOutputStream;
10
9
  import java.io.BufferedWriter;
11
10
  import java.io.OutputStreamWriter;
12
11
  import java.io.Writer;
13
- import java.text.NumberFormat;
14
12
  import org.yaml.snakeyaml.Yaml;
15
13
  import com.fasterxml.jackson.databind.ObjectMapper;
14
+ import com.google.common.base.Function;
16
15
  import com.google.inject.Injector;
17
16
  import org.embulk.config.ConfigSource;
18
17
  import org.embulk.config.DataSource;
@@ -29,7 +28,6 @@ import org.embulk.exec.ResumeState;
29
28
  import org.embulk.exec.PartialExecutionException;
30
29
  import org.embulk.spi.time.Timestamp;
31
30
  import org.embulk.spi.ExecSession;
32
- import org.embulk.spi.util.Pages;
33
31
  import org.embulk.EmbulkService;
34
32
 
35
33
  public class Runner
@@ -44,6 +42,9 @@ public class Runner
44
42
 
45
43
  private String logLevel;
46
44
  public String getLogLevel() { return logLevel; }
45
+
46
+ private String previewOutputFormat;
47
+ public String getPreviewOutputFormat() { return previewOutputFormat; };
47
48
  }
48
49
 
49
50
  private final Options options;
@@ -218,41 +219,27 @@ public class Runner
218
219
  ExecSession exec = newExecSession(config);
219
220
  PreviewExecutor preview = injector.getInstance(PreviewExecutor.class);
220
221
  PreviewResult result = preview.preview(exec, config);
221
- List<Object[]> records = Pages.toObjects(result.getSchema(), result.getPages());
222
- final ModelManager model = injector.getInstance(ModelManager.class);
223
-
224
- String[] header = new String[result.getSchema().getColumnCount()];
225
- for (int i=0; i < header.length; i++) {
226
- header[i] = result.getSchema().getColumnName(i) + ":" + result.getSchema().getColumnType(i);
227
- }
222
+ ModelManager modelManager = injector.getInstance(ModelManager.class);
228
223
 
229
- TablePrinter printer = new TablePrinter(System.out, header) {
230
- private NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.ENGLISH);
224
+ PreviewPrinter printer;
231
225
 
232
- protected String valueToString(Object obj)
233
- {
234
- if (obj instanceof String) {
235
- return (String) obj;
236
- } else if (obj instanceof Number) {
237
- if (obj instanceof Integer) {
238
- return numberFormat.format(((Integer) obj).longValue());
239
- }
240
- if (obj instanceof Long) {
241
- return numberFormat.format(((Long) obj).longValue());
242
- }
243
- return obj.toString();
244
- } else if (obj instanceof Timestamp) {
245
- return obj.toString();
246
- } else {
247
- return model.writeObject(obj);
248
- }
249
- }
250
- };
226
+ String format = options.getPreviewOutputFormat();
227
+ if (format == null) {
228
+ format = "table";
229
+ }
230
+ switch (format) {
231
+ case "table":
232
+ printer = new TablePreviewPrinter(System.out, modelManager, result.getSchema());
233
+ break;
234
+ case "vertical":
235
+ printer = new VerticalPreviewPrinter(System.out, modelManager, result.getSchema());
236
+ break;
237
+ default:
238
+ throw new IllegalArgumentException(String.format("Unknown preview output format '%s'. Supported formats: table, vertical", format));
239
+ }
251
240
 
252
241
  try {
253
- for (Object[] record : records) {
254
- printer.add(record);
255
- }
242
+ printer.printAllPages(result.getPages());
256
243
  printer.finish();
257
244
  } catch (IOException ex) {
258
245
  throw new RuntimeException(ex);
@@ -0,0 +1,108 @@
1
+ package org.embulk.command;
2
+
3
+ import java.util.List;
4
+ import java.util.Arrays;
5
+ import java.util.ArrayList;
6
+ import java.io.PrintStream;
7
+ import java.io.IOException;
8
+ import com.google.common.base.Function;
9
+ import org.embulk.config.ModelManager;
10
+ import org.embulk.spi.Schema;
11
+
12
+ public class TablePreviewPrinter
13
+ extends PreviewPrinter
14
+ {
15
+ private static final int MAX_SAMPLE_SIZE = 32000;
16
+
17
+ private List<String[]> samples;
18
+ private int sampleSize;
19
+ private String format = null;
20
+ private String border = null;
21
+
22
+ public TablePreviewPrinter(PrintStream out, ModelManager modelManager, Schema schema)
23
+ {
24
+ super(out, modelManager, schema);
25
+ this.samples = new ArrayList<String[]>();
26
+ String[] header = new String[schema.getColumnCount()];
27
+ for (int i=0; i < header.length; i++) {
28
+ header[i] = schema.getColumnName(i) + ":" + schema.getColumnType(i);
29
+ }
30
+ samples.add(header);
31
+ }
32
+
33
+ @Override
34
+ protected void printRecord(String[] values) throws IOException
35
+ {
36
+ if (samples == null) {
37
+ // header is already written
38
+ out.format(format, Arrays.copyOf(values, values.length, Object[].class));
39
+ } else {
40
+ // estimating size of columns
41
+ samples.add(Arrays.copyOf(values, values.length));
42
+ for (String v : values) {
43
+ sampleSize += v.length();
44
+ }
45
+ if (sampleSize > MAX_SAMPLE_SIZE) {
46
+ // enough number of rows to estimate size of the columns.
47
+ flushSamples();
48
+ }
49
+ }
50
+ }
51
+
52
+ private void flushSamples()
53
+ {
54
+ StringBuilder borderBuilder = new StringBuilder();
55
+
56
+ StringBuilder sb = new StringBuilder();
57
+ sb.append("| ");
58
+ borderBuilder.append("+-");
59
+ for (int i=0; i < schema.getColumnCount(); i++) {
60
+ if (i != 0) {
61
+ sb.append(" | ");
62
+ borderBuilder.append("-+-");
63
+ }
64
+ int colLen = maxLengthInColumn(i);
65
+ sb.append("%"+colLen+"s");
66
+ for (int b=0; b < colLen; b++) {
67
+ borderBuilder.append("-");
68
+ }
69
+ }
70
+ sb.append(" |");
71
+ borderBuilder.append("-+");
72
+ sb.append("\n");
73
+
74
+ this.format = sb.toString();
75
+ this.border = borderBuilder.toString();
76
+
77
+ out.println(border);
78
+
79
+ for (int i=0; i < samples.size(); i++) {
80
+ String[] values = samples.get(i);
81
+ out.format(format, Arrays.copyOf(values, values.length, Object[].class));
82
+ if (i == 0) {
83
+ // i == 0 is header. write border after the header
84
+ out.println(border);
85
+ }
86
+ }
87
+
88
+ this.samples = null;
89
+ }
90
+
91
+ private int maxLengthInColumn(int i)
92
+ {
93
+ int max = 0;
94
+ for (String[] values : samples) {
95
+ max = Math.max(max, values[i].length());
96
+ }
97
+ return max;
98
+ }
99
+
100
+ @Override
101
+ public void finish() throws IOException
102
+ {
103
+ if (samples != null) {
104
+ flushSamples();
105
+ }
106
+ out.println(border);
107
+ }
108
+ }
@@ -0,0 +1,47 @@
1
+ package org.embulk.command;
2
+
3
+ import java.io.PrintStream;
4
+ import java.io.IOException;
5
+ import org.embulk.config.ModelManager;
6
+ import org.embulk.spi.Schema;
7
+
8
+ public class VerticalPreviewPrinter
9
+ extends PreviewPrinter
10
+ {
11
+ private final String format;
12
+ private int count = 0;
13
+
14
+ public VerticalPreviewPrinter(PrintStream out, ModelManager modelManager, Schema schema)
15
+ {
16
+ super(out, modelManager, schema);
17
+ this.format = "%" + maxColumnNameLength(schema) + "s (%" + maxColumnTypeNameLength(schema)+ "s) : %s\n";
18
+ }
19
+
20
+ private static int maxColumnNameLength(Schema schema)
21
+ {
22
+ int max = 0;
23
+ for (int i=0; i < schema.getColumnCount(); i++) {
24
+ max = Math.max(max, schema.getColumnName(i).length());
25
+ }
26
+ return max;
27
+ }
28
+
29
+ private static int maxColumnTypeNameLength(Schema schema)
30
+ {
31
+ int max = 0;
32
+ for (int i=0; i < schema.getColumnCount(); i++) {
33
+ max = Math.max(max, schema.getColumnType(i).toString().length());
34
+ }
35
+ return max;
36
+ }
37
+
38
+ @Override
39
+ protected void printRecord(String[] values) throws IOException
40
+ {
41
+ count++;
42
+ out.format("*************************** %d ***************************\n", count);
43
+ for (int i=0; i < schema.getColumnCount(); i++) {
44
+ out.format(format, schema.getColumnName(i), schema.getColumnType(i), values[i]);
45
+ }
46
+ }
47
+ }
@@ -17,4 +17,5 @@ Release Notes
17
17
  release/release-0.4.4
18
18
  release/release-0.4.5
19
19
  release/release-0.4.6
20
+ release/release-0.4.7
20
21
 
@@ -0,0 +1,16 @@
1
+ Release 0.4.7
2
+ ==================================
3
+
4
+ CLI
5
+ ------------------
6
+
7
+ * Added ``-G, --vertical`` option to ``preview`` subcommand. It shows records in vertical style like MySQL's ``\G`` or PostgreSQL's ``\x`` (@yaggytter++).
8
+
9
+ General Changes
10
+ ------------------
11
+
12
+ * Fixed a problem on Windows where classloader raises (@hito4_t++)
13
+
14
+ Release Date
15
+ ------------------
16
+ 2015-02-23
@@ -102,6 +102,9 @@ module Embulk
102
102
  op.on('-C', '--classpath PATH', "Add java classpath separated by #{classpath_separator} (CLASSPATH)") do |classpath|
103
103
  classpaths.concat classpath.split(classpath_separator)
104
104
  end
105
+ op.on('-G', '--vertical', "Use vertical output format", TrueClass) do |b|
106
+ options[:previewOutputFormat] = "vertical"
107
+ end
105
108
  args = 1..1
106
109
 
107
110
  when :guess
@@ -5,7 +5,7 @@ module Embulk
5
5
  class JavaPlugin
6
6
  def self.classloader(dir)
7
7
  jars = Dir["#{dir}/**/*.jar"]
8
- urls = jars.map {|jar| java.net.URL.new "file://#{File.expand_path(jar)}" }
8
+ urls = jars.map {|jar| java.io.File.new(File.expand_path(jar)).toURI.toURL }
9
9
  classloader = Java::PluginClassLoader.new(JRuby.runtime, urls)
10
10
  end
11
11
 
@@ -1,3 +1,3 @@
1
1
  module Embulk
2
- VERSION = '0.4.6'
2
+ VERSION = '0.4.7'
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.4.6
4
+ version: 0.4.7
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-02-21 00:00:00.000000000 Z
11
+ date: 2015-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -102,8 +102,10 @@ files:
102
102
  - embulk-cli/src/main/sh/selfrun.sh
103
103
  - embulk-core/build.gradle
104
104
  - embulk-core/src/main/java/org/embulk/EmbulkService.java
105
+ - embulk-core/src/main/java/org/embulk/command/PreviewPrinter.java
105
106
  - embulk-core/src/main/java/org/embulk/command/Runner.java
106
- - embulk-core/src/main/java/org/embulk/command/TablePrinter.java
107
+ - embulk-core/src/main/java/org/embulk/command/TablePreviewPrinter.java
108
+ - embulk-core/src/main/java/org/embulk/command/VerticalPreviewPrinter.java
107
109
  - embulk-core/src/main/java/org/embulk/config/CommitReport.java
108
110
  - embulk-core/src/main/java/org/embulk/config/Config.java
109
111
  - embulk-core/src/main/java/org/embulk/config/ConfigDefault.java
@@ -260,6 +262,7 @@ files:
260
262
  - embulk-docs/src/release/release-0.4.4.rst
261
263
  - embulk-docs/src/release/release-0.4.5.rst
262
264
  - embulk-docs/src/release/release-0.4.6.rst
265
+ - embulk-docs/src/release/release-0.4.7.rst
263
266
  - embulk-standards/build.gradle
264
267
  - embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java
265
268
  - embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java
@@ -360,10 +363,8 @@ files:
360
363
  - classpath/bval-jsr303-0.5.jar
361
364
  - classpath/commons-beanutils-core-1.8.3.jar
362
365
  - classpath/commons-lang3-3.1.jar
363
- - classpath/embulk-core-0.4.5.jar
364
- - classpath/embulk-core-0.4.6.jar
365
- - classpath/embulk-standards-0.4.5.jar
366
- - classpath/embulk-standards-0.4.6.jar
366
+ - classpath/embulk-core-0.4.7.jar
367
+ - classpath/embulk-standards-0.4.7.jar
367
368
  - classpath/guava-18.0.jar
368
369
  - classpath/guice-3.0.jar
369
370
  - classpath/guice-multibindings-3.0.jar
@@ -1,119 +0,0 @@
1
- package org.embulk.command;
2
-
3
- import java.util.List;
4
- import java.util.ArrayList;
5
- import java.util.Locale;
6
- import java.io.PrintStream;
7
- import java.io.Flushable;
8
- import java.io.IOException;
9
-
10
- class TablePrinter
11
- {
12
- private static final int SAMPLES = 10;
13
-
14
- private PrintStream out;
15
-
16
- private String[] header;
17
-
18
- private List<Object[]> samples;
19
- private String format;
20
- private String border;
21
-
22
- public TablePrinter(PrintStream out, String... header)
23
- {
24
- this.out = out;
25
- this.header = header;
26
- this.samples = new ArrayList<Object[]>(SAMPLES);
27
- samples.add(header);
28
- }
29
-
30
- public void add(Object... values) throws IOException
31
- {
32
- int min = header.length < values.length ? header.length : values.length;
33
- Object[] cols = new Object[header.length];
34
- for(int i=0; i < min; i++) {
35
- if(values[i] == null) {
36
- cols[i] = "";
37
- } else {
38
- cols[i] = valueToString(values[i]);
39
- }
40
- }
41
- for(int i=min; i < header.length; i++) {
42
- cols[i] = "";
43
- }
44
-
45
- if(samples == null) {
46
- out.format(format, cols);
47
- return;
48
- }
49
-
50
- samples.add(cols);
51
- if(samples.size() < SAMPLES) {
52
- return;
53
- }
54
- }
55
-
56
- protected String valueToString(Object obj)
57
- {
58
- return obj.toString();
59
- }
60
-
61
- private void flushSamples()
62
- {
63
- StringBuilder borderBuilder = new StringBuilder();
64
-
65
- StringBuilder sb = new StringBuilder();
66
- sb.append("| ");
67
- borderBuilder.append("+-");
68
- for(int i=0; i < header.length; i++) {
69
- if(i != 0) {
70
- sb.append(" | ");
71
- borderBuilder.append("-+-");
72
- }
73
- int colLen = maxLengthInColumn(i);
74
- sb.append("%"+colLen+"s");
75
- for(int b=0; b < colLen; b++) {
76
- borderBuilder.append("-");
77
- }
78
- }
79
- sb.append(" |");
80
- borderBuilder.append("-+");
81
- sb.append("\n");
82
-
83
- this.format = sb.toString();
84
- this.border = borderBuilder.toString();
85
-
86
- out.println(border);
87
-
88
- for(int i=0; i < samples.size(); i++) {
89
- out.format(format, samples.get(i));
90
- if(i == 0) {
91
- out.println(border);
92
- }
93
- }
94
-
95
- this.samples = null;
96
- }
97
-
98
- private int maxLengthInColumn(int i)
99
- {
100
- int max = 0;
101
- for(Object[] cols : samples) {
102
- String s = (String) cols[i];
103
- int len = (s == null) ? 0 : s.length();
104
- if(max < len) {
105
- max = len;
106
- }
107
- }
108
- return max;
109
- }
110
-
111
- public void finish() throws IOException
112
- {
113
- if(!samples.isEmpty()) {
114
- flushSamples();
115
- }
116
- out.println(border);
117
- }
118
- }
119
-