dzl 1.0.0.rc7 → 1.0.0.rc8

Sign up to get free protection for your applications and to get access to all the features.
data/config.ru CHANGED
@@ -15,10 +15,10 @@ end
15
15
  # run Dzl::Examples::Trey
16
16
  # end
17
17
 
18
- require 'dzl/examples/fun_with_params'
19
- map '/' do
20
- run Dzl::Examples::FunWithParams
21
- end
18
+ # require 'dzl/examples/fun_with_params'
19
+ # map '/' do
20
+ # run Dzl::Examples::FunWithParams
21
+ # end
22
22
 
23
23
  # require 'dzl/examples/fun_with_requests'
24
24
  # map '/' do
@@ -30,10 +30,10 @@ end
30
30
  # run Dzl::Examples::RouteProfile
31
31
  # end
32
32
 
33
- # require 'dzl/examples/fun_with_handlers'
34
- # map '/' do
35
- # run Dzl::Examples::FunWithHandlers
36
- # end
33
+ require 'dzl/examples/fun_with_handlers'
34
+ map '/' do
35
+ run Dzl::Examples::FunWithHandlers
36
+ end
37
37
 
38
38
  # require 'dzl/examples/fun_with_hooks'
39
39
  # map '/' do
@@ -46,6 +46,12 @@ class Dzl::DSLProxies::Router < Dzl::DSLProxy
46
46
  @subject.call_with_subject(Proc.new, @subject.defaults_dslsub)
47
47
  end
48
48
 
49
+ def error_hook(&block)
50
+ raise ArgumentError unless block_given?
51
+
52
+ @subject.error_hooks << block
53
+ end
54
+
49
55
  REQUEST_METHODS.each do |m|
50
56
  define_method(m) do |route, *request_methods, &block|
51
57
  request_methods << m
@@ -3,7 +3,7 @@ require 'dzl/dsl_subjects/defaults'
3
3
 
4
4
  class Dzl::DSLSubjects::Router < Dzl::DSLSubject
5
5
  include Dzl::RouterDoc
6
- attr_reader :pblocks, :defaults_dslsub, :defaults, :app
6
+ attr_reader :pblocks, :defaults_dslsub, :defaults, :app, :error_hooks
7
7
 
8
8
  def initialize(app)
9
9
  @pblocks = {}
@@ -16,6 +16,7 @@ class Dzl::DSLSubjects::Router < Dzl::DSLSubject
16
16
  @defaults_dslsub = Dzl::DSLSubjects::Defaults.new(self)
17
17
  @dsl_proxy = Dzl::DSLProxies::Router.new(self)
18
18
  @app = app
19
+ @error_hooks = []
19
20
  end
20
21
 
21
22
  def call_with_subject(proc, subject)
@@ -5,6 +5,18 @@ class Dzl::Examples::FunWithHandlers < Dzl::Examples::Base
5
5
  content_type 'application/json'
6
6
  end
7
7
 
8
+ error_hook do |e|
9
+ Object.first_error_hook
10
+ end
11
+
12
+ error_hook do |e|
13
+ Object.second_error_hook
14
+
15
+ if e.to_s.match('explode')
16
+ raise 'explode'
17
+ end
18
+ end
19
+
8
20
  endpoint '/say_bar' do
9
21
  optional :foo, :bar, :baz, :bam
10
22
 
@@ -31,6 +43,12 @@ class Dzl::Examples::FunWithHandlers < Dzl::Examples::Base
31
43
  end
32
44
  end
33
45
 
46
+ get '/explode' do
47
+ handle do
48
+ raise 'explode'
49
+ end
50
+ end
51
+
34
52
  get '/validation_error' do
35
53
  handle do
