call_center 0.0.6 → 0.0.7
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/VERSION +1 -1
- data/call_center.gemspec +2 -2
- data/lib/call_center/flow_callback.rb +30 -4
- data/lib/call_center/state_machine_ext.rb +13 -16
- data/test/call_center_test.rb +17 -1
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.7
|
data/call_center.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{call_center}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.7"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Henry Hsu"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-11-07}
|
13
13
|
s.description = %q{Support for describing call center workflows}
|
14
14
|
s.email = %q{hhsu@zendesk.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -5,11 +5,11 @@ module CallCenter
|
|
5
5
|
def self.create(state_name, scope, options, block)
|
6
6
|
case scope
|
7
7
|
when :success
|
8
|
-
|
8
|
+
new(state_name, scope, options, block).extend(SuccessFlowCallback)
|
9
9
|
when :failure
|
10
|
-
|
10
|
+
new(state_name, scope, options, block).extend(FailureFlowCallback)
|
11
11
|
else
|
12
|
-
|
12
|
+
new(state_name, scope, options, block).extend(AlwaysFlowCallback)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -26,22 +26,48 @@ module CallCenter
|
|
26
26
|
|
27
27
|
def setup(context)
|
28
28
|
callback = self
|
29
|
-
context.
|
29
|
+
context.send(transition_hook, transition_parameters(context)) do |call, transition|
|
30
30
|
callback.run(call, transition)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
+
def before
|
35
|
+
true
|
36
|
+
end
|
37
|
+
|
38
|
+
def after
|
39
|
+
false
|
40
|
+
end
|
41
|
+
|
34
42
|
private
|
35
43
|
|
36
44
|
def transition_parameters(context)
|
37
45
|
{ context.any => @state_name }
|
38
46
|
end
|
39
47
|
|
48
|
+
def transition_hook
|
49
|
+
:before_transition
|
50
|
+
end
|
51
|
+
|
40
52
|
def should_run?
|
41
53
|
true
|
42
54
|
end
|
43
55
|
end
|
44
56
|
|
57
|
+
class AfterFlowCallback < FlowCallback
|
58
|
+
def transition_hook
|
59
|
+
:after_transition
|
60
|
+
end
|
61
|
+
|
62
|
+
def before
|
63
|
+
false
|
64
|
+
end
|
65
|
+
|
66
|
+
def after
|
67
|
+
true
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
45
71
|
module AlwaysFlowCallback
|
46
72
|
def success; true; end
|
47
73
|
def failure; true; end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
# Extension for StateMachine::Machine to store and provide render blocks
|
2
2
|
class StateMachine::Machine
|
3
3
|
attr_accessor :response_blocks
|
4
|
-
attr_accessor :
|
5
|
-
attr_accessor :after_blocks
|
4
|
+
attr_accessor :callback_blocks
|
6
5
|
attr_accessor :flow_actor_blocks
|
7
6
|
|
8
7
|
def response(state_name, &blk)
|
@@ -11,13 +10,13 @@ class StateMachine::Machine
|
|
11
10
|
end
|
12
11
|
|
13
12
|
def before(state_name, scope, options, &blk)
|
14
|
-
@
|
15
|
-
@
|
13
|
+
@callback_blocks ||= []
|
14
|
+
@callback_blocks << CallCenter::FlowCallback.create(state_name, :always, options, blk)
|
16
15
|
end
|
17
16
|
|
18
17
|
def after(state_name, scope, options, &blk)
|
19
|
-
@
|
20
|
-
@
|
18
|
+
@callback_blocks ||= []
|
19
|
+
@callback_blocks << CallCenter::AfterFlowCallback.create(state_name, scope, options, blk)
|
21
20
|
end
|
22
21
|
|
23
22
|
def block_accessor(accessor, for_state)
|
@@ -32,25 +31,23 @@ class StateMachine::Machine
|
|
32
31
|
end
|
33
32
|
|
34
33
|
def setup_call_flow(flow)
|
35
|
-
|
36
|
-
|
34
|
+
setup_success_blocks
|
35
|
+
setup_failure_blocks
|
37
36
|
setup_flow_actor_blocks(flow)
|
38
37
|
self
|
39
38
|
end
|
40
39
|
|
41
|
-
def
|
42
|
-
return unless @
|
43
|
-
@
|
40
|
+
def setup_success_blocks
|
41
|
+
return unless @callback_blocks
|
42
|
+
@callback_blocks.select { |c| c.before || (c.success && c.after) }.each { |callback| callback.setup(self) }
|
44
43
|
end
|
45
44
|
|
46
|
-
def
|
47
|
-
return unless @
|
48
|
-
@after_blocks.select(&:success).each { |callback| callback.setup(self) }
|
49
|
-
|
45
|
+
def setup_failure_blocks
|
46
|
+
return unless @callback_blocks
|
50
47
|
event_names = events.map(&:name)
|
51
48
|
event_names.each do |event_name|
|
52
49
|
after_failure :on => event_name do |call, transition|
|
53
|
-
callbacks = @
|
50
|
+
callbacks = @callback_blocks.select { |callback| callback.after && callback.state_name == transition.to_name && callback.failure } || []
|
54
51
|
callbacks.each { |callback| callback.run(call, transition) }
|
55
52
|
end
|
56
53
|
end
|
data/test/call_center_test.rb
CHANGED
@@ -130,7 +130,7 @@ class CallCenterTest < Test::Unit::TestCase
|
|
130
130
|
assert_select "Response"
|
131
131
|
end
|
132
132
|
|
133
|
-
should "execute
|
133
|
+
should "execute callbacks" do
|
134
134
|
@call.state = 'cancelled'
|
135
135
|
|
136
136
|
@call.expects(:notify).with(:before_always).times(3)
|
@@ -150,6 +150,22 @@ class CallCenterTest < Test::Unit::TestCase
|
|
150
150
|
assert(!@call.customer_hangs_up)
|
151
151
|
end
|
152
152
|
|
153
|
+
should "execute callbacks in sequence" do
|
154
|
+
seq = sequence('callback_sequence')
|
155
|
+
@call.state = 'cancelled'
|
156
|
+
|
157
|
+
@call.expects(:notify).with(:before_always).in_sequence(seq)
|
158
|
+
@call.expects(:notify).with(:before_always_uniq).in_sequence(seq)
|
159
|
+
|
160
|
+
@call.expects(:notify).with(:after_always).in_sequence(seq)
|
161
|
+
@call.expects(:notify).with(:after_success).in_sequence(seq)
|
162
|
+
|
163
|
+
@call.expects(:notify).with(:after_always_uniq).in_sequence(seq)
|
164
|
+
@call.expects(:notify).with(:after_success_uniq, anything).in_sequence(seq)
|
165
|
+
|
166
|
+
@call.customer_end!
|
167
|
+
end
|
168
|
+
|
153
169
|
should "asynchronously perform event" do
|
154
170
|
@call.stubs(:agents_available?).returns(true)
|
155
171
|
@call.incoming_call!
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: call_center
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 7
|
10
|
+
version: 0.0.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Henry Hsu
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-11-07 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|