古いgemをインストールしようとすると警告を出すgemを作った

昨日メンテナンスされていないgemをインストールしてはまって大変だったので、インストールする際に古いgemだと警告を出すgemを作った。

1年以上メンテナンスされていなかったら警告を出すようにしている。1年という期間に特に理由があるわけではないんだけど、それだけ古かったら危ないだろうなあという直感。

rubygems.orgにも上げたので、以下のコマンドでインストール出来る。

$ gem install check-date

仕組み

RubyGemsにはインストール前/後、アンインストール前/後にフックを仕掛ける機能があり、今回のgemではそれを利用している。RubyGemsrubygems_plugin.rbというファイルを探すので、そのファイルの中にフックや独自コマンドなどを記述するといいらしい。今回はフックを書きたかったので、ぐぐって見つけたRubyGems Plugin Hook Safety · GitHubを参考にした。

# lib/rubygems_plugin.rb
require "rubygems/installer"
require "check-date/hook"

フックの処理は以下のように書いている。インストールしようとしているgemの作成日が1年以上前だと警告を出す。Yを押すとそのままインストールを実行して、nを押すとabortするようにしている。

# lib/check-date/hook.rb
Gem.pre_install do |installer|
  today = Time.now
  year_sec = 365 * 24 * 60 * 60

  if (today - installer.spec.date) / year_sec > 1 then
    if !Gem::ConsoleUI.new.ask_yes_no("This gem was updated more than 1 years ago. (last update: #{installer.spec.date})\nInstall this gem?", true) then
      abort
    end
  end
end

そんなに複雑なことをしているわけではないんだけど、ネット上を探してもGem.pre_installを使っているサンプルがあまりなく、どう書けばいいか調べるのが大変だった。