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,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
+ }