diff --git a/lib/sinatra.rb b/lib/sinatra.rb deleted file mode 100644 index dacc1503..00000000 --- a/lib/sinatra.rb +++ /dev/null @@ -1,83 +0,0 @@ -require "rubygems" - -if ENV['SWIFT'] - require 'swiftcore/swiftiplied_mongrel' - puts "Using Swiftiplied Mongrel" -elsif ENV['EVENT'] - require 'swiftcore/evented_mongrel' - puts "Using Evented Mongrel" -end - -require "rack" - -require File.dirname(__FILE__) + '/sinatra/application' -require File.dirname(__FILE__) + '/sinatra/event_context' -require File.dirname(__FILE__) + '/sinatra/route' -require File.dirname(__FILE__) + '/sinatra/error' -require File.dirname(__FILE__) + '/sinatra/mime_types' -require File.dirname(__FILE__) + '/sinatra/core_ext' -require File.dirname(__FILE__) + '/sinatra/halt_results' -require File.dirname(__FILE__) + '/sinatra/logger' - -def get(*paths, &b) - options = Hash === paths.last ? paths.pop : {} - paths.map { |path| Sinatra.define_route(:get, path, options, &b) } -end - -def post(*paths, &b) - options = Hash === paths.last ? paths.pop : {} - paths.map { |path| Sinatra.define_route(:post, path, options, &b) } -end - -def put(*paths, &b) - options = Hash === paths.last ? paths.pop : {} - paths.map { |path| Sinatra.define_route(:put, path, options, &b) } -end - -def delete(*paths, &b) - options = Hash === paths.last ? paths.pop : {} - paths.map { |path| Sinatra.define_route(:delete, path, options, &b) } -end - -def error(*codes, &b) - raise 'You must specify a block to assciate with an error' if b.nil? - codes.each { |code| Sinatra.define_error(code, &b) } -end - -def before(*groups, &b) - groups = [:all] if groups.empty? - groups.each { |group| Sinatra.define_filter(:before, group, &b) } -end - -def after(*groups, &b) - groups = [:all] if groups.empty? - groups.each { |group| Sinatra.define_filter(:after, group, &b) } -end - -def mime_type(content_type, *exts) - exts.each { |ext| Sinatra::MIME_TYPES.merge(ext.to_s, content_type) } -end - -def helpers(&b) - Sinatra::EventContext.class_eval(&b) -end - -def configures(*envs) - return if Sinatra.config[:reloading] - yield if (envs.include?(Sinatra.config[:env]) || envs.empty?) -end -alias :configure :configures - -Sinatra.setup_default_events! - -at_exit do - raise $! if $! - Sinatra.setup_logger - - #TODO: Move this into command line options - if ARGV.include?('-i') - require File.dirname(__FILE__) + '/sinatra/irb' - end - - Sinatra.run if Sinatra.config[:run] -end \ No newline at end of file diff --git a/lib/sinatra/application.rb b/lib/sinatra/application.rb deleted file mode 100644 index 60fefb83..00000000 --- a/lib/sinatra/application.rb +++ /dev/null @@ -1,218 +0,0 @@ -module Sinatra - extend self - - def method_missing(name, *args, &b) - Application.send(name, *args, &b) - end - - module Application - extend self - - attr_accessor :logger - - def run - - begin - puts "== Sinatra has taken the stage on port #{Sinatra.config[:port]} for #{Sinatra.config[:env]}" - require 'pp' - Rack::Handler::Mongrel.run(Sinatra, :Port => Sinatra.config[:port]) do |server| - trap(:INT) do - server.stop - puts "\n== Sinatra has ended his set (crowd applauds)" - end - end - rescue Errno::EADDRINUSE => e - puts "== Someone is already performing on port #{Sinatra.config[:port]}!" - end - - end - - def setup_logger - self.logger = Sinatra::Logger.new( - config[:root] + "/#{Sinatra.config[:env]}.log" - ) - end - - def setup_default_events! - error 500 do - "

#{$!.message}

#{$!.backtrace.join("
")}" - end - - error 404 do - "

Not Found

