diff --git a/examples/calendar/calendar.rb b/examples/calendar/calendar.rb new file mode 100644 index 0000000000..74c0118a95 --- /dev/null +++ b/examples/calendar/calendar.rb @@ -0,0 +1,17 @@ +$LOAD_PATH.unshift File.dirname(__FILE__) + '/../../lib/' +require 'sinatra' + +get '/' do + html {p "here, b"} + p "hi" +end + +get 'index' do + html {body "in here!"} + body do + "pancakes" + end +end + +get 'favicon' do +end diff --git a/lib/sinatra/event.rb b/lib/sinatra/event.rb index b28e23438f..4b80af4c16 100644 --- a/lib/sinatra/event.rb +++ b/lib/sinatra/event.rb @@ -56,8 +56,9 @@ def status(value = nil) @status || 200 end - def body(value = nil) + def body(value = nil, &block) @body = value if value + @body = block.call if block @body || '' end diff --git a/vendor/respond_to/README b/vendor/respond_to/README new file mode 100644 index 0000000000..cf4531696a --- /dev/null +++ b/vendor/respond_to/README @@ -0,0 +1,17 @@ +Respond_to + +Allows for different methods to be called upon in the event context block + +from + +get 'index' do + body "hey" +end + +to + +get 'index' do + html {"hi"} +end + +If there is a block with the extension, that will be used as the output, otherwise the body of the block will be used. diff --git a/vendor/respond_to/init.rb b/vendor/respond_to/init.rb new file mode 100644 index 0000000000..ee5bdc1698 --- /dev/null +++ b/vendor/respond_to/init.rb @@ -0,0 +1,5 @@ +require File.dirname(__FILE__) + '/lib/responder' + +Sinatra::EventContext.send(:include, Sinatra::Responder) +Sinatra::Event.send(:include, Sinatra::EventResponder) +Sinatra::EventManager.send(:extend, Sinatra::DispatcherResponder) diff --git a/vendor/respond_to/lib/responder.rb b/vendor/respond_to/lib/responder.rb new file mode 100644 index 0000000000..67c2fa89d0 --- /dev/null +++ b/vendor/respond_to/lib/responder.rb @@ -0,0 +1,63 @@ +module Sinatra + module Responder + + module InstanceMethods + def method_missing(id, *args, &block) + if block + @responds_to[id] = block unless @responds_to.has_key? id + else + super + end + end + def initialize_with_responds_to(i) + initialize_without_responds_to(i) + @responds_to = {} + end + end + + def self.included(base) + base.send :include, InstanceMethods + base.instance_eval do + alias_method :initialize_without_responds_to, :initialize + alias_method :initialize, :initialize_with_responds_to + end + attr_accessor :responds_to + end + end + module EventResponder + def self.included(base) + base.send :include, InstanceMethods + base.instance_eval do + alias_method :attend_without_respond_to, :attend + alias_method :attend, :attend_with_respond_to + end + end + module InstanceMethods + # Pulls the request info from the REQUEST_PATH + # it looks for the path extension + # For instance, index.html will respond to the html block + def respond_request(request) + request.env['REQUEST_PATH'].include?('.') ? request.env['REQUEST_PATH'].split('.')[-1].to_sym : :html + end + def attend_with_respond_to(request) + context = EventContext.new(request) + begin + context.instance_eval(&@block) if @block + context.responds_to[respond_request(request)].call if context.responds_to.has_key? respond_request(request) + rescue => e + context.error e + end + run_through_after_filters(context) + context + end + end + end + + module DispatcherResponder + def determine_event(verb, path) + EventManager.events.detect(method(:not_found)) do |e| + e.path =~ Regexp.new(path.split(".")[0..-2].join("|").gsub(/\//, '')) && e.verb == verb + end + end + end +end