最新版のrestful-authenticationはどこにある?

restful-authenticationというと、Rails界では代表的な、そして古株の認証プラグインである。本ブログでも取り上げたことがあるのだが、ブクマ数やアクセスログを見たところ、いまでもそれなりの需要があるようだ。

restful_authenticationを触ってみた - idesaku blog

ところが、本プラグインの大本であるGitHub - technoweenie/restful-authentication: Generates common user authentication code for Rails/Merb, with a full test/unit and rspec suite and optional Acts as State Machine support built-in.は、どうやら現在メンテナンスされていないようなのである。

いくつかの不具合

最近になって本プラグインを使い始めて、自動生成したspecを走らせた人は戸惑ったのではないかと思うのだが、全てのspecをパスしてくれない。Railsバージョンアップにより失われているメソッドを呼び出そうとしてエラーになるのだ。私はRails 2.3.4で確認したが、Rails 2.3.2の頃からこの状態らしい

また、Rails 2.3.6でrakeを呼んでみると、こんな警告が出る。

DEPRECATION WARNING: Rake tasks in vendor/plugins/restful_authentication/tasks are deprecated. Use lib/tasks instead. (called from /opt/local/lib/ruby/gems/1.8/gems/rails-2.3.6/lib/tasks/rails.rb:10)

こんな感じで、Railsのアップデートに追従していないのが現状である。restful-authenticationはもう終わりなのか?

最新版?

ふと思い立ち、rubygems.orgを見に行ってみたのだが、いつの間にかrestful_authentication.gemが存在している

かつてはvendor/plugins/にライブラリを自分で配置して使うようになっていて、gemなんて存在しなかった。バージョンは1.1.6。本家のものは1.1.1なので、数値の上では進んでいる。

ここからたどると、gemの配布元はhttp://github.com/jeremydurham/restful-authenticationであることがわかる。本家からフォークしたプロジェクトだ。フォークした理由はここに書いてあるが、どうも新しいプロジェクトを作ってrestful-authenticationを使うたびにあちこち書き換えなきゃいけないことに嫌気がさしたので、書き直してやろうと考えたらしい。

かようなgemを配布しているということは、メンテナンスを引き継いだということだろうか?しかし、バージョン1.1.6しか存在しないのが気になる。また、同じ作者によるjeremydurham-restful_authentication.gemっていうやつもあって、しかもバージョンが少し進んでいる。

もう何を使ったらよいものか。しかし、どちらにしろgem版は前述したいくつかの問題を解消したうえに、テストおよび環境の改善を行っているようだ。比較的新しい環境でプロジェクトを始めたい場合は、こちらを使った方がよいかもしれない。

This fork significantly updates the plugin to provide:

  • 100% passing specs
  • 100% passing cucumber features (with selenium support)
  • Machinist support
  • Pickle support
  • Available as a gem
  • Uses aasm gem

ところが、このプロジェクトのREADMEはフォーク元プロジェクトのものをほぼそのまま使っており、使い方がよくわからない。"Available as a gem"は結構なことだが、それを使ったインストール方法の説明がありませんがな?

新規プロジェクト作成

しかしまぁ、config.gemに食わせれば動くだろう(適当)。Rails 2.3.6でお試し。

rubygemsを最新版にしておく。

$ sudo gem update --system

railsプロジェクトを作る。

$ rails auth
$ cd auth

config/environment.rbに、restful-authenticationへの依存を記述する。:versionの記述は任意。AASMを使ったアクティベーション機構も取り入れてみるつもりなので、ついでに定義*1。fakerとmachinistは、restful-authenticationが利用する*2

config.gem "jeremydurham-restful_authentication", :lib => "restful_authentication", :version => ">= 1.1.7"
# またはこっち。
# config.gem "restful_authentication", :version => ">= 1.1.6"

config.gem "aasm", :version => ">= 2.1.5"
config.gem "faker"
config.gem "machinist"

gemをインストールする。

$ sudo rake gems:install

specがパスするようになっているか確認したいので、rspec-railsを有効にする。

$ sudo gem install rspec-rails
$ ruby script/generate rspec

あとはこれまでどおりの使い方。

$ ruby script/generate authenticated --rspec --aasm user sessions
$ rake db:migrate

UserControllerの"include AuthenticatedSystem"を、ApplicationControllerに移動させる。

で、specを走らせてみる。

$ rake spec
(in /Users/idesaku/sandbox/auth)
..........................................................................................................................................................................................................................................................................

Finished in 6.990711 seconds

266 examples, 0 failures

ちゃんと通りますな。specの中身も少し変わっている。本家でパスできなかった箇所を直しているのと、fixtureを使っていた箇所をMachinistにより作成したテストデータを使う形に変更してある。

ちなみに、Cucumber用のfeaturesも生成されるのだが、こちらは実行すると失敗しまくる。たぶん私の環境の問題だと思うので何とかしたいが、Cucumberをあまり知らないので、とりあえず放置。

既存プロジェクトのアップデート

ということは、アップデートしたい場合はこんな感じか。

vendor/plugins/restful_authenticationを消す。

$ rm -rf vendor/plugins/restful_authentication

git-submoduleを使っている場合は、.gitmodulesから下記のrestful_authenticationの記述も消す。

[submodule "vendor/plugins/restful_authentication"]
        path = vendor/plugins/restful_authentication
        url = git://github.com/technoweenie/restful-authentication.git

あとはconfig.gemの定義を新規プロジェクト作成手順同様に書き換えてやる。

これで動くんじゃないだろうか。とりあえず自前のプロジェクトに適用したみたが、specは全て通っているし、警告なども出なくなった。

変更があったのはテスト周りで機能的な変更は無いから、アップデートする動機はさほど無い。ただし、アップデートしない場合は、最初に紹介したDEPRECATION WARNINGをなんとかしないと、そのうちrake auth:gen:site_keyが動かなくなるかもしれない。

それとも、本家のままでも現在のバージョンのRailsであれば(specとfeatureを少し修正しなければならないが)動くのだから、この組み合わせをずっと使い続けることにするか?それもアリだと思う。もうRails 3の登場も近いし、そうなればたぶんこのプラグインは動かなくなるから、いずれRailsバージョンアップへの追従はあきらめることになるだろう。

これを使い続けていいのか?

いろいろ有用な変更を行っているようだが、同時に複雑になってるな、依存するライブラリも増えてるし。テストでしか使わないライブラリが、テスト以外の環境を汚染しているのもどうかと思う。

そもそも、今後はrestful_authentication.gemが主流ってことでいいのか?たぶん違うな、個人的なフォークなんだろう。委譲するというアナウンスも見あたらないし。

いつまでメンテナンスされるかわからないから、今後新しいプロジェクトを開始する場合は、自力で何とかする気合いが無い限りは別のプラグインの採用を検討すべきかもしれない。

*1:READMEにはrubyist-aasmを定義するように書いてあるが、今やrubygems.orgにaasm.gemがいるのでこの定義でいいはず。

*2:テスト用のライブラリだと思うのだが、config/initializers/machinist.rbで使っているため、environment.rbに定義せざるをえない。