embulk 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,6 @@
1
+ dependencies {
2
+ compile project(':embulk-core')
3
+ compile project(':embulk-standards')
4
+
5
+ testCompile project(':embulk-core').sourceSets.test.output
6
+ }
@@ -0,0 +1,94 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3
+ <modelVersion>4.0.0</modelVersion>
4
+
5
+ <parent>
6
+ <groupId>org.embulk</groupId>
7
+ <artifactId>embulk-parent</artifactId>
8
+ <version>0.1.0-SNAPSHOT</version>
9
+ </parent>
10
+
11
+ <artifactId>embulk-cli</artifactId>
12
+ <name>embulk-cli</name>
13
+
14
+ <dependencies>
15
+ <dependency>
16
+ <groupId>org.jruby</groupId>
17
+ <artifactId>jruby-complete</artifactId>
18
+ </dependency>
19
+
20
+ <dependency>
21
+ <groupId>org.embulk</groupId>
22
+ <artifactId>embulk-core</artifactId>
23
+ </dependency>
24
+
25
+ <!-- TODO move embulk-standards to another repository -->
26
+ <!-- TODO once embulk-standards is moved to another repository, replace this dependency with gem from rubygems-proxy -->
27
+ <!-- and change Rakefile to include embulk-core instead of embulk-cli and gemspec depends on embulk-standards -->
28
+ <dependency>
29
+ <groupId>org.embulk</groupId>
30
+ <artifactId>embulk-standards</artifactId>
31
+ </dependency>
32
+ </dependencies>
33
+
34
+ <repositories>
35
+ <!-- See https://github.com/jruby/jruby/wiki/Jruby-Scripting-container-using-Gems-with-a-Maven-Project -->
36
+ <repository>
37
+ <id>rubygems-proxy</id>
38
+ <name>RubyGems Proxy</name>
39
+ <url>http://rubygems-proxy.torquebox.org/releases</url>
40
+ <layout>default</layout>
41
+ <releases>
42
+ <enabled>true</enabled>
43
+ </releases>
44
+ <snapshots>
45
+ <enabled>false</enabled>
46
+ <updatePolicy>never</updatePolicy>
47
+ </snapshots>
48
+ </repository>
49
+ </repositories>
50
+
51
+ <build>
52
+ <plugins>
53
+ <plugin>
54
+ <groupId>de.saumya.mojo</groupId>
55
+ <artifactId>gem-maven-plugin</artifactId>
56
+ <version>1.0.0</version>
57
+ <configuration>
58
+ <includeRubygemsInResources>true</includeRubygemsInResources>
59
+ </configuration>
60
+ <executions>
61
+ <execution>
62
+ <goals>
63
+ <goal>initialize</goal>
64
+ </goals>
65
+ </execution>
66
+ </executions>
67
+ </plugin>
68
+
69
+ <plugin>
70
+ <groupId>org.apache.maven.plugins</groupId>
71
+ <artifactId>maven-shade-plugin</artifactId>
72
+ <executions>
73
+ <execution>
74
+ <phase>package</phase>
75
+ <goals>
76
+ <goal>shade</goal>
77
+ </goals>
78
+ <configuration>
79
+ <shadedArtifactAttached>true</shadedArtifactAttached>
80
+ <shadedClassifierName>executable</shadedClassifierName>
81
+ <transformers>
82
+ <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
83
+ <manifestEntries>
84
+ <Main-Class>org.embulk.cli.Main</Main-Class>
85
+ </manifestEntries>
86
+ </transformer>
87
+ </transformers>
88
+ </configuration>
89
+ </execution>
90
+ </executions>
91
+ </plugin>
92
+ </plugins>
93
+ </build>
94
+ </project>
@@ -0,0 +1,15 @@
1
+ package org.embulk.cli;
2
+
3
+ public class Main
4
+ {
5
+ public static void main(String[] args)
6
+ {
7
+ // TODO set GEM_HOME to point the internal gem repository created by gem-maven-plugin?
8
+
9
+ // $ java -jar jruby-complete.jar classpath:embulk/command/embulk.rb "$@"
10
+ String[] jrubyArgs = new String[args.length + 1];
11
+ jrubyArgs[0] = "classpath:embulk/command/embulk.rb";
12
+ System.arraycopy(args, 0, jrubyArgs, 1, args.length);
13
+ org.jruby.Main.main(jrubyArgs);
14
+ }
15
+ }
@@ -0,0 +1,6 @@
1
+ sourceSets {
2
+ main.resources {
3
+ srcDirs 'src/main/resources'
4
+ srcDirs '../lib'
5
+ }
6
+ }
@@ -0,0 +1,143 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3
+ <modelVersion>4.0.0</modelVersion>
4
+
5
+ <parent>
6
+ <groupId>org.embulk</groupId>
7
+ <artifactId>embulk-parent</artifactId>
8
+ <version>0.1.0-SNAPSHOT</version>
9
+ </parent>
10
+
11
+ <artifactId>embulk-core</artifactId>
12
+ <name>embulk-core</name>
13
+
14
+ <dependencies>
15
+ <dependency>
16
+ <groupId>commons-logging</groupId>
17
+ <artifactId>commons-logging</artifactId>
18
+ </dependency>
19
+
20
+ <dependency>
21
+ <groupId>com.google.guava</groupId>
22
+ <artifactId>guava</artifactId>
23
+ </dependency>
24
+
25
+ <dependency>
26
+ <groupId>com.google.inject</groupId>
27
+ <artifactId>guice</artifactId>
28
+ </dependency>
29
+
30
+ <dependency>
31
+ <groupId>com.google.inject.extensions</groupId>
32
+ <artifactId>guice-multibindings</artifactId>
33
+ </dependency>
34
+
35
+ <dependency>
36
+ <groupId>javax.inject</groupId>
37
+ <artifactId>javax.inject</artifactId>
38
+ </dependency>
39
+
40
+ <dependency>
41
+ <groupId>com.fasterxml.jackson.core</groupId>
42
+ <artifactId>jackson-databind</artifactId>
43
+ </dependency>
44
+
45
+ <dependency>
46
+ <groupId>com.fasterxml.jackson.core</groupId>
47
+ <artifactId>jackson-annotations</artifactId>
48
+ </dependency>
49
+
50
+ <dependency>
51
+ <groupId>com.fasterxml.jackson.core</groupId>
52
+ <artifactId>jackson-core</artifactId>
53
+ </dependency>
54
+
55
+ <dependency>
56
+ <groupId>com.fasterxml.jackson.datatype</groupId>
57
+ <artifactId>jackson-datatype-guava</artifactId>
58
+ </dependency>
59
+
60
+ <dependency>
61
+ <groupId>com.fasterxml.jackson.module</groupId>
62
+ <artifactId>jackson-module-guice</artifactId>
63
+ </dependency>
64
+
65
+ <dependency>
66
+ <groupId>com.fasterxml.jackson.datatype</groupId>
67
+ <artifactId>jackson-datatype-joda</artifactId>
68
+ </dependency>
69
+
70
+ <dependency>
71
+ <groupId>org.slf4j</groupId>
72
+ <artifactId>slf4j-api</artifactId>
73
+ </dependency>
74
+
75
+ <dependency>
76
+ <groupId>org.slf4j</groupId>
77
+ <artifactId>slf4j-log4j12</artifactId>
78
+ </dependency>
79
+
80
+ <dependency>
81
+ <groupId>log4j</groupId>
82
+ <artifactId>log4j</artifactId>
83
+ </dependency>
84
+
85
+ <dependency>
86
+ <groupId>joda-time</groupId>
87
+ <artifactId>joda-time</artifactId>
88
+ </dependency>
89
+
90
+ <dependency>
91
+ <groupId>org.yaml</groupId>
92
+ <artifactId>snakeyaml</artifactId>
93
+ </dependency>
94
+
95
+ <dependency>
96
+ <groupId>javax.validation</groupId>
97
+ <artifactId>validation-api</artifactId>
98
+ </dependency>
99
+
100
+ <dependency>
101
+ <groupId>org.apache.bval</groupId>
102
+ <artifactId>bval-jsr303</artifactId>
103
+ </dependency>
104
+
105
+ <dependency>
106
+ <groupId>io.airlift</groupId>
107
+ <artifactId>slice</artifactId>
108
+ </dependency>
109
+
110
+ <dependency>
111
+ <groupId>io.netty</groupId>
112
+ <artifactId>netty-buffer</artifactId>
113
+ </dependency>
114
+
115
+ <dependency>
116
+ <groupId>org.jruby</groupId>
117
+ <artifactId>jruby-complete</artifactId>
118
+ </dependency>
119
+
120
+ <!-- for guess_charset plugin -->
121
+ <dependency>
122
+ <groupId>com.ibm.icu</groupId>
123
+ <artifactId>icu4j</artifactId>
124
+ <scope>runtime</scope>
125
+ </dependency>
126
+
127
+ <dependency>
128
+ <groupId>junit</groupId>
129
+ <artifactId>junit</artifactId>
130
+ </dependency>
131
+ </dependencies>
132
+
133
+ <build>
134
+ <resources>
135
+ <resource>
136
+ <directory>src/main/resources</directory>
137
+ </resource>
138
+ <resource>
139
+ <directory>../lib</directory>
140
+ </resource>
141
+ </resources>
142
+ </build>
143
+ </project>
@@ -0,0 +1,39 @@
1
+ package org.embulk;
2
+
3
+ import com.google.common.collect.ImmutableList;
4
+ import com.google.inject.Guice;
5
+ import com.google.inject.Injector;
6
+ import com.google.inject.Module;
7
+ import org.embulk.config.ConfigSource;
8
+ import org.embulk.exec.SystemConfigModule;
9
+ import org.embulk.exec.ExecModule;
10
+ import org.embulk.exec.ExtensionServiceLoaderModule;
11
+ import org.embulk.plugin.BuiltinPluginSourceModule;
12
+ import org.embulk.jruby.JRubyScriptingModule;
13
+
14
+ public class EmbulkService
15
+ {
16
+ protected final Injector injector;
17
+
18
+ public EmbulkService(ConfigSource systemConfig)
19
+ {
20
+ ImmutableList.Builder<Module> modules = ImmutableList.builder();
21
+ modules.add(new SystemConfigModule(systemConfig));
22
+ modules.add(new ExecModule());
23
+ modules.add(new ExtensionServiceLoaderModule(systemConfig));
24
+ modules.add(new BuiltinPluginSourceModule());
25
+ modules.add(new JRubyScriptingModule(systemConfig));
26
+ modules.addAll(getAdditionalModules());
27
+ injector = Guice.createInjector(modules.build());
28
+ }
29
+
30
+ protected Iterable<? extends Module> getAdditionalModules()
31
+ {
32
+ return ImmutableList.of();
33
+ }
34
+
35
+ public Injector getInjector()
36
+ {
37
+ return injector;
38
+ }
39
+ }
@@ -0,0 +1,199 @@
1
+ package org.embulk.command;
2
+
3
+ import java.util.List;
4
+ import java.util.Map;
5
+ import java.util.HashMap;
6
+ import java.util.Locale;
7
+ import java.io.File;
8
+ import java.io.IOException;
9
+ import java.io.FileOutputStream;
10
+ import java.io.BufferedWriter;
11
+ import java.io.OutputStreamWriter;
12
+ import java.io.Writer;
13
+ import java.text.NumberFormat;
14
+ import org.yaml.snakeyaml.Yaml;
15
+ import com.fasterxml.jackson.databind.ObjectMapper;
16
+ import com.google.inject.Injector;
17
+ import org.embulk.config.ConfigSource;
18
+ import org.embulk.config.DataSource;
19
+ import org.embulk.config.ConfigLoader;
20
+ import org.embulk.config.NextConfig;
21
+ import org.embulk.config.ModelManager;
22
+ import org.embulk.config.ConfigException;
23
+ import org.embulk.exec.LocalExecutor;
24
+ import org.embulk.exec.ExecuteResult;
25
+ import org.embulk.exec.GuessExecutor;
26
+ import org.embulk.exec.PreviewExecutor;
27
+ import org.embulk.exec.PreviewResult;
28
+ import org.embulk.spi.time.Timestamp;
29
+ import org.embulk.spi.ExecSession;
30
+ import org.embulk.spi.util.Pages;
31
+ import org.embulk.EmbulkService;
32
+
33
+ public class Runner
34
+ {
35
+ private static class Options
36
+ {
37
+ private String nextConfigOutputPath;
38
+ public String getNextConfigOutputPath() { return nextConfigOutputPath; }
39
+ }
40
+
41
+ private final Options options;
42
+ private final ConfigSource systemConfig;
43
+ private final EmbulkService service;
44
+ private final Injector injector;
45
+
46
+ public Runner(String optionJson)
47
+ {
48
+ ModelManager bootstrapModelManager = new ModelManager(null, new ObjectMapper());
49
+ this.options = bootstrapModelManager.readObject(Options.class, optionJson);
50
+ this.systemConfig = new ConfigLoader(bootstrapModelManager).fromPropertiesYamlLiteral(System.getProperties(), "embulk.");
51
+ this.service = new EmbulkService(systemConfig);
52
+ this.injector = service.getInjector();
53
+ }
54
+
55
+ public void main(String command, String[] args)
56
+ {
57
+ switch (command) {
58
+ case "run":
59
+ run(args[0]);
60
+ break;
61
+ case "guess":
62
+ guess(args[0]);
63
+ break;
64
+ case "preview":
65
+ preview(args[0]);
66
+ break;
67
+ default:
68
+ throw new RuntimeException("Unsupported command: "+command);
69
+ }
70
+ }
71
+
72
+ public void run(String configPath)
73
+ {
74
+ ConfigSource config = loadYamlConfig(configPath);
75
+ checkNextConfigOutputPath(options.getNextConfigOutputPath());
76
+
77
+ ExecSession exec = newExecSession(config);
78
+ LocalExecutor local = injector.getInstance(LocalExecutor.class);
79
+ ExecuteResult result = local.run(exec, config);
80
+ NextConfig nextConfig = result.getNextConfig();
81
+
82
+ exec.getLogger(Runner.class).info("next config: {}", nextConfig.toString());
83
+ writeNextConfig(options.getNextConfigOutputPath(), config, nextConfig);
84
+ }
85
+
86
+ public void guess(String partialConfigPath)
87
+ {
88
+ ConfigSource config = loadYamlConfig(partialConfigPath);
89
+ checkNextConfigOutputPath(options.getNextConfigOutputPath());
90
+
91
+ ExecSession exec = newExecSession(config);
92
+ GuessExecutor guess = injector.getInstance(GuessExecutor.class);
93
+ NextConfig nextConfig = guess.guess(exec, config);
94
+
95
+ String yml = writeNextConfig(options.getNextConfigOutputPath(), config, nextConfig);
96
+ System.err.println(yml);
97
+ }
98
+
99
+ private void checkNextConfigOutputPath(String path)
100
+ {
101
+ if (path != null) {
102
+ try (FileOutputStream in = new FileOutputStream(path, true)) {
103
+ // open with append mode and do nothing. just check availability of the path to not cause exceptiosn later
104
+ } catch (IOException ex) {
105
+ throw new RuntimeException(ex);
106
+ }
107
+ }
108
+ }
109
+
110
+ private String writeNextConfig(String path, ConfigSource originalConfig, NextConfig nextConfigDiff)
111
+ {
112
+ String yml = dumpConfigInYaml(originalConfig.merge(nextConfigDiff));
113
+ if (path != null) {
114
+ if (path.equals("-")) {
115
+ System.out.print(yml);
116
+ } else {
117
+ try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path), "UTF-8"))) {
118
+ writer.write(yml);
119
+ } catch (IOException ex) {
120
+ throw new RuntimeException(ex);
121
+ }
122
+ }
123
+ }
124
+ return yml;
125
+ }
126
+
127
+ public void preview(String partialConfigPath)
128
+ {
129
+ ConfigSource config = loadYamlConfig(partialConfigPath);
130
+ ExecSession exec = newExecSession(config);
131
+ PreviewExecutor preview = injector.getInstance(PreviewExecutor.class);
132
+ PreviewResult result = preview.preview(exec, config);
133
+ List<Object[]> records = Pages.toObjects(result.getSchema(), result.getPages());
134
+ final ModelManager model = injector.getInstance(ModelManager.class);
135
+
136
+ String[] header = new String[result.getSchema().getColumnCount()];
137
+ for (int i=0; i < header.length; i++) {
138
+ header[i] = result.getSchema().getColumnName(i) + ":" + result.getSchema().getColumnType(i);
139
+ }
140
+
141
+ TablePrinter printer = new TablePrinter(System.out, header) {
142
+ private NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.ENGLISH);
143
+
144
+ protected String valueToString(Object obj)
145
+ {
146
+ if (obj instanceof String) {
147
+ return (String) obj;
148
+ } else if (obj instanceof Number) {
149
+ if (obj instanceof Integer) {
150
+ return numberFormat.format(((Integer) obj).longValue());
151
+ }
152
+ if (obj instanceof Long) {
153
+ return numberFormat.format(((Long) obj).longValue());
154
+ }
155
+ return obj.toString();
156
+ } else if (obj instanceof Timestamp) {
157
+ return obj.toString();
158
+ } else {
159
+ return model.writeObject(obj);
160
+ }
161
+ }
162
+ };
163
+
164
+ try {
165
+ for (Object[] record : records) {
166
+ printer.add(record);
167
+ }
168
+ printer.finish();
169
+ } catch (IOException ex) {
170
+ throw new RuntimeException(ex);
171
+ }
172
+ }
173
+
174
+ private ConfigSource loadYamlConfig(String yamlPath)
175
+ {
176
+ try {
177
+ return injector.getInstance(ConfigLoader.class).fromYamlFile(new File(yamlPath));
178
+
179
+ } catch (IOException ex) {
180
+ throw new ConfigException(ex);
181
+ }
182
+ }
183
+
184
+ private String dumpConfigInYaml(DataSource config)
185
+ {
186
+ ModelManager model = injector.getInstance(ModelManager.class);
187
+ Map<String, Object> map = model.readObject(MapType.class, model.writeObject(config));
188
+ return new Yaml().dump(map);
189
+ }
190
+
191
+ private ExecSession newExecSession(ConfigSource config)
192
+ {
193
+ return new ExecSession(injector, config.getNestedOrSetEmpty("exec"));
194
+ }
195
+
196
+ private static class MapType extends HashMap<String, Object> {
197
+ public MapType() { }
198
+ };
199
+ }