JRuby 9.2.0.0-SNAPSHOTの調査

RuboCop の Travis CI で jruby-head が落ちているのが気に掛かっていたので、少し調べようと思った。まずは環境が必要。

現在 zip のダウンロードができない問題から、普段使いの rbenv では jruby-head がインストールできないため、Travis CI のログをもとに RVM を使ってインストールする。

% rvm get stable
% rvm remove ${ruby_alias:-jruby-head} --gems
% rvm remove jruby-head --gems --fuzzy
% rvm install jruby-head --binary

絞り込んでみた Excepted と Actual は以下。後述の Issue から抜粋した振る舞いの違いとなる。

Expected Behavior

JRuby 9.1.13.0 and MRI 2.4.2 の振る舞い。

% rvm use jruby-9.1.13.0
Using /home/vagrant/.rvm/gems/jruby-9.1.13.0
% rake --version
rake, version 12.1.0
% ruby -e 'system("rake --version")'
rake, version 12.1.0

Actual Behavior

JRuby 9.2.0.0-SNAPSHOT の振る舞い。

% rvm use jruby-head
Using /home/vagrant/.rvm/gems/jruby-head
% rake --version
rake, version 12.1.0
% ruby -e 'system("rake --version")' # Do not return `rake` version

どうも system まわりが問題だと特定はできたもののよく分からない。とりあえず Issue にてレポートをした。

JRuby 9.2.0.0-SNAPSHOT does not return result of `rake` via `system` · Issue #4809 · jruby/jruby · GitHub

3連休

だいたい RuboCop 引きこもりだった。レビューしてもらっている PR がいくつかある状態で PR を増やしたくなかったので、手元にだけある wip ブランチが 3 つほど増えたのが成果。ものとしては概ね出来ているので順々に出して行く予定。

あと Heaven's Feel が始まる前に、見ようと思って届いていた SOA オーディナル・スケールを英語字幕を付けて見ていたりした。

今日の Cop 業

なんだっけ? (この日記は 10/9 に書いている) Lint/ShadowedException cop へのレアケースな Issue を Fix した PR に、バグレポーターからまだ対応が足りていなかったフィードバックをもらったのでパッチを足したり、Ruby 1.9 のコードが残っていたので消 (すのに複数 Ruby 環境で確認) したり、テッドさんから提案してもらった内部業務の Cop を作ったりしていた。

Lint/ShadowedException cop のフィードバックは再現ケースがついていたので、かなり助かった。再現ケースほんとうに重要。

あとは Heaven's Feel が今週末の開演だったのでチケットを買ったりしてた。

stub_constで少しハマった話

具体的には以下のコードを書くのに、おや?となっていた。Errno は環境依存の話になる (ので stub_const している) 、いちおう手元の MacOS X 10.9 (古い!) での話となる。

    it 'accepts rescuing multiple same error code exceptions' do
      # System dependent error code depends on runtime environment.
      stub_const('Errno::EAGAIN::Errno', 35)
      stub_const('Errno::EWOULDBLOCK::Errno', 35)

      expect_no_offenses(<<-RUBY.strip_indent)
        begin
          something
        rescue Errno::EAGAIN, Errno::EWOULDBLOCK
          handle_exception
        end
      RUBY
    end

github.com

例えば以下のように Errno::EAGAIN::Errno の値のみ 34 にしようしたら、Errno::EWOULDBLOCK::Errno まで 34 になる。

stub_const('Errno::EAGAIN::Errno', 34)

stub_const の使い方を間違っていたかなと、しばし逡巡してログを仕込んだりでもしやと思ったら以下が理由だった。

> Errno::EAGAIN.object_id == Errno::EWOULDBLOCK.object_id
=> true

もっと書くとこう。

> Errno::EWOULDBLOCK
=> Errno::EAGAIN

なるほどなあ。

Rails/TopLevelInclude cop を提案した

以下の PR となる。

github.com

この Cop を提案した経緯なんかは、今日申し込んだ福岡Ruby会議02の前夜祭 LT で話そうかなと思っている (ので今日の日記には書きません) 。

fukuokarb.connpass.com