has-guarded-handlers 0.0.3 → 0.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.
- data/CHANGELOG.md +5 -2
- data/lib/has_guarded_handlers.rb +26 -4
- data/lib/has_guarded_handlers/version.rb +1 -1
- data/spec/has_guarded_handlers_spec.rb +44 -0
- metadata +16 -16
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
+
# 0.1.0
|
2
|
+
* Allow setting a priority with which to execute a handler, where higher priority handlers are exectuted first
|
3
|
+
|
1
4
|
# 0.0.3
|
2
|
-
|
5
|
+
* Allow classes to be passed as guards, matching against an event via #is_a?
|
3
6
|
|
4
7
|
# 0.0.2
|
5
|
-
|
8
|
+
* Bugfix: The mixin now does not hijack the target's initializer which was causing issues with inheritance
|
6
9
|
|
7
10
|
# 0.0.1
|
8
11
|
* Feature: Some code that works!
|
data/lib/has_guarded_handlers.rb
CHANGED
@@ -7,10 +7,21 @@ module HasGuardedHandlers
|
|
7
7
|
# @param [guards] guards take a look at the guards documentation
|
8
8
|
# @yield [Object] stanza the incoming event
|
9
9
|
def register_handler(type, *guards, &handler)
|
10
|
+
register_handler_with_priority type, 0, *guards, &handler
|
11
|
+
end
|
12
|
+
|
13
|
+
# Register a handler with a specified priority
|
14
|
+
#
|
15
|
+
# @param [Symbol, nil] type set the filter on a specific handler
|
16
|
+
# @param [Integer] priority the priority of the handler. Higher priority executes first
|
17
|
+
# @param [guards] guards take a look at the guards documentation
|
18
|
+
# @yield [Object] stanza the incoming event
|
19
|
+
def register_handler_with_priority(type, priority, *guards, &handler)
|
10
20
|
initialize_guarded_handlers
|
11
21
|
check_guards guards
|
12
|
-
@handlers[type] ||=
|
13
|
-
@handlers[type]
|
22
|
+
@handlers[type] ||= {}
|
23
|
+
@handlers[type][priority] ||= []
|
24
|
+
@handlers[type][priority] << [guards, handler]
|
14
25
|
end
|
15
26
|
|
16
27
|
# Clear handlers with given guards
|
@@ -19,12 +30,14 @@ module HasGuardedHandlers
|
|
19
30
|
# @param [guards] guards take a look at the guards documentation
|
20
31
|
def clear_handlers(type, *guards)
|
21
32
|
initialize_guarded_handlers
|
22
|
-
@handlers[type].
|
33
|
+
@handlers[type].each_pair do |priority, handlers|
|
34
|
+
handlers.delete_if { |g, _| g == guards }
|
35
|
+
end
|
23
36
|
end
|
24
37
|
|
25
38
|
def trigger_handler(type, event)
|
26
39
|
initialize_guarded_handlers
|
27
|
-
return unless handler =
|
40
|
+
return unless handler = handlers_of_type(type)
|
28
41
|
catch :halt do
|
29
42
|
handler.find do |guards, handler|
|
30
43
|
catch(:pass) { call_handler handler, guards, event }
|
@@ -34,6 +47,15 @@ module HasGuardedHandlers
|
|
34
47
|
|
35
48
|
private
|
36
49
|
|
50
|
+
def handlers_of_type(type)
|
51
|
+
hash = @handlers[type]
|
52
|
+
values = []
|
53
|
+
hash.keys.sort.reverse.each do |key|
|
54
|
+
values += hash[key]
|
55
|
+
end
|
56
|
+
values
|
57
|
+
end
|
58
|
+
|
37
59
|
def call_handler(handler, guards, event)
|
38
60
|
handler.call event unless guarded?(guards, event)
|
39
61
|
end
|
@@ -39,6 +39,50 @@ describe TestObject do
|
|
39
39
|
subject.trigger_handler :event, event
|
40
40
|
end
|
41
41
|
|
42
|
+
describe 'when registering handlers with the same priority' do
|
43
|
+
it 'preserves the order of specification of the handlers' do
|
44
|
+
sequence = sequence 'handler_priority'
|
45
|
+
response.expects(:handle1).once.in_sequence sequence
|
46
|
+
response.expects(:handle2).once.in_sequence sequence
|
47
|
+
response.expects(:handle3).once.in_sequence sequence
|
48
|
+
subject.register_handler :event do |_|
|
49
|
+
response.handle1
|
50
|
+
throw :pass
|
51
|
+
end
|
52
|
+
subject.register_handler :event do |_|
|
53
|
+
response.handle2
|
54
|
+
throw :pass
|
55
|
+
end
|
56
|
+
subject.register_handler :event do |_|
|
57
|
+
response.handle3
|
58
|
+
throw :pass
|
59
|
+
end
|
60
|
+
subject.trigger_handler :event, event
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe 'when registering handlers with a specified priority' do
|
65
|
+
it 'executes handlers in that order' do
|
66
|
+
sequence = sequence 'handler_priority'
|
67
|
+
response.expects(:handle1).once.in_sequence sequence
|
68
|
+
response.expects(:handle2).once.in_sequence sequence
|
69
|
+
response.expects(:handle3).once.in_sequence sequence
|
70
|
+
subject.register_handler_with_priority :event, -10 do |_|
|
71
|
+
response.handle3
|
72
|
+
throw :pass
|
73
|
+
end
|
74
|
+
subject.register_handler_with_priority :event, 0 do |_|
|
75
|
+
response.handle2
|
76
|
+
throw :pass
|
77
|
+
end
|
78
|
+
subject.register_handler_with_priority :event, 10 do |_|
|
79
|
+
response.handle1
|
80
|
+
throw :pass
|
81
|
+
end
|
82
|
+
subject.trigger_handler :event, event
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
42
86
|
it 'can clear handlers' do
|
43
87
|
response.expects(:call).once
|
44
88
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: has-guarded-handlers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,12 +10,12 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2011-
|
13
|
+
date: 2011-10-28 00:00:00.000000000 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
18
|
-
requirement: &
|
18
|
+
requirement: &2165367660 !ruby/object:Gem::Requirement
|
19
19
|
none: false
|
20
20
|
requirements:
|
21
21
|
- - ~>
|
@@ -23,10 +23,10 @@ dependencies:
|
|
23
23
|
version: 1.0.0
|
24
24
|
type: :development
|
25
25
|
prerelease: false
|
26
|
-
version_requirements: *
|
26
|
+
version_requirements: *2165367660
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
|
-
requirement: &
|
29
|
+
requirement: &2165366980 !ruby/object:Gem::Requirement
|
30
30
|
none: false
|
31
31
|
requirements:
|
32
32
|
- - ! '>='
|
@@ -34,10 +34,10 @@ dependencies:
|
|
34
34
|
version: 2.5.0
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
|
-
version_requirements: *
|
37
|
+
version_requirements: *2165366980
|
38
38
|
- !ruby/object:Gem::Dependency
|
39
39
|
name: mocha
|
40
|
-
requirement: &
|
40
|
+
requirement: &2165366340 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
43
|
- - ! '>='
|
@@ -45,10 +45,10 @@ dependencies:
|
|
45
45
|
version: '0'
|
46
46
|
type: :development
|
47
47
|
prerelease: false
|
48
|
-
version_requirements: *
|
48
|
+
version_requirements: *2165366340
|
49
49
|
- !ruby/object:Gem::Dependency
|
50
50
|
name: ci_reporter
|
51
|
-
requirement: &
|
51
|
+
requirement: &2165365700 !ruby/object:Gem::Requirement
|
52
52
|
none: false
|
53
53
|
requirements:
|
54
54
|
- - ! '>='
|
@@ -56,10 +56,10 @@ dependencies:
|
|
56
56
|
version: 1.6.3
|
57
57
|
type: :development
|
58
58
|
prerelease: false
|
59
|
-
version_requirements: *
|
59
|
+
version_requirements: *2165365700
|
60
60
|
- !ruby/object:Gem::Dependency
|
61
61
|
name: yard
|
62
|
-
requirement: &
|
62
|
+
requirement: &2165365060 !ruby/object:Gem::Requirement
|
63
63
|
none: false
|
64
64
|
requirements:
|
65
65
|
- - ~>
|
@@ -67,10 +67,10 @@ dependencies:
|
|
67
67
|
version: 0.7.0
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
|
-
version_requirements: *
|
70
|
+
version_requirements: *2165365060
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
72
|
name: rake
|
73
|
-
requirement: &
|
73
|
+
requirement: &2165364420 !ruby/object:Gem::Requirement
|
74
74
|
none: false
|
75
75
|
requirements:
|
76
76
|
- - ! '>='
|
@@ -78,10 +78,10 @@ dependencies:
|
|
78
78
|
version: '0'
|
79
79
|
type: :development
|
80
80
|
prerelease: false
|
81
|
-
version_requirements: *
|
81
|
+
version_requirements: *2165364420
|
82
82
|
- !ruby/object:Gem::Dependency
|
83
83
|
name: guard-rspec
|
84
|
-
requirement: &
|
84
|
+
requirement: &2165363900 !ruby/object:Gem::Requirement
|
85
85
|
none: false
|
86
86
|
requirements:
|
87
87
|
- - ! '>='
|
@@ -89,7 +89,7 @@ dependencies:
|
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
|
-
version_requirements: *
|
92
|
+
version_requirements: *2165363900
|
93
93
|
description: Allow an object's API to provide flexible handler registration, storage
|
94
94
|
and matching to arbitrary events.
|
95
95
|
email:
|