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.
- checksums.yaml +15 -0
- data/.gitignore +13 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +33 -0
- data/README.md +117 -0
- data/Rakefile +58 -0
- data/bin/embulk +63 -0
- data/build.gradle +149 -0
- data/embulk-cli/build.gradle +6 -0
- data/embulk-cli/pom.xml +94 -0
- data/embulk-cli/src/main/java/org/embulk/cli/Main.java +15 -0
- data/embulk-core/build.gradle +6 -0
- data/embulk-core/pom.xml +143 -0
- data/embulk-core/src/main/java/org/embulk/EmbulkService.java +39 -0
- data/embulk-core/src/main/java/org/embulk/command/Runner.java +199 -0
- data/embulk-core/src/main/java/org/embulk/command/TablePrinter.java +119 -0
- data/embulk-core/src/main/java/org/embulk/config/CommitReport.java +26 -0
- data/embulk-core/src/main/java/org/embulk/config/Config.java +15 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigDefault.java +15 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigException.java +20 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigLoader.java +83 -0
- data/embulk-core/src/main/java/org/embulk/config/ConfigSource.java +28 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSource.java +35 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceImpl.java +208 -0
- data/embulk-core/src/main/java/org/embulk/config/DataSourceSerDe.java +80 -0
- data/embulk-core/src/main/java/org/embulk/config/GenericTypeReference.java +20 -0
- data/embulk-core/src/main/java/org/embulk/config/ModelManager.java +125 -0
- data/embulk-core/src/main/java/org/embulk/config/NextConfig.java +26 -0
- data/embulk-core/src/main/java/org/embulk/config/Task.java +10 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskInvocationHandler.java +180 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskSerDe.java +343 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskSource.java +28 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskValidationException.java +37 -0
- data/embulk-core/src/main/java/org/embulk/config/TaskValidator.java +24 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecModule.java +45 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecuteInterruptedException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExecuteResult.java +19 -0
- data/embulk-core/src/main/java/org/embulk/exec/ExtensionServiceLoaderModule.java +43 -0
- data/embulk-core/src/main/java/org/embulk/exec/ForSystemConfig.java +16 -0
- data/embulk-core/src/main/java/org/embulk/exec/GuessExecutor.java +307 -0
- data/embulk-core/src/main/java/org/embulk/exec/LocalExecutor.java +274 -0
- data/embulk-core/src/main/java/org/embulk/exec/LoggerProvider.java +30 -0
- data/embulk-core/src/main/java/org/embulk/exec/NoSampleException.java +10 -0
- data/embulk-core/src/main/java/org/embulk/exec/PooledBufferAllocator.java +58 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewExecutor.java +138 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewResult.java +27 -0
- data/embulk-core/src/main/java/org/embulk/exec/PreviewedNoticeError.java +17 -0
- data/embulk-core/src/main/java/org/embulk/exec/SamplingParserPlugin.java +116 -0
- data/embulk-core/src/main/java/org/embulk/exec/SystemConfigModule.java +24 -0
- data/embulk-core/src/main/java/org/embulk/jruby/JRubyPluginSource.java +69 -0
- data/embulk-core/src/main/java/org/embulk/jruby/JRubyScriptingModule.java +100 -0
- data/embulk-core/src/main/java/org/embulk/plugin/BuiltinPluginSourceModule.java +17 -0
- data/embulk-core/src/main/java/org/embulk/plugin/InjectedPluginSource.java +92 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginManager.java +34 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginSource.java +6 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginSourceNotMatchException.java +19 -0
- data/embulk-core/src/main/java/org/embulk/plugin/PluginType.java +47 -0
- data/embulk-core/src/main/java/org/embulk/plugin/SetThreadContextClassLoader.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/Buffer.java +113 -0
- data/embulk-core/src/main/java/org/embulk/spi/BufferAllocator.java +8 -0
- data/embulk-core/src/main/java/org/embulk/spi/Column.java +92 -0
- data/embulk-core/src/main/java/org/embulk/spi/ColumnConfig.java +79 -0
- data/embulk-core/src/main/java/org/embulk/spi/DecoderPlugin.java +16 -0
- data/embulk-core/src/main/java/org/embulk/spi/EncoderPlugin.java +16 -0
- data/embulk-core/src/main/java/org/embulk/spi/Exec.java +76 -0
- data/embulk-core/src/main/java/org/embulk/spi/ExecAction.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/ExecSession.java +105 -0
- data/embulk-core/src/main/java/org/embulk/spi/Extension.java +42 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInput.java +11 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInputPlugin.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileInputRunner.java +113 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutput.java +13 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputPlugin.java +20 -0
- data/embulk-core/src/main/java/org/embulk/spi/FileOutputRunner.java +167 -0
- data/embulk-core/src/main/java/org/embulk/spi/FormatterPlugin.java +18 -0
- data/embulk-core/src/main/java/org/embulk/spi/GuessPlugin.java +9 -0
- data/embulk-core/src/main/java/org/embulk/spi/InputPlugin.java +20 -0
- data/embulk-core/src/main/java/org/embulk/spi/OutputPlugin.java +21 -0
- data/embulk-core/src/main/java/org/embulk/spi/Page.java +45 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageBuilder.java +327 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageFormat.java +47 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageOutput.java +11 -0
- data/embulk-core/src/main/java/org/embulk/spi/PageReader.java +227 -0
- data/embulk-core/src/main/java/org/embulk/spi/ParserPlugin.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/Schema.java +101 -0
- data/embulk-core/src/main/java/org/embulk/spi/SchemaConfig.java +52 -0
- data/embulk-core/src/main/java/org/embulk/spi/SchemaVisitor.java +14 -0
- data/embulk-core/src/main/java/org/embulk/spi/Transactional.java +10 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileInput.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalFileOutput.java +19 -0
- data/embulk-core/src/main/java/org/embulk/spi/TransactionalPageOutput.java +17 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/DateTimeZoneSerDe.java +57 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelper.java +8 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/JRubyTimeParserHelperFactory.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/Timestamp.java +159 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormat.java +98 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampFormatter.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParseException.java +6 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampParser.java +60 -0
- data/embulk-core/src/main/java/org/embulk/spi/time/TimestampSerDe.java +50 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/AbstractType.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/BooleanType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/DoubleType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/LongType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/StringType.java +12 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/TimestampType.java +39 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/Type.java +15 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/TypeDeserializer.java +47 -0
- data/embulk-core/src/main/java/org/embulk/spi/type/Types.java +14 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/CharsetSerDe.java +55 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Decoders.java +81 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Encoders.java +81 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/FileInputInputStream.java +110 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/FileOutputOutputStream.java +94 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/InputStreamFileInput.java +111 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Inputs.java +74 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/LineDecoder.java +118 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/LineEncoder.java +109 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/ListFileInput.java +52 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Newline.java +38 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/PagePrinter.java +102 -0
- data/embulk-core/src/main/java/org/embulk/spi/util/Pages.java +139 -0
- data/embulk-core/src/test/java/org/embulk/EmbulkTestRuntime.java +110 -0
- data/embulk-core/src/test/java/org/embulk/GuiceBinder.java +72 -0
- data/embulk-core/src/test/java/org/embulk/RandomManager.java +53 -0
- data/embulk-core/src/test/java/org/embulk/TestPluginSourceModule.java +23 -0
- data/embulk-core/src/test/java/org/embulk/TestUtilityModule.java +17 -0
- data/embulk-core/src/test/java/org/embulk/config/TestConfigSource.java +114 -0
- data/embulk-core/src/test/java/org/embulk/config/TestTaskSource.java +70 -0
- data/embulk-core/src/test/java/org/embulk/plugin/MockPluginSource.java +57 -0
- data/embulk-core/src/test/java/org/embulk/plugin/TestPluginType.java +18 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockFileOutput.java +63 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockFormatterPlugin.java +101 -0
- data/embulk-core/src/test/java/org/embulk/spi/MockParserPlugin.java +73 -0
- data/embulk-core/src/test/java/org/embulk/spi/PageTestUtils.java +78 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileInputInputStream.java +67 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileInputRunner.java +180 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestFileOutputRunner.java +192 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestInputStreamFileInput.java +188 -0
- data/embulk-core/src/test/java/org/embulk/spi/TestPageBuilderReader.java +301 -0
- data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestamp.java +116 -0
- data/embulk-core/src/test/java/org/embulk/spi/time/TestTimestampFormatterParser.java +52 -0
- data/embulk-core/src/test/java/org/embulk/spi/type/TestTypeSerDe.java +45 -0
- data/embulk-core/src/test/java/org/embulk/spi/util/TestLineDecoder.java +132 -0
- data/embulk-core/src/test/java/org/embulk/spi/util/TestLineEncoder.java +123 -0
- data/embulk-standards/build.gradle +6 -0
- data/embulk-standards/pom.xml +68 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvFormatterPlugin.java +158 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvParserPlugin.java +233 -0
- data/embulk-standards/src/main/java/org/embulk/standards/CsvTokenizer.java +355 -0
- data/embulk-standards/src/main/java/org/embulk/standards/GzipFileDecoderPlugin.java +55 -0
- data/embulk-standards/src/main/java/org/embulk/standards/GzipFileEncoderPlugin.java +39 -0
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileInputPlugin.java +138 -0
- data/embulk-standards/src/main/java/org/embulk/standards/LocalFileOutputPlugin.java +128 -0
- data/embulk-standards/src/main/java/org/embulk/standards/NullOutputPlugin.java +46 -0
- data/embulk-standards/src/main/java/org/embulk/standards/S3FileInputPlugin.java +238 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginExtension.java +16 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StandardPluginModule.java +44 -0
- data/embulk-standards/src/main/java/org/embulk/standards/StdoutOutputPlugin.java +71 -0
- data/embulk-standards/src/main/resources/META-INF/services/org.embulk.spi.Extension +1 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestCsvParserPlugin.java +69 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestCsvTokenizer.java +291 -0
- data/embulk-standards/src/test/java/org/embulk/standards/TestS3FileInputPlugin.java +43 -0
- data/embulk.gemspec +27 -0
- data/examples/config.yml +34 -0
- data/examples/csv/sample.csv.gz +0 -0
- data/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/gradle/wrapper/gradle-wrapper.properties +6 -0
- data/gradlew +164 -0
- data/gradlew.bat +90 -0
- data/lib/embulk.rb +16 -0
- data/lib/embulk/buffer.rb +17 -0
- data/lib/embulk/column.rb +47 -0
- data/lib/embulk/command/embulk.rb +39 -0
- data/lib/embulk/command/embulk_example.rb +32 -0
- data/lib/embulk/command/embulk_generate_bin.rb +62 -0
- data/lib/embulk/command/embulk_run.rb +243 -0
- data/lib/embulk/data/bundle/.bundle/config +3 -0
- data/lib/embulk/data/bundle/Gemfile +31 -0
- data/lib/embulk/data/bundle/Gemfile.lock +8 -0
- data/lib/embulk/data/bundle/embulk/input_example.rb +40 -0
- data/lib/embulk/data/bundle/embulk/output_example.rb +51 -0
- data/lib/embulk/data_source.rb +66 -0
- data/lib/embulk/error.rb +5 -0
- data/lib/embulk/guess_charset.rb +26 -0
- data/lib/embulk/guess_csv.rb +195 -0
- data/lib/embulk/guess_gzip.rb +18 -0
- data/lib/embulk/guess_newline.rb +20 -0
- data/lib/embulk/guess_plugin.rb +113 -0
- data/lib/embulk/input_plugin.rb +53 -0
- data/lib/embulk/java/bootstrap.rb +12 -0
- data/lib/embulk/java/imports.rb +26 -0
- data/lib/embulk/java/time_helper.rb +77 -0
- data/lib/embulk/output_plugin.rb +104 -0
- data/lib/embulk/page.rb +28 -0
- data/lib/embulk/page_builder.rb +22 -0
- data/lib/embulk/plugin.rb +152 -0
- data/lib/embulk/plugin_registry.rb +70 -0
- data/lib/embulk/schema.rb +85 -0
- data/lib/embulk/time_format_guess.rb +331 -0
- data/lib/embulk/version.rb +3 -0
- data/pom.xml +533 -0
- data/settings.gradle +5 -0
- 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,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,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
|