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,39 @@
1
+ bundle_path = ENV['EMBULK_BUNDLE_PATH'].to_s
2
+ bundle_path = nil if bundle_path.empty?
3
+
4
+ # search -b, --bundle BUNDLE_DIR
5
+ bundle_path_index = ARGV.find_index {|arg| arg == '-b' || arg == '--bundle' }
6
+ if bundle_path_index
7
+ bundle_path = ARGV.slice!(bundle_path_index, 2)[1]
8
+ end
9
+
10
+ if bundle_path
11
+ # use bundler installed at bundle_path
12
+ ENV['GEM_HOME'] = File.expand_path File.join(bundle_path, Gem.ruby_engine, RbConfig::CONFIG['ruby_version'])
13
+ ENV['GEM_PATH'] = ''
14
+ Gem.clear_paths # force rubygems to reload GEM_HOME
15
+
16
+ ENV['BUNDLE_GEMFILE'] = File.expand_path File.join(bundle_path, "Gemfile")
17
+ require 'bundler'
18
+ Bundler.load.setup_environment
19
+ require 'bundler/setup'
20
+ # since here, `require` may load files of different (newer) embulk versions
21
+ # especially following 'embulk/command/embulk_run'.
22
+
23
+ $LOAD_PATH << File.expand_path(bundle_path) # for local plugins
24
+
25
+ begin
26
+ require 'embulk/command/embulk_run'
27
+ rescue LoadError
28
+ require_relative 'embulk_run'
29
+ end
30
+
31
+ else
32
+ # GEM_HOME is set by embulk_run.rb
33
+ ENV.delete('GEM_HOME')
34
+ ENV.delete('GEM_PATH')
35
+ ENV.delete('BUNDLE_GEMFILE')
36
+ require_relative 'embulk_run'
37
+ end
38
+
39
+ Embulk.run(ARGV)
@@ -0,0 +1,32 @@
1
+ module Embulk
2
+ def self.create_example(path)
3
+ require 'fileutils'
4
+ require 'zlib'
5
+
6
+ puts " Creating #{path}/"
7
+ FileUtils.mkdir_p File.join(path, 'csv')
8
+ puts " Creating #{path}/csv/"
9
+
10
+ puts " Creating #{path}/csv/sample_01.csv.gz"
11
+ Zlib::GzipWriter.open(File.join(path, 'csv', 'sample_01.csv.gz')) do |f|
12
+ f.write <<EOF
13
+ id,account,time,purchase,comment
14
+ 1,32864,2015-01-27 19:23:49,20150127,embulk
15
+ 2,14824,2015-01-27 19:01:23,20150127,embulk jruby
16
+ 3,27559,2015-01-28 02:20:02,20150128,embulk core
17
+ 4,11270,2015-01-29 11:54:36,20150129,"Embulk ""csv"" parser plugin"
18
+ EOF
19
+ end
20
+
21
+ puts " Creating #{path}/example.yml"
22
+ File.open(File.join(path, 'example.yml'), 'w') do |f|
23
+ f.write <<EOF
24
+ in:
25
+ type: file
26
+ paths: [#{File.expand_path File.join(path, 'csv')}]
27
+ out:
28
+ type: stdout
29
+ EOF
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,62 @@
1
+ module Embulk
2
+ def self.generate_bin(options={})
3
+ jruby_jar_path = org.jruby.Main.java_class.protection_domain.code_source.location.to_s
4
+ if __FILE__ =~ /^classpath:/ || __FILE__.include?('!/')
5
+ resource_class = org.embulk.command.Runner.java_class
6
+ ruby_script_path = resource_class.resource("/embulk/command/embulk.rb").to_s
7
+ else
8
+ ruby_script_path = File.join(File.dirname(__FILE__), 'embulk.rb')
9
+ end
10
+ java_home = java.lang.System.properties['java.home']
11
+
12
+ generate_bin_data(jruby_jar_path, ruby_script_path, options.merge(java_home: java_home))
13
+ end
14
+
15
+ def self.generate_bin_data(jruby_jar_path, ruby_script_path, options={})
16
+ if java_home = options[:java_home]
17
+ java_home_script = %{export JAVA_HOME='#{java_home}'}
18
+ java_path = %{"$JAVA_HOME"/bin/java}
19
+ else
20
+ java_home_script = %{}
21
+ java_path = %{java}
22
+ end
23
+
24
+ # TODO parse -D options to set them to java
25
+ shell_script = <<EOF
26
+ #!/bin/sh
27
+ =begin 2>/dev/null
28
+ #{java_home_script}
29
+ exec #{java_path} -classpath "$0" org.jruby.Main "$0" "$@"
30
+ exit 127
31
+ =end
32
+ EOF
33
+
34
+ if options[:bundle_path] == :here
35
+ bundle_path_script = %{ENV['EMBULK_BUNDLE_PATH'] = File.expand_path('..', File.dirname(__FILE__))}
36
+ elsif path = options[:bundle_path]
37
+ bundle_path_script = %{ENV['EMBULK_BUNDLE_PATH'] = '#{path}'}
38
+ else
39
+ bundle_path_script = b ''
40
+ end
41
+
42
+ ruby_init_script = b <<EOF
43
+ #{bundle_path_script}
44
+ ENV.delete 'GEM_HOME'
45
+ ENV.delete 'GEM_PATH'
46
+ EOF
47
+
48
+ ruby_script = b(File.read(ruby_script_path))
49
+ if i = ruby_script.index(b("\n__END__\n"))
50
+ # delete contents after __END__
51
+ ruby_script = ruby_script[0, i]
52
+ end
53
+
54
+ jruby_jar = b(File.read(jruby_jar_path))
55
+
56
+ data = shell_script << ruby_init_script + ruby_script << b("\n__END__\n") << jruby_jar
57
+ end
58
+
59
+ def self.b(s)
60
+ s.force_encoding('ASCII-8BIT')
61
+ end
62
+ end
@@ -0,0 +1,243 @@
1
+ module Embulk
2
+ def self.run(argv)
3
+ # default_bundle_path
4
+ default_bundle_path = nil
5
+ gemfile_path = ENV['BUNDLE_GEMFILE'].to_s
6
+ gemfile_path = nil if gemfile_path.empty?
7
+ default_bundle_path = File.dirname(gemfile_path) if gemfile_path
8
+
9
+ # default GEM_HOME is ~/.embulk/jruby/1.9/. If -b option is set,
10
+ # GEM_HOME is already set by embulk/command/embulk.rb
11
+ gem_home = ENV['GEM_HOME'].to_s
12
+ if gem_home.empty?
13
+ ENV['GEM_HOME'] = File.expand_path File.join(ENV['HOME'], '.embulk', Gem.ruby_engine, RbConfig::CONFIG['ruby_version'])
14
+ Gem.clear_paths # force rubygems to reload GEM_HOME
15
+ end
16
+
17
+ i = argv.find_index {|arg| arg !~ /^\-/ }
18
+ usage nil unless i
19
+ subcmd = argv.slice!(i)
20
+
21
+ load_paths = []
22
+ options = {}
23
+
24
+ # to make sure org.embulk.jruby.JRubyScriptingModule can require 'embulk/java/bootstrap'
25
+ $LOAD_PATH << Embulk.home('lib')
26
+
27
+ require 'optparse'
28
+ op = OptionParser.new
29
+
30
+ op.on('-b', '--bundle BUNDLE_DIR', 'Path to a Gemfile directory') do |path|
31
+ # only for help message. implemented at lib/embulk/command/embulk.rb
32
+ end
33
+
34
+ case subcmd.to_sym
35
+ when :bundle
36
+ if default_bundle_path
37
+ op.banner = "Usage: bundle [directory=#{default_bundle_path}]"
38
+ args = 0..1
39
+ else
40
+ op.banner = "Usage: bundle <directory>"
41
+ args = 1..1
42
+ end
43
+
44
+ when :run
45
+ op.banner = "Usage: run <config.yml>"
46
+ op.on('-b', '--bundle BUNDLE_DIR', 'Path to a Gemfile directory') do |path|
47
+ end
48
+ op.on('-I', '--load-path PATH', 'Add ruby script directory path or jar file path') do |load_path|
49
+ load_paths << load_path
50
+ end
51
+ op.on('-o', '--output PATH', 'Path to a file to write the next configuration') do |path|
52
+ options[:nextConfigOutputPath] = path
53
+ end
54
+ args = 1..1
55
+
56
+ when :preview
57
+ op.banner = "Usage: preview <config.yml>"
58
+ op.on('-b', '--bundle BUNDLE_DIR', 'Path to a Gemfile directory') do |path|
59
+ end
60
+ op.on('-I', '--load-path PATH', 'Add ruby script directory path or jar file path') do |load_path|
61
+ load_paths << load_path
62
+ end
63
+ args = 1..1
64
+
65
+ when :guess
66
+ op.banner = "Usage: guess <partial-config.yml>"
67
+ op.on('-o', '--output PATH', 'Path to a file to write the guessed configuration') do |path|
68
+ options[:nextConfigOutputPath] = path
69
+ end
70
+ op.on('-I', '--load-path PATH', 'Add ruby script directory path or jar file path') do |load_path|
71
+ load_paths << load_path
72
+ end
73
+ args = 1..1
74
+
75
+ #when :generate # or :new
76
+ # TODO create plugin templates
77
+
78
+ when :gem
79
+ require 'rubygems/gem_runner'
80
+ Gem::GemRunner.new.run argv
81
+ exit 0
82
+
83
+ when :example
84
+ args = 0..1
85
+
86
+ when :exec
87
+ exec *argv
88
+ exit 127
89
+
90
+ else
91
+ usage "Unknown subcommand #{subcmd.dump}."
92
+ end
93
+
94
+ begin
95
+ op.parse!(argv)
96
+ unless args.include?(argv.length)
97
+ usage nil
98
+ end
99
+ rescue => e
100
+ usage e.to_s
101
+ end
102
+
103
+ case subcmd.to_sym
104
+ when :bundle
105
+ path = argv[0] || default_bundle_path
106
+
107
+ require 'fileutils'
108
+ require 'rubygems/gem_runner'
109
+ setup_load_paths(load_paths)
110
+
111
+ unless File.exists?(path)
112
+ puts "Initializing #{path}..."
113
+ FileUtils.mkdir_p File.dirname(path)
114
+ begin
115
+ success = false
116
+
117
+ # copy embulk/data/bundle/ directory
118
+ if __FILE__ =~ /^classpath:/ || __FILE__.include?('!/')
119
+ # data is in embulk-core jar
120
+ resource_class = org.embulk.command.Runner.java_class
121
+ %w[.bundle/config embulk/input_example.rb embulk/output_example.rb Gemfile Gemfile.lock].each do |file| # TODO get file list from the jar
122
+ url = resource_class.resource("/embulk/data/bundle/#{file}").to_s
123
+ dst = File.join(path, file)
124
+ FileUtils.mkdir_p File.dirname(dst)
125
+ FileUtils.cp(url, dst)
126
+ end
127
+ else
128
+ #tmpl = File.join(File.dirname(__FILE__), '../data/bundle')
129
+ tmpl = File.join(Embulk.home('lib'), 'embulk', 'data', 'bundle')
130
+ FileUtils.cp_r tmpl, path
131
+ end
132
+
133
+ ## TODO this is disabled for now. enable this if you want to use
134
+ ## create bin/embulk
135
+ #bin_embulk_path = File.join(path, 'bin', 'embulk')
136
+ #FileUtils.mkdir_p File.dirname(bin_embulk_path)
137
+ #require 'embulk/command/embulk_generate_bin' # defines Embulk.generate_bin
138
+ #File.open(bin_embulk_path, 'wb', 0755) {|f| f.write Embulk.generate_bin(bundle_path: :here) }
139
+
140
+ # install bundler
141
+ setup_gem_paths(path)
142
+ Gem::GemRunner.new.run %w[install bundler]
143
+
144
+ success = true
145
+ rescue Gem::SystemExitException => e
146
+ raise e if e.exit_code != 0
147
+ success = true
148
+ ensure
149
+ FileUtils.rm_rf path unless success
150
+ end
151
+ else
152
+ setup_gem_paths(path)
153
+ end
154
+
155
+ ENV['BUNDLE_GEMFILE'] = File.expand_path File.join(path, "Gemfile")
156
+ Dir.chdir(path) do
157
+ require 'bundler'
158
+ require 'bundler/friendly_errors'
159
+ require 'bundler/cli'
160
+ Bundler.with_friendly_errors do
161
+ # run > bundle install
162
+ Bundler::CLI.start(%w[install], debug: true)
163
+ end
164
+ end
165
+
166
+ when :example
167
+ require_relative 'embulk_example'
168
+ path = ARGV[0] || "embulk-example"
169
+ puts "Creating #{path} directory..."
170
+ Embulk.create_example(path)
171
+ puts ""
172
+ puts "Run following subcommands to try embulk:"
173
+ puts ""
174
+ puts " 1. guess #{File.join(path, 'example.yml')} -o config.yml"
175
+ puts " 2. preview config.yml"
176
+ puts " 3. run config.yml"
177
+ puts ""
178
+
179
+ else
180
+ require 'json'
181
+
182
+ begin
183
+ java.lang.Class.forName('org.embulk.command.Runner')
184
+ rescue java.lang.ClassNotFoundException
185
+ # load classpath
186
+ classpath_dir = Embulk.home('classpath')
187
+ jars = Dir.entries(classpath_dir).select {|f| f =~ /\.jar$/ }.sort
188
+ jars.each do |jar|
189
+ require File.join(classpath_dir, jar)
190
+ end
191
+ end
192
+
193
+ setup_load_paths(load_paths)
194
+
195
+ org.embulk.command.Runner.new(options.to_json).main(subcmd, argv.to_java(:string))
196
+ end
197
+ end
198
+
199
+ def self.home(dir)
200
+ home = File.expand_path('../../..', File.dirname(__FILE__))
201
+ File.join(home, dir)
202
+ end
203
+
204
+ private
205
+
206
+ def self.setup_gem_paths(path)
207
+ # install bundler gem here & use bundler installed here
208
+ ENV['GEM_HOME'] = File.expand_path File.join(path, Gem.ruby_engine, RbConfig::CONFIG['ruby_version'])
209
+ ENV['GEM_PATH'] = ''
210
+ Gem.clear_paths # force rubygems to reload GEM_HOME
211
+ end
212
+
213
+ def self.setup_load_paths(load_paths)
214
+ load_paths.each do |load_path|
215
+ if File.file?(load_path)
216
+ # jar files
217
+ require File.expand_path(load_path)
218
+ else
219
+ # ruby script directory (add at the beginning of $LOAD_PATH to make it highest priority)
220
+ $LOAD_PATH.unshift File.expand_path(load_path)
221
+ end
222
+ end
223
+ end
224
+
225
+ def self.usage(message)
226
+ STDERR.puts "usage: <command> [--options]"
227
+ STDERR.puts "commands:"
228
+ STDERR.puts " bundle [directory] # create or update plugin environment."
229
+ STDERR.puts " run <config.yml> # run a bulk load transaction."
230
+ STDERR.puts " preview <config.yml> # dry-run the bulk load without output and show preview."
231
+ STDERR.puts " guess <partial-config.yml> -o <output.yml> # guess missing parameters to create a complete configuration file."
232
+ STDERR.puts " gem <install | list | help> # install a plugin or show installed plugins."
233
+ STDERR.puts " # plugin path is #{ENV['GEM_HOME']}"
234
+ STDERR.puts " example [path] # creates an example config file and csv file to try embulk."
235
+ STDERR.puts ""
236
+ if message
237
+ STDERR.puts "error: #{message}"
238
+ else
239
+ STDERR.puts "Use \`<command> --help\` to see description of the commands."
240
+ end
241
+ exit 1
242
+ end
243
+ end
@@ -0,0 +1,3 @@
1
+ ---
2
+ BUNDLE_PATH: .
3
+ BUNDLE_DISABLE_SHARED_GEMS: '1'
@@ -0,0 +1,31 @@
1
+ source 'https://rubygems.org/'
2
+
3
+ # Plugin bundle:
4
+ #
5
+ # a) Using plugins released on RubyGems:
6
+ # You can write plugin names (and versions) to this file to include
7
+ # the plugins released on RubyGems. To use those plugins,
8
+ #
9
+ # 1. modify this Gemfile. Examples are at the end of this file.
10
+ # 2. update Gemfile.lock using: embulk bundle <this dir>
11
+ # 3. run embulk with -b option: embulk run -b <this dir> example.yml
12
+ #
13
+ # b) Using simple single-file ruby plugins:
14
+ # You can put a simple ruby plugins to <this dir>/embulk directory.
15
+ # When you run embulk with -b <this dir> option, embulk loads them:
16
+ #
17
+ # $ embulk run -b <this dir> example.yml
18
+ #
19
+ # See <this dir>/embulk/* files for example. When the plugin works,
20
+ # you can release the plugin to RubyGems with "embulk-plugin-foobar"
21
+ # name to deploy them to servers.
22
+ #
23
+
24
+ # Plugins
25
+ #
26
+ #gem 'embulk-plugin-foo'
27
+ #gem 'embulk-plugin-bar', '~> 0.1.0'
28
+ #gem 'embulk-plugin-baz', '= 0.2.0'
29
+ #gem 'embulk-plugin-xyz', '>= 0.3.0'
30
+ #
31
+
@@ -0,0 +1,8 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+
5
+ PLATFORMS
6
+ java
7
+
8
+ DEPENDENCIES
@@ -0,0 +1,40 @@
1
+ module Embulk
2
+
3
+ class InputExample < InputPlugin
4
+ # input plugin file name must be: embulk/output_<name>.rb
5
+ Plugin.register_input('example', self)
6
+
7
+ def self.transaction(config, &control)
8
+ task = {
9
+ 'message' => config.param('message', :string, default: nil)
10
+ }
11
+ threads = config.param('threads', :integer, default: 2)
12
+
13
+ columns = [
14
+ Column.new(0, 'col0', :long),
15
+ Column.new(1, 'col1', :double),
16
+ Column.new(2, 'col2', :string),
17
+ ]
18
+
19
+ puts "Example input started."
20
+ commit_reports = yield(task, columns, threads)
21
+ puts "Example input finished. Commit reports = #{commit_reports.to_json}"
22
+
23
+ return {}
24
+ end
25
+
26
+ def self.run(task, schema, index, page_builder)
27
+ puts "Example input thread #{index}..."
28
+
29
+ 10.times do |i|
30
+ page_builder.add([i, 10.0, "example"])
31
+ end
32
+ page_builder.finish # don't forget to call finish :-)
33
+
34
+ commit_report = {
35
+ }
36
+ return commit_report
37
+ end
38
+ end
39
+
40
+ end