pluggaloid 1.1.1 → 1.1.2
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 +5 -5
- data/lib/pluggaloid/event.rb +37 -15
- data/lib/pluggaloid/filter.rb +16 -5
- data/lib/pluggaloid/handler_tag.rb +9 -9
- data/lib/pluggaloid/listener.rb +1 -1
- data/lib/pluggaloid/plugin.rb +20 -20
- data/lib/pluggaloid/version.rb +1 -1
- data/pluggaloid.gemspec +1 -1
- data/test/helper.rb +2 -2
- metadata +4 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c2e0d7c80c5e6e013d8adfd22d6e242fb15bd00e1df0b1667443132c4307e846
|
4
|
+
data.tar.gz: 647c05b3f6e5083798ec8d90852dc16c6f29ff539f110b317340eaee50b01a25
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a629bf91f585251405c72a7e561f9de3275d4d20fd3bfad2cfc511c1c1acd47f17d365cc3a51b7417e20310d846f1fbeb7d0253aa6a61a648af5a81959a7826
|
7
|
+
data.tar.gz: d890f710693d94ba7564f1744e51fd18b83e00b4c4597085e254b6da302d7eaa1c6db53ef2129aab6f981c68c295aa5e8b4521099ff78e6e006b87dea50ab2cb
|
data/lib/pluggaloid/event.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
class Pluggaloid::Event
|
4
|
+
Lock = Mutex.new
|
5
|
+
|
4
6
|
include InstanceStorage
|
5
7
|
|
6
8
|
# オプション。以下のキーを持つHash
|
@@ -14,8 +16,9 @@ class Pluggaloid::Event
|
|
14
16
|
def initialize(*args)
|
15
17
|
super
|
16
18
|
@options = {}
|
17
|
-
@listeners = []
|
18
|
-
@filters = []
|
19
|
+
@listeners = [].freeze
|
20
|
+
@filters = [].freeze
|
21
|
+
end
|
19
22
|
|
20
23
|
def vm
|
21
24
|
self.class.vm end
|
@@ -60,15 +63,25 @@ class Pluggaloid::Event
|
|
60
63
|
|
61
64
|
def add_listener(listener)
|
62
65
|
unless listener.is_a? Pluggaloid::Listener
|
63
|
-
raise Pluggaloid::ArgumentError, "First argument must be Pluggaloid::Listener, but given #{listener.class}."
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
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."
|
71
|
+
end
|
72
|
+
@listeners = [*@listeners, listener].freeze
|
73
|
+
end
|
74
|
+
self
|
75
|
+
end
|
68
76
|
|
69
|
-
def delete_listener(
|
70
|
-
|
71
|
-
|
77
|
+
def delete_listener(listener)
|
78
|
+
Lock.synchronize do
|
79
|
+
@listeners = @listeners.dup
|
80
|
+
@listeners.delete(listener)
|
81
|
+
@listeners.freeze
|
82
|
+
end
|
83
|
+
self
|
84
|
+
end
|
72
85
|
|
73
86
|
# イベントフィルタを追加する
|
74
87
|
# ==== Args
|
@@ -78,8 +91,9 @@ class Pluggaloid::Event
|
|
78
91
|
def add_filter(event_filter)
|
79
92
|
unless event_filter.is_a? Pluggaloid::Filter
|
80
93
|
raise Pluggaloid::ArgumentError, "First argument must be Pluggaloid::Filter, but given #{event_filter.class}." end
|
81
|
-
@filters
|
82
|
-
self
|
94
|
+
@filters = [*@filters, event_filter].freeze
|
95
|
+
self
|
96
|
+
end
|
83
97
|
|
84
98
|
# イベントフィルタを削除する
|
85
99
|
# ==== Args
|
@@ -87,14 +101,22 @@ class Pluggaloid::Event
|
|
87
101
|
# ==== Return
|
88
102
|
# self
|
89
103
|
def delete_filter(event_filter)
|
90
|
-
|
91
|
-
|
104
|
+
Lock.synchronize do
|
105
|
+
@filters = @filters.dup
|
106
|
+
@filters.delete(event_filter)
|
107
|
+
@filters.freeze
|
108
|
+
end
|
109
|
+
self
|
110
|
+
end
|
92
111
|
|
93
112
|
private
|
94
113
|
def call_all_listeners(args)
|
95
114
|
catch(:plugin_exit) do
|
96
115
|
@listeners.each do |listener|
|
97
|
-
listener.call(*args)
|
116
|
+
listener.call(*args)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
98
120
|
|
99
121
|
class << self
|
100
122
|
attr_accessor :filter_another_thread, :vm
|
data/lib/pluggaloid/filter.rb
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
class Pluggaloid::Filter < Pluggaloid::Handler
|
4
|
+
NotConverted = Class.new
|
5
|
+
THROUGH = NotConverted.new.freeze
|
6
|
+
|
4
7
|
# フィルタ内部で使う。フィルタの実行をキャンセルする。Plugin#filtering はfalseを返し、
|
5
8
|
# イベントのフィルタの場合は、そのイベントの実行自体をキャンセルする。
|
6
9
|
# また、 _result_ が渡された場合、Event#filtering の戻り値は _result_ になる。
|
7
10
|
def self.cancel!(result=false)
|
8
11
|
throw :filter_exit, result end
|
9
12
|
|
13
|
+
CANCEL_PROC = method(:cancel!)
|
14
|
+
|
10
15
|
# ==== Args
|
11
16
|
# [event] 監視するEventのインスタンス
|
12
17
|
# [name:] 名前(String | nil)
|
@@ -15,7 +20,7 @@ class Pluggaloid::Filter < Pluggaloid::Handler
|
|
15
20
|
# [&callback] コールバック
|
16
21
|
def initialize(event, **kwrest, &callback)
|
17
22
|
super
|
18
|
-
@callback =
|
23
|
+
@callback = callback
|
19
24
|
event.add_filter self end
|
20
25
|
|
21
26
|
# イベントを実行する
|
@@ -25,10 +30,16 @@ class Pluggaloid::Filter < Pluggaloid::Handler
|
|
25
30
|
# 加工後の引数の配列
|
26
31
|
def filtering(*args)
|
27
32
|
length = args.size
|
28
|
-
result = @callback.call(*args, &
|
29
|
-
|
30
|
-
|
31
|
-
|
33
|
+
result = @callback.call(*args, &CANCEL_PROC)
|
34
|
+
case
|
35
|
+
when THROUGH == result
|
36
|
+
args
|
37
|
+
when length != result.size
|
38
|
+
raise Pluggaloid::FilterError, "filter changes arguments length (#{length} to #{result.size})"
|
39
|
+
else
|
40
|
+
result
|
41
|
+
end
|
42
|
+
end
|
32
43
|
|
33
44
|
# このリスナを削除する
|
34
45
|
# ==== Return
|
@@ -48,12 +48,12 @@ class Pluggaloid::HandlerTag < Pluggaloid::Identity
|
|
48
48
|
# このTagがついている Pluggaloid::Listener と Pluggaloid::Filter を全て列挙する
|
49
49
|
# ==== Return
|
50
50
|
# Enumerable
|
51
|
-
def each
|
52
|
-
if
|
51
|
+
def each(&block)
|
52
|
+
if block
|
53
53
|
Enumerator.new do |y|
|
54
54
|
listeners{|x| y << x }
|
55
55
|
filters{|x| y << x }
|
56
|
-
end.each(&
|
56
|
+
end.each(&block)
|
57
57
|
else
|
58
58
|
Enumerator.new do |y|
|
59
59
|
listeners{|x| y << x }
|
@@ -65,9 +65,9 @@ class Pluggaloid::HandlerTag < Pluggaloid::Identity
|
|
65
65
|
# このTagがついている Pluggaloid::Listener を全て列挙する
|
66
66
|
# ==== Return
|
67
67
|
# Enumerable
|
68
|
-
def listeners
|
69
|
-
if
|
70
|
-
listeners.each(&
|
68
|
+
def listeners(&block)
|
69
|
+
if block
|
70
|
+
listeners.each(&block)
|
71
71
|
else
|
72
72
|
@plugin.to_enum(:listeners).lazy.select{|l| l.tags.include?(self) }
|
73
73
|
end
|
@@ -76,9 +76,9 @@ class Pluggaloid::HandlerTag < Pluggaloid::Identity
|
|
76
76
|
# このTagがついている Pluggaloid::Filter を全て列挙する
|
77
77
|
# ==== Return
|
78
78
|
# Enumerable
|
79
|
-
def filters
|
80
|
-
if
|
81
|
-
filters.each(&
|
79
|
+
def filters(&block)
|
80
|
+
if block
|
81
|
+
filters.each(&block)
|
82
82
|
else
|
83
83
|
@plugin.to_enum(:filters).lazy.select{|l| l.tags.include?(self) }
|
84
84
|
end
|
data/lib/pluggaloid/listener.rb
CHANGED
data/lib/pluggaloid/plugin.rb
CHANGED
@@ -134,7 +134,7 @@ module Pluggaloid
|
|
134
134
|
# [name] タグ名
|
135
135
|
# ==== Return
|
136
136
|
# Pluggaloid::HandlerTag
|
137
|
-
def handler_tag(slug=SecureRandom.uuid, name=slug)
|
137
|
+
def handler_tag(slug=SecureRandom.uuid, name=slug, &block)
|
138
138
|
tag = case slug
|
139
139
|
when String, Symbol
|
140
140
|
vm.HandlerTag.new(slug: slug.to_sym, name: name.to_s, plugin: self)
|
@@ -143,9 +143,9 @@ module Pluggaloid
|
|
143
143
|
else
|
144
144
|
raise Pluggaloid::TypeError, "Argument `slug' must be instance of Symbol, String or Pluggaloid::HandlerTag, but given #{slug.class}."
|
145
145
|
end
|
146
|
-
if
|
146
|
+
if block
|
147
147
|
handlers = @events + @filters
|
148
|
-
|
148
|
+
block.(tag)
|
149
149
|
(@events + @filters - handlers).each do |handler|
|
150
150
|
handler.add_tag(tag)
|
151
151
|
end
|
@@ -157,9 +157,9 @@ module Pluggaloid
|
|
157
157
|
# イベントリスナを列挙する
|
158
158
|
# ==== Return
|
159
159
|
# Set of Pluggaloid::Listener
|
160
|
-
def listeners
|
161
|
-
if
|
162
|
-
@events.each(&
|
160
|
+
def listeners(&block)
|
161
|
+
if block
|
162
|
+
@events.each(&block)
|
163
163
|
else
|
164
164
|
@events.dup
|
165
165
|
end
|
@@ -168,9 +168,9 @@ module Pluggaloid
|
|
168
168
|
# フィルタを列挙する
|
169
169
|
# ==== Return
|
170
170
|
# Set of Pluggaloid::Filter
|
171
|
-
def filters
|
172
|
-
if
|
173
|
-
@filters.each(&
|
171
|
+
def filters(&block)
|
172
|
+
if block
|
173
|
+
@filters.each(&block)
|
174
174
|
else
|
175
175
|
@filters.dup
|
176
176
|
end
|
@@ -232,8 +232,7 @@ module Pluggaloid
|
|
232
232
|
self end
|
233
233
|
|
234
234
|
# プラグインが Plugin.uninstall される時に呼ばれるブロックを登録する。
|
235
|
-
def onunload
|
236
|
-
callback = Proc.new
|
235
|
+
def onunload(&callback)
|
237
236
|
add_event(:unload) do |plugin_slug|
|
238
237
|
if plugin_slug == self.name
|
239
238
|
callback.call
|
@@ -246,15 +245,16 @@ module Pluggaloid
|
|
246
245
|
# on_?name :: add_event(name)
|
247
246
|
# filter_?name :: add_event_filter(name)
|
248
247
|
def method_missing(method, *args, **kwrest, &proc)
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
when
|
255
|
-
|
256
|
-
|
257
|
-
|
248
|
+
method_name = method.to_s
|
249
|
+
case
|
250
|
+
when method_name.start_with?('on')
|
251
|
+
event_name = method_name[(method_name[2] == '_' ? 3 : 2)..method_name.size]
|
252
|
+
add_event(event_name.to_sym, *args, **kwrest, &proc)
|
253
|
+
when method_name.start_with?('filter')
|
254
|
+
event_name = method_name[(method_name[6] == '_' ? 7 : 6)..method_name.size]
|
255
|
+
add_event_filter(event_name.to_sym, **kwrest, &proc)
|
256
|
+
end
|
257
|
+
end
|
258
258
|
|
259
259
|
private
|
260
260
|
|
data/lib/pluggaloid/version.rb
CHANGED
data/pluggaloid.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["toshi.alternative@gmail.com"]
|
11
11
|
spec.summary = %q{Extensible plugin system}
|
12
12
|
spec.description = %q{Pluggaloid is extensible plugin system for mikutter.}
|
13
|
-
spec.homepage = ""
|
13
|
+
spec.homepage = "https://rubygems.org/gems/pluggaloid"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
data/test/helper.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
module PluggaloidTestHelper
|
4
|
-
def eval_all_events(delayer=Delayer)
|
4
|
+
def eval_all_events(delayer=Delayer, &block)
|
5
5
|
native = Thread.list
|
6
|
-
|
6
|
+
block.() if block
|
7
7
|
delayer.run while not(delayer.empty? and (Thread.list - native).empty?)
|
8
8
|
end
|
9
9
|
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.1.
|
4
|
+
version: 1.1.2
|
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: 2019-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: delayer
|
@@ -113,7 +113,7 @@ files:
|
|
113
113
|
- test/helper.rb
|
114
114
|
- test/multi_vm_test.rb
|
115
115
|
- test/plugin_test.rb
|
116
|
-
homepage:
|
116
|
+
homepage: https://rubygems.org/gems/pluggaloid
|
117
117
|
licenses:
|
118
118
|
- MIT
|
119
119
|
metadata: {}
|
@@ -132,8 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
132
132
|
- !ruby/object:Gem::Version
|
133
133
|
version: '0'
|
134
134
|
requirements: []
|
135
|
-
|
136
|
-
rubygems_version: 2.5.1
|
135
|
+
rubygems_version: 3.0.3
|
137
136
|
signing_key:
|
138
137
|
specification_version: 4
|
139
138
|
summary: Extensible plugin system
|