pluggaloid 1.2.0 → 1.3.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
  SHA256:
3
- metadata.gz: 35247bc23e35e0883f0ad31b3e837573fcb09dda2858efd62f8a9136b147e3ff
4
- data.tar.gz: 685d655ef114502abc8c953339496ada5a59dea23d9e6cd0fbbd483650b6a7f1
3
+ metadata.gz: e068709da8ec715bcb2454af10c5b8cdf60f8da92b96357fef5996753af4930c
4
+ data.tar.gz: 4bd0da1c90d5bfa19a21f436e7f59b272f93804619386b6b30b6c3ecc42c23db
5
5
  SHA512:
6
- metadata.gz: 0ab87b2b058152cade220fcfe1b258ea681854216d43e51333b897cbbdf421bc41f4737a07e4bbcc5c8ec49bd8bea4ed5bed1469ecc20cc3ebfa4282f7679057
7
- data.tar.gz: 3a4c6f326aadded01ee31e2a1dfd600236caebfe99a15e8e056e84a53d1997f33c73485383ced9efd190e8068713109054f2f03d619a1c0a7258de900bd32499
6
+ metadata.gz: 91f7e39fed67236f339ca54b72deff6d68b4bc5482ddcfb5fd589edadea3628532e6a71f239228989dc9928ceaf25a7af947ff5444bd733ff20d23714b392511
7
+ data.tar.gz: a625889e2d9b505d7713688b0bd744b2cc5b54ec4f396a007680a54d8f4c99aa3c99c48ce45ea6d9022b3c85028196adeb3765a0c30f99ba16fdeb51559273e9
data/README.md CHANGED
@@ -54,6 +54,25 @@ Pluggaloid::newは、プラグイン機構を制御するためのDelayer, Plugi
54
54
 
55
55
  コンストラクタの唯一の引数には `Delayer.generate_class(priority: %i<high normal low>, default: :normal)`のように、優先順位付きでデフォルト優先度が設定されたDelayerを渡します。
56
56
 
57
+ ## Reactive Filter
58
+
59
+ ### each_slice(times)
60
+
61
+ _times_ 要素ずつブロックに渡して繰り返します。
62
+ 要素数が _times_ で割り切れないときは、要素が _times_ 個になるまで待ちます。
63
+
64
+ ### throttle(sec)
65
+
66
+ 最後に要素を受信してから、 _sec_ 秒の間に受信した要素を捨てます。
67
+
68
+ ### debounce(sec)
69
+
70
+ _sec_ 秒要素を受信しなかった場合、最後の要素を送信する。
71
+
72
+ ### buffer(sec)
73
+
74
+ _sec_ 秒の間に受信した要素を、 _sec_ 秒ごとに配列にまとめて送信する。
75
+
57
76
  ## Contributing
58
77
 
59
78
  1. Fork it ( https://github.com/toshia/pluggaloid/fork )
@@ -18,6 +18,7 @@ class Pluggaloid::Event
18
18
  @options = {}
19
19
  @listeners = [].freeze
20
20
  @filters = [].freeze
21
+ @subscribers = {}
21
22
  end
22
23
 
23
24
  def vm
@@ -62,18 +63,29 @@ class Pluggaloid::Event
62
63
  event_filter.filtering(*acm) } } end
63
64
 
64
65
  def add_listener(listener)
65
- unless listener.is_a? Pluggaloid::Listener
66
- raise Pluggaloid::ArgumentError, "First argument must be Pluggaloid::Listener, but given #{listener.class}."
67
- end
68
- Lock.synchronize do
69
- if @listeners.map(&:slug).include?(listener.slug)
70
- raise Pluggaloid::DuplicateListenerSlugError, "Listener slug #{listener.slug} already exists."
66
+ case listener
67
+ when Pluggaloid::Listener
68
+ Lock.synchronize do
69
+ if @listeners.map(&:slug).include?(listener.slug)
70
+ raise Pluggaloid::DuplicateListenerSlugError, "Listener slug #{listener.slug} already exists."
71
+ end
72
+ @listeners = [*@listeners, listener].freeze
73
+ end
74
+ when Pluggaloid::Subscriber
75
+ Lock.synchronize do
76
+ @subscribers[listener.accepted_hash] ||= []
77
+ @subscribers[listener.accepted_hash] << listener
71
78
  end
