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 に変換してメソッド呼び出しできるようにしてるの面白かった
参考
- GitHub - remi/her: Her is an ORM (Object Relational Mapper) that maps REST resources to Ruby objects. It is designed to build applications that are powered by a RESTful API instead of a database.
- GitHub - lostisland/faraday: Simple, but flexible HTTP client library, with support for multiple backends.