pluggaloid 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/pluggaloid.rb +6 -2
- data/lib/pluggaloid/error.rb +2 -0
- data/lib/pluggaloid/event.rb +2 -0
- data/lib/pluggaloid/filter.rb +6 -4
- data/lib/pluggaloid/handler.rb +45 -0
- data/lib/pluggaloid/handler_tag.rb +86 -0
- data/lib/pluggaloid/identity.rb +21 -0
- data/lib/pluggaloid/listener.rb +8 -4
- data/lib/pluggaloid/plugin.rb +96 -26
- data/lib/pluggaloid/version.rb +1 -1
- data/pluggaloid.gemspec +2 -0
- data/test/handler_tag_test.rb +138 -0
- data/test/helper.rb +9 -0
- data/test/multi_vm_test.rb +3 -6
- data/test/plugin_test.rb +68 -16
- metadata +12 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d033689082ba0fa51b68f245868289fb7e2a195
|
4
|
+
data.tar.gz: 537e9f98015b743aeaf8cf220b7e76f0ff1c27a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8f437ad6c146a27f8ac445dda5a29c89c93746cd51069f538d0b4797c2e5cf9e55c10130a8fefae9b16bff43aec2fd08a2e4d9a754610645afac090347778d61
|
7
|
+
data.tar.gz: 0765e389d20a6742f18afbb9a2642fb708af44c1f2cf99610d7bdd5ac04fc8fc9d88a72e4792a06bdaac743bdff4d328455c2c6022d02642877ebab791c65705
|
data/lib/pluggaloid.rb
CHANGED
@@ -1,21 +1,25 @@
|
|
1
1
|
require "pluggaloid/version"
|
2
2
|
require "pluggaloid/plugin"
|
3
3
|
require 'pluggaloid/event'
|
4
|
+
require "pluggaloid/identity"
|
5
|
+
require "pluggaloid/handler"
|
4
6
|
require 'pluggaloid/listener'
|
5
7
|
require 'pluggaloid/filter'
|
8
|
+
require "pluggaloid/handler_tag"
|
6
9
|
require 'pluggaloid/error'
|
7
10
|
|
8
11
|
require 'delayer'
|
9
12
|
|
10
13
|
module Pluggaloid
|
11
|
-
VM = Struct.new(*%i<Delayer Plugin Event Listener Filter>)
|
14
|
+
VM = Struct.new(*%i<Delayer Plugin Event Listener Filter HandlerTag>)
|
12
15
|
|
13
16
|
def self.new(delayer)
|
14
17
|
vm = VM.new(delayer,
|
15
18
|
Class.new(Plugin),
|
16
19
|
Class.new(Event),
|
17
20
|
Class.new(Listener),
|
18
|
-
Class.new(Filter)
|
21
|
+
Class.new(Filter),
|
22
|
+
Class.new(HandlerTag))
|
19
23
|
vm.Plugin.vm = vm.Event.vm = vm
|
20
24
|
end
|
21
25
|
end
|
data/lib/pluggaloid/error.rb
CHANGED
data/lib/pluggaloid/event.rb
CHANGED
@@ -61,6 +61,8 @@ class Pluggaloid::Event
|
|
61
61
|
def add_listener(listener)
|
62
62
|
unless listener.is_a? Pluggaloid::Listener
|
63
63
|
raise Pluggaloid::ArgumentError, "First argument must be Pluggaloid::Listener, but given #{listener.class}." end
|
64
|
+
if @listeners.map(&:slug).include?(listener.slug)
|
65
|
+
raise Pluggaloid::DuplicateListenerSlugError, "Listener slug #{listener.slug} already exists." end
|
64
66
|
@listeners << listener
|
65
67
|
self end
|
66
68
|
|
data/lib/pluggaloid/filter.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
class Pluggaloid::Filter
|
3
|
+
class Pluggaloid::Filter < Pluggaloid::Handler
|
4
4
|
# フィルタ内部で使う。フィルタの実行をキャンセルする。Plugin#filtering はfalseを返し、
|
5
5
|
# イベントのフィルタの場合は、そのイベントの実行自体をキャンセルする。
|
6
6
|
# また、 _result_ が渡された場合、Event#filtering の戻り値は _result_ になる。
|
@@ -9,10 +9,12 @@ class Pluggaloid::Filter
|
|
9
9
|
|
10
10
|
# ==== Args
|
11
11
|
# [event] 監視するEventのインスタンス
|
12
|
+
# [name:] 名前(String | nil)
|
13
|
+
# [slug:] フィルタスラッグ(Symbol | nil)
|
14
|
+
# [tags:] Pluggaloid::HandlerTag|Array フィルタのタグ
|
12
15
|
# [&callback] コールバック
|
13
|
-
def initialize(event, &callback)
|
14
|
-
|
15
|
-
@event = event
|
16
|
+
def initialize(event, **kwrest, &callback)
|
17
|
+
super
|
16
18
|
@callback = Proc.new
|
17
19
|
event.add_filter self end
|
18
20
|
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
=begin rdoc
|
4
|
+
イベントのListenerやFilterのスーパクラス。
|
5
|
+
イベントに関連付けたり、タグを付けたりできる
|
6
|
+
=end
|
7
|
+
class Pluggaloid::Handler < Pluggaloid::Identity
|
8
|
+
Lock = Mutex.new
|
9
|
+
attr_reader :tags
|
10
|
+
|
11
|
+
# ==== Args
|
12
|
+
# [event] 監視するEventのインスタンス
|
13
|
+
# [name:] 名前(String | nil)
|
14
|
+
# [slug:] ハンドラスラッグ(Symbol | nil)
|
15
|
+
# [tags:] Pluggaloid::HandlerTag|Array リスナのタグ
|
16
|
+
# [&callback] コールバック
|
17
|
+
def initialize(event, tags: [], **kwrest)
|
18
|
+
raise Pluggaloid::TypeError, "Argument `event' must be instance of Pluggaloid::Event, but given #{event.class}." unless event.is_a? Pluggaloid::Event
|
19
|
+
super(**kwrest)
|
20
|
+
@event = event
|
21
|
+
_tags = tags.is_a?(Pluggaloid::HandlerTag) ? [tags] : Array(tags)
|
22
|
+
_tags.each{|t| raise "#{t} is not a Pluggaloid::HandlerTag" unless t.is_a?(Pluggaloid::HandlerTag) }
|
23
|
+
@tags = Set.new(_tags).freeze
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_tag(tag)
|
27
|
+
raise Pluggaloid::TypeError, "Argument `tag' must be instance of Pluggaloid::HandlerTag, but given #{tag.class}." unless tag.is_a? Pluggaloid::HandlerTag
|
28
|
+
Lock.synchronize do
|
29
|
+
@tags = Set.new([tag, *@tags]).freeze
|
30
|
+
end
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
def remove_tag(tag)
|
35
|
+
Lock.synchronize do
|
36
|
+
@tags -= tag
|
37
|
+
@tags.freeze
|
38
|
+
end
|
39
|
+
self
|
40
|
+
end
|
41
|
+
|
42
|
+
def inspect
|
43
|
+
"#<#{self.class} event: #{@event.name.inspect}, slug: #{slug.inspect}, name: #{name.inspect}>"
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'securerandom'
|
4
|
+
|
5
|
+
=begin rdoc
|
6
|
+
= リスナをまとめて管理するプラグイン
|
7
|
+
|
8
|
+
Pluggaloid::Listener や、 Pluggaloid::Filter をまとめて扱うための仕組み。
|
9
|
+
Pluggaloid::Plugin#add_event などの引数 _tags:_ に、このインスタンスを設定する。
|
10
|
+
|
11
|
+
== インスタンスの作成
|
12
|
+
|
13
|
+
Pluggaloid::Plugin#handler_tag を使って生成する。 Pluggaloid::HandlerTag の
|
14
|
+
_plugin:_ 引数には、レシーバ(Pluggaloid::Plugin)が渡される。
|
15
|
+
Pluggaloid::HandlerTag は、このプラグインの中でだけ使える。複数のプラグインのリスナ
|
16
|
+
をまとめて管理することはできない。
|
17
|
+
|
18
|
+
== リスナにタグをつける
|
19
|
+
|
20
|
+
Pluggaloid::Plugin#add_event または Pluggaloid::Plugin#add_event_filter の
|
21
|
+
_tags:_ 引数にこれのインスタンスを渡す。
|
22
|
+
|
23
|
+
== このタグがついたListenerやFilterを取得する
|
24
|
+
|
25
|
+
Enumerable をincludeしていて、リスナやフィルタを取得することができる。
|
26
|
+
また、
|
27
|
+
- Pluggaloid::HandlerTag#listeners で、 Pluggaloid::Listener だけ
|
28
|
+
- Pluggaloid::HandlerTag#filters で、 Pluggaloid::Filter だけ
|
29
|
+
を対象にした Enumerator を取得することができる
|
30
|
+
|
31
|
+
== このタグがついたリスナを全てdetachする
|
32
|
+
|
33
|
+
Pluggaloid::Plugin#detach の第一引数に Pluggaloid::HandlerTag の
|
34
|
+
インスタンスを渡すことで、そのHandlerTagがついたListener、Filterは全てデタッチ
|
35
|
+
される
|
36
|
+
|
37
|
+
=end
|
38
|
+
class Pluggaloid::HandlerTag < Pluggaloid::Identity
|
39
|
+
include Enumerable
|
40
|
+
|
41
|
+
# ==== Args
|
42
|
+
# [name:] タグの名前(String | nil)
|
43
|
+
def initialize(plugin:, **kwrest)
|
44
|
+
super(**kwrest)
|
45
|
+
@plugin = plugin
|
46
|
+
end
|
47
|
+
|
48
|
+
# このTagがついている Pluggaloid::Listener と Pluggaloid::Filter を全て列挙する
|
49
|
+
# ==== Return
|
50
|
+
# Enumerable
|
51
|
+
def each
|
52
|
+
if block_given?
|
53
|
+
Enumerator.new do |y|
|
54
|
+
listeners{|x| y << x }
|
55
|
+
filters{|x| y << x }
|
56
|
+
end.each(&Proc.new)
|
57
|
+
else
|
58
|
+
Enumerator.new do |y|
|
59
|
+
listeners{|x| y << x }
|
60
|
+
filters{|x| y << x }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# このTagがついている Pluggaloid::Listener を全て列挙する
|
66
|
+
# ==== Return
|
67
|
+
# Enumerable
|
68
|
+
def listeners
|
69
|
+
if block_given?
|
70
|
+
listeners.each(&Proc.new)
|
71
|
+
else
|
72
|
+
@plugin.to_enum(:listeners).lazy.select{|l| l.tags.include?(self) }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# このTagがついている Pluggaloid::Filter を全て列挙する
|
77
|
+
# ==== Return
|
78
|
+
# Enumerable
|
79
|
+
def filters
|
80
|
+
if block_given?
|
81
|
+
filters.each(&Proc.new)
|
82
|
+
else
|
83
|
+
@plugin.to_enum(:filters).lazy.select{|l| l.tags.include?(self) }
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
=begin rdoc
|
4
|
+
slugと名前をもつオブジェクト。
|
5
|
+
これの参照を直接持たずとも、slugで一意に参照したり、表示名を設定することができる
|
6
|
+
=end
|
7
|
+
class Pluggaloid::Identity
|
8
|
+
attr_reader :name, :slug
|
9
|
+
|
10
|
+
# ==== Args
|
11
|
+
# [name:] 名前(String | nil)
|
12
|
+
# [slug:] ハンドラスラッグ(Symbol | nil)
|
13
|
+
def initialize(slug: SecureRandom.uuid, name: slug)
|
14
|
+
@name = name.to_s.freeze
|
15
|
+
@slug = slug.to_sym
|
16
|
+
end
|
17
|
+
|
18
|
+
def inspect
|
19
|
+
"#<#{self.class} slug: #{slug.inspect}, name: #{name.inspect}>"
|
20
|
+
end
|
21
|
+
end
|
data/lib/pluggaloid/listener.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
+
require 'securerandom'
|
3
|
+
require 'set'
|
2
4
|
|
3
|
-
class Pluggaloid::Listener
|
5
|
+
class Pluggaloid::Listener < Pluggaloid::Handler
|
4
6
|
# プラグインコールバックをこれ以上実行しない。
|
5
7
|
def self.cancel!
|
6
8
|
throw :plugin_exit, false end
|
7
9
|
|
8
10
|
# ==== Args
|
9
11
|
# [event] 監視するEventのインスタンス
|
12
|
+
# [name:] 名前(String | nil)
|
13
|
+
# [slug:] イベントリスナスラッグ(Symbol | nil)
|
14
|
+
# [tags:] Pluggaloid::HandlerTag|Array リスナのタグ
|
10
15
|
# [&callback] コールバック
|
11
|
-
def initialize(event, &callback)
|
12
|
-
|
13
|
-
@event = event
|
16
|
+
def initialize(event, **kwrest, &callback)
|
17
|
+
super
|
14
18
|
@callback = Proc.new
|
15
19
|
event.add_listener(self) end
|
16
20
|
|
data/lib/pluggaloid/plugin.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'instance_storage'
|
4
4
|
require 'delayer'
|
5
|
+
require 'securerandom'
|
5
6
|
require 'set'
|
6
7
|
|
7
8
|
# プラグインの本体。
|
@@ -21,7 +22,8 @@ module Pluggaloid
|
|
21
22
|
self,
|
22
23
|
Pluggaloid::Event,
|
23
24
|
Pluggaloid::Listener,
|
24
|
-
Pluggaloid::Filter
|
25
|
+
Pluggaloid::Filter,
|
26
|
+
Pluggaloid::HandlerTag)
|
25
27
|
vm.Event.vm = vm end end
|
26
28
|
|
27
29
|
# プラグインのインスタンスを返す。
|
@@ -93,30 +95,88 @@ module Pluggaloid
|
|
93
95
|
super
|
94
96
|
@defined_time = Time.new.freeze
|
95
97
|
@events = Set.new
|
96
|
-
@filters = Set.new
|
98
|
+
@filters = Set.new
|
99
|
+
end
|
97
100
|
|
98
101
|
# イベントリスナを新しく登録する
|
99
102
|
# ==== Args
|
100
|
-
# [
|
101
|
-
# [
|
103
|
+
# [event] 監視するEventのインスタンス
|
104
|
+
# [name:] 名前(String | nil)
|
105
|
+
# [slug:] イベントリスナスラッグ(Symbol | nil)
|
106
|
+
# [tags:] Pluggaloid::HandlerTag|Array リスナのタグ
|
107
|
+
# [&callback] コールバック
|
102
108
|
# ==== Return
|
103
109
|
# Pluggaloid::Listener
|
104
|
-
def add_event(event_name, &callback)
|
105
|
-
result = vm.Listener.new(vm.Event[event_name], &callback)
|
110
|
+
def add_event(event_name, **kwrest, &callback)
|
111
|
+
result = vm.Listener.new(vm.Event[event_name], **kwrest, &callback)
|
106
112
|
@events << result
|
107
113
|
result end
|
108
114
|
|
109
115
|
# イベントフィルタを新しく登録する
|
110
116
|
# ==== Args
|
111
|
-
# [
|
112
|
-
# [
|
117
|
+
# [event] 監視するEventのインスタンス
|
118
|
+
# [name:] 名前(String | nil)
|
119
|
+
# [slug:] フィルタスラッグ(Symbol | nil)
|
120
|
+
# [tags:] Pluggaloid::HandlerTag|Array フィルタのタグ
|
121
|
+
# [&callback] コールバック
|
113
122
|
# ==== Return
|
114
|
-
#
|
115
|
-
def add_event_filter(event_name, &callback)
|
116
|
-
result = vm.Filter.new(vm.Event[event_name], &callback)
|
123
|
+
# Pluggaloid::Filter
|
124
|
+
def add_event_filter(event_name, **kwrest, &callback)
|
125
|
+
result = vm.Filter.new(vm.Event[event_name], **kwrest, &callback)
|
117
126
|
@filters << result
|
118
127
|
result end
|
119
128
|
|
129
|
+
# このプラグインのHandlerTagを作る。
|
130
|
+
# ブロックが渡された場合は、ブロックの中を実行し、ブロックの中で定義された
|
131
|
+
# Handler全てにTagを付与する。
|
132
|
+
# ==== Args
|
133
|
+
# [slug] スラッグ
|
134
|
+
# [name] タグ名
|
135
|
+
# ==== Return
|
136
|
+
# Pluggaloid::HandlerTag
|
137
|
+
def handler_tag(slug=SecureRandom.uuid, name=slug)
|
138
|
+
tag = case slug
|
139
|
+
when String, Symbol
|
140
|
+
vm.HandlerTag.new(slug: slug.to_sym, name: name.to_s, plugin: self)
|
141
|
+
when vm.HandlerTag
|
142
|
+
slug
|
143
|
+
else
|
144
|
+
raise Pluggaloid::TypeError, "Argument `slug' must be instance of Symbol, String or Pluggaloid::HandlerTag, but given #{slug.class}."
|
145
|
+
end
|
146
|
+
if block_given?
|
147
|
+
handlers = @events + @filters
|
148
|
+
yield tag
|
149
|
+
(@events + @filters - handlers).each do |handler|
|
150
|
+
handler.add_tag(tag)
|
151
|
+
end
|
152
|
+
else
|
153
|
+
tag
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# イベントリスナを列挙する
|
158
|
+
# ==== Return
|
159
|
+
# Set of Pluggaloid::Listener
|
160
|
+
def listeners
|
161
|
+
if block_given?
|
162
|
+
@events.each(&Proc.new)
|
163
|
+
else
|
164
|
+
@events.dup
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
# フィルタを列挙する
|
169
|
+
# ==== Return
|
170
|
+
# Set of Pluggaloid::Filter
|
171
|
+
def filters
|
172
|
+
if block_given?
|
173
|
+
@filters.each(&Proc.new)
|
174
|
+
else
|
175
|
+
@filters.dup
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
|
120
180
|
# イベントを削除する。
|
121
181
|
# 引数は、Pluggaloid::ListenerかPluggaloid::Filterのみ(on_*やfilter_*の戻り値)。
|
122
182
|
# 互換性のため、二つ引数がある場合は第一引数は無視され、第二引数が使われる。
|
@@ -126,22 +186,30 @@ module Pluggaloid
|
|
126
186
|
# self
|
127
187
|
def detach(*args)
|
128
188
|
listener = args.last
|
129
|
-
|
189
|
+
case listener
|
190
|
+
when vm.Listener
|
130
191
|
@events.delete(listener)
|
131
192
|
listener.detach
|
132
|
-
|
193
|
+
when vm.Filter
|
133
194
|
@filters.delete(listener)
|
134
|
-
listener.detach
|
195
|
+
listener.detach
|
196
|
+
when Enumerable
|
197
|
+
listener.each(&method(:detach))
|
198
|
+
else
|
199
|
+
raise ArgumentError, "Argument must be Pluggaloid::Listener, Pluggaloid::Filter, Pluggaloid::HandlerTag or Enumerable. But given #{listener.class}."
|
200
|
+
end
|
135
201
|
self end
|
136
202
|
|
137
203
|
# このプラグインを破棄する
|
138
204
|
# ==== Return
|
139
205
|
# self
|
140
206
|
def uninstall
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
207
|
+
vm.Event[:unload].call(self.name)
|
208
|
+
vm.Delayer.new do
|
209
|
+
@events.map(&:detach)
|
210
|
+
@filters.map(&:detach)
|
211
|
+
self.class.destroy name
|
212
|
+
end
|
145
213
|
self end
|
146
214
|
|
147
215
|
# イベント _event_name_ を宣言する
|
@@ -165,19 +233,24 @@ module Pluggaloid
|
|
165
233
|
|
166
234
|
# プラグインが Plugin.uninstall される時に呼ばれるブロックを登録する。
|
167
235
|
def onunload
|
168
|
-
|
169
|
-
|
236
|
+
callback = Proc.new
|
237
|
+
add_event(:unload) do |plugin_slug|
|
238
|
+
if plugin_slug == self.name
|
239
|
+
callback.call
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
170
243
|
alias :on_unload :onunload
|
171
244
|
|
172
245
|
# マジックメソッドを追加する。
|
173
246
|
# on_?name :: add_event(name)
|
174
247
|
# filter_?name :: add_event_filter(name)
|
175
|
-
def method_missing(method, *args, &proc)
|
248
|
+
def method_missing(method, *args, **kwrest, &proc)
|
176
249
|
case method.to_s
|
177
250
|
when /\Aon_?(.+)\Z/
|
178
|
-
add_event($1.to_sym, &proc)
|
251
|
+
add_event($1.to_sym, *args, **kwrest, &proc)
|
179
252
|
when /\Afilter_?(.+)\Z/
|
180
|
-
add_event_filter($1.to_sym, &proc)
|
253
|
+
add_event_filter($1.to_sym, **kwrest, &proc)
|
181
254
|
when /\Ahook_?(.+)\Z/
|
182
255
|
add_event_hook($1.to_sym, &proc)
|
183
256
|
else
|
@@ -185,9 +258,6 @@ module Pluggaloid
|
|
185
258
|
|
186
259
|
private
|
187
260
|
|
188
|
-
def execute_unload_hook
|
189
|
-
@unload_hook.each{ |unload| unload.call } if(defined?(@unload_hook)) end
|
190
|
-
|
191
261
|
def vm
|
192
262
|
self.class.vm end
|
193
263
|
|
data/lib/pluggaloid/version.rb
CHANGED
data/pluggaloid.gemspec
CHANGED
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.required_ruby_version = '2.0.0'
|
22
|
+
|
21
23
|
spec.add_dependency 'delayer'
|
22
24
|
spec.add_dependency 'instance_storage', ">= 1.0.0", "< 2.0.0"
|
23
25
|
|
@@ -0,0 +1,138 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'minitest/autorun'
|
4
|
+
|
5
|
+
require 'pluggaloid'
|
6
|
+
require_relative 'helper'
|
7
|
+
|
8
|
+
describe(Pluggaloid::HandlerTag) do
|
9
|
+
include PluggaloidTestHelper
|
10
|
+
|
11
|
+
before do
|
12
|
+
Delayer.default = Delayer.generate_class(priority: %i<high normal low>, default: :normal)
|
13
|
+
Pluggaloid::Plugin.clear!
|
14
|
+
@pluggaloid = Pluggaloid.new(Delayer.default)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'plugin tag' do
|
18
|
+
before do
|
19
|
+
a = b = c = d = fd = tag_a = tag_b = tag_c = tag_d = nil
|
20
|
+
lst = @lst = []
|
21
|
+
@plugin = @pluggaloid.Plugin.create :parent do
|
22
|
+
a = on_a{ lst << :a }
|
23
|
+
tag_a = handler_tag :tag_a
|
24
|
+
tag_b = handler_tag :tag_b
|
25
|
+
tag_c = handler_tag :tag_c
|
26
|
+
tag_d = handler_tag :tag_d
|
27
|
+
b = on_b(tags: tag_a){ lst << :b }
|
28
|
+
c = on_c(tags: [tag_a, tag_b]){ lst << :c }
|
29
|
+
handler_tag tag_d do
|
30
|
+
d = on_d(tags: [tag_b]){ lst << :d }
|
31
|
+
handler_tag tag_c do
|
32
|
+
fd = filter_d{|&stop| stop.call }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
@a, @b, @c, @d, @fd = a, b, c, d, fd
|
37
|
+
@tag_a, @tag_b, @tag_c, @tag_d = tag_a, tag_b, tag_c, tag_d
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'plugin has 4 listeners' do
|
41
|
+
assert_equal 4, @plugin.listeners.count
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'listener a has no tag' do
|
45
|
+
assert_empty @a.tags
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'listener b has tag_a' do
|
49
|
+
assert_equal Set.new([@tag_a]), @b.tags
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'listener c has tag_a and tag_b' do
|
53
|
+
assert_equal Set.new([@tag_a, @tag_b]), @c.tags
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'listener d has tag_b and tag_d' do
|
57
|
+
assert_equal Set.new([@tag_b, @tag_d]), @d.tags
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'filter fd has tag_c and tag_d' do
|
61
|
+
assert_equal Set.new([@tag_c, @tag_d]), @fd.tags
|
62
|
+
end
|
63
|
+
|
64
|
+
describe 'detach tag_a' do
|
65
|
+
before do
|
66
|
+
@plugin.detach(@tag_a)
|
67
|
+
@pluggaloid.Event[:a].call
|
68
|
+
@pluggaloid.Event[:b].call
|
69
|
+
@pluggaloid.Event[:c].call
|
70
|
+
eval_all_events(@pluggaloid.Delayer)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should not call event in tag' do
|
74
|
+
assert_equal [:a], @lst
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe 'detach tag_c' do
|
79
|
+
before do
|
80
|
+
@pluggaloid.Event[:a].call
|
81
|
+
@pluggaloid.Event[:b].call
|
82
|
+
@pluggaloid.Event[:c].call
|
83
|
+
@pluggaloid.Event[:d].call
|
84
|
+
end
|
85
|
+
|
86
|
+
describe 'detach' do
|
87
|
+
before do
|
88
|
+
@plugin.detach(@tag_c)
|
89
|
+
eval_all_events(@pluggaloid.Delayer)
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'should not call filter' do
|
93
|
+
assert_equal [:a, :b, :c, :d], @lst
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe 'does not detach' do
|
98
|
+
before do
|
99
|
+
eval_all_events(@pluggaloid.Delayer)
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'should call filter' do
|
103
|
+
assert_equal [:a, :b, :c], @lst
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe 'each' do
|
109
|
+
it 'should count of listeners and filters are 2' do
|
110
|
+
assert_equal 2, @tag_a.count
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should count of listeners are 2 in tag_a' do
|
114
|
+
assert_equal 2, @tag_a.listeners.count
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'should there are no filter in tag_a' do
|
118
|
+
assert_equal 0, @tag_a.filters.count
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should count of listeners are 2 in tag_b' do
|
122
|
+
assert_equal 2, @tag_b.listeners.count
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'should there are no filter in tag_b' do
|
126
|
+
assert_equal 0, @tag_b.filters.count
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'should there are no listener in tag_c' do
|
130
|
+
assert_equal 0, @tag_c.listeners.count
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'should has one filter in tag_c' do
|
134
|
+
assert_equal 1, @tag_c.filters.count
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
data/test/helper.rb
ADDED
data/test/multi_vm_test.rb
CHANGED
@@ -4,19 +4,16 @@ require 'bundler/setup'
|
|
4
4
|
require 'minitest/autorun'
|
5
5
|
|
6
6
|
require 'pluggaloid'
|
7
|
+
require_relative 'helper'
|
7
8
|
|
8
9
|
describe(Pluggaloid) do
|
10
|
+
include PluggaloidTestHelper
|
11
|
+
|
9
12
|
before do
|
10
13
|
Delayer.default = Delayer.generate_class(priority: %i<high normal low>, default: :normal)
|
11
14
|
Pluggaloid::Plugin.clear!
|
12
15
|
end
|
13
16
|
|
14
|
-
def eval_all_events(delayer=Delayer)
|
15
|
-
native = Thread.list
|
16
|
-
yield if block_given?
|
17
|
-
delayer.run while not(delayer.empty? and (Thread.list - native).empty?)
|
18
|
-
end
|
19
|
-
|
20
17
|
it "should take new plugin classes" do
|
21
18
|
pluggaloid = Pluggaloid.new(Delayer.default)
|
22
19
|
assert_equal Delayer.default, pluggaloid.Delayer, ""
|
data/test/plugin_test.rb
CHANGED
@@ -4,19 +4,16 @@ require 'bundler/setup'
|
|
4
4
|
require 'minitest/autorun'
|
5
5
|
|
6
6
|
require 'pluggaloid'
|
7
|
+
require_relative 'helper'
|
7
8
|
|
8
9
|
describe(Pluggaloid::Plugin) do
|
10
|
+
include PluggaloidTestHelper
|
11
|
+
|
9
12
|
before do
|
10
13
|
Delayer.default = Delayer.generate_class(priority: %i<high normal low>, default: :normal)
|
11
14
|
Pluggaloid::Plugin.clear!
|
12
15
|
end
|
13
16
|
|
14
|
-
def eval_all_events
|
15
|
-
native = Thread.list
|
16
|
-
yield if block_given?
|
17
|
-
Delayer.run while not(Delayer.empty? and (Thread.list - native).empty?)
|
18
|
-
end
|
19
|
-
|
20
17
|
it "fire and filtering event, receive a plugin" do
|
21
18
|
sum = 0
|
22
19
|
Pluggaloid::Plugin.create(:event) do
|
@@ -108,16 +105,34 @@ describe(Pluggaloid::Plugin) do
|
|
108
105
|
assert_equal(Pluggaloid::Plugin[:defevent], Pluggaloid::Event[:increase].options[:plugin])
|
109
106
|
end
|
110
107
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
108
|
+
describe "unload hook" do
|
109
|
+
before do
|
110
|
+
@value = value = []
|
111
|
+
Pluggaloid::Plugin.create(:temporary) {
|
112
|
+
on_unload {
|
113
|
+
value << 2 }
|
114
|
+
on_unload {
|
115
|
+
value << 1 } }
|
116
|
+
Pluggaloid::Plugin.create(:eternal) {
|
117
|
+
on_unload {
|
118
|
+
raise "try to unload eternal plugin" } }
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should not call unload event it is not unload' do
|
122
|
+
assert_empty(@value)
|
123
|
+
end
|
124
|
+
|
125
|
+
describe 'unload temporary plugin' do
|
126
|
+
before do
|
127
|
+
eval_all_events do
|
128
|
+
Pluggaloid::Plugin.create(:temporary).uninstall
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'was called unload hooks' do
|
133
|
+
assert_equal([1, 2].sort, @value.sort)
|
134
|
+
end
|
135
|
+
end
|
121
136
|
end
|
122
137
|
|
123
138
|
describe "defdsl" do
|
@@ -150,4 +165,41 @@ describe(Pluggaloid::Plugin) do
|
|
150
165
|
on_no_default_delayer_error do; end end end
|
151
166
|
end
|
152
167
|
|
168
|
+
describe "named listener" do
|
169
|
+
it 'raises when duplicate slug registered to equally events' do
|
170
|
+
assert_raises(Pluggaloid::DuplicateListenerSlugError) do
|
171
|
+
Pluggaloid::Plugin.create :duplicate_slug do
|
172
|
+
on_a(slug: :duplicate){}
|
173
|
+
on_a(slug: :duplicate){}
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'was not raises when duplicate slug registered to another events' do
|
179
|
+
Pluggaloid::Plugin.create :duplicate_slug do
|
180
|
+
on_a(slug: :duplicate){}
|
181
|
+
on_b(slug: :duplicate){}
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'successful when dupliacte name registered to another events' do
|
186
|
+
a = b = nil
|
187
|
+
Pluggaloid::Plugin.create :duplicate_name do
|
188
|
+
a = on_a(name: "duplicate"){}
|
189
|
+
b = on_b(name: "duplicate"){}
|
190
|
+
end
|
191
|
+
assert_equal("duplicate", a.name, 'a.name should be "duplicate"')
|
192
|
+
assert_equal("duplicate", b.name, 'b.name should be "duplicate"')
|
193
|
+
end
|
194
|
+
|
195
|
+
it 'include listener slug and name in Pluggaloid::Listener#inspect' do
|
196
|
+
a = nil
|
197
|
+
Pluggaloid::Plugin.create :inspect do
|
198
|
+
a = on_a(slug: :inspect_slug, name: "inspect name"){}
|
199
|
+
end
|
200
|
+
assert(a.inspect.include?("inspect_slug"), 'Pluggaloid::Listener.inspect does not include slug')
|
201
|
+
assert(a.inspect.include?("inspect name"), 'Pluggaloid::Listener.inspect does not include name')
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
153
205
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pluggaloid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Toshiaki Asai
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: delayer
|
@@ -102,10 +102,15 @@ files:
|
|
102
102
|
- lib/pluggaloid/error.rb
|
103
103
|
- lib/pluggaloid/event.rb
|
104
104
|
- lib/pluggaloid/filter.rb
|
105
|
+
- lib/pluggaloid/handler.rb
|
106
|
+
- lib/pluggaloid/handler_tag.rb
|
107
|
+
- lib/pluggaloid/identity.rb
|
105
108
|
- lib/pluggaloid/listener.rb
|
106
109
|
- lib/pluggaloid/plugin.rb
|
107
110
|
- lib/pluggaloid/version.rb
|
108
111
|
- pluggaloid.gemspec
|
112
|
+
- test/handler_tag_test.rb
|
113
|
+
- test/helper.rb
|
109
114
|
- test/multi_vm_test.rb
|
110
115
|
- test/plugin_test.rb
|
111
116
|
homepage: ''
|
@@ -118,9 +123,9 @@ require_paths:
|
|
118
123
|
- lib
|
119
124
|
required_ruby_version: !ruby/object:Gem::Requirement
|
120
125
|
requirements:
|
121
|
-
- -
|
126
|
+
- - '='
|
122
127
|
- !ruby/object:Gem::Version
|
123
|
-
version:
|
128
|
+
version: 2.0.0
|
124
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
130
|
requirements:
|
126
131
|
- - ">="
|
@@ -128,10 +133,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
133
|
version: '0'
|
129
134
|
requirements: []
|
130
135
|
rubyforge_project:
|
131
|
-
rubygems_version: 2.
|
136
|
+
rubygems_version: 2.5.1
|
132
137
|
signing_key:
|
133
138
|
specification_version: 4
|
134
139
|
summary: Extensible plugin system
|
135
140
|
test_files:
|
141
|
+
- test/handler_tag_test.rb
|
142
|
+
- test/helper.rb
|
136
143
|
- test/multi_vm_test.rb
|
137
144
|
- test/plugin_test.rb
|