sanford 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -9,8 +9,8 @@ module Sanford
9
9
 
10
10
  def initialize(exception, host_data = nil, request = nil)
11
11
  @exception, @host_data, @request = exception, host_data, request
12
- @keep_alive = @host_data ? @host_data.keep_alive : false
13
- @error_proc = @host_data ? @host_data.error_proc : proc{ }
12
+ @keep_alive = @host_data ? @host_data.keep_alive : false
13
+ @error_procs = @host_data ? @host_data.error_procs.reverse : []
14
14
  end
15
15
 
16
16
  # The exception that we are generating a response for can change in the case
@@ -20,12 +20,17 @@ module Sanford
20
20
  # server will respond and log based on the last exception that occurred.
21
21
 
22
22
  def run
23
- begin
24
- result = @error_proc.call(@exception, @host_data, @request)
25
- rescue Exception => proc_exception
26
- @exception = proc_exception
23
+ response = nil
24
+ @error_procs.each do |error_proc|
25
+ result = nil
26
+ begin
27
+ result = error_proc.call(@exception, @host_data, @request)
28
+ rescue Exception => proc_exception
29
+ @exception = proc_exception
30
+ end
31
+ response ||= self.response_from_proc(result)
27
32
  end
28
- self.response_from_proc(result) || self.response_from_exception(@exception)
33
+ response || self.response_from_exception(@exception)
29
34
  end
30
35
 
31
36
  protected
data/lib/sanford/host.rb CHANGED
@@ -26,7 +26,7 @@ module Sanford
26
26
  option :verbose_logging, :default => true
27
27
  option :receives_keep_alive, :default => false
28
28
  option :runner, :default => proc{ Sanford.config.runner }
29
- option :error_proc, Proc, :default => proc{ }
29
+ option :error_procs, Array, :default => []
30
30
  option :init_proc, Proc, :default => proc{ }
31
31
 
32
32
  def initialize(host)
@@ -83,7 +83,7 @@ module Sanford
83
83
  end
84
84
 
85
85
  def error(&block)
86
- self.configuration.error_proc = block
86
+ self.configuration.error_procs << block
87
87
  end
88
88
 
89
89
  def init(&block)
@@ -11,7 +11,7 @@ module Sanford
11
11
 
12
12
  # NOTE: The `name` attribute shouldn't be removed, it is used to identify
13
13
  # a `HostData`, particularly in error handlers
14
- attr_reader :name, :logger, :verbose, :keep_alive, :runner, :error_proc
14
+ attr_reader :name, :logger, :verbose, :keep_alive, :runner, :error_procs
15
15
 
16
16
  def initialize(service_host, options = nil)
17
17
  service_host.configuration.init_proc.call
@@ -19,12 +19,12 @@ module Sanford
19
19
  overrides = self.remove_nil_values(options || {})
20
20
  configuration = service_host.configuration.to_hash.merge(overrides)
21
21
 
22
- @name = configuration[:name]
23
- @logger = configuration[:logger]
24
- @verbose = configuration[:verbose_logging]
25
- @keep_alive = configuration[:receives_keep_alive]
26
- @runner = configuration[:runner]
27
- @error_proc = configuration[:error_proc]
22
+ @name = configuration[:name]
23
+ @logger = configuration[:logger]
24
+ @verbose = configuration[:verbose_logging]
25
+ @keep_alive = configuration[:receives_keep_alive]
26
+ @runner = configuration[:runner]
27
+ @error_procs = configuration[:error_procs]
28
28
 
29
29
  @handlers = service_host.versioned_services.inject({}) do |hash, (version, services)|
30
30
  hash.merge({ version => self.constantize_services(services) })
@@ -1,3 +1,3 @@
1
1
  module Sanford
2
- VERSION = "0.6.1"
2
+ VERSION = "0.6.2"
3
3
  end
@@ -39,7 +39,7 @@ class Sanford::ErrorHandler
39
39
  Sanford::Protocol::Response.new([ 567, 'custom message'], 'custom data')
40
40
  end
41
41
  host_data = Sanford::HostData.new(EmptyHost, @host_defaults.merge({
42
- :error_proc => error_proc
42
+ :error_procs => [ error_proc ]
43
43
  }))
44
44
  response = Sanford::ErrorHandler.new(@exception, host_data).run
45
45
 
@@ -50,7 +50,7 @@ class Sanford::ErrorHandler
50
50
 
51
51
  should "use an integer returned by the error proc to generate a protocol response" do
52
52
  host_data = Sanford::HostData.new(EmptyHost, @host_defaults.merge({
53
- :error_proc => proc{ 345 }
53
+ :error_procs => [ proc{ 345 } ]
54
54
  }))
55
55
  response = Sanford::ErrorHandler.new(@exception, host_data).run
56
56
 
