1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

slack-notifier補完計画

Posted at

はじめに

Slack通知に便利なgem「slack-notifier」がRuby3に対応してなかった。
バグ通知とか便利だからこれがないと困る。

pingメソッドを実行すると

ArgumentError (wrong number of arguments (given 2, expected 1))

しょうがないからモンキーパッチを当てて対応した。
極力モンキーパッチしたくないけど、gem壊れてたらしょうがないよね。

前提

Rails 6.1.0
Ruby 3.0.0
slack-notifier 2.3.2

※2021年3月12日現在までは動くことを保証してますが、
それ以降は自己責任でお願いします。

説明すること

  • slack-notifierが動かなくなった理由
  • 対応方法

slack-notifierが動かなくなった理由

Ruby 3で、キーワード引数が通常の引数とは独立した引数になったことが原因みたい。

Ruby 3ではこんな感じで引数を入れてあげないとErrorになるらしい。

# キーワード引数を受け取るメソッド
def foo(key: 42)
end

foo(key: 42)      # OK: キーワード引数を渡している

opt = { key: 42 }
foo(opt)          # NG: 普通の引数を渡しているのでエラー(2.7では警告付きで動いていた)

foo(**opt)        # OK: ハッシュを明示的にキーワードに変換している

参照:https://techlife.cookpad.com/entry/2020/12/25/155741

この変更のせいで「Slack::Notifier::Util::LinkFormatter」がお亡くなりになったようです。

対応方法

モンキーパッチをしてあげましょう。

モンキーパッチって何?

ソースを直接いじらず、RailsとかGemとかの外部モジュールを変更すること。

wikipediaにはこんな感じで書いてる
モンキーパッチは、オリジナルのソースコードを変更することなく、実行時に動的言語(例えばSmalltalk, JavaScript, Objective-C, Ruby, Perl, Python, Groovy, など)のコードを拡張したり、変更したりする方法である。

参照:https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%82%AD%E3%83%BC%E3%83%91%E3%83%83%E3%83%81

実際のソース

lib/monkey_patches/slack_notifier.rb
require 'slack-notifier/version'
unless Slack::Notifier::VERSION == '2.3.2'
  raise 'Consider removing this patch'
end

module MonkeyPatches::SlackNotifier
  def initialize string, opts = {}
    @formats = opts[:formats] || %i[html markdown]
    @orig    = string.respond_to?(:scrub) ? string.scrub : string
  end
end

Slack::Notifier::Util::LinkFormatter.prepend(MonkeyPatches::SlackNotifier)
config/initializers/monkey_patches.rb
Dir[Rails.root.join('lib/monkey_patches/*.rb')].sort.each do |file|
  require file
end

参照

[Gemにモンキーパッチを当てるサンプル
] (https://qiita.com/ham0215/items/96726d73a563ae8a4c60)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?