Skip to content

Commit

Permalink
Changed the body method to accept blocks as well as strings. Also, ad…
Browse files Browse the repository at this point in the history
…ded example calendar app to be built more in the future. Finally, added the respon_to block. View readme for example
  • Loading branch information
a_user@mac.com committed Sep 11, 2007
1 parent 3b491e0 commit 2da5100
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 1 deletion.
17 changes: 17 additions & 0 deletions 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
3 changes: 2 additions & 1 deletion lib/sinatra/event.rb
Expand Up @@ -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

Expand Down
17 changes: 17 additions & 0 deletions 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.
5 changes: 5 additions & 0 deletions 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)
63 changes: 63 additions & 0 deletions 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

0 comments on commit 2da5100

Please sign in to comment.