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 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