resugan 0.1.13 → 0.1.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +4 -0
- data/README.md +60 -1
- data/lib/resugan/context.rb +1 -1
- data/lib/resugan/kernel.rb +27 -13
- data/lib/resugan/object.rb +13 -1
- data/lib/resugan/thread.rb +28 -6
- data/lib/resugan/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9529648f6c3c3ea15ec3bbd5de41528befc5b4ee
|
4
|
+
data.tar.gz: 54d84c99dad40bef7d122d853fecc369fcf12c1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14d17a89b022eeaba39cd2b719691464f71ff43d0a7f1bd9c9eba0e140c8f08ee5009b9305ec8f58fb211595c04e88795c856bf3b4afd590d17b72cfaf2e83ae
|
7
|
+
data.tar.gz: bdd07b56ed36bc09446ba3de39cbf995fae37a879879b065937e0872a138e28f5829fa6683ebb09cffcc331705a9fab19976a655a7c2d1df5320f420b2c151fb
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
= Version 0.1.14
|
2
|
+
* events will only be resolved at the top level for nested resugan blocks unless resugan! is used
|
3
|
+
* Config is set using Resugan::Kernel.config do |c| c..... end
|
4
|
+
|
1
5
|
= Version 0.1.11
|
2
6
|
* Allow listeners to attach to multiple namespaces to allow for DRY'er code
|
3
7
|
|
data/README.md
CHANGED
@@ -147,6 +147,57 @@ listener that belongs to 2 namespaces
|
|
147
147
|
hello! someone said hay!
|
148
148
|
listener that belongs to 2 namespaces
|
149
149
|
```
|
150
|
+
|
151
|
+
### Behavior of nested resugan blocks
|
152
|
+
|
153
|
+
Resugan will by default only resolve events at the outermost resugan context of
|
154
|
+
a namespace.
|
155
|
+
|
156
|
+
```ruby
|
157
|
+
_listener :event1 do |array_of_params|
|
158
|
+
puts "hello! event 1"
|
159
|
+
end
|
160
|
+
|
161
|
+
_listener :event2, namespace: "group2" do |array_of_params|
|
162
|
+
puts "hello! event 1"
|
163
|
+
end
|
164
|
+
|
165
|
+
resugan {
|
166
|
+
_fire :event1
|
167
|
+
|
168
|
+
resugan {
|
169
|
+
_fire :event2
|
170
|
+
}
|
171
|
+
}
|
172
|
+
```
|
173
|
+
|
174
|
+
If there are nested resugan blocks note that event dispatch will occur at the
|
175
|
+
outermost context. Output will be:
|
176
|
+
|
177
|
+
```
|
178
|
+
hello! event 1
|
179
|
+
hello! event 2
|
180
|
+
```
|
181
|
+
|
182
|
+
To force the innermost block to immediately resolve, use resugan! instead (or set Kernel.config.reuse_top_level_context = false globally):
|
183
|
+
|
184
|
+
```ruby
|
185
|
+
resugan {
|
186
|
+
_fire :event1
|
187
|
+
|
188
|
+
resugan! {
|
189
|
+
_fire :event2
|
190
|
+
}
|
191
|
+
}
|
192
|
+
```
|
193
|
+
|
194
|
+
Since the inner block will be resolved first, Output will be:
|
195
|
+
|
196
|
+
```
|
197
|
+
hello! event 2
|
198
|
+
hello! event 1
|
199
|
+
```
|
200
|
+
|
150
201
|
## Unique Listeners
|
151
202
|
|
152
203
|
the _listener always creates a new listener for an event, so if it so happens that
|
@@ -207,7 +258,9 @@ This allows you to use various queue backends per namespace, like resugan-worker
|
|
207
258
|
Sometimes you need to track where events are fired. You can do so by enabling line tracing:
|
208
259
|
|
209
260
|
```ruby
|
210
|
-
Resugan::Kernel.
|
261
|
+
Resugan::Kernel.config do |c|
|
262
|
+
c.line_trace_enabled = true
|
263
|
+
end
|
211
264
|
```
|
212
265
|
|
213
266
|
Line source should now be passed as params everytime you fire an event. You can also
|
@@ -247,6 +300,12 @@ Can also be used as a sample on how to extend resugan.
|
|
247
300
|
|
248
301
|
https://github.com/jedld/resugan-worker
|
249
302
|
|
303
|
+
### Testing
|
304
|
+
|
305
|
+
RSpec helpers are available:
|
306
|
+
|
307
|
+
https://github.com/jedld/resugan-rspec
|
308
|
+
|
250
309
|
## Similar Projects
|
251
310
|
|
252
311
|
wisper (https://github.com/krisleech/wisper) - An excellent gem that focuses on a coupled pub-sub model. Though its global listeners somehow have the same effect though in a syntactically different way.
|
data/lib/resugan/context.rb
CHANGED
data/lib/resugan/kernel.rb
CHANGED
@@ -1,39 +1,53 @@
|
|
1
1
|
module Resugan
|
2
|
+
class Config
|
3
|
+
attr_accessor :reuse_top_level_context, :warn_no_context_events, :line_trace_enabled, :default_dispatcher
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@reuse_top_level_context = true
|
7
|
+
@warn_no_context_events = false
|
8
|
+
@line_trace_enabled = false
|
9
|
+
@default_dispatcher = Resugan::Engine::InlineDispatcher
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
2
13
|
class Kernel
|
3
|
-
|
4
|
-
|
5
|
-
|
14
|
+
def self.config
|
15
|
+
@config ||= Resugan::Config.new
|
16
|
+
if block_given?
|
17
|
+
yield @config
|
18
|
+
end
|
19
|
+
|
20
|
+
@config
|
6
21
|
end
|
7
22
|
|
8
|
-
def self.
|
9
|
-
|
23
|
+
def self.reuse_top_level_context?
|
24
|
+
config.reuse_top_level_context
|
10
25
|
end
|
11
26
|
|
12
|
-
|
13
|
-
|
14
|
-
@enable = enable
|
27
|
+
def self.warn_no_context_events?
|
28
|
+
config.warn_no_context_events
|
15
29
|
end
|
16
30
|
|
17
31
|
def self.line_trace_enabled?
|
18
|
-
|
32
|
+
config.line_trace_enabled
|
19
33
|
end
|
20
34
|
|
21
35
|
def self.set_default_dispatcher(dispatcher)
|
22
|
-
|
36
|
+
config.default_dispatcher = dispatcher
|
23
37
|
end
|
24
38
|
|
25
39
|
def self.default_dispatcher
|
26
|
-
|
40
|
+
config.default_dispatcher
|
27
41
|
end
|
28
42
|
|
29
43
|
def self.dispatcher_for(namespace = '')
|
30
44
|
@dispatchers = {} unless @dispatchers
|
31
|
-
@dispatchers[namespace] || default_dispatcher
|
45
|
+
@dispatchers[namespace.to_s] || default_dispatcher.new
|
32
46
|
end
|
33
47
|
|
34
48
|
def self.register_dispatcher(dispatcher, namespace = '')
|
35
49
|
@dispatchers = {} unless @dispatchers
|
36
|
-
@dispatchers[namespace] = dispatcher.is_a?(Class) ? dispatcher.new : dispatcher
|
50
|
+
@dispatchers[namespace.to_s] = (dispatcher.is_a?(Class) ? dispatcher.new : dispatcher)
|
37
51
|
end
|
38
52
|
|
39
53
|
def self.register(event, &block)
|
data/lib/resugan/object.rb
CHANGED
@@ -1,12 +1,24 @@
|
|
1
1
|
class Object
|
2
2
|
def resugan(namespace = '', &block)
|
3
|
+
namespace ||= ''
|
3
4
|
current_thread = Thread.current
|
4
5
|
current_thread.push_resugan_context(namespace)
|
5
6
|
begin
|
6
7
|
block.call
|
7
8
|
ensure
|
8
9
|
context = current_thread.pop_resugan_context
|
9
|
-
|
10
|
+
end
|
11
|
+
context
|
12
|
+
end
|
13
|
+
|
14
|
+
def resugan!(namespace = '', &block)
|
15
|
+
namespace ||= ''
|
16
|
+
current_thread = Thread.current
|
17
|
+
current_thread.push_resugan_context(namespace, true)
|
18
|
+
begin
|
19
|
+
block.call
|
20
|
+
ensure
|
21
|
+
context = current_thread.pop_resugan_context(true)
|
10
22
|
end
|
11
23
|
context
|
12
24
|
end
|
data/lib/resugan/thread.rb
CHANGED
@@ -1,18 +1,40 @@
|
|
1
1
|
class Thread
|
2
|
-
def push_resugan_context(namespace = '')
|
3
|
-
|
4
|
-
|
2
|
+
def push_resugan_context(namespace = '', force_invoke = false)
|
3
|
+
@resugan_context_stack ||= []
|
4
|
+
|
5
|
+
namespace = namespace.to_s
|
6
|
+
|
7
|
+
if @resugan_context.nil? || !Resugan::Kernel.reuse_top_level_context? || force_invoke
|
8
|
+
@resugan_context = Resugan::Context.new(namespace)
|
9
|
+
elsif @resugan_context.namespace != namespace
|
10
|
+
@resugan_context = (@resugan_context_stack.reverse.find { |e| e.namespace == namespace }) || Resugan::Context.new(namespace)
|
5
11
|
end
|
6
12
|
|
7
|
-
@resugan_context = Resugan::Context.new(namespace)
|
8
13
|
@resugan_context_stack << @resugan_context
|
9
14
|
end
|
10
15
|
|
11
|
-
def pop_resugan_context
|
12
|
-
|
16
|
+
def pop_resugan_context(force_invoke = false)
|
17
|
+
_resugan_context = @resugan_context_stack.pop
|
18
|
+
@resugan_context = @resugan_context_stack.last
|
19
|
+
|
20
|
+
# depending on option, only invoke if top level
|
21
|
+
if !force_invoke && Resugan::Kernel.reuse_top_level_context?
|
22
|
+
_resugan_context.invoke if @resugan_context_stack.find { |e| e.namespace == _resugan_context.namespace }.nil?
|
23
|
+
elsif
|
24
|
+
_resugan_context.invoke
|
25
|
+
end
|
26
|
+
|
27
|
+
_resugan_context
|
13
28
|
end
|
14
29
|
|
15
30
|
def resugan_context
|
16
31
|
@resugan_context
|
17
32
|
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def clear_context
|
37
|
+
@resugan_context_stack = []
|
38
|
+
@resugan_context
|
39
|
+
end
|
18
40
|
end
|
data/lib/resugan/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resugan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joseph Emmanuel Dayo
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-07-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|