72
- @listeners = [*@listeners, listener].freeze
79
+ else
80
+ raise Pluggaloid::ArgumentError, "First argument must be Pluggaloid::Listener or Pluggaloid::Subscriber, but given #{listener.class}."
73
81
  end
74
82
  self
75
83
  end
76
84
 
85
+ def subscribe?(*args)
86
+ !@listeners.empty? || @subscribers.key?(argument_hash(args))
87
+ end
88
+
77
89
  def delete_listener(listener)
78
90
  Lock.synchronize do
79
91
  @listeners = @listeners.dup
@@ -83,6 +95,17 @@ class Pluggaloid::Event
83
95
  self
84
96
  end
85
97
 
98
+ def delete_subscriber(listener)
99
+ Lock.synchronize do
100
+ ss = @subscribers[listener.accepted_hash]
101
+ ss.delete(listener)
102
+ if ss.empty?
103
+ @subscribers.delete(listener.accepted_hash)
104
+ end
105
+ end
106
+ self
107
+ end
108
+
86
109
  # イベントフィルタを追加する
87
110
  # ==== Args
88
111
  # [event_filter] イベントフィルタ(Filter)
@@ -109,8 +132,28 @@ class Pluggaloid::Event
109
132
  self
110
133
  end
111
134
 
135
+ def argument_hash(args)
136
+ args.each_with_index.map do |item, i|
137
+ if i != yield_index
138
+ item.hash
139
+ end
140
+ end.compact.freeze
141
+ end
142
+
143
+ def yield_index
144
+ unless defined?(@yield_index)
145
+ @yield_index = self.options[:prototype].index(Pluggaloid::STREAM)
146
+ end
147
+ @yield_index
148
+ end
149
+
112
150
  private
113
151
  def call_all_listeners(args)
152
+ if yield_index
153
+ @subscribers[argument_hash(args)]&.each do |subscriber|
154
+ subscriber.call(*args)
155
+ end
156
+ end
114
157
  catch(:plugin_exit) do
115
158
  @listeners.each do |listener|
116
159
  listener.call(*args)
@@ -18,12 +18,14 @@ module Pluggaloid
18
18
  @vm ||= begin
19
19
  raise Pluggaloid::NoDefaultDelayerError, "Default Delayer was not set." unless Delayer.default
20
20
  vm = Pluggaloid::VM.new(
21
- Delayer.default,
22
- self,
23
- Pluggaloid::Event,
24
- Pluggaloid::Listener,
25
- Pluggaloid::Filter,
26
- Pluggaloid::HandlerTag)
21
+ Delayer: Delayer.default,
22
+ Plugin: self,
23
+ Event: Pluggaloid::Event,
24
+ Listener: Pluggaloid::Listener,
25
+ Filter: Pluggaloid::Filter,
26
+ HandlerTag: Pluggaloid::HandlerTag,
27
+ Subscriber: Pluggaloid::Subscriber
28
+ )
27
29
  vm.Event.vm = vm end end
28
30
 
29
31
  # プラグインのインスタンスを返す。
@@ -126,6 +128,26 @@ module Pluggaloid
126
128
  @filters << result
127
129
  result end
128
130
 
131
+ def subscribe(event_name, *specs, **kwrest, &block)
132
+ if block
133
+ result = vm.Subscriber.new(vm.Event[event_name], *specs, **kwrest, &block)
134
+ @events << result
135
+ result
136
+ else
137
+ Stream.new(
138
+ Enumerator.new do |yielder|
139
+ @events << vm.Subscriber.new(vm.Event[event_name], *specs, **kwrest) do |stream|
140
+ stream.each(&yielder.method(:<<))
141
+ end
142
+ end.lazy
143
+ )
144
+ end
145
+ end
146
+
147
+ def subscribe?(event_name, *specs)
148
+ vm.Event[event_name].subscribe?(*specs)
149
+ end
150
+
129
151
  # このプラグインのHandlerTagを作る。
130
152
  # ブロックが渡された場合は、ブロックの中を実行し、ブロックの中で定義された
131
153
  # Handler全てにTagを付与する。
@@ -187,7 +209,7 @@ module Pluggaloid
187
209
  def detach(*args)
188
210
  listener = args.last
189
211
  case listener
190
- when vm.Listener
212
+ when vm.Listener, vm.Subscriber
191
213
  @events.delete(listener)
192
214
  listener.detach
193
215
  when vm.Filter
@@ -253,6 +275,8 @@ module Pluggaloid
253
275
  when method_name.start_with?('filter')
