はじめに
hkob の雑記録の第157回目は、昨日アップデートした Faraday でテストが通過するように実装を修正します。
controllers/notion_cache.rb
Faraday 2.0 になって FaradayMiddleware を利用しなくなりました。Faraday の記述は全て NotionCache でまとめて実施しているので、修正はほぼこのクラスだけになります。diff コマンドで差異を示します。- が消された行で、+ が追加された行になります。
まずFaraday::Nonnection.new で作成していた @client インスタンスは Faraday.new で作成します。 Notion-Version ヘッダは変化することがないので、コンストラクタで設定するようにしてしまいました。
def initialize @object_hash = {} - @client = Faraday::Connection.new "https://api.notion.com" do |builder| - builder.use FaradayMiddleware::EncodeJson - builder.use FaradayMiddleware::ParseJson - builder.adapter Faraday.default_adapter + @client = Faraday.new "https://api.notion.com" do |conn| + conn.request :json + # conn.response :json, parser_options: { symbolize_names: true } + conn.response :json + conn.headers["Notion-Version"] = NotionRubyMapping::NOTION_VERSION end @notion_token = nil
このため、実際にリクエストする部分から Notion-Version のヘッダ設定は除いています。
sleep @wait response = @client.send(method) do |request| request.headers["Authorization"] = "Bearer #{@notion_token}" - request.headers["Notion-Version"] = NotionRubyMapping::NOTION_VERSION case method when :get, :delete request.url path, options
version.rb
今回はメジャーバージョンアップにする予定です。
module NotionRubyMapping - VERSION = "0.8.9" + VERSION = "1.0.0" NOTION_VERSION = "2022-06-28" end
spec/spec_helper.rb
rspec を実行すると WebMock アクセス時に失敗していました。ヘッダファイルに User-Agent があり、ここに Faraday のバージョン番号が書かれていたためでした。
"Accept-Encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3", "Authorization" => "Bearer #{notion_token}", "Notion-Version" => NotionRubyMapping::NOTION_VERSION, - "User-Agent" => "Faraday v1.10.3", + "User-Agent" => "Faraday v2.13.1", }, } request[:body] = JSON.generate(payload) if payload
テスト再実行
ここまでやってテストを再度実行してみました。大量に Spec の結果の最後は以下のようになっていました。とりあえずこれまで設定したテストが Faraday 2.13.1 でも動作したようです。
NotionRubyMapping has a version number Finished in 0.78887 seconds (files took 0.84087 seconds to load) 2364 examples, 0 failures
おわりに
とりあえず Faraday のアップデートを行なっても動作することが確認できたので、アップデートを進めてみたいと思っています。せっかくのメジャーアップデートなので、内部を綺麗にしてみようと思います。まず、Faraday のコンストラクタでコメントした以下の行を活かしてみたいと思っています。
+ # conn.response :json, parser_options: { symbolize_names: true }
この設定をすることで、文字列をキーとしたハッシュだったのが、シンボルをキーとしたハッシュに変換できます。やはり Ruby で記載するならシンボルの方が簡単なので、こちらに変更したいと思っています。現在、テストの JSON データがほぼ全部文字列になっているので、それを全て修正するとともに、実装もシンボルで動作するように改訂していきます。
もう一つはせっかく Ruby 3.0 を最低条件に設定するので、3.0 から利用できる rbs を有効にしてみたいと思っています。
https://hkob.notion.site/hkob-16dd8e4e98ab807cbe3cf3cc94cdfe0f?pvs=4