mikutter / rest

REST APIを使って、タイムラインを定期的に更新する
MIT License
1 stars 1 forks source link

undefined method `+' for nil:NilClass (NoMethodError) #1

Closed shibafu528 closed 4 years ago

shibafu528 commented 4 years ago

プラグイン導入後の初回起動時にクラッシュします。しかし、2回目以降は問題なく動作します。

おそらく、 core/userconfig.rb において初期値が定義されていた設定について、参照すべき初期値がなくなったからと思われます。

この辺ですかね。
https://github.com/mikutter/rest/blob/a4bcd033aa40a0240004c8fe55b093f8a5cc0cf0/rest.rb#L6-L9

stacktrace

Traceback (most recent call last):
        15: from mikutter.rb:109:in `<main>'
        14: from mikutter.rb:73:in `boot!'
        13: from /home/shibafu/git/mikutter/core/plugin/gtk/mainloop.rb:10:in `mainloop'
        12: from /home/shibafu/git/mikutter/core/plugin/gtk/mainloop.rb:10:in `catch'
        11: from /home/shibafu/git/mikutter/core/plugin/gtk/mainloop.rb:12:in `block in mainloop'
        10: from /home/shibafu/git/mikutter/core/plugin/gtk/mainloop.rb:12:in `loop'
         9: from /home/shibafu/git/mikutter/core/plugin/gtk/mainloop.rb:23:in `block (2 levels) in mainloop'
         8: from /home/shibafu/git/mikutter/vendor/bundle/ruby/2.6.0/gems/delayer-1.0.1/lib/delayer.rb:36:in `method_missing'
         7: from /home/shibafu/git/mikutter/vendor/bundle/ruby/2.6.0/gems/delayer-1.0.1/lib/delayer/extend.rb:92:in `run_once'
         6: from /home/shibafu/git/mikutter/vendor/bundle/ruby/2.6.0/gems/delayer-1.0.1/lib/delayer/procedure.rb:26:in `run'
         5: from /home/shibafu/.mikutter/plugin/rest/rest.rb:34:in `block in start'
         4: from /home/shibafu/.mikutter/plugin/rest/rest.rb:34:in `each'
         3: from /home/shibafu/.mikutter/plugin/rest/rest.rb:35:in `block (2 levels) in start'
         2: from /home/shibafu/.mikutter/plugin/rest/rest.rb:35:in `each'
         1: from /home/shibafu/.mikutter/plugin/rest/rest.rb:35:in `block (3 levels) in start'
/home/shibafu/.mikutter/plugin/rest/rest.rb:9:in `block in define_periodical_executer': undefined method `+' for nil:NilClass (NoMethodError)
tsutsui commented 4 years ago

おそらく、 core/userconfig.rb において初期値が定義されていた設定について、参照すべき初期値がなくなったからと思われます。

UserConfig を使ってるプラグインをみようみまねで脳死コピーするととりあえず動いてるっぽいです。

From 69f087e1733b81170be5aa057be68383850829b5 Mon Sep 17 00:00:00 2001
From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
Date: Sat, 7 Mar 2020 17:16:20 +0900
Subject: [PATCH] Add default UserConfig values of intervals and counts to
 fetch timelines.

---
 rest.rb | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/rest.rb b/rest.rb
index 9fcb742..455cbf1 100644
--- a/rest.rb
+++ b/rest.rb
@@ -2,6 +2,10 @@
 # Rest API で定期的にタイムラインを更新するプラグイン

 Plugin.create :rest do
+  UserConfig[:retrieve_interval_friendtl] ||= 1
+  UserConfig[:retrieve_interval_mention]  ||= 20
+  UserConfig[:retrieve_count_friendtl]    ||= 20
+  UserConfig[:retrieve_count_mention]     ||= 20

   def self.define_periodical_executer(api, interval, count, &success)
     counter = UserConfig[interval]
-- 
2.24.1

rest 以外にも 保存した検索の間隔 follow/followerの取得間隔 DMの更新間隔 リストの更新間隔 があったはずですが、そこらへんは対処しなくても動いてるのが謎(コードを見ていない)

tsutsui commented 4 years ago

UserConfig[:retrieve_interval_friendtl] ||= 1 で放置してると複数起動であっという間に規制されてしまうようなので 5分くらいにすべきですね……

tsutsui commented 4 years ago