254
276
  event_name = method_name[(method_name[6] == '_' ? 7 : 6)..method_name.size]
255
277
  add_event_filter(event_name.to_sym, **kwrest, &proc)
278
+ else
279
+ super
256
280
  end
257
281
  end
258
282
 
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pluggaloid
4
+ class Stream
5
+ include Enumerable
6
+
7
+ def initialize(enumerator)
8
+ @enumerator = enumerator
9
+ end
10
+
11
+ def throttle(sec)
12
+ throttling = 0
13
+ @enumerator.select do |item|
14
+ r0 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
15
+ if throttling <= r0
16
+ throttling = r0 + sec
17
+ end
18
+ end
19
+ end
20
+
21
+ def debounce(sec)
22
+ throttling_promise = nil
23
+ Stream.new(
24
+ Enumerator.new do |yielder|
25
+ @enumerator.each do |item|
26
+ throttling_promise&.cancel
27
+ throttling_promise = Delayer.new(delay: sec) do
28
+ yielder << item
29
+ end
30
+ end
31
+ end.lazy
32
+ )
33
+ end
34
+
35
+ def buffer(sec)
36
+ throttling_promise = nil
37
+ buffer = []
38
+ Stream.new(
39
+ Enumerator.new do |yielder|
40
+ @enumerator.each do |item|
41
+ buffer << item
42
+ throttling_promise ||= Delayer.new(delay: sec) do
43
+ yielder << buffer.freeze
44
+ buffer = []
45
+ throttling_promise = nil
46
+ end
47
+ end
48
+ end.lazy
49
+ )
50
+ end
51
+
52
+ def merge(*streams)
53
+ Stream.new(Merge.new(self, *streams).lazy)
54
+ end
55
+
56
+ (Enumerator.instance_methods - Enumerator.superclass.instance_methods).each do |method_name|
57
+ define_method(method_name) do |*rest, **kwrest, &block|
58
+ if kwrest.empty?
59
+ r = @enumerator.__send__(method_name, *rest, &block)
60
+ else
61
+ r = @enumerator.__send__(method_name, *rest, **kwrest, &block)
62
+ end
63
+ if r.is_a?(Enumerator::Lazy)
64
+ Pluggaloid::Stream.new(r)
65
+ else
66
+ r
67
+ end
68
+ end
69
+ end
70
+
71
+ class Merge
72
+ include Enumerable
73
+
74
+ def initialize(*sources)
75
+ @sources = sources
76
+ end
77
+
78
+ def each(&block)
79
+ fiber = Fiber.new do
80
+ loop do
81
+ block.call(Fiber.yield)
82
+ end
83
+ end
84
+ fiber.resume
85
+ @sources.each do |source|
86
+ source.each(&fiber.method(:resume))
87
+ end
88
+ self
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,35 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'securerandom'
3
+ require 'set'
4
+
5
+ class Pluggaloid::Subscriber < Pluggaloid::Handler
6
+ attr_reader :accepted_hash
7
+
8
+ # ==== Args
9
+ # [event] 監視するEventのインスタンス
10
+ # [name:] 名前(String | nil)
11
+ # [slug:] イベントリスナスラッグ(Symbol | nil)
12
+ # [tags:] Pluggaloid::HandlerTag|Array リスナのタグ
13
+ # [&callback] コールバック
14
+ def initialize(event, *specs, **kwrest, &callback)
15
+ super(event, **kwrest)
16
+ @callback = callback
17
+ @accepted_hash = @event.argument_hash(specs)
18
+ event.add_listener(self)
19
+ end
20
+
21
+ # イベントを実行する
22
+ # ==== Args
23
+ # [stream] イベントの引数
24
+ def call(*args)
25
+ @callback.call(args[@event.yield_index])
26
+ end
27
+
28
+ # このリスナを削除する
29
+ # ==== Return
30
+ # self
31
+ def detach
32
+ @event.delete_subscriber(self)
33
+ self
34
+ end
35
+ end
@@ -1,3 +1,3 @@
1
1
  module Pluggaloid
2
- VERSION = "1.2.0"
2
+ VERSION = '1.3.0'
3
3
  end
data/lib/pluggaloid.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  require "pluggaloid/version"
2
2
  require "pluggaloid/plugin"
3
+ require 'pluggaloid/stream'
3
4
  require 'pluggaloid/event'
4
5
  require "pluggaloid/identity"
5
6
  require "pluggaloid/handler"