36
54
  raise Dzl::ValidationError.new(
@@ -10,23 +10,30 @@ module Dzl::RackInterface
10
10
  request = nil
11
11
  start_time = Time.now
12
12
  start_profile if PROFILE_REQUESTS
13
- response = begin
13
+ response, error = begin
14
14
  request = Dzl::Request.new(env)
15
- __router.handle_request(request)
15
+ [__router.handle_request(request), nil]
16
16
  rescue Dzl::RespondWithHTTPBasicChallenge
17
- respond_with_http_basic_challenge
17
+ [respond_with_http_basic_challenge, nil]
18
18
  rescue Dzl::Error => e
19
- respond_with_dzl_error_handler(e)
19
+ [respond_with_dzl_error_handler(e), nil]
20
20
  rescue StandardError => e
21
- respond_with_standard_error_handler(e)
21
+ [respond_with_standard_error_handler(e), e]
22
22
  end
23
23
 
24
24
  if response[0] < 100
25
- response = respond_with_standard_error_handler(StandardError.new('Application did not respond'))
25
+ error = Dzl::Error.new('Application did not respond')
26
+ response = respond_with_standard_error_handler(error)
27
+ end
28
+
29
+ if error.present?
30
+ __router.error_hooks.each do |hook|
31
+ hook.call(error) rescue nil
32
+ end
26
33
  end
27
34
 
28
35
  stop_profiling_and_print if PROFILE_REQUESTS
29
- log_request(request, response, (Time.now - start_time)) unless request.silent?
36
+ log_request(request, response, (Time.now - start_time), error) unless request.silent?
30
37
 
31
38
  if Dzl.production? || Dzl.staging?
32
39
  (response[0] < 500) ? response : [response[0], [], [response[0].to_s]]
@@ -88,10 +95,17 @@ module Dzl::RackInterface
88
95
  )
89
96
  end
90
97
 
91
- def log_request(request, response, seconds)
98
+ def log_request(request, response, seconds, error)
92
99
  logger.info "#{request.request_method} #{request.path}"
93
100
  logger.info "PARAMS: #{request.params}"
94
101
  logger.debug "BODY: #{request.body}" unless request.body.blank?
95
102
  logger.info "#{response[0]} in #{seconds * 1000}ms"
103
+
104
+ if error.present?
105
+ logger.info error.inspect
106
+ error.backtrace.each do |line|
107
+ logger.info " #{line}"
108
+ end
109
+ end
96
110
  end
97
111
  end
data/lib/dzl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Dzl
2
- VERSION = "1.0.0.rc7"
2
+ VERSION = "1.0.0.rc8"
3
3
  end
@@ -29,12 +29,24 @@ describe 'handlers' do
29
29
  end
30
30
  end
31
31
 
32
- it 'can raise exceptions without exploding everything' do
32
+ it 'calls error hooks on errors' do
33
+ Object.should_receive(:first_error_hook)
34
+ Object.should_receive(:second_error_hook)
35
+
33
36
  get '/raise' do |response|
34
37
  response.status.should == 500
35
38
  end
36
39
  end
37
40
 
41
+ it 'exceptions raised in error hooks are squashed, sorry' do
42
+ Object.should_receive(:first_error_hook)
43
+ Object.should_receive(:second_error_hook)
44
+
45
+ get '/explode' do |response|
46
+ response.status.should == 500
47
+ end
48
+ end
49
+
38
50
  it 'are good places to raise Dzl::ValidationError' do
39
51
  get '/validation_error' do |response|
40
52
  response.status.should == 404
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dzl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc7
4
+ version: 1.0.0.rc8
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-04-25 00:00:00.000000000 Z
13
+ date: 2012-05-02 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
17
- requirement: &70287627293400 !ruby/object:Gem::Requirement
17
+ requirement: &70294010134960 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: 1.4.1
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70287627293400
25
+ version_requirements: *70294010134960
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: activesupport
28
- requirement: &70287627291640 !ruby/object:Gem::Requirement
28
+ requirement: &70294010134460 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: 3.2.2
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *70287627291640
36
+ version_requirements: *70294010134460
37
37
  description: Small, fast racktivesupport web framework with handy DSL and explicit
38
38
  parameter validation.
39
39
  email: