と言いつつ途中から依存してる '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.