LoginSignup
3
4

More than 5 years have passed since last update.

Embulk - ソースコードリーディング No.2

Last updated at Posted at 2015-01-28

バッチ処理データ連携ツールの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))

今日はここまで
続きは次回にて

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4