From 54e6313aa31345749cffe0d3c2cc789eefb2e8a7 Mon Sep 17 00:00:00 2001 From: Blake Mizerany Date: Thu, 25 Oct 2007 19:21:24 -0700 Subject: [PATCH] Allow before and after_attend events to put themselves in front of the line --- lib/sinatra/dsl.rb | 8 ++++---- lib/sinatra/event.rb | 14 ++++++++------ test/sinatra/filter_test.rb | 31 +++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 test/sinatra/filter_test.rb diff --git a/lib/sinatra/dsl.rb b/lib/sinatra/dsl.rb index 186fe0c..c0d6cb3 100644 --- a/lib/sinatra/dsl.rb +++ b/lib/sinatra/dsl.rb @@ -70,8 +70,8 @@ module Sinatra # Throw a String to render it as the content # Throw a Fixnum to set the status # - def before_attend(filter_name = nil, &block) - Sinatra::Event.before_attend(filter_name, &block) + def before_attend(filter_name = nil, options ={}, &block) + Sinatra::Event.before_attend(filter_name, options, &block) end # Run given block after each Event's execution @@ -82,8 +82,8 @@ module Sinatra # or # after_attend :clean_up # clean_up is a helper method defined using helpers # - def after_attend(filter_name = nil, &block) - Sinatra::Event.after_attend(filter_name, &block) + def after_attend(filter_name = nil, options ={}, &block) + Sinatra::Event.after_attend(filter_name, options, &block) end # Add methods to each event for use during execution diff --git a/lib/sinatra/event.rb b/lib/sinatra/event.rb index d90545f..5496535 100644 --- a/lib/sinatra/event.rb +++ b/lib/sinatra/event.rb @@ -52,21 +52,23 @@ module Sinatra self.before_filters = [] self.after_filters = [] - def self.before_attend(method_name = nil, &block) - setup_filter(:before_filters, method_name, &block) + def self.before_attend(method_name = nil, options ={}, &block) + setup_filter(:before_filters, method_name, options, &block) end - def self.after_attend(method_name = nil, &block) - setup_filter(:after_filters, method_name, &block) + def self.after_attend(method_name = nil, options = {}, &block) + setup_filter(:after_filters, method_name, options, &block) end - def self.setup_filter(filter_set_name, method_name, &block) + def self.setup_filter(filter_set_name, method_name, options = {}, &block) raise "Must specify method or block" if method_name.nil? and !block_given? - send(filter_set_name) << if block_given? + value = if block_given? block else method_name end + insert_index = options[:infront] == true ? 0 : -1 + send(filter_set_name).insert(insert_index, value) end after_attend :log_event diff --git a/test/sinatra/filter_test.rb b/test/sinatra/filter_test.rb new file mode 100644 index 0000000..2e0b096 --- /dev/null +++ b/test/sinatra/filter_test.rb @@ -0,0 +1,31 @@ +require File.dirname(__FILE__) + '/../helper' + +context "Filter" do + + before(:each) do + @befores = Sinatra::Event.before_filters + Sinatra::Event.before_filters = [] + @afters = Sinatra::Event.after_filters + Sinatra::Event.after_filters = [] + end + + after(:each) do + Sinatra::Event.before_filters = @befores + Sinatra::Event.after_filters = @afters + end + + specify "befores can be in front" do + before_attend :bar + before_attend :foo, :infront => true + + Sinatra::Event.before_filters.should.equal [:foo, :bar] + end + + specify "afters can be in front" do + after_attend :bar + after_attend :foo, :infront => true + + Sinatra::Event.after_filters.should.equal [:foo, :bar] + end + +end \ No newline at end of file -- 2.11.4.GIT