ruby 3.0 対応前の docusign-esign-ruby-client で苦労した話
※以下、2021 年 7 月時点の内容です。docusign-esign-ruby-client
最新バージョンでは ruby 3.0
で正常に動作します。
こんにちは!
アナログレコード集めが趣味で、週末は都内のレコード屋をいくつかグルグル徘徊したりするのですが、リモートワークの影響か、体力が極端に落ちてしまって、最近ではレコード屋の階段を登るだけで息切れしちゃいます。プロダクト開発部の市川(@shunta27)です。
弊社プロダクトでは、施主と工事会社が契約を結ぶ際にDocuSignというサービスを利用し、電子契約を行なっております。DocuSign を ruby で扱うためのdocusign-esign-ruby-client (Gem)が公開されており、直近の開発で、この Gem を使う機会があり、今回はこの Gem を Rails で利用する際の注意点や工夫した点をお話ししたいと思います。
今回docusign-esign-ruby-client
を導入した ruby、Rails のバージョンは以下になります。
- ruby 3.0.1
- Rails 6.1.2.1
docusign-esign-ruby-client の導入方法
そもそもdocusign-esign-ruby-client
はruby 3.0
では正常に動作しません。
理由は、URI:Module
のencode
メソッドを内部で使用しているためです。
このencode
メソッドなどは RFC に準拠していない動作をしていたためruby 3.0
で削除されました。(ruby 2.7
まではencode
メソッドをコールすると非推奨として warning が出ます)
なので、削除されたencode
メソッドなどを利用している箇所にモンキーパッチを当てる必要があります。
モンキーパッチを当てる方法はいくつかあると思いますが、今回は、以下のように適用しました。
- モンキーパッチを当てるための
initializer
を用意 - Rails 起動時にパッチファイル(
lib/monkey_patches/docusign_esign_ext.rb
)を読み込む
Dir[Rails.root.join('lib/monkey_patches/**/*.rb')].each do |file|
require file
end
require 'docusign_esign/version'
raise 'Consider removing this patch' unless DocuSign_eSign::VERSION == '3.10.0'
module DocusignEsignExt
module Configuration
def base_url
"#{scheme}://#{[host, base_path].join('/').gsub(/\/+/, '/')}".sub(/\/+\z/, '')
end
end
module ApiClient
def build_request_url(path, opts)
path = "/#{path}".gsub(/\/+/, '/')
return "https://#{get_oauth_base_path}#{path}" if opts[:oauth]
"#{@config.base_url}#{path}"
end
end
end
# `Module#prepend`で、利用するGemのモジュールのメソッドを上書き
DocuSign_eSign::Configuration.prepend(DocusignEsignExt::Configuration)
DocuSign_eSign::ApiClient.prepend(DocusignEsignExt::ApiClient)
工夫した点として、導入した Gem にモンキーパッチが当たっているので、Gem のバージョンを上げた時や、変更があった時に開発者自身が気付けるようにraise
させておきました。以下の部分です。
raise 'Consider removing this patch' unless DocuSign_eSign::VERSION == '3.10.0'
また、パッチを当てたメソッドには ちゃんと rspec を書いて動作保証しておきましょうね!
以上で、無事docusign-esign-ruby-client
を Rails から利用することができます。
docusign-esign-ruby-client
は、クセ強めの Gem でしたので、今回機能実装するにあたっては、Docusign::ApiClient
のようなラッパークラスを作成し、そのクラスの中でdocusign-esign-ruby-client
の各メソッドを呼び出して使うようにしたりしてます。
あとがき
どうやら、最新バージョンのdocusign-esign-ruby-client
を使えば、今回のようなモンキーパッチをあてなくてもruby 3.0
で動くようになったみたいです!
今回開発している段階では、上記プルリクがマージされるまで待てなかったため、モンキーパッチを当てて対応しました。
おわりに
クラッソーネでは、docusign-esign-ruby-client
Gem のようなクセ強めなエンジニアも、そうでないエンジニアも大募集しています。少しでも興味がある方、是非ご連絡ください!!!