inohilog

/var/log/inohiro.log

oauth-ruby 0.4.5 で走っていたコードが,最新版(0.4.7)にしたら走らなくなった問題

NoMethodError (undefined method `<=>' for :oauth_token:Symbol):
  oauth (0.4.7) lib/oauth/helper.rb:37:in `<=>'
  oauth (0.4.7) lib/oauth/helper.rb:37:in `sort'
  oauth (0.4.7) lib/oauth/helper.rb:37:in `normalize'
  oauth (0.4.7) lib/oauth/consumer.rb:359:in `create_http_request'
  oauth (0.4.7) lib/oauth/consumer.rb:187:in `create_signed_request'
  oauth (0.4.7) lib/oauth/consumer.rb:159:in `request'
  oauth (0.4.7) lib/oauth/consumer.rb:194:in `token_request'
  oauth (0.4.7) lib/oauth/tokens/request_token.rb:18:in `get_access_token'
  • RequestToken.get_access_token に渡す引数をURLとして組み立てるときに正規化(normalize)するメソッドが追加され,その中で sort を行なっている
  • 引数が Hash だと Key がシンボルの場合ソート出来ない => エラーになった
$ git diff v0.4.5 v0.4.7 lib/oauth/consumer.rb

@@ -351,9 +356,8 @@ module OAuth
       end
 
       if data.is_a?(Hash)
-        form_data = {}
-        data.each {|k,v| form_data[k.to_s] = v if !v.nil?}
-        request.set_form_data(form_data)
+        request.body = OAuth::Helper.normalize(data)
+        request.content_type = 'application/x-www-form-urlencoded'
       elsif data
         if data.respond_to?(:read)
           request.body_stream = data
  • RequestToken.get_access_token の引数に,Hash を使う場合は,Key に文字列を使うように変更
             access_token = request_token.get_access_token( {},
-                                                           :oauth_token => params[:oauth_token],
-                                                           :oauth_verifier => params[:oauth_verifier] )
+                                                           'oauth_token' => params['oauth_token'],
+                                                           'oauth_verifier' => params['oauth_verifier'] )

その他

可変長の引数を受け取るメソッドの定義
  • これまではデフォルト引数(default arguments)に配列とかを渡していた
  • そういえばオプショナル引数(optional arguments)なんかあったな
def hoge( a, b = [] )
end

def fuga( a, *b )
end
git でタグ間の diff などを見る方法