Sorceryのコードを読んでみる
Sorceryの過去のバグ修正を見かけた時にoptionsの定義場所が分からなかったので調べてみた。
def tableized_model_class
options[:model] ? options[:model].gsub(/::/, '').tableize : 'users'
end
Sorceryにはソースコードのgeneratorがあり、自動でいくつかのファイルを作成してくれるのだが、その際に渡したオプションをテーブル名に変換するメソッドっぽい。
Sorcery内
上のファイル/lib/generators/sorcery/helpers.rb内をチェックしたところ、他にoptionsという変数やメソッドは定義されていなかった。
options[:model]はHelpersというmoduleの中に定義されていたので、Helpersを利用している箇所を調べてみる。
唯一/lib/generators/sorcery/install_generator.rbの中でだけincludeされ利用されていた。
このファイルの中でも同様にoptions[:migrations]のようにoptionsが利用されているが、定義は存在しない。
moduleをincludeしているクラスはInstallGeneratorであり、このクラスはRails::Generators::Baseを継承しているので、optionsの定義はSorcery内ではなくRails側にありそう
Rails内
Rails::Generators::Baseクラスはここに定義はされている
が、ここでもoptionsは利用されているだけであり、定義されてないので、さらに継承ツリーを辿る。
class Base < Thor::Groupとある通り、Rails::Generators::BaseはThorというgemのGroupクラスを継承していた。
ここでThorについて軽く調べると、CLI作成時に利用できるgemらしいというのがわかった。
Thor内
上でRails::Generators::Baseが継承していたGroupクラスはここにあった
が、この中でもoptionsについて定義している箇所はない。
そしてThor::Groupは他のクラスを継承していない(正確には書かれていないだけでObjectクラスを継承している)
よく見ると、かなり下の方でinclude Thor::Baseという記述があり、Baseモジュールをincludeしていたので確認してみる。
35行目に
attr_accessor :options, :parent_options, :args
という記述があった。おそらくこれ?
※ attr_accessorって何だ? という人へ
Thor::Baseのドキュメントにはoptionsインスタンスメソッドについて記載がある
まとめ
SorceryはRailsを継承していて、さらにRailsはThorを継承していて、そのThorの中に定義されていた。
1. 一番最初に書いたoptionsがあるモジュールは、SorceryのInstallGeneratorクラスが唯一includeしている
2. SorceryのInstallGeneratorはRailsのRails::Generators::Baseクラスを継承している
3. Rails::Generators::BaseはThorのThor::Groupクラスを継承している
4. Thor::GroupはThor::Baseモジュールをincludeしている
5. Thor::Baseの中で、optionsが定義されていた。
optionsメソッドは何をしているのか?
CLIのオプションで設定した値を取得できる。
Railsガイドに詳しく書かれているので以下引用
Railsのジェネレータは、カスタムのコマンドライン引数を与えることで簡単に挙動を変更できます。この機能はThorを利用しています。
class_option :scope, type: :string, default: 'read_products'
これで、ジェネレータを以下のように呼び出せます。
rails generate initializer --scope write_products
このコマンドライン引数は、ジェネレータクラス内ではoptionsメソッドでアクセスできます。
@scope = options['scope']
thanks
分からない箇所はstack overflowで@nekketsuuuさんがサポートしてくださいました。
その他
まだ理解しきれておらず、もしかしたら間違えているかもしれないので何かあればコメント頂ければ幸いです
Discussion