6
7
  require 'pluggaloid/listener'
8
+ require 'pluggaloid/subscriber'
7
9
  require 'pluggaloid/filter'
8
10
  require "pluggaloid/handler_tag"
9
11
  require 'pluggaloid/error'
@@ -11,15 +13,19 @@ require 'pluggaloid/error'
11
13
  require 'delayer'
12
14
 
13
15
  module Pluggaloid
14
- VM = Struct.new(*%i<Delayer Plugin Event Listener Filter HandlerTag>)
16
+ VM = Struct.new(*%i<Delayer Plugin Event Listener Filter HandlerTag Subscriber>, keyword_init: true)
17
+
18
+ class PrototypeStream; end
19
+ STREAM = PrototypeStream.new.freeze
15
20
 
16
21
  def self.new(delayer)
17
- vm = VM.new(delayer,
18
- Class.new(Plugin),
19
- Class.new(Event),
20
- Class.new(Listener),
21
- Class.new(Filter),
22
- Class.new(HandlerTag))
22
+ vm = VM.new(Delayer: delayer,
23
+ Plugin: Class.new(Plugin),
24
+ Event: Class.new(Event),
25
+ Listener: Class.new(Listener),
26
+ Filter: Class.new(Filter),
27
+ HandlerTag: Class.new(HandlerTag),
28
+ Subscriber: Class.new(Subscriber))
23
29
  vm.Plugin.vm = vm.Event.vm = vm
24
30
  end
25
31
  end
data/pluggaloid.gemspec CHANGED
@@ -18,9 +18,9 @@ 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.4.0'
21
+ spec.required_ruby_version = '>= 2.5.0'
22
22
 
23
- spec.add_dependency 'delayer', '>= 1.0.0', '< 2.0'
23
+ spec.add_dependency 'delayer', '>= 1.1.0', '< 2.0'
24
24
  spec.add_dependency 'instance_storage', ">= 1.0.0", "< 2.0.0"
25
25
 
26
26
  spec.add_development_dependency "bundler"
data/test/plugin_test.rb CHANGED
@@ -202,4 +202,12 @@ describe(Pluggaloid::Plugin) do
202
202
  end
203
203
  end
204
204
 
205
+ it 'call undefined method in plugin context' do
206
+ assert_raises(NameError) do
207
+ Pluggaloid::Plugin.create(:raises) do
208
+ undefined_call
209
+ end
210
+ end
211
+ end
212
+
205
213
  end
