From 8cc45b6a1a1f328b2e4333873bd33a8a800b5d32 Mon Sep 17 00:00:00 2001 From: "blake.mizerany@gmail.com" Date: Sun, 9 Sep 2007 00:46:38 +0000 Subject: [PATCH] * after filters --- examples/hello/test.rb | 10 +++++++++- lib/sinatra/dsl.rb | 8 ++++++++ lib/sinatra/event.rb | 35 +++++++++++++++++++++++++++-------- 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/examples/hello/test.rb b/examples/hello/test.rb index b05e97d..f0179aa 100644 --- a/examples/hello/test.rb +++ b/examples/hello/test.rb @@ -1,6 +1,14 @@ -$LOAD_PATH.unshift '../../lib/' +$LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib/' require 'sinatra' +after_attend :log_fun_stuff + +helpers do + def log_fun_stuff + logger.debug "THIS IS COOL!" + end +end + get '/' do body <<-HTML
diff --git a/lib/sinatra/dsl.rb b/lib/sinatra/dsl.rb index 75499e3..1f0d240 100644 --- a/lib/sinatra/dsl.rb +++ b/lib/sinatra/dsl.rb @@ -7,5 +7,13 @@ module Kernel end end_eval end + + def after_attend(filter_name = nil, &block) + Sinatra::Event.after_attend(filter_name, &block) + end + + def helpers(&block) + Sinatra::EventContext.class_eval &block + end end diff --git a/lib/sinatra/event.rb b/lib/sinatra/event.rb index 216ecec..d39fbd8 100644 --- a/lib/sinatra/event.rb +++ b/lib/sinatra/event.rb @@ -34,6 +34,14 @@ module Sinatra @body = value if value @body || '' end + + def error(value = nil) + if value + @error = value + status 500 + end + @error + end # This allows for: # header 'Content-Type' => 'text/html' @@ -53,11 +61,25 @@ module Sinatra @params ||= @request.params.symbolize_keys end + def log_event + logger.info "#{request.request_method} #{request.path_info} | Status: #{status} | Params: #{params.inspect}" + logger.exception(error) if error + end + end class Event cattr_accessor :logger + cattr_accessor :after_filters + + self.after_filters = [] + + def self.after_attend(filter) + after_filters << filter + end + + after_attend :log_event attr_reader :path, :verb @@ -72,23 +94,20 @@ module Sinatra begin context = EventContext.new(request) context.instance_eval(&@block) if @block - log_event(request, context, nil) context rescue => e - context.status 500 - log_event(request, context, e) - context + context.error e end + run_through_after_filters(context) + context end alias :call :attend private - def log_event(request, context, e) - logger.info "#{request.request_method} #{request.path_info} | Status: #{context.status} | Params: #{context.params.inspect}" - logger.exception(e) if e + def run_through_after_filters(context) + after_filters.each { |filter| context.send(filter) } end - end end -- 2.11.4.GIT