環境対応 #1051
完了memoistを1.16にアップデートすると起動しなくなる
説明
memoistを1.16にアップデートすると起動しなくなります.
memoistを1.15に戻したところ正常に稼働しました.
どうもmemoistにはそれを直すコミット
https://github.com/matthewrudy/memoist/commit/d3052454e14f6461f26b7a02153e4daa7d525b60
が入っているみたいですが,mikutterはextend Memoistしていないためその恩恵を受けることが出来ません.
これがmemoistの仕様なのかバグなのか今一つわからないため,とりあえずmikutterが動かなくなるという情報を上げさせていただきました.
エラー内容
% mikutter /usr/lib64/ruby/gems/2.3.0/gems/memoist-0.16.0/lib/memoist.rb:142:in `block (2 levels) in memoize': undefined local variable or method `memoized_methods' for ConfigLoader:Module (NameError) Did you mean? unmemoized_method from /usr/lib64/ruby/gems/2.3.0/gems/memoist-0.16.0/lib/memoist.rb:56:in `class_eval' from /usr/lib64/ruby/gems/2.3.0/gems/memoist-0.16.0/lib/memoist.rb:56:in `memoist_eval' from /usr/lib64/ruby/gems/2.3.0/gems/memoist-0.16.0/lib/memoist.rb:132:in `block in memoize' from /usr/lib64/ruby/gems/2.3.0/gems/memoist-0.16.0/lib/memoist.rb:128:in `each' from /usr/lib64/ruby/gems/2.3.0/gems/memoist-0.16.0/lib/memoist.rb:128:in `memoize' from /usr/share/mikutter/core/configloader.rb:116:in `<module:ConfigLoader>' from /usr/share/mikutter/core/configloader.rb:20:in `<top (required)>' from /usr/lib64/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' from /usr/lib64/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' from /usr/share/mikutter/core/miquire.rb:98:in `miquire_original_require' from /usr/share/mikutter/core/miquire.rb:95:in `file_or_directory_require' from /usr/share/mikutter/core/miquire.rb:76:in `block in miquire' from /usr/share/mikutter/core/miquire.rb:75:in `each' from /usr/share/mikutter/core/miquire.rb:75:in `miquire' from /usr/share/mikutter/core/miquire.rb:18:in `miquire' from /usr/share/mikutter/core/service.rb:5:in `<top (required)>' from /usr/lib64/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' from /usr/lib64/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' from /usr/share/mikutter/core/miquire.rb:98:in `miquire_original_require' from /usr/share/mikutter/core/miquire.rb:95:in `file_or_directory_require' from /usr/share/mikutter/core/miquire.rb:76:in `block in miquire' from /usr/share/mikutter/core/miquire.rb:75:in `each' from /usr/share/mikutter/core/miquire.rb:75:in `miquire' from /usr/share/mikutter/core/miquire.rb:18:in `miquire' from /usr/share/mikutter/mikutter.rb:38:in `<main>'
toshi_a 初音 さんが7年以上前に更新
再現できました。対応難しそうなら一旦は<=1.15としますが、最終的には1.16でも問題なく使えるようにします。
かつてmemoizable gemを使っていた時はKernelモジュールにincludeするとすべてのメソッドがメモ化可能になっていて、memoist gemに乗り換えたとき(#755)も同じことが出来たのですが、コードを読んでいるとその方法は想定されてないのかな(READMEにもそういう使い方に関する言及がない)。
経緯の想像はつくけれど、かなり多くの場所に extend Memoist
を入れなければならない?
toshi_a 初音 さんが7年以上前に更新
- 担当者 を toshi_a 初音 にセット
一応すべてのmemoize使っているクラスにextend Memoistを入れたら起動するけど、以前まではmemoizeはmikutterのすべての場所で使えたので、これは非互換な変更となり、一部サードパーティプラグインがクラッシュする可能性があります。
mikutter 3.5系は memoist <1.16 とするのが良いんですが、だいたいのディストリにとって意味がないので、memoist 1.16でも同じように動作させる方法を探っています。
toshi_a 初音 さんが7年以上前に更新
- ステータス を 新規 から 実装待ち に変更
二案。
memoistを利用するすべてのModuleにMemoistをextendする (topic/1051-memoist-1.16)¶
正しい使い方に愚直に合わせる。vanillaでは正しく動作しているがサードパーティプラグインの互換性問題がある。
Module#.memoize が呼ばれたらMemoistをextendする (topic/1051-memoist-auto-extend)¶
互換性の問題を解決したもの。
ゴリ押し感が強いので、長期に渡ってはやりたくない気がする。Module#.memoizeが呼ばれたら警告を表示するなどして、基本的にMemoistをextendしてもらうようにするか。
toshi_a 初音 さんが7年以上前に更新
今後は、memoizeメソッドを利用する場合は、そのClassやModuleにMemoistをextendするという、memoistのマニュアルに書いてある方法をmikutterプラグインにも利用してもらうようにします。そのうえで、Module#.memoizeも実装しておいて、extendしていない旧来のプラグインも利用できるようにします。その場合はmemoizeが呼ばれた時に警告を発生させます。
この警告が表示されるようになってしまったプラグインは、memoistの使い方 を参考に書き直すべきです。memoistはもともと利用するClassやModuleにextendするのが正しい使い方だったので、そのような書き換えを行っても、memoist 1.15以前+mikutter 3.5.8以前を利用している環境でも正しく動きます。
toshi_a 初音 さんが7年以上前に更新
- ステータス を 実装待ち から レビュー待ち に変更
- 担当者 を toshi_a 初音 から ncaq エヌユル に変更
hotfix/3.5 ブランチにmergeしました。年のためそちらの環境でもこのブランチでの確認をお願いします。
もし正しく動作すればチケットのステータスを「終了」に、なにか問題が発生する場合は「まだダメ」に変えたうえで、どういった問題が起こったかを注記に書いてください。