Note

3年後の自分のために書いています

gem 'her' コードリーディング

と言いつつ途中から依存してる 'faraday' のコードリーディングがメインになった。

her 側で faraday_options 引数として渡した Hash を faraday 側では url という名前で扱っており、混乱したので記事にしておく。

バージョン

  • her (1.1.0)
  • faraday (0.17.3)

url のみ渡して setup

以下を実行した時に何が起こるか。

require 'her'
Her::API.setup url: "https://api.example.com"

Her::API.setup -> Her::API#initialize -> Her::API#setup と処理が流れていく。

Her::API#setup 内で Faraday.new する時 の実引数 faraday_options{ url: "https://api.example.com" } という Hash になる。

Faraday.new の時には実引数 faraday_options は仮引数 url として渡ってくる、第二引数 options は渡してないので nil になる。(ここの名前の紛らわしさで混乱した)

Faraday.new 内の Faraday::Connection.new で呼ばれた Faraday::Connection#initialize の仮引数 url は Hash なので、ここ で値を抜き取られて url 変数にセット、最終的には #url_prefix= で url_prefix にセットされる。(呼び出し側のここインスタンスメソッドの呼び出しを url_prefix= とするとローカル変数への代入になってしまうので self.url_prefix= としている。)

戻り値を her_api とすると her_api.connectin.url_prefix のようにアクセスできる。

url の他にもオプション渡して setup

README#ssl を参考に。

require 'her'
Her::API.setup url: "https://api.example.com", ssl: { ca_path: "/usr/lib/ssl/certs" }

この場合 Faraday.new の仮引数 url{ url: "https://api.example.com", ssl: { ca_path: "/usr/lib/ssl/certs" } } } のような Hash となる。options は引き続き nil、さあこれでも動くのか。

結論からいうと渡ってきた url が Hash の場合は ここoptions に代入してオプションとしても扱えるようにしてる。わお。

一応 コメントにも書いてあるのね。わお。

Can also be the options Hash.

ぶっちゃけここの柔軟性は不要だと思うけど、歴史的経緯があるのかな。

メモ

  • 仮引数が定義側、実引数が呼び出し側
  • faraday は Faraday::Options で Hash を Struct に変換してメソッド呼び出しできるようにしてるの面白かった

参考