機能 #1063
未完了プラグイン着脱時にイベントが発生する機能
説明
プラグイン着脱時に何も起きないので、イベントを発生させる機能がほしい。
ので、作ります。
toshi_a 初音 さんが7年以上前に更新
プラグインのslugはイベント名としてvalidなので可能だけど、 #1061 ではイベント名を動的に生成するか迷った結果、イベント名は固定で(key, value)を引数としたんですが、理由としては
- 動的に名前を生成すると、listenerを登録する時にエディタで補完が効きづらくなる(単一のトークンとなるため)
- どのような設定が変更されたかを知りたい場合、イベント名が動的に生成されるとトラックできない
というのがありました。一方でこの方法だと
- すべてのイベントがPlugin slugを確認するif式をもつ必要がある
という問題があります。とはいえ、このイベントを受け取る動機って、不特定のプラグインがロードされた時になにかしたいとかだと思うので、イベント名は固定が良さそうと思います
toshi_a 初音 さんが7年以上前に更新
細かい話だけど、pluginの着脱はイベント分けたい気がします。mikutterだと抽出タブやアカウントの追加、削除とかの単位でイベント分けてるので。
詳細とかをイベントとして送ってしまうのはいいですね。具体的にはどんな内容を想定してますか。specファイルのdescription?
toshi_a 初音 さんが7年以上前に更新
思いついたことをまとめて書かなくて申し訳ないんだけど、イベントが現在形だと、そのイベントをフィルタで止めてしまえばプラグインのロードを止められそうな感じになるので、既にロードが終わったことを通知しているだけなら、過去形にしたほうがいいと思います。
あと知ってるかわからないけど、面白い裏技があって
Plugin[:extract] # => #<Plugin: slug=extract>
プラグインオブジェクトが既にあれば得られるんだけど
Plugin[:extract].spec # {:slug=>:extract, :depends=>{:mikutter=>"0.2", :plugin=>["gtk", "settings", "gui", "uitranslator", "skin"]}, ...
と、specファイルの中身得ることが出来ます(specファイルがない場合は、slugなどの基本的な項目を埋めたダミーのHashオブジェクトが返される)。
PluginオブジェクトはDiva::Modelとかではないのであまりイベントで投げたくないですが、specはHashなので付けてもいいかも。その場合、そもそもslugを投げなくても、specに入っているので要らないっちゃ要らないですね。
一方で、今のところはPlugin[slug]でこれだけの情報が得られるので、slugだけでいいという考え方もあります。
toshi_a 初音 さんが7年以上前に更新
プラグインをロードするには、 Miquire::Plugin.load
を呼ぶけど、これの例外だか戻り値だか(曖昧)でエラー報告してくれるので、成否は取れますよ。ロードエラーは、結局プラグインをロードできてないので、そのことを他のプラグインが検出できることが有用なケースが思いつかないんですが、そういうのも欲しいですか
toshi_a 初音 さんが7年以上前に更新
それだったらやっぱり、Miquire::Plugin.loadがロードが正しく行えたかを返すので十分で、エラーをイベントで通知するのは有用ではないと思います。
いずれにせよ、プラグインのロード・アンロード後にそれを通知するイベントは有用だと思うので、それはmergeしたいです。
toshi_a 初音 さんが7年以上前に更新
plugin_loadedイベントは、新たなプラグインがロードされたことを通知するものなので、失敗したときはイベントを発生しないようにするのが良いと思います