@@ -0,0 +1,248 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'bundler/setup'
4
+ require 'minitest/autorun'
5
+
6
+ require 'pluggaloid'
7
+ require_relative 'helper'
8
+
9
+ describe(Pluggaloid::Plugin) do
10
+ include PluggaloidTestHelper
11
+
12
+ before do
13
+ Delayer.default = Delayer.generate_class(priority: %i<high normal low>, default: :normal)
14
+ Pluggaloid::Plugin.clear!
15
+ end
16
+
17
+ it "subscribe" do
18
+ sum = []
19
+
20
+ Pluggaloid::Plugin.create(:event) do
21
+ defevent :increase, prototype: [Integer, Pluggaloid::STREAM]
22
+ subscribe(:increase, 1) do |v|
23
+ sum = v
24
+ end
25
+ end
26
+
27
+ eval_all_events do
28
+ Pluggaloid::Event[:increase].call(1, [:one])
29
+ Pluggaloid::Event[:increase].call(2, [:two])
30
+ end
31
+
32
+ assert_equal(%i[one], sum)
33
+ end
34
+
35
+ it "subscribe?" do
36
+ sum = []
37
+
38
+ Pluggaloid::Plugin.create(:event) do
39
+ defevent :increase, prototype: [Integer, Pluggaloid::STREAM]
40
+ subscribe(:increase, 1) do |v|
41
+ end
42
+ end
43
+ assert(Pluggaloid::Plugin[:event].subscribe?(:increase, 1))
44
+ refute(Pluggaloid::Plugin[:event].subscribe?(:increase, 2))
45
+
46
+ end
47
+
48
+ it "subscribe? returns always true if plugin listener exist" do
49
+ sum = []
50
+
51
+ Pluggaloid::Plugin.create(:event) do
52
+ defevent :increase, prototype: [Integer, Pluggaloid::STREAM]
53
+ on_increase do |i, y|
54
+ end
55
+ end
56
+ assert(Pluggaloid::Plugin[:event].subscribe?(:increase, 1))
57
+ assert(Pluggaloid::Plugin[:event].subscribe?(:increase, 2))
58
+ end
59
+
60
+ it "subscribe enumerable" do
61
+ sum = []
62
+
63
+ Pluggaloid::Plugin.create(:event) do
64
+ defevent :increase, prototype: [Integer, Pluggaloid::STREAM]
65
+ subscribe(:increase, 1).each do |v|
66
+ sum = v
67
+ end
68
+ end
69
+
70
+ eval_all_events do
71
+ Pluggaloid::Event[:increase].call(1, [:one])
72
+ Pluggaloid::Event[:increase].call(2, [:two])
73
+ end
74
+
75
+ assert_equal(:one, sum)
76
+ end
77
+
78
+ it "detach" do
79
+ sum = 0
80
+ subscriber = nil
81
+ Pluggaloid::Plugin.create(:event) do
82
+ defevent :increase, prototype: [Pluggaloid::STREAM]
83
+ subscriber = subscribe(:increase) do |v|
84
+ sum += v
85
+ end
86
+ end
87
+ eval_all_events do
88
+ Pluggaloid::Event[:increase].call(1)
89
+ end
90
+ assert_equal(1, sum, "It should execute subscriber when event called")
91
+
92
+ eval_all_events do
93
+ Pluggaloid::Plugin[:event].detach subscriber
94
+ Pluggaloid::Event[:increase].call(1)
95
+ end
96
+ assert_equal(1, sum, "It should not execute detached subscriber when event called")
97
+ end
98
+
99
+ it "subscribe enumerable chain" do
100
+ sum = []
101
+
102
+ Pluggaloid::Plugin.create(:event) do
103
+ defevent :increase, prototype: [Integer, Pluggaloid::STREAM]
104
+ subscribe(:increase, 1).map{|v| v.to_s }.each do |v|
105
+ sum << v
106
+ end
107
+ end
108
+
109
+ eval_all_events do
110
+ Pluggaloid::Event[:increase].call(1, [:one])
111
+ Pluggaloid::Event[:increase].call(2, [:two])
112
+ Pluggaloid::Event[:increase].call(1, [:three])
113
+ end
114
+
115
+ assert_equal(%w[one three], sum)
116
+ end
117
+
118
+ it "subscribe each_slice" do
119
+ sum = []
120
+
121
+ Pluggaloid::Plugin.create(:event) do
122
+ defevent :increase, prototype: [Integer, Pluggaloid::STREAM]
123
+ subscribe(:increase, 1).each_slice(3).each do |v|
124
+ sum << v
125
+ end
126
+ end
127
+
128
+ eval_all_events do
129
+ Pluggaloid::Event[:increase].call(1, 100.times)
130
+ end
131
+
132
+ assert_equal([0, 1, 2], sum.first)
133
+ assert_equal([96, 97, 98], sum.last)
134
+ assert_equal(33, sum.size)
135
+
136
+ eval_all_events do
137
+ Pluggaloid::Event[:increase].call(1, [100, 101])
138
+ end
139
+
140
+ assert_equal([99, 100, 101], sum.last)
141
+ assert_equal(34, sum.size)
142
+ end
143
+
144
+ it "throttle" do
145
+ sum = []
146
+
147
+ Pluggaloid::Plugin.create(:event) do
148
+ defevent :increase, prototype: [Integer, Pluggaloid::STREAM]
149
+ subscribe(:increase, 1).throttle(0.001).each do |v|
150
+ sum << v
151
+ end
152
+ end
153
+
154
+ eval_all_events do
155
+ Pluggaloid::Event[:increase].call(1, (1..10).to_a)
156
+ Pluggaloid::Event[:increase].call(1, (11..20).to_a)
157
+ end
158
+
159
+ assert_equal(1, sum.last)
160
+ assert_equal(1, sum.size)
161
+
162
+ sleep 0.01
163
+
164
+ eval_all_events do
165
+ Pluggaloid::Event[:increase].call(1, (21..30).to_a)
166
+ end
167
+
168
+ assert_equal(21, sum.last)
169
+ assert_equal(2, sum.size)
170
+ end
171
+
172
+ it "debounce" do
173
+ sum = []
174
+
175
+ Pluggaloid::Plugin.create(:event) do
176
+ defevent :increase, prototype: [Integer, Pluggaloid::STREAM]
177
+ subscribe(:increase, 1).debounce(0.01).each do |v|
178
+ sum << v
179
+ end
180
+ end
181
+
182
+ eval_all_events do
183
+ Pluggaloid::Event[:increase].call(1, (1..10).to_a)
184
+ Pluggaloid::Event[:increase].call(1, (11..20).to_a)
185
+ end
186
+
187
+ assert_equal(0, sum.size)
188
+
189
+ sleep 0.02
190
+ Delayer.run
191
+
192
+ assert_equal(1, sum.size)
193
+ assert_equal(20, sum.last)
194
+ end
195
+
196
+ it "buffer" do
197
+ sum = []
198
+
199
+ Pluggaloid::Plugin.create(:event) do
200
+ defevent :increase, prototype: [Integer, Pluggaloid::STREAM]
201
+ subscribe(:increase, 1).buffer(0.01).each do |v|
202
+ sum << v
203
+ end
204
+ end
205
+
206
+ eval_all_events do
207
+ Pluggaloid::Event[:increase].call(1, (1..10).to_a)
208
+ Pluggaloid::Event[:increase].call(1, (11..20).to_a)
209
+ end
210
+
211
+ assert_equal(0, sum.size)
212
+
213
+ sleep 0.1
214
+ Delayer.run
215
+ Pluggaloid::Event[:increase].call(1, [21])
216
+ Delayer.run
217
+
218
+ assert_equal(1, sum.size)
219
+ assert_equal((1..20).to_a, sum.last)
220
+ end
221
+
222
+ it "merge" do
223
+ sum = sum1 = sum2 = 0
224
+ Pluggaloid::Plugin.create(:event) do
225
+ defevent :increase, prototype: [Integer, Pluggaloid::STREAM]
226
+ subscribe(:increase, 1).each do |v|
227
+ sum1 += v
228
+ end
229
+
230
+ subscribe(:increase, 2).each do |v|
231
+ sum2 += v
232
+ end
233
+
234
+ subscribe(:increase, 1).merge(subscribe(:increase, 2)).each do |v|
235
+ sum += v
236
+ end
237
+ end
238
+
239
+ eval_all_events do
240
+ Pluggaloid::Event[:increase].call(1, (1..10).to_a)
241
+ Pluggaloid::Event[:increase].call(2, (11..20).to_a)
242
+ end
243
+
244
+ assert_equal((1..10).to_a.sum, sum1)
245
+ assert_equal((11..20).to_a.sum, sum2)
246
+ assert_equal((1..20).to_a.sum, sum)
247
+ end
248
+ 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.2.0
4
+ version: 1.3.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: 2019-06-01 00:00:00.000000000 Z
11
+ date: 2020-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: delayer
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.0.0
19
+ version: 1.1.0
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: '2.0'
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 1.0.0
29
+ version: 1.1.0
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '2.0'
@@ -113,12 +113,15 @@ files:
113
113
  - lib/pluggaloid/identity.rb
