バッチ処理データ連携ツールのEmbulkのソースコードリーディングを続けます
今日のリーディング範囲
今日からはQuick Startの2コマンド目のguessを読み進めたいと思います
量が多いので数日に分かれます
java -jar embulk.jar guess ./try1/example.yml -o config.yml
リーディング内容
embulk_run.rb
前回も出現した箇所ですが、ここでオプションを取得しています
オプション(-o)のみを残してguessオプションを取得していますね
embulk_run.rb#17
i = argv.find_index {|arg| arg !~ /^\-/ }
usage nil unless i
subcmd = argv.slice!(i)
そして取得してguessオプションを使いcaseで分岐させています
case内では-oオプションで指定されたアウトプットパスと、-Iで指定された追加jar or Rubyスクリプトパスの値を取得しています
この-iはreadmeには見当たらないですね
読んでいけばどう使うかわかるのでしょう
embulk_run.rb#34
case subcmd.to_sym
(中略)
when :guess
op.banner = "Usage: guess <partial-config.yml>"
op.on('-o', '--output PATH', 'Path to a file to write the guessed configuration') do |path|
options[:nextConfigOutputPath] = path
end
op.on('-I', '--load-path PATH', 'Add ruby script directory path or jar file path') do |load_path|
load_paths << load_path
end
args = 1..1
そしてcaseを抜けた後にはOptionParser#parseメソッドによりオプション解析を実施してます
embulk_run.rb#94
begin
op.parse!(argv)
unless args.include?(argv.length)
usage nil
end
rescue => e
usage e.to_s
end
最後にJavaをCallしてRuby部は終了です
ここでは
①org.embulk.command.Runnerをロード(見つからない場合はフォルダ指定)
②setup_load_paths関数で-Iで追加されたjarをrequire
③org.embulk.command.Runner#mainの呼び出し
※コンストラクタにはオプション情報(-oで渡した値)をJSON化して渡す
※mainメソッドにはサブコマンド(guess)とオプション(-o,-I)を渡して実行
ということを行っています
embulk_run.rb#180
require 'json'
begin
java.lang.Class.forName('org.embulk.command.Runner')
rescue java.lang.ClassNotFoundException
# load classpath
classpath_dir = Embulk.home('classpath')
jars = Dir.entries(classpath_dir).select {|f| f =~ /\.jar$/ }.sort
jars.each do |jar|
require File.join(classpath_dir, jar)
end
end
setup_load_paths(load_paths)
org.embulk.command.Runner.new(options.to_json).main(subcmd, argv.to_java(:string))
今日はここまで
続きは次回にて