embulk 0.1.0

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.
Files changed (204) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +13 -0
  3. data/Gemfile +3 -0
  4. data/Gemfile.lock +33 -0
  5. data/README.md +117 -0
  6. data/Rakefile +58 -0
  7. data/bin/embulk +63 -0
  8. data/build.gradle +149 -0
  9. data/embulk-cli/build.gradle +6 -0
  10. data/embulk-cli/pom.xml +94 -0
  11. data/embulk-cli/src/main/java/org/embulk/cli/Main.java +15 -0
  12. data/embulk-core/build.gradle +6 -0
  13. data/embulk-core/pom.xml +143 -0
  14. data/embulk-core/src/main/java/org/embulk/EmbulkService.java +39 -0
  15. data/embulk-core/src/main/java/org/embulk/command/Runner.java +199 -0
  16. data/embulk-core/src/main/java/org/embulk/command/TablePrinter.java +119 -0
  17. data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +26 -0
  18. data/embulk-core/src/main/java/org/embulk/config/Config.java +15 -0
  19. data/embulk-core/src/main/java/org/embulk/config/ConfigDefault.java +15 -0
  20. data/embulk-core/src/main/java/org/embulk/config/ConfigException.java +20 -0
  21. data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +83 -0
  22. data/embulk-core/src/main/java/org/embulk/config/ConfigSource.java +28 -0
  23. data/embulk-core/src/main/java/org/embulk/config/DataSource.java +35 -0
  24. data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +208 -0
  25. data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +80 -0
  26. data/embulk-core/src/main/java/org/embulk/config/GenericTypeReference.java +20 -0
  27. data/embulk-core/src/main/java/org/embulk/config/ModelManager.java +125 -0
  28. data/embulk-core/src/main/java/org/embulk/config/NextConfig.java +26 -0
  29. data/embulk-core/src/main/java/org/embulk/config/Task.java +10 -0
  30. data/embulk-core/src/main/java/org/embulk/config/TaskInvocationHandler.java +180 -0
  31. data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +343 -0
  32. data/embulk-core/src/main/java/org/embulk/config/TaskSource.java +28 -0
  33. data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +37 -0
  34. data/embulk-core/src/main/java/org/embulk/config/TaskValidator.java +24 -0
  35. data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +45 -0
  36. data/embulk-core/src/main/java/org/embulk/exec/ExecuteInterruptedException.java +10 -0
  37. data/embulk-core/src/main/java/org/embulk/exec/ExecuteResult.java +19 -0
  38. data/embulk-core/src/main/java/org/embulk/exec/ExtensionServiceLoaderModule.java +43 -0
  39. data/embulk-core/src/main/java/org/embulk/exec/ForSystemConfig.java +16 -0
  40. data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +307 -0
  41. data/embulk-core/src/main/java/org/embulk/exec/LocalExecutor.java +274 -0
  42. data/embulk-core/src/main/java/org/embulk/exec/LoggerProvider.java +30 -0
  43. data/embulk-core/src/main/java/org/embulk/exec/NoSampleException.java +10 -0
  44. data/embulk-core/src/main/java/org/embulk/exec/PooledBufferAllocator.java +58 -0
  45. data/embulk-core/src/main/java/org/embulk/exec/PreviewExecutor.java +138 -0
  46. data/embulk-core/src/main/java/org/embulk/exec/PreviewResult.java +27 -0
  47. data/embulk-core/src/main/java/org/embulk/exec/PreviewedNoticeError.java +17 -0
  48. data/embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java +116 -0
  49. data/embulk-core/src/main/java/org/embulk/exec/SystemConfigModule.java +24 -0
  50. data/embulk-core/src/main/java/org/embulk/jruby/JRubyPluginSource.java +69 -0
  51. data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +100 -0
  52. data/embulk-core/src/main/java/org/embulk/plugin/BuiltinPluginSourceModule.java +17 -0
  53. data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +92 -0
  54. data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +34 -0
  55. data/embulk-core/src/main/java/org/embulk/plugin/PluginSource.java +6 -0
  56. data/embulk-core/src/main/java/org/embulk/plugin/PluginSourceNotMatchException.java +19 -0
  57. data/embulk-core/src/main/java/org/embulk/plugin/PluginType.java +47 -0
  58. data/embulk-core/src/main/java/org/embulk/plugin/SetThreadContextClassLoader.java +19 -0
  59. data/embulk-core/src/main/java/org/embulk/spi/Buffer.java +113 -0
  60. data/embulk-core/src/main/java/org/embulk/spi/BufferAllocator.java +8 -0
  61. data/embulk-core/src/main/java/org/embulk/spi/Column.java +92 -0
  62. data/embulk-core/src/main/java/org/embulk/spi/ColumnConfig.java +79 -0
  63. data/embulk-core/src/main/java/org/embulk/spi/DecoderPlugin.java +16 -0
  64. data/embulk-core/src/main/java/org/embulk/spi/EncoderPlugin.java +16 -0
  65. data/embulk-core/src/main/java/org/embulk/spi/Exec.java +76 -0
  66. data/embulk-core/src/main/java/org/embulk/spi/ExecAction.java +6 -0
  67. data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +105 -0
  68. data/embulk-core/src/main/java/org/embulk/spi/Extension.java +42 -0
  69. data/embulk-core/src/main/java/org/embulk/spi/FileInput.java +11 -0
  70. data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +19 -0
  71. data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +113 -0
  72. data/embulk-core/src/main/java/org/embulk/spi/FileOutput.java +13 -0
  73. data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +20 -0
  74. data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +167 -0
  75. data/embulk-core/src/main/java/org/embulk/spi/FormatterPlugin.java +18 -0
  76. data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +9 -0
  77. data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +20 -0
  78. data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +21 -0
  79. data/embulk-core/src/main/java/org/embulk/spi/Page.java +45 -0
  80. data/embulk-core/src/main/java/org/embulk/spi/PageBuilder.java +327 -0
  81. data/embulk-core/src/main/java/org/embulk/spi/PageFormat.java +47 -0
  82. data/embulk-core/src/main/java/org/embulk/spi/PageOutput.java +11 -0
  83. data/embulk-core/src/main/java/org/embulk/spi/PageReader.java +227 -0
  84. data/embulk-core/src/main/java/org/embulk/spi/ParserPlugin.java +17 -0
  85. data/embulk-core/src/main/java/org/embulk/spi/Schema.java +101 -0
  86. data/embulk-core/src/main/java/org/embulk/spi/SchemaConfig.java +52 -0
  87. data/embulk-core/src/main/java/org/embulk/spi/SchemaVisitor.java +14 -0
  88. data/embulk-core/src/main/java/org/embulk/spi/Transactional.java +10 -0
  89. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileInput.java +17 -0
  90. data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileOutput.java +19 -0
  91. data/embulk-core/src/main/java/org/embulk/spi/TransactionalPageOutput.java +17 -0
  92. data/embulk-core/src/main/java/org/embulk/spi/time/DateTimeZoneSerDe.java +57 -0
  93. data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelper.java +8 -0
  94. data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelperFactory.java +6 -0
  95. data/embulk-core/src/main/java/org/embulk/spi/time/Timestamp.java +159 -0
  96. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java +98 -0
  97. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +55 -0
  98. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParseException.java +6 -0
  99. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +60 -0
  100. data/embulk-core/src/main/java/org/embulk/spi/time/TimestampSerDe.java +50 -0
  101. data/embulk-core/src/main/java/org/embulk/spi/type/AbstractType.java +55 -0
  102. data/embulk-core/src/main/java/org/embulk/spi/type/BooleanType.java +12 -0
  103. data/embulk-core/src/main/java/org/embulk/spi/type/DoubleType.java +12 -0
  104. data/embulk-core/src/main/java/org/embulk/spi/type/LongType.java +12 -0
  105. data/embulk-core/src/main/java/org/embulk/spi/type/StringType.java +12 -0
  106. data/embulk-core/src/main/java/org/embulk/spi/type/TimestampType.java +39 -0
  107. data/embulk-core/src/main/java/org/embulk/spi/type/Type.java +15 -0
  108. data/embulk-core/src/main/java/org/embulk/spi/type/TypeDeserializer.java +47 -0
  109. data/embulk-core/src/main/java/org/embulk/spi/type/Types.java +14 -0
  110. data/embulk-core/src/main/java/org/embulk/spi/util/CharsetSerDe.java +55 -0
  111. data/embulk-core/src/main/java/org/embulk/spi/util/Decoders.java +81 -0
  112. data/embulk-core/src/main/java/org/embulk/spi/util/Encoders.java +81 -0
  113. data/embulk-core/src/main/java/org/embulk/spi/util/FileInputInputStream.java +110 -0
  114. data/embulk-core/src/main/java/org/embulk/spi/util/FileOutputOutputStream.java +94 -0
  115. data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamFileInput.java +111 -0
  116. data/embulk-core/src/main/java/org/embulk/spi/util/Inputs.java +74 -0
  117. data/embulk-core/src/main/java/org/embulk/spi/util/LineDecoder.java +118 -0
  118. data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +109 -0
  119. data/embulk-core/src/main/java/org/embulk/spi/util/ListFileInput.java +52 -0
  120. data/embulk-core/src/main/java/org/embulk/spi/util/Newline.java +38 -0
  121. data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +102 -0
  122. data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +139 -0
  123. data/embulk-core/src/test/java/org/embulk/EmbulkTestRuntime.java +110 -0
  124. data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +72 -0
  125. data/embulk-core/src/test/java/org/embulk/RandomManager.java +53 -0
  126. data/embulk-core/src/test/java/org/embulk/TestPluginSourceModule.java +23 -0
  127. data/embulk-core/src/test/java/org/embulk/TestUtilityModule.java +17 -0
  128. data/embulk-core/src/test/java/org/embulk/config/TestConfigSource.java +114 -0
  129. data/embulk-core/src/test/java/org/embulk/config/TestTaskSource.java +70 -0
  130. data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +57 -0
  131. data/embulk-core/src/test/java/org/embulk/plugin/TestPluginType.java +18 -0
  132. data/embulk-core/src/test/java/org/embulk/spi/MockFileOutput.java +63 -0
  133. data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +101 -0
  134. data/embulk-core/src/test/java/org/embulk/spi/MockParserPlugin.java +73 -0
  135. data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +78 -0
  136. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputInputStream.java +67 -0
  137. data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +180 -0
  138. data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +192 -0
  139. data/embulk-core/src/test/java/org/embulk/spi/TestInputStreamFileInput.java +188 -0
  140. data/embulk-core/src/test/java/org/embulk/spi/TestPageBuilderReader.java +301 -0
  141. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestamp.java +116 -0
  142. data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParser.java +52 -0
  143. data/embulk-core/src/test/java/org/embulk/spi/type/TestTypeSerDe.java +45 -0
  144. data/embulk-core/src/test/java/org/embulk/spi/util/TestLineDecoder.java +132 -0
  145. data/embulk-core/src/test/java/org/embulk/spi/util/TestLineEncoder.java +123 -0
  146. data/embulk-standards/build.gradle +6 -0
  147. data/embulk-standards/pom.xml +68 -0
  148. data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +158 -0
  149. data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +233 -0
  150. data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +355 -0
  151. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +55 -0
  152. data/embulk-standards/src/main/java/org/embulk/standards/GzipFileEncoderPlugin.java +39 -0
  153. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +138 -0
  154. data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +128 -0
  155. data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +46 -0
  156. data/embulk-standards/src/main/java/org/embulk/standards/S3FileInputPlugin.java +238 -0
  157. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginExtension.java +16 -0
  158. data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +44 -0
  159. data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +71 -0
  160. data/embulk-standards/src/main/resources/META-INF/services/org.embulk.spi.Extension +1 -0
  161. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvParserPlugin.java +69 -0
  162. data/embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java +291 -0
  163. data/embulk-standards/src/test/java/org/embulk/standards/TestS3FileInputPlugin.java +43 -0
  164. data/embulk.gemspec +27 -0
  165. data/examples/config.yml +34 -0
  166. data/examples/csv/sample.csv.gz +0 -0
  167. data/gradle/wrapper/gradle-wrapper.jar +0 -0
  168. data/gradle/wrapper/gradle-wrapper.properties +6 -0
  169. data/gradlew +164 -0
  170. data/gradlew.bat +90 -0
  171. data/lib/embulk.rb +16 -0
  172. data/lib/embulk/buffer.rb +17 -0
  173. data/lib/embulk/column.rb +47 -0
  174. data/lib/embulk/command/embulk.rb +39 -0
  175. data/lib/embulk/command/embulk_example.rb +32 -0
  176. data/lib/embulk/command/embulk_generate_bin.rb +62 -0
  177. data/lib/embulk/command/embulk_run.rb +243 -0
  178. data/lib/embulk/data/bundle/.bundle/config +3 -0
  179. data/lib/embulk/data/bundle/Gemfile +31 -0
  180. data/lib/embulk/data/bundle/Gemfile.lock +8 -0
  181. data/lib/embulk/data/bundle/embulk/input_example.rb +40 -0
  182. data/lib/embulk/data/bundle/embulk/output_example.rb +51 -0
  183. data/lib/embulk/data_source.rb +66 -0
  184. data/lib/embulk/error.rb +5 -0
  185. data/lib/embulk/guess_charset.rb +26 -0
  186. data/lib/embulk/guess_csv.rb +195 -0
  187. data/lib/embulk/guess_gzip.rb +18 -0
  188. data/lib/embulk/guess_newline.rb +20 -0
  189. data/lib/embulk/guess_plugin.rb +113 -0
  190. data/lib/embulk/input_plugin.rb +53 -0
  191. data/lib/embulk/java/bootstrap.rb +12 -0
  192. data/lib/embulk/java/imports.rb +26 -0
  193. data/lib/embulk/java/time_helper.rb +77 -0
  194. data/lib/embulk/output_plugin.rb +104 -0
  195. data/lib/embulk/page.rb +28 -0
  196. data/lib/embulk/page_builder.rb +22 -0
  197. data/lib/embulk/plugin.rb +152 -0
  198. data/lib/embulk/plugin_registry.rb +70 -0
  199. data/lib/embulk/schema.rb +85 -0
  200. data/lib/embulk/time_format_guess.rb +331 -0
  201. data/lib/embulk/version.rb +3 -0
  202. data/pom.xml +533 -0
  203. data/settings.gradle +5 -0
  204. metadata +370 -0