" - end - end - - def request_types - @request_types ||= [:get, :put, :post, :delete] - end - - def routes - @routes ||= Hash.new do |hash, key| - hash[key] = [] if request_types.include?(key) - end - end - - def filters - unless @filters - @filters = Hash.new do |hash, key| - hash[key] = Hash.new { |hash, key| hash[key] = [] } - end - end - @filters - end - - def config - @config ||= default_config.dup - end - - def config=(c) - @config = c - end - - def development? - config[:env] == :development - end - - def default_config - @default_config ||= { - :run => true, - :port => 4567, - :raise_errors => false, - :env => :development, - :root => Dir.pwd, - :default_static_mime_type => 'text/plain', - :default_params => { :format => 'html' } - } - end - - def determine_route(verb, path) - routes[verb].eject { |r| r.match(path) } || routes[404] - end - - def content_type_for(path) - ext = File.extname(path)[1..-1] - Sinatra.mime_types[ext] || config[:default_static_mime_type] - end - - def serve_static_file(path) - path = Sinatra.config[:root] + '/public' + path - if File.file?(path) - headers = { - 'Content-Type' => Array(content_type_for(path)), - 'Content-Length' => Array(File.size(path)) - } - [200, headers, File.read(path)] - end - end - - def call(env) - - reload! if Sinatra.development? - - time = Time.now - - request = Rack::Request.new(env) - - if found = serve_static_file(request.path_info) - log_request_and_response(time, request, Rack::Response.new(found)) - return found - end - - response = Rack::Response.new - route = determine_route( - request.request_method.downcase.to_sym, - request.path_info - ) - context = EventContext.new(request, response, route.params) - context.status = nil - begin - context = handle_with_filters(route.groups, context, &route.block) - context.status ||= route.default_status - rescue => e - raise e if config[:raise_errors] - route = Sinatra.routes[500] - context.status 500 - context.body Array(context.instance_eval(&route.block)) - ensure - log_request_and_response(time, request, response) - logger.flush - end - - context.finish - end - - def define_route(verb, path, options = {}, &b) - routes[verb] << route = Route.new(path, Array(options[:groups]), &b) - route - end - - def define_error(code, &b) - routes[code] = Error.new(code, &b) - end - - def define_filter(type, group, &b) - filters[type][group] << b - end - - def reset! - self.config = nil - routes.clear - filters.clear - setup_default_events! - end - - def reload! - reset! - self.config[:reloading] = true - load $0 - self.config[:reloading] = false - end - - protected - - def log_request_and_response(time, request, response) - now = Time.now - - # Common Log Format: http://httpd.apache.org/docs/1.3/logs.html#common - # lilith.local - - [07/Aug/2006 23:58:02] "GET / HTTP/1.1" 500 - - # %{%s - %s [%s] "%s %s%s %s" %d %s\n} % - logger.info %{%s - %s [%s] "%s %s%s %s" %d %s %0.4f\n} % - [ - request.env["REMOTE_ADDR"] || "-", - request.env["REMOTE_USER"] || "-", - now.strftime("%d/%b/%Y %H:%M:%S"), - request.env["REQUEST_METHOD"], - request.env["PATH_INFO"], - request.env["QUERY_STRING"].empty? ? - "" : - "?" + request.env["QUERY_STRING"], - request.env["HTTP_VERSION"], - response.status.to_s[0..3].to_i, - (response.body.length.zero? ? "-" : response.body.length.to_s), - now - time - ] - end - - def handle_with_filters(groups, cx, &b) - caught = catch(:halt) do - filters_for(:before, groups).each { |x| cx.instance_eval(&x) } - [:complete, b] - end - caught = catch(:halt) do - caught.to_result(cx) - end - result = caught.to_result(cx) if caught - filters_for(:after, groups).each { |x| cx.instance_eval(&x) } - cx.body Array(result.to_s) - cx - end - - def filters_for(type, groups) - filters[type][:all] + groups.inject([]) do |m, g| - m + filters[type][g] - end - end - end - -end diff --git a/lib/sinatra/core_ext.rb b/lib/sinatra/core_ext.rb deleted file mode 100644 index 48ad4639..00000000 --- a/lib/sinatra/core_ext.rb +++ /dev/null @@ -1,58 +0,0 @@ -def silence_warnings - old_verbose, $VERBOSE = $VERBOSE, nil - yield -ensure - $VERBOSE = old_verbose -end - -class String - def to_param - URI.escape(self) - end - - def from_param - URI.unescape(self) - end -end - -class Hash - def to_params - map { |k,v| "#{k}=#{URI.escape(v)}" }.join('&') - end - - def symbolize_keys - self.inject({}) { |h,(k,v)| h[k.to_sym] = v; h } - end - - def pass(*keys) - reject { |k,v| !keys.include?(k) } - end -end - -class Symbol - def to_proc - Proc.new { |*args| args.shift.__send__(self, *args) } - end -end - -class Array - def to_hash - self.inject({}) { |h, (k, v)| h[k] = v; h } - end - - def to_proc - Proc.new { |*args| args.shift.__send__(self[0], args + self[1..-1]) } - end -end - -class Proc - def block - self - end -end - -module Enumerable - def eject(&block) - find { |e| result = block[e] and break result } - end -end diff --git a/lib/sinatra/error.rb b/lib/sinatra/error.rb deleted file mode 100644 index 73235a1e..00000000 --- a/lib/sinatra/error.rb +++ /dev/null @@ -1,17 +0,0 @@ -class Error - - attr_reader :block - - def initialize(code, &b) - @code, @block = code, b - end - - def default_status - @code - end - - def params; {}; end - - def groups; []; end - -end diff --git a/lib/sinatra/event_context.rb b/lib/sinatra/event_context.rb deleted file mode 100644 index f49fdcc2..00000000 --- a/lib/sinatra/event_context.rb +++ /dev/null @@ -1,40 +0,0 @@ -class Sinatra::EventContext - - attr_reader :request, :response, :route_params - - def logger - Sinatra.logger - end - - def initialize(request, response, route_params) - @request, @response, @route_params = - request, response, route_params - end - - def params - @params ||= request.params.merge(route_params).symbolize_keys - end - - def complete(b) - self.instance_eval(&b) - end - - # redirect to another url It can be like /foo/bar - # for redirecting within your same app. Or it can - # be a fully qualified url to another site. - def redirect(url) - logger.info "Redirecting to: #{url}" - status(302) - headers.merge!('Location' => url) - return '' - end - - def method_missing(name, *args) - if args.size == 1 && response.respond_to?("#{name}=") - response.send("#{name}=", args.first) - else - response.send(name, *args) - end - end - -end diff --git a/lib/sinatra/halt_results.rb b/lib/sinatra/halt_results.rb deleted file mode 100644 index d6a67bd8..00000000 --- a/lib/sinatra/halt_results.rb +++ /dev/null @@ -1,30 +0,0 @@ -class Proc - def to_result(cx, *args) - cx.instance_eval(&self) - end -end - -class String - def to_result(cx, *args) - cx.body self - end -end - -class Array - def to_result(cx, *args) - self.shift.to_result(cx, *self) - end -end - -class Symbol - def to_result(cx, *args) - cx.send(self, *args) - end -end - -class Fixnum - def to_result(cx, *args) - cx.status self - cx.body args.first - end -end diff --git a/lib/sinatra/irb.rb b/lib/sinatra/irb.rb deleted file mode 100644 index d16a93bf..00000000 --- a/lib/sinatra/irb.rb +++ /dev/null @@ -1,45 +0,0 @@ -require File.dirname(__FILE__) + '/test/methods' - -Object.send(:include, Sinatra::Test::Methods) # added to allow post_to in console - -Object.class_eval do - - # Reload all Sinatra and App specific files - def reload! - Sinatra.reload! - end - - # Show the +body+ with result info in your text editor!!! Great Job! - def show!(editor = nil) - editor = editor || ENV['EDITOR'] - IO.popen(editor, 'w') do |f| - f.puts "" - f.puts - f.puts body - end - nil - end - alias :mate :show! - - def result_info #:nodoc: - info = <<-end_info - # Status: #{status} - # Headers: #{headers.inspect} - end_info - end - -end - -ARGV.clear # Avoid passing args to IRB -require 'irb' -require 'irb/completion' -def exit - exit! -end -if File.exists? ".irbrc" - ENV['IRBRC'] = ".irbrc" -end -IRB.start -exit! diff --git a/lib/sinatra/logger.rb b/lib/sinatra/logger.rb deleted file mode 100644 index 1e9933a3..00000000 --- a/lib/sinatra/logger.rb +++ /dev/null @@ -1,75 +0,0 @@ -# Adapted from Merb greatness - -module Sinatra - - class Logger - module Severity - DEBUG = 0 - INFO = 1 - WARN = 2 - ERROR = 3 - FATAL = 4 - UNKNOWN = 5 - end - include Severity - - attr_accessor :level - attr_reader :buffer - - def initialize(log, level = DEBUG) - @level = level - @buffer = [] - if log.respond_to?(:write) - @log = log - elsif File.exist?(log) - @log = open(log, (File::WRONLY | File::APPEND)) - @log.sync = true - else - @log = open(log, (File::WRONLY | File::APPEND | File::CREAT)) - @log.sync = true - @log.write("# Logfile created on %s\n" % [Time.now.to_s]) - end - end - - def flush - unless @buffer.size == 0 - @aio ||= !Sinatra.config.to_s.match(/development|test/) # && !RUBY_PLATFORM.match(/java|mswin/) && - @log.respond_to?(:write_nonblock) - if @aio - @log.write_nonblock(@buffer.slice!(0..-1).to_s) - else - @log.write(@buffer.slice!(0..-1).to_s) - end - end - end - - def close - flush - @log.close if @log.respond_to?(:close) - @log = nil - end - - def add(severity, message = nil, progname = nil, &block) - return if @level > severity - message = (message || (block && block.call) || progname).to_s - # If a newline is necessary then create a new message ending with a newline. - # Ensures that the original message is not mutated. - message = "#{message}\n" unless message[-1] == ?\n - @buffer << message - message - end - - Severity.constants.each do |severity| - class_eval <<-EOT - def #{severity.downcase}(message = nil, progname = nil, &block) - add(#{severity}, message, progname, &block) - end - - def #{severity.downcase}? - #{severity} >= @level - end - EOT - end - - end -end diff --git a/lib/sinatra/mime_types.rb b/lib/sinatra/mime_types.rb deleted file mode 100644 index 4b133385..00000000 --- a/lib/sinatra/mime_types.rb +++ /dev/null @@ -1,256 +0,0 @@ -module Sinatra - - def mime_types - - @default_mime_types ||= { - "csh"=>"application/x-csh", - "x_t"=>"model/vnd.parasolid.transmit.text", - "ksp"=>"application/vnd.kde.kspread", - "fsc"=>"application/vnd.fsc.weblaunch", - "vcs"=>"text/x-vcalendar", - "hvs"=>"application/vnd.yamaha.hv-script", - "seml"=>"application/vnd.sealed.eml", - "movie"=>"video/x-sgi-movie", - "plt"=>"application/vnd.hp-HPGL", - "wav"=>"audio/x-wav", - "3gpp"=>"audio/3gpp", - "eol"=>"audio/vnd.digital-winds", - "rtf"=>"application/rtf", - "kfo"=>"application/vnd.kde.kformula", - "rdf"=>"application/rdf+xml", - "rgb"=>"image/x-rgb", - "wpd"=>"application/vnd.wordperfect", - "sit"=>"application/x-stuffit", - "ogg"=>"application/ogg", - "pbm"=>"image/x-portable-bitmap", - "dwf"=>"x-drawing/dwf", - "smp3"=>"audio/vnd.sealedmedia.softseal.mpeg", - "html"=>"text/html", - "dwg"=>"image/vnd.dwg", - "see"=>"application/vnd.seemail", - "igs"=>"model/iges", - "siv"=>"application/sieve", - "jad"=>"text/vnd.sun.j2me.app-descriptor", - "wml"=>"text/vnd.wap.wml", - "ustar"=>"application/x-ustar", - "vis"=>"application/vnd.visionary", - "pkipath"=>"application/pkix-pkipath", - "ecelp4800"=>"audio/vnd.nuera.ecelp4800", - "ice"=>"x-conference/x-cooltalk", - "qcp"=>"audio/QCELP", - "ai"=>"application/postscript", - "sppt"=>"application/vnd.sealed.ppt", - "ltx"=>"application/x-latex", - "nim"=>"video/vnd.nokia.interleaved-multimedia", - "igx"=>"application/vnd.micrografx.igx", - "viv"=>"video/vnd.vivo", - "wpl"=>"application/vnd.ms-wpl", - "ami"=>"application/vnd.amiga.ami", - "tcl"=>"application/x-tcl", - "l16"=>"audio/L16", - "css"=>"text/css", - "vbk"=>"audio/vnd.nortel.vbk", - "pki"=>"application/pkixcmp", - "ras"=>"image/x-cmu-raster", - "jpeg"=>"image/jpeg", - "chrt"=>"application/vnd.kde.kchart", - "cil"=>"application/vnd.ms-artgalry", - "mxu"=>"video/vnd.mpegurl", - "xwd"=>"image/x-xwindowdump", - "kon"=>"application/vnd.kde.kontour", - "dgn"=>"image/x-vnd.dgn", - "csv"=>"text/csv", - "png"=>"image/png", - "xfdf"=>"application/vnd.adobe.xfdf", - "asf"=>"application/vnd.ms-asf", - "sxls"=>"application/vnd.sealed.xls", - "dl"=>"video/dl", - "karbon"=>"application/vnd.kde.karbon", - "ico"=>"image/vnd.microsoft.icon", - "sus"=>"application/vnd.sus-calendar", - "pdb"=>"x-chemical/x-pdb", - "wif"=>"application/watcherinfo+xml", - "ser"=>"application/x-java-serialized-object", - "mdi"=>"image/vnd.ms-modi", - "qt"=>"video/quicktime", - "rtx"=>"text/richtext", - "jar"=>"application/x-java-archive", - "rcprofile"=>"application/vnd.ipunplugged.rcprofile", - "tsv"=>"text/tab-separated-values", - "pnm"=>"image/x-portable-anymap", - "me"=>"application/x-troff-me", - "amr"=>"audio/AMR", - "wp5"=>"application/wordperfect5.1", - "gl"=>"video/gl", - "man"=>"application/x-troff-man", - "pdf"=>"application/pdf", - "pgb"=>"image/vnd.globalgraphics.pgb", - "au"=>"audio/basic", - "avi"=>"video/x-msvideo", - "wmlsc"=>"application/vnd.wap.wmlscriptc", - "wbxml"=>"application/vnd.wap.wbxml", - "saf"=>"application/vnd.yamaha.smaf-audio", - "gtar"=>"application/x-gtar", - "crl"=>"application/pkix-crl", - "pti"=>"application/vnd.pvi.ptid1", - "rdz"=>"application/vnd.data-vision.rdz", - "flo"=>"application/vnd.micrografx.flo", - "aif"=>"audio/x-aiff", - "qxd"=>"application/vnd.Quark.QuarkXPress", - "kne"=>"application/vnd.Kinar", - "rpm"=>"audio/x-pn-realaudio-plugin", - "lvp"=>"audio/vnd.lucent.voice", - "stml"=>"application/vnd.sealedmedia.softseal.html", - "sc"=>"application/vnd.ibm.secure-container", - "jnlp"=>"application/x-java-jnlp-file", - "smov"=>"video/vnd.sealedmedia.softseal.mov", - "dvi"=>"application/x-dvi", - "jisp"=>"application/vnd.jisp", - "wv"=>"application/vnd.wv.csp+wbxml", - "mseq"=>"application/vnd.mseq", - "mmf"=>"application/vnd.smaf", - "mpc"=>"application/vnd.mophun.certificate", - "stk"=>"application/hyperstudio", - "txd"=>"application/vnd.genomatix.tuxedo", - "ent"=>"application/vnd.nervana", - "hdf"=>"application/x-hdf", - "xml"=>"application/xml", - "mpga"=>"audio/mpeg", - "sh"=>"application/x-sh", - "pgm"=>"image/x-portable-graymap", - "lbd"=>"application/vnd.llamagraphics.life-balance.desktop", - "flw"=>"application/vnd.kde.kivio", - "si"=>"text/vnd.wap.si", - "zip"=>"application/zip", - "ecelp7470"=>"audio/vnd.nuera.ecelp7470", - "lbe"=>"application/vnd.llamagraphics.life-balance.exchange+xml", - "p10"=>"application/pkcs10", - "ief"=>"image/ief", - "doc"=>"application/msword", - "efif"=>"application/vnd.picsel", - "jpm"=>"image/jpm", - "gz"=>"application/x-gzip", - "xhtml"=>"application/xhtml+xml", - "irm"=>"application/vnd.ibm.rights-management", - "bcpio"=>"application/x-bcpio", - "mcd"=>"application/vnd.mcd", - "ecelp9600"=>"audio/vnd.nuera.ecelp9600", - "ms"=>"application/x-troff-ms", - "gif"=>"image/gif", - "kwd"=>"application/vnd.kde.kword", - "wrl"=>"model/vrml", - "sl"=>"text/vnd.wap.sl", - "xpm"=>"image/x-xpixmap", - "cer"=>"application/pkix-cert", - "mxmf"=>"audio/vnd.nokia.mobile-xmf", - "psb"=>"application/vnd.3gpp.pic-bw-small", - "cab"=>"application/vnd.ms-cab-compressed", - "rst"=>"text/prs.fallenstein.rst", - "p7m"=>"application/pkcs7-mime", - "spng"=>"image/vnd.sealed.png", - "mj2"=>"video/MJ2", - "wbmp"=>"image/vnd.wap.wbmp", - "irp"=>"application/vnd.irepository.package+xml", - "smht"=>"application/vnd.sealed.mht", - "msh"=>"model/mesh", - "htke"=>"application/vnd.kenameaapp", - "s11"=>"video/vnd.sealed.mpeg1", - "mpm"=>"application/vnd.blueice.multipass", - "mpn"=>"application/vnd.mophun.application", - "dfac"=>"application/vnd.dreamfactory", - "pvb"=>"application/vnd.3gpp.pic-bw-var", - "lrm"=>"application/vnd.ms-lrm", - "tiff"=>"image/tiff", - "jp2"=>"image/jp2", - "rpss"=>"application/vnd.nokia.radio-presets", - "wmlc"=>"application/vnd.wap.wmlc", - "rpst"=>"application/vnd.nokia.radio-preset", - "etx"=>"text/x-setext", - "bmp"=>"image/bmp", - "mpp"=>"application/vnd.ms-project", - "spf"=>"application/vnd.yamaha.smaf-phrase", - "3gp"=>"video/3gpp", - "mid"=>"audio/x-midi", - "hqx"=>"application/mac-binhex40", - "p7s"=>"application/pkcs7-signature", - "wbs"=>"application/vnd.criticaltools.wbs+xml", - "emm"=>"application/vnd.ibm.electronic-media", - "ppm"=>"image/x-portable-pixmap", - "texinfo"=>"application/x-texinfo", - "mp2"=>"video/mpeg", - "jpx"=>"image/jpx", - "evc"=>"audio/EVRC", - "mif"=>"application/x-mif", - "ra"=>"audio/x-realaudio", - "spdf"=>"application/vnd.sealedmedia.softseal.pdf", - "x_b"=>"model/vnd.parasolid.transmit.binary", - "class"=>"application/x-java-vm", - "txt"=>"text/plain", - "mp4"=>"video/vnd.objectvideo", - "hbci"=>"application/vnd.hbci", - "wqd"=>"application/vnd.wqd", - "vsc"=>"application/vnd.vidsoft.vidconference", - "mfm"=>"application/vnd.mfmp", - "sgml"=>"text/sgml", - "tex"=>"application/x-tex", - "curl"=>"application/vnd.curl", - "djvu"=>"image/vnd.djvu", - "cw"=>"application/prs.cww", - "vsd"=>"application/vnd.visio", - "tga"=>"image/targa", - "wtb"=>"application/vnd.webturbo", - "plb"=>"application/vnd.3gpp.pic-bw-large", - "t"=>"text/troff", - "les"=>"application/vnd.hhe.lesson-player", - "sms"=>"application/vnd.3gpp.sms", - "hvd"=>"application/vnd.yamaha.hv-dic", - "yaml"=>"text/x-yaml", - "ppt"=>"application/powerpoint", - "psp"=>"image/x-paintshoppro", - "sic"=>"application/vnd.wap.sic", - "cmc"=>"application/vnd.cosmocaller", - "vcf"=>"text/x-vcard", - "sjpg"=>"image/vnd.sealedmedia.softseal.jpg", - "sid"=>"audio/prs.sid", - "sv4cpio"=>"application/x-sv4cpio", - "sswf"=>"video/vnd.sealed.swf", - "cpio"=>"application/x-cpio", - "smv"=>"audio/SMV", - "wks"=>"application/vnd.lotus-1-2-3", - "sig"=>"application/pgp-signature", - "slc"=>"application/vnd.wap.slc", - "z"=>"application/x-compressed", - "rm"=>"audio/x-pn-realaudio", - "bin"=>"application/octet-stream", - "smpg"=>"video/vnd.sealed.mpeg4", - "wmls"=>"text/vnd.wap.wmlscript", - "atc"=>"application/vnd.acucorp", - "pfr"=>"application/font-tdpfr", - "plj"=>"audio/vnd.everad.plj", - "rnd"=>"application/prs.nprend", - "xls"=>"application/excel", - "sdoc"=>"application/vnd.sealed.doc", - "tar"=>"application/x-tar", - "oda"=>"application/oda", - "kia"=>"application/vnd.kidspiration", - "prc"=>"application/vnd.palm", - "sgif"=>"image/vnd.sealedmedia.softseal.gif", - "soc"=>"application/sgml-open-catalog", - "xyz"=>"x-chemical/x-xyz", - "awb"=>"audio/AMR-WB", - "xbm"=>"image/x-xbitmap", - "ccc"=>"text/vnd.net2phone.commcenter.command", - "xul"=>"application/vnd.mozilla.xul+xml", - "cdy"=>"application/vnd.cinderella", - "kpr"=>"application/vnd.kde.kpresenter", - "shar"=>"application/x-shar", - "src"=>"application/x-wais-source", - "hvp"=>"application/vnd.yamaha.hv-voice", - "nc"=>"application/netcdf", - "sv4crc"=>"application/x-sv4crc", - "js" => "text/javascript" - } - - end - -end diff --git a/lib/sinatra/route.rb b/lib/sinatra/route.rb deleted file mode 100644 index a74e1cfe..00000000 --- a/lib/sinatra/route.rb +++ /dev/null @@ -1,39 +0,0 @@ -class Sinatra::Route - - URI_CHAR = '[^/?:,&#]'.freeze unless defined?(URI_CHAR) - PARAM = /:(#{URI_CHAR}+)/.freeze unless defined?(PARAM) - - attr_reader :block, :path - - def initialize(path, groups = :all, &b) - @path, @groups, @block = path, Array(groups), b - @param_keys = [] - @struct = Struct.new(:path, :groups, :block, :params, :default_status) - regex = path.to_s.gsub(PARAM) do - @param_keys << $1.intern - "(#{URI_CHAR}+)" - end - if path =~ /:format$/ - @pattern = /^#{regex}$/ - else - @param_keys << :format - @pattern = /^#{regex}(?:\.(#{URI_CHAR}+))?$/ - end - end - - def match(path) - return nil unless path =~ @pattern - params = @param_keys.zip($~.captures.compact.map(&:from_param)).to_hash - @struct.new(@path, @groups, @block, include_format(params), 200) - end - - def include_format(h) - h.delete(:format) unless h[:format] - Sinatra.config[:default_params].merge(h) - end - - def pretty_print(pp) - pp.text "{Route: #{@pattern} : [#{@param_keys.map(&:inspect).join(",")}] : #{@groups.join(",")} }" - end - -end diff --git a/lib/sinatra/test.rb b/lib/sinatra/test.rb deleted file mode 100644 index c0b0a7ec..00000000 --- a/lib/sinatra/test.rb +++ /dev/null @@ -1,24 +0,0 @@ -require 'test/unit' - -def silence_warnings - old_verbose, $VERBOSE = $VERBOSE, nil - yield -ensure - $VERBOSE = old_verbose -end - -silence_warnings do - require File.dirname(__FILE__) + '/../sinatra' -end - -require File.dirname(__FILE__) + "/test/methods" - -Test::Unit::TestCase.send :include, Sinatra::Test::Methods - -Sinatra.default_config[:raise_errors] = true -Sinatra.default_config[:env] = :test -Sinatra.default_config[:run] = false - -Sinatra.config = nil - -Sinatra.setup_logger diff --git a/lib/sinatra/test/methods.rb b/lib/sinatra/test/methods.rb deleted file mode 100644 index 02d4ca66..00000000 --- a/lib/sinatra/test/methods.rb +++ /dev/null @@ -1,45 +0,0 @@ -module Sinatra - - module Test - - module Methods - - def get_it(path, params = {}) - @request = Rack::MockRequest.new(Sinatra) - @response = @request.get(path, :input => params.to_params) - end - - def post_it(path, params = {}) - @request = Rack::MockRequest.new(Sinatra) - @response = @request.post(path, :input => params.to_params) - end - - def put_it(path, params = {}) - @request = Rack::MockRequest.new(Sinatra) - @response = @request.put(path, :input => params.to_params) - end - - def delete_it(path, params = {}) - @request = Rack::MockRequest.new(Sinatra) - @response = @request.delete(path, :input => params.to_params) - end - - def follow! - get_it(@response.location) - end - - def dont_raise_errors - Sinatra.config[:raise_errors] = false - yield - Sinatra.config[:raise_errors] = true - end - - def method_missing(name, *args) - @response.send(name, *args) - end - - end - - end - -end diff --git a/lib/sinatra/test/spec.rb b/lib/sinatra/test/spec.rb deleted file mode 100644 index 30a65e58..00000000 --- a/lib/sinatra/test/spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require File.dirname(__FILE__) + '/../test' -require "test/spec" - -module Sinatra::Test::Methods - - def should - @response.should - end - -end diff --git a/test/dispatching_test.rb b/test/dispatching_test.rb deleted file mode 100644 index c03cd1f5..00000000 --- a/test/dispatching_test.rb +++ /dev/null @@ -1,146 +0,0 @@ -require File.dirname(__FILE__) + '/helper' - -context "Dispatching" do - - setup do - Sinatra.reset! - end - - - specify "should return the correct block" do - r = get '/' do - 'main' - end - - result = Sinatra.determine_route(:get, '/') - result.path.should.equal r.first.path - end - - specify "should return custom 404" do - Sinatra.routes[404] = r = Proc.new { 'custom 404' } - - result = Sinatra.determine_route(:get, '/') - result.should.be r - end - - specify "should return standard 404" do - get_it '/' - status.should.equal 404 - body.should.equal '

Not Found

' - end - - specify "should give custom 500 if error when called" do - Sinatra.routes[500] = r = Proc.new { 'custom 500' } - - get '/' do - raise 'asdf' - end - - dont_raise_errors do - get_it '/' - end - - body.should.equal 'custom 500' - end - - specify "should give standard 500 if error when called" do - get '/' do - raise 'asdf' - end - - dont_raise_errors do - get_it '/' - end - - body.should.match(/^

asdf<\/h2>/) - end - - specify "should run in a context" do - Sinatra::EventContext.any_instance.expects(:foo).returns 'in foo' - - get '/' do - foo - end - - get_it '/' - body.should.equal 'in foo' - end - - specify "has access to the request" do - - get '/blake' do - request.path_info - end - - get_it '/blake' - - body.should.equal '/blake' - - end - - specify "has DSLified methods for response" do - get '/' do - status 555 - 'uh oh' - end - - get_it '/' - - body.should.equal "uh oh" - status.should.equal 555 - end - - specify "should give format for free" do - get '/formatted' do - params[:format].should.equal 'xml' - end - - get_it '/formatted.xml' - - should.be.ok - end - - specify "should give format default html format for free" do - get '/formatted' do - params[:format].should.equal 'html' - end - - get_it '/formatted' - - should.be.ok - end - - specify "format for free is overrided by :format in route" do - - get '/formatted.:format' do - params[:format] - end - - get_it '/formatted.xml' - should.be.ok - body.should.equal 'xml' - - get_it '/formatted.js' - should.be.ok - body.should.equal 'js' - - end - -end - -context "An Event in test mode" do - - setup do - Sinatra.routes.clear - Sinatra.setup_default_events! - end - - specify "should raise errors to top" do - get '/' do - raise 'asdf' - end - - lambda { get_it '/' }.should.raise(RuntimeError) - end - -end diff --git a/test/error_dsl_test.rb b/test/error_dsl_test.rb deleted file mode 100644 index 42dcc81c..00000000 --- a/test/error_dsl_test.rb +++ /dev/null @@ -1,50 +0,0 @@ -require File.dirname(__FILE__) + '/helper' - -context "Defining Errors" do - - setup do - Sinatra.reset! - end - - specify "should raise error if no block given" do - - lambda { error 404 }.should.raise(RuntimeError) - lambda { error(404) {} }.should.not.raise - - end - - specify "should auto-set status for error events" do - error 404 do - 'custom 404' - end - - get_it '/' - - should.be.not_found - end - - specify "should handle multiple errors" do - - error 404, 500 do - 'multi custom error' - end - - get '/error' do - raise 'asdf' - end - - dont_raise_errors do - get_it '/error' - end - - status.should.equal 500 - body.should.equal 'multi custom error' - - get_it '/' - status.should.equal 404 - - body.should.equal 'multi custom error' - - end - -end diff --git a/test/event_dsl_test.rb b/test/event_dsl_test.rb deleted file mode 100644 index c88cfe6a..00000000 --- a/test/event_dsl_test.rb +++ /dev/null @@ -1,39 +0,0 @@ -require File.dirname(__FILE__) + '/helper' - -context "Event's DSL" do - - setup do - Sinatra.reset! - end - - specify "takes multiple routes" do - - get '/', '/foo' do - 'hello from me' - end - - get_it '/' - should.be.ok - body.should.equal 'hello from me' - - get_it '/foo' - should.be.ok - body.should.equal 'hello from me' - - end - - specify "should be able to halt from within request" do - - get '/halting' do - throw :halt, 'halted' - 'not this' - end - - get_it '/halting' - - should.be.ok - body.should.equal 'halted' - - end - -end diff --git a/test/filter_test.rb b/test/filter_test.rb deleted file mode 100644 index d6febca8..00000000 --- a/test/filter_test.rb +++ /dev/null @@ -1,113 +0,0 @@ -require File.dirname(__FILE__) + '/helper' - -class CustomResult - - def to_result(cx, *args) - cx.status 404 - cx.body "Can't find this shit!" - end - -end - -context "Filters" do - - setup do - Sinatra.reset! - end - - specify "halts when told" do - - before do - throw :halt, 'fubar' - end - - get '/' do - 'not this' - end - - get_it '/' - - should.be.ok - body.should.equal 'fubar' - - end - - specify "halts with status" do - - before do - throw :halt, [401, 'get out dude!'] - end - - get '/auth' do - "you're in!" - end - - get_it '/auth' - - status.should.equal 401 - body.should.equal 'get out dude!' - - end - - specify "halts with custom result" do - - before do - throw :halt, CustomResult.new - end - - get '/custom' do - 'not this' - end - - get_it '/custom' - - should.be.not_found - body.should.equal "Can't find this shit!" - - end - -end - -context "Filter grouping" do - - setup do - Sinatra.reset! - end - - specify "befores only run for groups if specified" do - - Sinatra::EventContext.any_instance.expects(:foo).times(4) - - before do - foo # this should be called before all events - end - - after do - foo - end - - before :admins do - throw :halt, 'not authorized' - end - - get '/', :groups => :admins do - 'asdf' - end - - get '/foo' do - 'yeah!' - end - - get_it '/' - - should.be.ok - body.should.equal 'not authorized' - - get_it '/foo' - - should.be.ok - body.should.equal 'yeah!' - - end - -end \ No newline at end of file diff --git a/test/helper.rb b/test/helper.rb deleted file mode 100644 index 4eac0fea..00000000 --- a/test/helper.rb +++ /dev/null @@ -1,3 +0,0 @@ -require File.dirname(__FILE__) + '/../lib/sinatra/test/spec' -require 'mocha' - diff --git a/test/helpers_dsl_test.rb b/test/helpers_dsl_test.rb deleted file mode 100644 index af5f6e02..00000000 --- a/test/helpers_dsl_test.rb +++ /dev/null @@ -1,28 +0,0 @@ -require File.dirname(__FILE__) + '/helper' - -context "Helpers" do - - setup do - Sinatra.reset! - end - - specify "for event context" do - - helpers do - def foo - 'foo' - end - end - - get '/' do - foo - end - - get_it '/' - - should.be.ok - body.should.equal 'foo' - - end - -end diff --git a/test/public/foo.foo b/test/public/foo.foo deleted file mode 100644 index ba0e162e..00000000 --- a/test/public/foo.foo +++ /dev/null @@ -1 +0,0 @@ -bar \ No newline at end of file diff --git a/test/public/foo.xml b/test/public/foo.xml deleted file mode 100644 index 54181ed4..00000000 --- a/test/public/foo.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/test/public/test.js b/test/public/test.js deleted file mode 100644 index 69a82a27..00000000 --- a/test/public/test.js +++ /dev/null @@ -1 +0,0 @@ -var i = 11; \ No newline at end of file diff --git a/test/public/xyz b/test/public/xyz deleted file mode 100644 index f2ba8f84..00000000 --- a/test/public/xyz +++ /dev/null @@ -1 +0,0 @@ -abc \ No newline at end of file diff --git a/test/route_test.rb b/test/route_test.rb deleted file mode 100644 index 4c5f1368..00000000 --- a/test/route_test.rb +++ /dev/null @@ -1,40 +0,0 @@ -require File.dirname(__FILE__) + '/helper' - -context "A Route in general" do - - specify "matches a path to a block" do - e = Sinatra::Route.new('/') do - 'hello' - end - - result = e.match('/') - result.block.call.should.equal 'hello' - result.params.should.equal :format => 'html' - end - - specify "matches with params from path" do - e = Sinatra::Route.new('/:name') do - 'hello again' - end - - # spaces should work - result = e.match('/blake%20mizerany') - result.should.not.be.nil - result.block.call.should.equal 'hello again' - result.params.should.equal :name => 'blake mizerany', :format => "html" - end - - specify "matches multiple vars in path" do - e = Sinatra::Route.new('/:name/:age') do - 'hello again' - end - - # spaces should work - result = e.match('/blake%20mizerany/25') - result.should.not.be.nil - result.block.call.should.equal 'hello again' - result.params.should.equal :name => 'blake mizerany', :age => '25', - :format => "html" - end - -end diff --git a/test/static_test.rb b/test/static_test.rb deleted file mode 100644 index b6afb2ab..00000000 --- a/test/static_test.rb +++ /dev/null @@ -1,62 +0,0 @@ -require File.dirname(__FILE__) + '/helper' - -context "Static" do - - setup do - Sinatra.reset! - Sinatra.config[:root] = File.dirname(__FILE__) - end - - specify "sends files" do - - get_it '/foo.xml' - - should.be.ok - body.should.equal '' - headers.should.equal 'Content-Type' => 'application/xml', - 'Content-Length' => ''.size - - end - - specify "defaults to text/plain" do - - get_it '/foo.foo' - - should.be.ok - body.should.equal 'bar' - headers.should.equal 'Content-Type' => 'text/plain', - 'Content-Length' => 'bar'.size - end - - specify "default to user definied type" do - Sinatra.config[:default_static_mime_type] = 'foo/bar' - - get_it '/foo.foo' - - should.be.ok - body.should.equal 'bar' - headers.should.equal 'Content-Type' => 'foo/bar', - 'Content-Length' => 'bar'.size - end - - specify "handles files without ext" do - get_it '/xyz' - - should.be.ok - body.should.equal 'abc' - headers.should.equal 'Content-Type' => 'text/plain', - 'Content-Length' => 'bar'.size - end - - specify "should handle javascript correctly" do - - get_it '/test.js' - - should.be.ok - body.should.equal 'var i = 11;' - headers.should.equal 'Content-Type' => 'text/javascript', - 'Content-Length' => 'var i = 11;'.size - - end - -end diff --git a/test/test_test.rb b/test/test_test.rb deleted file mode 100644 index 45422b4d..00000000 --- a/test/test_test.rb +++ /dev/null @@ -1,12 +0,0 @@ -require File.dirname(__FILE__) + '/../lib/sinatra' -require File.dirname(__FILE__) + '/../lib/sinatra/test' - -class TestTest < Test::Unit::TestCase - - def test_test - get_it '/' - assert_equal 404, status - assert_equal '

Not Found

', body - end - -end