Ruby用API生成フレームワーク「grape」のコードを読んでみる (後半)


前回からの続きでRuby用のAPI生成フレームワーク grape のコードを読んで見たのでメモ。

前半は初期化処理を見た。今回は、リクエスト処理の部分を見ていく。

まとめ

  • マウントしたクラス => マウントしたクラスのシングルトンなインスタンス => Grape::Routerと呼び出していき、ここでリクエストに対応する Grape::Router::Routeインスタンスを検索する。その後、Grape::Router::Routeが内部で保持するGrape::Endpointのインスタンスに処理を委譲している。
  • リクエストに対応するRouteの検索は正規表現で一発、さらに名前付きのキャプチャを使用して高速化している。ここは、こういった方法があるのかと勉強になった。
  • 各Endpointは最初のリクエストが来た時に初期化処理を行うため、1回目のリクエストの処理は2回目以降に比べて少し時間がかかると思われる。
  • Grape::Endpointのインスタンスをリクエストごとにdupし #call! を実行する。
  • チェーンされている各種Middlewareを実行し、最終的に Grape::Endpoint#run に到達する。
  • Grape::Endpoint#run では各種callbackの実行しつつ、自身がAPIの処理として定義したブロックを実行し、Rackレスポンスとしての結果を返却する。
  • 前半に比べると読みやすい印象。

続きを読む →


Ruby用API生成フレームワーク「grape」のコードを読んでみる (前半)


仕事で使っているRuby用のAPI生成フレームワーク grape のコードを読んで見たのでメモ。

コード量が多かったので、前半(初期化処理)と 後半(リクエストの処理とレスポンス生成) に分けた。今回は、前半(初期化処理)の内容を記載。

まとめ

  • Rackアプリケーションとしてマウントされている。
  • 1回目のリクエストの処理中に、マウントしたクラス => マウントしたクラスのシングルトンなインスタンス => Grape::Router => APIごとのGrape::Router::Route => APIごとのGrape::Endpoint => マウントしたクラスに書いたAPIの処理内容(ブロック)という参照関係が出来上がる。
  • 自分にとってかなりコードの難易度の高く、読みづらいと感じた。
  • 様々な箇所でHashの破壊的な操作が行われていて、コードを変更するのに怖さを感じた。メンテナンスが大変そう。
  • コードをわかりやすく説明するのは難しい…。何本かブログを書いたら、1回整理したほうがよさそう。

続きを読む →


Rails用PDF生成ライブラリ「wicked_pdf」のソースを読んでみる


興味50%、仕事50%でRailsでPDFを出力したいことがあり、「rails pdf」でググると最初にヒットする wicked_pdf のソースコードを読んでみた。

まとめ

  • PDF生成は wkhtmltopdf に全て委譲している。
  • Controllerの #render_to_string でHTMLのStringを生成、保存。この結果を wkhtmltopdf に渡してPDF生成。最後にこの結果を #send_data で送信。
  • css/js/画像などの静的ファイルは、そのままでは参照できないため一工夫している。
  • HTMLやPDFをいったんメモリ上に全て読み込む点は注意。文書のサイズが大きいとメモリ使用量が多くなってしまう可能性がありそう。
  • コード量も多くなく、読みやすかった。ただ、Ruby 1.8.7、Rails 2.3をサポートしており、このせいで若干コードが汚くなっている気はした。
  • 完全に理解するには wkhtmltopdf コマンドで何ができるかを確認する必要がある。

続きを読む →


Railsで複数のログにリクエストIDを出力する


Railsで標準のログ(Rails.logger)以外にオリジナルのログを出力している時、なんらかの共通のキーを出力していないとログ間の対応が取りづらい、もしくは取れない時がある。それを解決するため、1つのHTTPリクエストごとに振られるリクエストIDを各ログに出力することで対応を取りやすくした時のメモ。

まとめ

  • RackMiddlewareでFiberローカル変数にリクエストIDを入れる。
  • 各ログではFiberローカル変数からリクエストIDを取得して、ログに出力する。
  • さくっと扱うためのGemを作ったので、使ってみてください。

続きを読む →