114
114
  - lib/pluggaloid/listener.rb
115
115
  - lib/pluggaloid/plugin.rb
116
+ - lib/pluggaloid/stream.rb
117
+ - lib/pluggaloid/subscriber.rb
116
118
  - lib/pluggaloid/version.rb
117
119
  - pluggaloid.gemspec
118
120
  - test/handler_tag_test.rb
119
121
  - test/helper.rb
120
122
  - test/multi_vm_test.rb
121
123
  - test/plugin_test.rb
124
+ - test/reactive_test.rb
122
125
  homepage: https://rubygems.org/gems/pluggaloid
123
126
  licenses:
124
127
  - MIT
@@ -131,14 +134,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
131
134
  requirements:
132
135
  - - ">="
133
136
  - !ruby/object:Gem::Version
134
- version: 2.4.0
137
+ version: 2.5.0
135
138
  required_rubygems_version: !ruby/object:Gem::Requirement
136
139
  requirements:
137
140
  - - ">="
138
141
  - !ruby/object:Gem::Version
139
142
  version: '0'
140
143
  requirements: []
141
- rubygems_version: 3.0.3
144
+ rubygems_version: 3.1.2
142
145
  signing_key:
143
146
  specification_version: 4
144
147
  summary: Extensible plugin system
@@ -147,3 +150,4 @@ test_files:
147
150
  - test/helper.rb
148
151
  - test/multi_vm_test.rb
149
152
  - test/plugin_test.rb
153
+ - test/reactive_test.rb