@@ -61,7 +61,7 @@ class Sanford::ErrorHandler
61
61
 
62
62
  should "use a symbol returned by the error proc to generate a protocol response" do
63
63
  host_data = Sanford::HostData.new(EmptyHost, @host_defaults.merge({
64
- :error_proc => proc{ :not_found }
64
+ :error_procs => [ proc{ :not_found } ]
65
65
  }))
66
66
  response = Sanford::ErrorHandler.new(@exception, host_data).run
67
67
 
@@ -72,7 +72,7 @@ class Sanford::ErrorHandler
72
72
 
73
73
  should "use the default behavior if the error proc doesn't return a valid response result" do
74
74
  host_data = Sanford::HostData.new(EmptyHost, @host_defaults.merge({
75
- :error_proc => proc{ true }
75
+ :error_procs => [ proc{ true } ]
76
76
  }))
77
77
  response = Sanford::ErrorHandler.new(@exception, host_data).run
78
78
 
@@ -83,7 +83,7 @@ class Sanford::ErrorHandler
83
83
  should "use the default behavior for an exception raised by the error proc " \
84
84
  "and ignore the original exception" do
85
85
  host_data = Sanford::HostData.new(EmptyHost, @host_defaults.merge({
86
- :error_proc => proc{ raise Sanford::NotFoundError }
86
+ :error_procs => [ proc{ raise Sanford::NotFoundError } ]
87
87
  }))
88
88
  response = Sanford::ErrorHandler.new(@exception, host_data).run
89
89
 
@@ -130,4 +130,58 @@ class Sanford::ErrorHandler
130
130
 
131
131
  end
132
132
 
133
+ class MultipleErrorProcsTest < ResponseFromProcTest
134
+ desc "with multiple error procs"
135
+ setup do
136
+ @first_called, @second_called, @third_called = nil, nil, nil
137
+ @host_data = Sanford::HostData.new(EmptyHost, @host_defaults.merge({
138
+ :error_procs => [ first_proc, second_proc, third_proc ]
139
+ }))
140
+ end
141
+
142
+ should "call every error proc" do
143
+ @error_handler = Sanford::ErrorHandler.new(RuntimeError.new('test'), @host_data)
144
+ @error_handler.run
145
+
146
+ assert_equal true, @first_called
147
+ assert_equal true, @second_called
148
+ assert_equal true, @third_called
149
+ end
150
+
151
+ should "should return the response of the last configured error proc " \
152
+ "that returned a valid response" do
153
+ @error_handler = Sanford::ErrorHandler.new(RuntimeError.new('test'), @host_data)
154
+ response = @error_handler.run
155
+
156
+ # use the second proc's generated response
157
+ assert_equal 987, response.code
158
+
159
+ exception = generate_exception(Sanford::NotFoundError, 'not found')
160
+ @error_handler = Sanford::ErrorHandler.new(exception, @host_data)
161
+ response = @error_handler.run
162
+
163
+ # use the third proc's generated response
164
+ assert_equal 876, response.code
165
+ end
166
+
167
+ def first_proc
168
+ proc{ @first_called = true }
169
+ end
170
+
171
+ def second_proc
172
+ proc do |exception, host_data, request|
173
+ @second_called = true
174
+ 987
175
+ end
176
+ end
177
+
178
+ def third_proc
179
+ proc do |exception, host_data, request|
180
+ @third_called = true
181
+ 876 if exception.kind_of?(Sanford::NotFoundError)
182
+ end
183
+ end
184
+
185
+ end
186
+
133
187
  end
@@ -10,7 +10,7 @@ class Sanford::Host::Configuration
10
10
  subject{ @configuration }
11
11
 
12
12
  should have_instance_methods :name, :ip, :port, :pid_file, :logger,
13
- :verbose_logging, :logger, :error_proc
13
+ :verbose_logging, :logger, :error_procs
14
14
 
15
15
  should "default name to the class name of the host" do
16
16
  assert_equal 'EmptyHost', subject.name
@@ -14,7 +14,7 @@ class Sanford::HostData
14
14
  subject{ @host_data }
15
15
 
16
16
  should have_instance_methods :name, :logger, :verbose, :keep_alive, :runner,
17
- :error_proc, :run, :handler_class_for
17
+ :error_procs, :run, :handler_class_for
18
18
 
19
19
  should "default it's configuration from the service host, but allow overrides" do
20
20
  host_data = Sanford::HostData.new(TestHost, :verbose_logging => false)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sanford
3
3
  version: !ruby/object:Gem::Version
4
- hash: 5
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 6
9
- - 1
10
- version: 0.6.1
9
+ - 2
10
+ version: 0.6.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Collin Redding
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2013-02-27 00:00:00 Z
19
+ date: 2013-03-04 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  prerelease: false