@@ -0,0 +1,38 @@
1
+ package org.embulk.spi.util;
2
+
3
+ public enum Newline
4
+ {
5
+ CRLF("\r\n"),
6
+ LF("\n"),
7
+ CR("\r");
8
+
9
+ private final String string;
10
+ private final char firstCharCode;
11
+ private final char secondCharCode;
12
+
13
+ private Newline(String string)
14
+ {
15
+ this.string = string;
16
+ this.firstCharCode = string.charAt(0);
17
+ if (string.length() > 1) {
18
+ this.secondCharCode = string.charAt(1);
19
+ } else {
20
+ this.secondCharCode = 0;
21
+ }
22
+ }
23
+
24
+ public String getString()
25
+ {
26
+ return string;
27
+ }
28
+
29
+ public char getFirstCharCode()
30
+ {
31
+ return firstCharCode;
32
+ }
33
+
34
+ public char getSecondCharCode()
35
+ {
36
+ return secondCharCode;
37
+ }
38
+ }
@@ -0,0 +1,102 @@
1
+ package org.embulk.spi.util;
2
+
3
+ import java.util.List;
4
+ import java.util.ArrayList;
5
+ import org.embulk.spi.time.Timestamp;
6
+ import org.embulk.spi.time.TimestampFormatter;
7
+ import org.embulk.spi.Schema;
8
+ import org.embulk.spi.Column;
9
+ import org.embulk.spi.PageReader;
10
+ import org.embulk.spi.SchemaVisitor;
11
+ import org.embulk.spi.type.TimestampType;
12
+
13
+ public class PagePrinter
14
+ {
15
+ private final Schema schema;
16
+ private final TimestampFormatter[] timestampFormatters;
17
+ private final ArrayList<String> record;
18
+
19
+ public PagePrinter(Schema schema, TimestampFormatter.FormatterTask task)
20
+ {
21
+ this.schema = schema;
22
+ this.timestampFormatters = new TimestampFormatter[schema.getColumnCount()];
23
+ for (int i=0; i < timestampFormatters.length; i++) {
24
+ if (schema.getColumnType(i) instanceof TimestampType) {
25
+ TimestampType type = (TimestampType) schema.getColumnType(i);
26
+ timestampFormatters[i] = new TimestampFormatter(type.getFormat(), task);
27
+ }
28
+ }
29
+
30
+ this.record = new ArrayList(schema.getColumnCount());
31
+ for (int i=0; i < schema.getColumnCount(); i++) {
32
+ record.add("");
33
+ }
34
+ }
35
+
36
+ public String printRecord(PageReader reader, String delimiter)
37
+ {
38
+ StringBuilder sb = new StringBuilder();
39
+ for (Column c : schema.getColumns()) {
40
+ if (c.getIndex() != 0) {
41
+ sb.append(delimiter);
42
+ }
43
+ sb.append(printColumn(reader, c));
44
+ }
45
+ return sb.toString();
46
+ }
47
+
48
+ public List<String> printRecord(PageReader reader)
49
+ {
50
+ for (Column c : schema.getColumns()) {
51
+ record.set(c.getIndex(), printColumn(reader, c));
52
+ }
53
+ return record;
54
+ }
55
+
56
+ public String printColumn(PageReader reader, Column column)
57
+ {
58
+ if (reader.isNull(column)) {
59
+ return "";
60
+ }
61
+ ToStringSchemaVisitor visitor = new ToStringSchemaVisitor(reader);
62
+ column.visit(visitor);
63
+ return visitor.string;
64
+ }
65
+
66
+ private class ToStringSchemaVisitor
67
+ implements SchemaVisitor
68
+ {
69
+ private final PageReader reader;
70
+ String string = "";
71
+
72
+ public ToStringSchemaVisitor(PageReader reader)
73
+ {
74
+ this.reader = reader;
75
+ }
76
+
77
+ public void booleanColumn(Column column)
78
+ {
79
+ string = Boolean.toString(reader.getBoolean(column));
80
+ }
81
+
82
+ public void longColumn(Column column)
83
+ {
84
+ string = Long.toString(reader.getLong(column));
85
+ }
86
+
87
+ public void doubleColumn(Column column)
88
+ {
89
+ string = Double.toString(reader.getDouble(column));
90
+ }
91
+
92
+ public void stringColumn(Column column)
93
+ {
94
+ string = reader.getString(column);
95
+ }
96
+
97
+ public void timestampColumn(Column column)
98
+ {
99
+ string = timestampFormatters[column.getIndex()].format(reader.getTimestamp(column));
100
+ }
101
+ }
102
+ }
@@ -0,0 +1,139 @@
1
+ package org.embulk.spi.util;
2
+
3
+ import java.util.List;
4
+ import java.util.Iterator;
5
+ import com.google.common.collect.ImmutableList;
6
+ import org.embulk.spi.time.Timestamp;
7
+ import org.embulk.spi.Schema;
8
+ import org.embulk.spi.SchemaVisitor;
9
+ import org.embulk.spi.Column;
10
+ import org.embulk.spi.Page;
11
+ import org.embulk.spi.PageReader;
12
+
13
+ public class Pages
14
+ {
15
+ public static List<Object[]> toObjects(Schema schema, Page page)
16
+ {
17
+ return toObjects(schema, ImmutableList.of(page));
18
+ }
19
+
20
+ // TODO use streaming and return Iterable
21
+ public static List<Object[]> toObjects(Schema schema, Iterable<Page> pages)
22
+ {
23
+ ImmutableList.Builder<Object[]> builder = ImmutableList.builder();
24
+ Iterator<Page> ite = pages.iterator();
25
+ try (PageReader reader = new PageReader(schema)) {
26
+ while (ite.hasNext()) {
27
+ reader.setPage(ite.next());
28
+ while (reader.nextRecord()) {
29
+ builder.add(toObjects(reader));
30
+ }
31
+ }
32
+ }
33
+ return builder.build();
34
+ }
35
+
36
+ public static Object[] toObjects(final PageReader record)
37
+ {
38
+ final Object[] values = new Object[record.getSchema().getColumns().size()];
39
+ record.getSchema().visitColumns(new ObjectSchemaVisitor(record) {
40
+ @Override
41
+ public void visit(Column column, Object object)
42
+ {
43
+ values[column.getIndex()] = object;
44
+ }
45
+ });
46
+ return values;
47
+ }
48
+
49
+ public static abstract class ObjectSchemaVisitor
50
+ implements SchemaVisitor
51
+ {
52
+ private final PageReader record;
53
+
54
+ public ObjectSchemaVisitor(PageReader record)
55
+ {
56
+ this.record = record;
57
+ }
58
+
59
+ public abstract void visit(Column column, Object obj);
60
+
61
+ @Override
62
+ public void booleanColumn(Column column)
63
+ {
64
+ if (record.isNull(column)) {
65
+ visit(column, null);
66
+ } else {
67
+ visit(column, record.getBoolean(column));
68
+ }
69
+ }
70
+
71
+ @Override
72
+ public void longColumn(Column column)
73
+ {
74
+ if (record.isNull(column)) {
75
+ visit(column, null);
76
+ } else {
77
+ visit(column, record.getLong(column));
78
+ }
79
+ }
80
+
81
+ @Override
82
+ public void doubleColumn(Column column)
83
+ {
84
+ if (record.isNull(column)) {
85
+ visit(column, null);
86
+ } else {
87
+ visit(column, record.getDouble(column));
88
+ }
89
+ }
90
+
91
+ @Override
92
+ public void stringColumn(Column column)
93
+ {
94
+ if (record.isNull(column)) {
95
+ visit(column, null);
96
+ } else {
97
+ visit(column, record.getString(column));
98
+ }
99
+ }
100
+
101
+ @Override
102
+ public void timestampColumn(Column column)
103
+ {
104
+ if (record.isNull(column)) {
105
+ visit(column, null);
106
+ } else {
107
+ visit(column, record.getTimestamp(column));
108
+ }
109
+ }
110
+ }
111
+
112
+ public static Object getObject(PageReader record, Column column)
113
+ {
114
+ GetObjectColumnVisitor visitor = new GetObjectColumnVisitor(record);
115
+ column.visit(visitor);
116
+ return visitor.get();
117
+ }
118
+
119
+ private static class GetObjectColumnVisitor
120
+ extends ObjectSchemaVisitor
121
+ {
122
+ private Object object;
123
+
124
+ public GetObjectColumnVisitor(PageReader record)
125
+ {
126
+ super(record);
127
+ }
128
+
129
+ public Object get()
130
+ {
131
+ return object;
132
+ }
133
+
134
+ public void visit(Column column, Object object)
135
+ {
136
+ this.object = object;
137
+ }
138
+ }
139
+ }
@@ -0,0 +1,110 @@
1
+ package org.embulk;
2
+
3
+ import java.util.Random;
4
+ import org.junit.runner.Description;
5
+ import org.junit.runners.model.Statement;
6
+ import com.google.inject.Binder;
7
+ import com.google.inject.Module;
8
+ import org.embulk.config.ConfigSource;
9
+ import org.embulk.config.DataSourceImpl;
10
+ import org.embulk.config.ModelManager;
11
+ import org.embulk.exec.SystemConfigModule;
12
+ import org.embulk.exec.ExecModule;
13
+ import org.embulk.exec.ExtensionServiceLoaderModule;
14
+ import org.embulk.plugin.BuiltinPluginSourceModule;
15
+ import org.embulk.jruby.JRubyScriptingModule;
16
+ import org.embulk.spi.BufferAllocator;
17
+ import org.embulk.spi.Exec;
18
+ import org.embulk.spi.ExecAction;
19
+ import org.embulk.spi.ExecSession;
20
+
21
+ public class EmbulkTestRuntime
22
+ extends GuiceBinder
23
+ {
24
+ private static ConfigSource getSystemConfig()
25
+ {
26
+ // TODO set some default values
27
+ return new DataSourceImpl(null);
28
+ }
29
+
30
+ public static class TestRuntimeModule
31
+ implements Module
32
+ {
33
+ @Override
34
+ public void configure(Binder binder)
35
+ {
36
+ ConfigSource systemConfig = getSystemConfig();
37
+ new SystemConfigModule(systemConfig).configure(binder);
38
+ new ExecModule().configure(binder);
39
+ new ExtensionServiceLoaderModule(systemConfig).configure(binder);
40
+ new BuiltinPluginSourceModule().configure(binder);
41
+ new JRubyScriptingModule(systemConfig).configure(binder);
42
+ new TestUtilityModule().configure(binder);
43
+ new TestPluginSourceModule().configure(binder);
44
+ }
45
+ }
46
+
47
+ private ExecSession exec;
48
+
49
+ public EmbulkTestRuntime()
50
+ {
51
+ super(new TestRuntimeModule());
52
+ ConfigSource execConfig = new DataSourceImpl(null);
53
+ this.exec = new ExecSession(getInjector(), execConfig);
54
+ }
55
+
56
+ public ExecSession getExec()
57
+ {
58
+ return exec;
59
+ }
60
+
61
+ public BufferAllocator getBufferAllocator()
62
+ {
63
+ return getInstance(BufferAllocator.class);
64
+ }
65
+
66
+ public ModelManager getModelManager()
67
+ {
68
+ return getInstance(ModelManager.class);
69
+ }
70
+
71
+ public Random getRandom()
72
+ {
73
+ return getInstance(RandomManager.class).getRandom();
74
+ }
75
+
76
+ @Override
77
+ public Statement apply(Statement base, Description description)
78
+ {
79
+ final Statement superStatement = EmbulkTestRuntime.super.apply(base, description);
80
+ return new Statement() {
81
+ public void evaluate() throws Throwable
82
+ {
83
+ try {
84
+ Exec.doWith(exec, new ExecAction<Void>() {
85
+ public Void run()
86
+ {
87
+ try {
88
+ superStatement.evaluate();
89
+ } catch (Throwable ex) {
90
+ throw new RuntimeExecutionException(ex);
91
+ }
92
+ return null;
93
+ }
94
+ });
95
+ } catch (RuntimeException ex) {
96
+ throw ex.getCause();
97
+ }
98
+ }
99
+ };
100
+ }
101
+
102
+ private static class RuntimeExecutionException
103
+ extends RuntimeException
104
+ {
105
+ public RuntimeExecutionException(Throwable cause)
106
+ {
107
+ super(cause);
108
+ }
109
+ }
110
+ }
@@ -0,0 +1,72 @@
1
+ package org.embulk;
2
+
3
+ import java.util.ArrayList;
4
+ import java.util.List;
5
+ import org.junit.rules.TestRule;
6
+ import org.junit.rules.TestWatcher;
7
+ import org.junit.runner.Description;
8
+ import org.junit.runners.model.Statement;
9
+ import com.google.common.collect.ImmutableList;
10
+ import com.google.inject.Guice;
11
+ import com.google.inject.Injector;
12
+ import com.google.inject.Module;
13
+
14
+ public class GuiceBinder
15
+ implements TestRule
16
+ {
17
+ private final List<Module> baseModules;
18
+ private List<Module> extraModules;
19
+ private Injector injector;
20
+
21
+ public GuiceBinder(Module... baseModules)
22
+ {
23
+ this.baseModules = ImmutableList.copyOf(baseModules);
24
+ reset();
25
+ }
26
+
27
+ private void reset()
28
+ {
29
+ extraModules = new ArrayList<Module>();
30
+ injector = null;
31
+ }
32
+
33
+ public synchronized void addModule(Module module)
34
+ {
35
+ if (injector != null) {
36
+ throw new IllegalStateException("Injector is already initialized. Call addModule before getInjector or getInstance");
37
+ }
38
+ extraModules.add(module);
39
+ }
40
+
41
+ public synchronized Injector getInjector()
42
+ {
43
+ if (injector == null) {
44
+ ImmutableList.Builder modules = ImmutableList.builder();
45
+ modules.addAll(baseModules);
46
+ modules.addAll(extraModules);
47
+ injector = Guice.createInjector(modules.build());
48
+ }
49
+ return injector;
50
+ }
51
+
52
+ public <T> T getInstance(Class<T> klass)
53
+ {
54
+ return getInjector().getInstance(klass);
55
+ }
56
+
57
+ @Override
58
+ public Statement apply(Statement base, Description description)
59
+ {
60
+ return new GuceBinderWatcher().apply(base, description);
61
+ }
62
+
63
+ private class GuceBinderWatcher
64
+ extends TestWatcher
65
+ {
66
+ @Override
67
+ protected void starting(Description description)
68
+ {
69
+ reset();
70
+ }
71
+ }
72
+ }