Header image

クラッソーネの開発者がエンジニアリングに関することもそうでないことも綴っています!

ruby 3.0 対応前の docusign-esign-ruby-client で苦労した話

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-clientruby 3.0では正常に動作しません。
理由は、URI:Moduleencodeメソッドを内部で使用しているためです。
このencodeメソッドなどは RFC に準拠していない動作をしていたためruby 3.0で削除されました。(ruby 2.7まではencodeメソッドをコールすると非推奨として warning が出ます)

https://imaizumimr.hatenablog.com/entry/2021/01/01/141154

https://github.com/ruby/uri/pull/9

なので、削除されたencodeメソッドなどを利用している箇所にモンキーパッチを当てる必要があります。
モンキーパッチを当てる方法はいくつかあると思いますが、今回は、以下のように適用しました。

  1. モンキーパッチを当てるためのinitializerを用意
  2. Rails 起動時にパッチファイル(lib/monkey_patches/docusign_esign_ext.rb)を読み込む
config/initializers/monkey_patches.rb
Dir[Rails.root.join('lib/monkey_patches/**/*.rb')].each do |file|
  require file
end
lib/monkey_patches/docusign_esign_ext.rb
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で動くようになったみたいです!

https://github.com/docusign/docusign-esign-ruby-client/pull/58

今回開発している段階では、上記プルリクがマージされるまで待てなかったため、モンキーパッチを当てて対応しました。

おわりに

クラッソーネでは、docusign-esign-ruby-client Gem のようなクセ強めなエンジニアも、そうでないエンジニアも大募集しています。少しでも興味がある方、是非ご連絡ください!!!

https://recruit.jobcan.jp/crassone/list?category_id=15694