Yapra: require時のエラーの表示を修正

  • ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux](RVMでインストールしたもの)
  • yuanying-yapra-v0.1.3-2-g8d130c0

mechanize がインストールされていない状態でmechanize を使うプラグインをロードすると、次のようなエラーメッセージが表示される。

NameError in 'undefined local variable or method `command' for #<Yapra::Pipeline:0x000000028f4420>'
/home/user/my-yapra/yapra/lib/yapra/pipeline_base.rb:37:in `load'
/home/user/my-yapra/yapra/lib/yapra/pipeline.rb:73:in `run_class_based_plugin'
/home/user/my-yapra/yapra/lib/yapra/pipeline.rb:54:in `execute_plugin'
/home/user/my-yapra/yapra/lib/yapra/pipeline.rb:37:in `block in run'
/home/user/my-yapra/yapra/lib/yapra/pipeline.rb:36:in `each'
/home/user/my-yapra/yapra/lib/yapra/pipeline.rb:36:in `inject'
/home/user/my-yapra/yapra/lib/yapra/pipeline.rb:36:in `run'
/home/user/my-yapra/yapra/lib/yapra/runtime.rb:47:in `execute_pipeline'
/home/user/my-yapra/yapra/lib/yapra/runtime.rb:37:in `block in execute'
/home/user/my-yapra/yapra/lib/yapra/runtime.rb:36:in `each'
/home/user/my-yapra/yapra/lib/yapra/runtime.rb:36:in `execute'
/home/user/my-yapra/yapra/bin/yapra:69:in `block in <main>'
/home/user/my-yapra/yapra/bin/yapra:55:in `each'
/home/user/my-yapra/yapra/bin/yapra:55:in `<main>'

実際は mechanize の require で LoadError になっているのだが、上のメッセージだけでは原因が分からない。

というか、 require でこけているのとは無関係に、ローカル変数 command が未定義だと言われている。


継承ツリー

  • Yapra::PipelineBase
    • Yapra::Pipeline
    • Yapra::RbPipeline

lib/yapra 以下の load() の出現箇所は次の2箇所。

pipeline.rb:    plugin = load(command['module'])
pipeline_base.rb:  def load plugin_name

なので、影響範囲は PipelineBase と Pipiline の該当箇所だけ。


load の引数にプラグイン名ではなく command を渡すようにしてみた。

pipeline_base.rb

-  def load plugin_name
+  def load command
+    plugin_name = command['module']

pipeline.rb

-    plugin = load(command['module'])
+    plugin = load(command)

https://github.com/sonota/yapra/commit/026a3e057366d0c12e45d8486c97725bb0f64e33

そうすると、エラー出力が次のようになり、mechanize のロードでこけてることが分かるようになった。

LoadError in 'cannot load such file -- mechanize': Misc::Sample module is not found. (LoadError)
	from /home/user/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from /home/user/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from /home/user/my-yapra/yapra/lib/yapra/plugin/mechanize_base.rb:1:in `<top (required)>'
	from /home/user/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from /home/user/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from /home/user/my-yapra/my-dir-class-base/yapra/plugin/misc/sample.rb:3:in `<top (required)>'
	from /home/user/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from /home/user/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
	from /home/user/my-yapra/yapra/lib/yapra.rb:32:in `load_class_constant'
	from /home/user/my-yapra/yapra/lib/yapra/pipeline_base.rb:33:in `block in load'
	from /home/user/my-yapra/yapra/lib/yapra/pipeline_base.rb:30:in `each'
	from /home/user/my-yapra/yapra/lib/yapra/pipeline_base.rb:30:in `load'
	from /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:74:in `run_class_based_plugin'
	from /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:54:in `execute_plugin'
	from /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:37:in `block in run'
	from /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:36:in `each'
	from /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:36:in `inject'
	from /home/user/my-yapra/yapra/lib/yapra/pipeline.rb:36:in `run'
(略)