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 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: