1
0
Fork 0
mirror of https://github.com/sinatra/sinatra synced 2023-03-27 23:18:01 -04:00

* custom 404

* bug fixes
* refactoring
This commit is contained in:
blake.mizerany@gmail.com 2007-09-11 01:14:18 +00:00
parent 1de67c2d6c
commit 3b491e00ab
9 changed files with 86 additions and 34 deletions

View file

@ -37,6 +37,7 @@ Sinatra::Loader.load_files Dir.glob(SINATRA_ROOT + '/lib/sinatra/core_ext/*.rb')
Sinatra::Loader.load_files Dir.glob(SINATRA_ROOT + '/lib/sinatra/*.rb')
Sinatra::Loader.load_files Dir.glob(SINATRA_ROOT + '/vendor/*/init.rb')
at_exit do
Sinatra::Server.new.start unless Sinatra::Server.running
end
Sinatra::Environment.setup!
Sinatra::Irb.start! if Sinatra::Options.console
at_exit { Sinatra::Server.new.start unless Sinatra::Server.running }

View file

@ -9,7 +9,7 @@ module Sinatra
end
def call(env)
Loader.reload! if Options.environment == :production
Loader.reload! if Options.environment == :development
@request = Rack::Request.new(env)

View file

@ -0,0 +1,16 @@
module Sinatra
module Environment
extend self
def setup!
Options.parse!(ARGV)
set_loggers
end
def set_loggers(logger = Logger.new(open(Options.log_file, 'w')))
[Server, EventContext, Event, Dispatcher].each do |klass|
klass.logger = logger
end
end
end
end

View file

@ -4,7 +4,7 @@ module Sinatra
extend self
def reset!
@events.clear
@events.clear if @events
end
def events
@ -15,14 +15,18 @@ module Sinatra
(@events ||= []) << event
end
def determine_event(verb, path)
EventManager.events.detect(method(:not_found)) do |e|
def determine_event(verb, path, if_nil = :present_error)
events.detect(method(if_nil)) do |e|
e.path == path && e.verb == verb
end
end
def present_error
determine_event(:get, 404, :not_found)
end
def not_found
Event.new(:get, nil) do
Event.new(:get, nil, false) do
status 404
views_dir SINATRA_ROOT + '/files'
@ -105,11 +109,11 @@ module Sinatra
attr_reader :path, :verb
def initialize(verb, path, &block)
def initialize(verb, path, register = true, &block)
@verb = verb
@path = path
@block = block
EventManager.register_event(self)
EventManager.register_event(self) if register
end
def attend(request)

View file

@ -9,12 +9,13 @@ module Sinatra
attr_with_default :console, nil
def parse!(args)
return if @environment == :test
OptionParser.new do |opts|
opts.on '-p port', '--port port', 'Set the port (default is 4567)' do |port|
@port = port
end
opts.on '-e environment', 'Set the environment (default if development)' do |env|
@environment = env
@environment = env.intern
end
opts.on '-c', '--console', 'Run in console mode' do
@console = true
@ -29,5 +30,9 @@ module Sinatra
def log_file
File.dirname($0) + ('/%s.log' % environment)
end
def set_environment(env)
@environment = env
end
end
end

View file

@ -9,17 +9,13 @@ module Sinatra
def start
begin
setup_environment
Irb.start! if Options.console
tail_thread = tail(Options.log_file)
Rack::Handler::Mongrel.run(Dispatcher.new, :Port => Options.port) do |server|
logger.info "== Sinatra has taken the stage on port #{server.port}!"
puts "== Sinatra has taken the stage on port #{server.port}!"
trap("INT") do
server.stop
self.class.running = false
logger.info "\n== Sinatra has ended his set (crowd applauds)"
puts "\n== Sinatra has ended his set (crowd applauds)"
end
end
self.class.running = true
@ -32,18 +28,6 @@ module Sinatra
private
def setup_environment
Options.parse!(ARGV)
set_loggers
end
def set_loggers
logger = Logger.new(open(Options.log_file, 'w'))
[Server, EventContext, Event, Dispatcher].each do |klass|
klass.logger = logger
end
end
def tail(log_file)
FileUtils.touch(log_file)
cursor = File.size(log_file)

View file

@ -9,7 +9,8 @@ require File.dirname(__FILE__) + '/../lib/sinatra'
end
Sinatra::Server.running = true
Sinatra::Options.set_environment :test
class Test::Unit::TestCase
include TestMethods
include Sinatra::TestMethods
end

View file

@ -2,6 +2,10 @@ require File.dirname(__FILE__) + '/../helper'
describe "When a dispatcher receives a request" do
before(:each) do
Sinatra::EventManager.reset!
end
it "should attend to the event" do
Sinatra::Event.new(:get, '/') do
@ -14,7 +18,7 @@ describe "When a dispatcher receives a request" do
text.should.equal 'this is the index as a get'
headers['Content-Type'].should.equal 'text/html'
post_it "/test"
post_it "/"
status.should.equal 404
text.scan("Not Found :: Sinatra").size.should.equal 1
@ -27,4 +31,30 @@ describe "When a dispatcher receives a request" do
end
it "should use custom error pages if present" do
Sinatra::Event.new(:get, 404) do
body 'custom 404'
end
get_it('/laksdjf').should.equal 'custom 404'
end
it "should reload app files unless in production" do
Sinatra::Event.new(:get, '/') {}
Sinatra::Options.expects(:environment).returns(:production)
Sinatra::Loader.expects(:reload!).never
get_it '/'
Sinatra::Options.expects(:environment).returns(:development)
Sinatra::Loader.expects(:reload!)
get_it '/'
end
it "should not register not_found (otherwise we'll have a newone in the array for every error)" do
Sinatra::EventManager.events.size.should.equal 0
get_it '/blake'
Sinatra::EventManager.events.size.should.equal 0
end
end

View file

@ -3,15 +3,26 @@ require File.dirname(__FILE__) + '/../helper'
describe "Event" do
it "should return 500 if exception thrown" do
set_logger stub_everything
Sinatra::Environment.set_loggers stub_everything
event = Sinatra::Event.new(:get, nil) do
raise 'whaaaa!'
end
result = event.attend(stub_everything)
result = event.attend(stub_everything(:params => {}))
result.status.should.equal 500
end
it "custom error if present" do
Sinatra::Environment.set_loggers stub_everything
event = Sinatra::Event.new(:get, 404) do
body 'custom 404'
end
Sinatra::EventManager.expects(:not_found).never
Sinatra::EventManager.determine_event(:get, '/sdf')
end
end