has-guarded-handlers 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
- # Allow classes to be passed as guards, matching against an event via #is_a?
5
+ * Allow classes to be passed as guards, matching against an event via #is_a?
3
6
 
4
7
  # 0.0.2
5
- # Bugfix: The mixin now does not hijack the target's initializer which was causing issues with inheritance
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!
@@ -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] << [guards, handler]
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].delete_if { |g, _| g == guards }
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 = @handlers[type]
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
@@ -1,3 +1,3 @@
1
1
  module HasGuardedHandlers
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  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.3
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-09-21 00:00:00.000000000 +01:00
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: &2156641740 !ruby/object:Gem::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: *2156641740
26
+ version_requirements: *2165367660
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
- requirement: &2156641100 !ruby/object:Gem::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: *2156641100
37
+ version_requirements: *2165366980
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: mocha
40
- requirement: &2156640520 !ruby/object:Gem::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: *2156640520
48
+ version_requirements: *2165366340
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: ci_reporter
51
- requirement: &2156639920 !ruby/object:Gem::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: *2156639920
59
+ version_requirements: *2165365700
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: yard
62
- requirement: &2156639320 !ruby/object:Gem::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: *2156639320
70
+ version_requirements: *2165365060
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: rake
73
- requirement: &2156638720 !ruby/object:Gem::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: *2156638720
81
+ version_requirements: *2165364420
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: guard-rspec
84
- requirement: &2156638220 !ruby/object:Gem::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: *2156638220
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: