高尾宏治日記 on はてなブログ

プログラミング言語Rubyを中心とした技術情報を扱うブログです(Microsoft Surfaceはやめました)。

Rubocopを、Ruby 1.9.2系でも使う (rubocop192のご紹介) #rubyjp

ロボコップ 1987 のことではありません。 rubocop192 です

rubocop192 とは、rubocopRuby 1.9.2で動作させるためのソフトウェアです。なんでいまさら Ruby 1.9.2 なのかは聞かないでください。 rubocop について簡単に説明しますね。と、思ったけど以下の記事が詳しいのでそちらを確認してくださいませ。

インストールと使い方

rubocop192 を以下のように gem でインストールしたら、あとは rubocop とまったく同じように使うことができます。ただし、コマンド名は rubocop192 ですのでお間違えなく。

$ gem install rubocop192
(rbenvの方はここで $ rbenv rehash をお忘れなく)
$ rubocop192 path/to/file

rubocop192の仕組み

Ruby 1.9.2で rubocop が動作しないのは以下のコメントの部分が原因です。

ruby-1.9.2-p320/ext/json/lib/json/common.rb の 24 行目付近より

    # Set the JSON parser class _parser_ to be used by JSON.
    def parser=(parser) # :nodoc:
      @parser = parser

      # 以下の処理で const_defined? が定数 JSON::Parser ではなく定数
      # ::Parser が定義されているかをチェックしている。定数 ::Parser は定
      # 義されているので true を返す。その結果、remove_const は定数
      # JSON::Parser を削除しようとしてしまうのだが、定数 JSON::Parser は
      # 定義されていないため、ここで例外が発生してしまう。
      remove_const :Parser if const_defined? :Parser

      const_set :Parser, parser
    end

そこで、 rubocop192 では上記を正しく動作できるように JSON にモンキーパッチを適用してから本来の rubocop コマンドの処理を実行するようにしています( 参考:lib/rubocop192.rb )。

と、ここまで書いていて思ったのですが、 rubocop の gem の設定を確認する限り Ruby 1.9.2 にも対応すべきなので rubocop 自体を修正して Pull Request を送ればよかったですね。→ あとでやる

余談

今回はじめて、開発からRubyGems.orgへの登録までのgem作成に関する一連の作業をWindows上で行ってみました。

途中、

  • 何度かEmacsが異常終了したり
    • (必ず日本語入力中に異常終了するためIME関連だろうと推測しています)
  • Cygwin上で gem push pkg/rubocop192.gem ができなかったり
  • いちいち動作が遅かったり
    • gitの操作、Rubyスクリプトの実行など、全体的に遅い
    • 作業マシン(Surface Pro)は Core i5 1.6GHz なのでマシンのせいではない。OSの問題だと思う

といったことがありましたが、なんとかなりましたね。