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:
parent
1de67c2d6c
commit
3b491e00ab
9 changed files with 86 additions and 34 deletions
|
@ -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 }
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
16
lib/sinatra/environment.rb
Normal file
16
lib/sinatra/environment.rb
Normal 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
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue