pluggaloid 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 20e6bd8ec73d5f7f22335af756a29b3d6d1dc5e2
4
- data.tar.gz: b00881d485341cead1eaf5fd4764cf7b5896f2e8
3
+ metadata.gz: 5d033689082ba0fa51b68f245868289fb7e2a195
4
+ data.tar.gz: 537e9f98015b743aeaf8cf220b7e76f0ff1c27a0
5
5
  SHA512:
6
- metadata.gz: 3e342cc0e12f5376a6371156b9506c9b29b3871f07deb3e0852f45502a6193747a14aa01ec07251e776c13e82f484c260cdf67823406381a855cff263d18d63a
7
- data.tar.gz: a19f49f587fef3b526666fafd3aa23d0a61f8ed453eb475e91c3a9e517b0662d0d45a415066992cb89f8813f61cc33efcfecc46c4530542ad79f5d7b9971becb
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
@@ -9,4 +9,6 @@ module Pluggaloid
9
9
  class FilterError < Error; end
10
10
 
11
11
  class NoDefaultDelayerError < Error; end
12
+
13
+ class DuplicateListenerSlugError < Error; end
12
14
  end
@@ -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
 
@@ -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
- raise Pluggaloid::TypeError, "Argument `event' must be instance of Pluggaloid::Event, but given #{event.class}." unless event.is_a? Pluggaloid::Event
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
@@ -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
- raise Pluggaloid::TypeError, "Argument `event' must be instance of Pluggaloid::Event, but given #{event.class}." unless event.is_a? Pluggaloid::Event
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
 
@@ -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 end
98
+ @filters = Set.new
99
+ end
97
100
 
98
101
  # イベントリスナを新しく登録する
99
102
  # ==== Args
100
- # [event_name] イベント名
101
- # [&callback] イベントのコールバック
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
- # [event_name] イベント名
112
- # [&callback] イベントのコールバック
117
+ # [event] 監視するEventのインスタンス
118
+ # [name:] 名前(String | nil)
119
+ # [slug:] フィルタスラッグ(Symbol | nil)
120
+ # [tags:] Pluggaloid::HandlerTag|Array フィルタのタグ
121
+ # [&callback] コールバック
113
122
  # ==== Return
114
- # EventFilter
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
- if listener.is_a? vm.Listener
189
+ case listener
190
+ when vm.Listener
130
191
  @events.delete(listener)
131
192
  listener.detach
132
- elsif listener.is_a? vm.Filter
193
+ when vm.Filter
133
194
  @filters.delete(listener)
134
- listener.detach end
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
- @events.map(&:detach)
142
- @filters.map(&:detach)
143
- self.class.destroy name
144
- execute_unload_hook
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
- @unload_hook ||= []
169
- @unload_hook.push(Proc.new) end
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
 
@@ -1,3 +1,3 @@
1
1
  module Pluggaloid
2
- VERSION = "1.0.2"
2
+ VERSION = "1.1.0"
3
3
  end
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
@@ -0,0 +1,9 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module PluggaloidTestHelper
4
+ def eval_all_events(delayer=Delayer)
5
+ native = Thread.list
6
+ yield if block_given?
7
+ delayer.run while not(delayer.empty? and (Thread.list - native).empty?)
8
+ end
9
+ end
@@ -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
- it "unload hook" do
112
- value = 0
113
- Pluggaloid::Plugin.create(:unload) {
114
- on_unload {
115
- value += 2 }
116
- on_unload {
117
- value += 1 } }
118
- assert_equal(value, 0)
119
- Pluggaloid::Plugin.create(:unload).uninstall
120
- assert_equal(value, 3)
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.2
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: 2015-10-25 00:00:00.000000000 Z
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: '0'
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.4.5.1
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