よくよく見たら、 https://github.com/mikutter/twitter_settings/blob/master/twitter_settings.rb にデフォルト値入ってました。 単に依存関係記述の問題なんでしょうか。

tsutsui commented 4 years ago

.mikutter.yml に明示的に依存関係書けば解決しましたがこれでいいんですかね。 (どのみち識別用にバージョンも上げるべきか)

同様に interval の値を参照している following_control と saved_search の .mikutter.yml にも同様に記載すべき?

From 0fdb90efca6d9e9f6b784521556946c78440b31a Mon Sep 17 00:00:00 2001
From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
Date: Sun, 8 Mar 2020 10:33:37 +0900
Subject: [PATCH] Explicitly depend on 'twitter_settings' to pull UserConfig
 values.

---
 .mikutter.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.mikutter.yml b/.mikutter.yml
index 30c88de..3cb7cda 100644
--- a/.mikutter.yml
+++ b/.mikutter.yml
@@ -4,6 +4,7 @@ depends:
   mikutter: '0.2'
   plugin:
     - twitter
+    - twitter_settings
 version: '1.0'
 author: toshi_a
 name: REST
-- 
2.24.1
shibafu528 commented 4 years ago

元々は各プラグインがロードされる前に初期化されていて、その前提で動いていたものになるので、一番早い段階でロードされるはずのtwitterプラグインが初期値を握っていてもいいような気がします。
twitter_settingsに明示的に依存してしまうと、間接的にguiに依存してしまいますので。

(とはいえ、たくさんリポジトリ散っていると手を入れるのが面倒ですね……!)

tsutsui commented 4 years ago

UserConfig できることと 設定画面で変更できることと その初期値を誰が設定するかということとが それぞれ独立であるとすると、 初期値の定義だけを各プラグインに移動するのがいいんですかねえ。

個別に変更したときに twitter_settings の修正を絶対に忘れるという気もしますが、 確かに GUI には依存したくないですね。

toshia commented 4 years ago

なるほど。この場合は、twitter_settingはそのままで、 https://github.com/mikutter/rest/issues/1#issuecomment-596061020 のパッチを適用するのが良いと思います。

twitter_settingは、 UserConfig[:retrieve_interval_friendtl] に必ず数値が入っていなければいけません。

一方、restも UserConfig[:retrieve_interval_friendtl] に必ず数値が入っていなければいけません。

そして、twitter_settingとrestに依存関係はないので、片方だけをインストールしても正しく動作するようにすべきです。

したがって、これを実現する方法はrestとtwitter_setting両方でデフォルト値を入れる処理を書くしかありません。

2つのプラグインが同じキーに別々のデフォルト値を提案した場合、先にロードされたほうが採用されてしまうため初期値が予測できなくなります。そのため、2つのプラグインで設定値は同じ値にしておいたほうがいいかもしれません。

tsutsui commented 4 years ago

なるほど。この場合は、twitter_settingはそのままで、 #1 (comment) のパッチを適用するのが良いと思います。

初期値を足すプルリクエストを rest および https://github.com/mikutter/saved_search https://github.com/mikutter/followingcontrol https://github.com/mikutter/direct_message https://github.com/mikutter/list それぞれに出せばいいですかね。 それぞれタグを打つなら .mikutter.yml のバージョン記述も上げないといけない? とか考え出すとエンドレスですが。

if 0 == count % UserConfig["retrieve_interval_followings"] みたいな参照の場合にエラーになるのかどうかよくわかっていません。

toshia commented 4 years ago
count % nil

は誤りですね。

https://docs.ruby-lang.org/ja/latest/method/Integer/i/=25.html

toshia commented 4 years ago

初期値を足すプルリクエストを rest および https://github.com/mikutter/saved_search https://github.com/mikutter/followingcontrol https://github.com/mikutter/direct_message https://github.com/mikutter/list それぞれに出せばいいですかね。

そうなります

toshia commented 4 years ago

バージョンあげるくらいは私がやります。pull-reqでやるべきではないと思うので。

tsutsui commented 4 years ago

direct_message だけはなぜか

Reserver.new([60, (UserConfig[:retrieve_interval_direct_messages] || 1).to_i * 60].max, thread: Delayer) do

|| 1 になってたのでそのままにしておきます

tsutsui commented 4 years ago

遅くなりましたが 1.1 で初回起動でも TL表示まで進むことを確認しました。 クローズでよいと思います

toshia commented 4 years ago

thx