sinatra-sinatra 0.9.1.1 → 0.9.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +8 -0
- data/README.rdoc +4 -10
- data/Rakefile +7 -18
- data/lib/sinatra/base.rb +89 -32
- data/lib/sinatra/main.rb +2 -14
- data/sinatra.gemspec +4 -4
- data/test/base_test.rb +10 -1
- data/test/extensions_test.rb +16 -0
- data/test/options_test.rb +1 -49
- metadata +15 -4
- data/test/reload_test.rb +0 -68
data/CHANGES
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
= 0.9.2 / unreleased
|
2
|
+
|
3
|
+
* Development mode source file reloading has been removed. The
|
4
|
+
"shotgun" (http://rtomayko.github.com/shotgun/) program can be
|
5
|
+
used to achieve the same basic functionality in most situations.
|
6
|
+
Passenger users should use the "tmp/always_restart.txt"
|
7
|
+
file (http://tinyurl.com/c67o4h). [#166]
|
8
|
+
|
1
9
|
= 0.9.1.1 / 2009-03-09
|
2
10
|
|
3
11
|
* Fix directory traversal vulnerability in default static files
|
data/README.rdoc
CHANGED
@@ -285,13 +285,7 @@ A route can punt processing to the next matching route using <tt>pass</tt>:
|
|
285
285
|
The route block is immediately exited and control continues with the next
|
286
286
|
matching route. If no matching route is found, a 404 is returned.
|
287
287
|
|
288
|
-
== Configuration
|
289
|
-
|
290
|
-
Sinatra supports multiple environments and reloading. Reloading happens
|
291
|
-
before each request when running under the <tt>:development</tt>
|
292
|
-
environment. Wrap your configurations (e.g., database connections, constants,
|
293
|
-
etc.) in <tt>configure</tt> blocks to protect them from reloading or to
|
294
|
-
target specific environments.
|
288
|
+
== Configuration
|
295
289
|
|
296
290
|
Run once, at startup, in any environment:
|
297
291
|
|
@@ -300,14 +294,14 @@ Run once, at startup, in any environment:
|
|
300
294
|
end
|
301
295
|
|
302
296
|
Run only when the environment (RACK_ENV environment variable) is set to
|
303
|
-
<tt>:production</tt
|
297
|
+
<tt>:production</tt>:
|
304
298
|
|
305
299
|
configure :production do
|
306
300
|
...
|
307
301
|
end
|
308
302
|
|
309
|
-
Run when the environment
|
310
|
-
|
303
|
+
Run when the environment is set to either <tt>:production</tt> or
|
304
|
+
<tt>:test</tt>:
|
311
305
|
|
312
306
|
configure :production, :test do
|
313
307
|
...
|
data/Rakefile
CHANGED
@@ -33,7 +33,7 @@ def spec
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def package(ext='')
|
36
|
-
"
|
36
|
+
"pkg/sinatra-#{spec.version}" + ext
|
37
37
|
end
|
38
38
|
|
39
39
|
desc 'Build packages'
|
@@ -44,15 +44,15 @@ task :install => package('.gem') do
|
|
44
44
|
sh "gem install #{package('.gem')}"
|
45
45
|
end
|
46
46
|
|
47
|
-
directory '
|
48
|
-
CLOBBER.include('
|
47
|
+
directory 'pkg/'
|
48
|
+
CLOBBER.include('pkg')
|
49
49
|
|
50
|
-
file package('.gem') => %w[
|
50
|
+
file package('.gem') => %w[pkg/ sinatra.gemspec] + spec.files do |f|
|
51
51
|
sh "gem build sinatra.gemspec"
|
52
52
|
mv File.basename(f.name), f.name
|
53
53
|
end
|
54
54
|
|
55
|
-
file package('.tar.gz') => %w[
|
55
|
+
file package('.tar.gz') => %w[pkg/] + spec.files do |f|
|
56
56
|
sh <<-SH
|
57
57
|
git archive \
|
58
58
|
--prefix=sinatra-#{source_version}/ \
|
@@ -64,7 +64,7 @@ end
|
|
64
64
|
# Rubyforge Release / Publish Tasks ==================================
|
65
65
|
|
66
66
|
desc 'Publish gem and tarball to rubyforge'
|
67
|
-
task '
|
67
|
+
task 'release' => [package('.gem'), package('.tar.gz')] do |t|
|
68
68
|
sh <<-end
|
69
69
|
rubyforge add_release sinatra sinatra #{spec.version} #{package('.gem')} &&
|
70
70
|
rubyforge add_file sinatra sinatra #{spec.version} #{package('.tar.gz')}
|
@@ -95,12 +95,6 @@ file 'doc/api/index.html' => FileList['lib/**/*.rb','README.rdoc'] do |f|
|
|
95
95
|
end
|
96
96
|
CLEAN.include 'doc/api'
|
97
97
|
|
98
|
-
def rdoc_to_html(file_name)
|
99
|
-
require 'rdoc/markup/to_html'
|
100
|
-
rdoc = RDoc::Markup::ToHtml.new
|
101
|
-
rdoc.convert(File.read(file_name))
|
102
|
-
end
|
103
|
-
|
104
98
|
# Gemspec Helpers ====================================================
|
105
99
|
|
106
100
|
def source_version
|
@@ -108,12 +102,7 @@ def source_version
|
|
108
102
|
line.match(/.*VERSION = '(.*)'/)[1]
|
109
103
|
end
|
110
104
|
|
111
|
-
|
112
|
-
FileList[
|
113
|
-
'{lib,test,compat,images}/**',
|
114
|
-
'Rakefile', 'CHANGES', 'README.rdoc'
|
115
|
-
]
|
116
|
-
file 'sinatra.gemspec' => project_files do |f|
|
105
|
+
task 'sinatra.gemspec' => FileList['{lib,test,compat}/**','Rakefile','CHANGES','*.rdoc'] do |f|
|
117
106
|
# read spec file and split out manifest section
|
118
107
|
spec = File.read(f.name)
|
119
108
|
head, manifest, tail = spec.split(" # = MANIFEST =\n")
|
data/lib/sinatra/base.rb
CHANGED
@@ -14,6 +14,7 @@ module Sinatra
|
|
14
14
|
@env['HTTP_USER_AGENT']
|
15
15
|
end
|
16
16
|
|
17
|
+
# Returns an array of acceptable media types for the response
|
17
18
|
def accept
|
18
19
|
@env['HTTP_ACCEPT'].to_s.split(',').map { |a| a.strip }
|
19
20
|
end
|
@@ -162,6 +163,8 @@ module Sinatra
|
|
162
163
|
not_found
|
163
164
|
end
|
164
165
|
|
166
|
+
# Rack response body used to deliver static files. The file contents are
|
167
|
+
# generated iteratively in 8K chunks.
|
165
168
|
class StaticFile < ::File #:nodoc:
|
166
169
|
alias_method :to_path, :path
|
167
170
|
def each
|
@@ -215,7 +218,18 @@ module Sinatra
|
|
215
218
|
end
|
216
219
|
|
217
220
|
# Template rendering methods. Each method takes a the name of a template
|
218
|
-
# to render as a Symbol and returns a String with the rendered output
|
221
|
+
# to render as a Symbol and returns a String with the rendered output,
|
222
|
+
# as well as an optional hash with additional options.
|
223
|
+
#
|
224
|
+
# `template` is either the name or path of the template as symbol
|
225
|
+
# (Use `:'subdir/myview'` for views in subdirectories), or a string
|
226
|
+
# that will be rendered.
|
227
|
+
#
|
228
|
+
# Possible options are:
|
229
|
+
# :layout If set to false, no layout is rendered, otherwise
|
230
|
+
# the specified layout is used (Ignored for `sass`)
|
231
|
+
# :locals A hash with local variables that should be available
|
232
|
+
# in the template
|
219
233
|
module Templates
|
220
234
|
def erb(template, options={})
|
221
235
|
require 'erb' unless defined? ::ERB
|
@@ -223,13 +237,13 @@ module Sinatra
|
|
223
237
|
end
|
224
238
|
|
225
239
|
def haml(template, options={})
|
226
|
-
require 'haml' unless defined? ::Haml
|
240
|
+
require 'haml' unless defined? ::Haml::Engine
|
227
241
|
options[:options] ||= self.class.haml if self.class.respond_to? :haml
|
228
242
|
render :haml, template, options
|
229
243
|
end
|
230
244
|
|
231
245
|
def sass(template, options={}, &block)
|
232
|
-
require 'sass' unless defined? ::Sass
|
246
|
+
require 'sass' unless defined? ::Sass::Engine
|
233
247
|
options[:layout] = false
|
234
248
|
render :sass, template, options
|
235
249
|
end
|
@@ -368,13 +382,16 @@ module Sinatra
|
|
368
382
|
self.class
|
369
383
|
end
|
370
384
|
|
371
|
-
# Exit the current block
|
385
|
+
# Exit the current block, halts any further processing
|
386
|
+
# of the request, and returns the specified response.
|
372
387
|
def halt(*response)
|
373
388
|
response = response.first if response.length == 1
|
374
389
|
throw :halt, response
|
375
390
|
end
|
376
391
|
|
377
392
|
# Pass control to the next matching route.
|
393
|
+
# If there are no more matching routes, Sinatra will
|
394
|
+
# return a 404 response.
|
378
395
|
def pass
|
379
396
|
throw :pass
|
380
397
|
end
|
@@ -435,6 +452,9 @@ module Sinatra
|
|
435
452
|
# No matching route found or all routes passed -- forward downstream
|
436
453
|
# when running as middleware; 404 when running as normal app.
|
437
454
|
if @app
|
455
|
+
# Call bypassed method before forward to catch behavior that should
|
456
|
+
# happen even if no routes are hit.
|
457
|
+
bypassed if respond_to?(:bypassed)
|
438
458
|
forward
|
439
459
|
else
|
440
460
|
raise NotFound
|
@@ -553,12 +573,14 @@ module Sinatra
|
|
553
573
|
@middleware = []
|
554
574
|
@errors = {}
|
555
575
|
@prototype = nil
|
576
|
+
@extensions = []
|
556
577
|
|
557
578
|
class << self
|
558
579
|
attr_accessor :routes, :filters, :conditions, :templates,
|
559
580
|
:middleware, :errors
|
560
581
|
|
561
|
-
|
582
|
+
# Sets an option to the given value. If the value is a proc,
|
583
|
+
# the proc will be called every time the option is accessed.
|
562
584
|
def set(option, value=self)
|
563
585
|
if value.kind_of?(Proc)
|
564
586
|
metadef(option, &value)
|
@@ -574,14 +596,19 @@ module Sinatra
|
|
574
596
|
self
|
575
597
|
end
|
576
598
|
|
599
|
+
# Same as calling `set :option, true` for each of the given options.
|
577
600
|
def enable(*opts)
|
578
601
|
opts.each { |key| set(key, true) }
|
579
602
|
end
|
580
603
|
|
604
|
+
# Same as calling `set :option, false` for each of the given options.
|
581
605
|
def disable(*opts)
|
582
606
|
opts.each { |key| set(key, false) }
|
583
607
|
end
|
584
608
|
|
609
|
+
# Define a custom error handler. Optionally takes either an Exception
|
610
|
+
# class, or an HTTP status code to specify which errors should be
|
611
|
+
# handled.
|
585
612
|
def error(codes=Exception, &block)
|
586
613
|
if codes.respond_to? :each
|
587
614
|
codes.each { |err| error(err, &block) }
|
@@ -590,23 +617,25 @@ module Sinatra
|
|
590
617
|
end
|
591
618
|
end
|
592
619
|
|
620
|
+
# Sugar for `error(404) { ... }`
|
593
621
|
def not_found(&block)
|
594
622
|
error 404, &block
|
595
623
|
end
|
596
624
|
|
625
|
+
# Define a named template. The block must return the template source.
|
597
626
|
def template(name, &block)
|
598
627
|
templates[name] = block
|
599
628
|
end
|
600
629
|
|
630
|
+
# Define the layout template. The block must return the template source.
|
601
631
|
def layout(name=:layout, &block)
|
602
632
|
template name, &block
|
603
633
|
end
|
604
634
|
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
find { |line| ignore.all? { |pattern| line !~ pattern } }
|
635
|
+
# Load embeded templates from the file; uses the caller's __FILE__
|
636
|
+
# when no file is specified.
|
637
|
+
def use_in_file_templates!(file=nil)
|
638
|
+
file ||= caller_files.first
|
610
639
|
if data = ::IO.read(file).split('__END__')[1]
|
611
640
|
data.gsub!(/\r\n/, "\n")
|
612
641
|
template = nil
|
@@ -627,10 +656,15 @@ module Sinatra
|
|
627
656
|
Rack::Mime.mime_type(type, nil)
|
628
657
|
end
|
629
658
|
|
659
|
+
# Define a before filter. Filters are run before all requests
|
660
|
+
# within the same context as route handlers and may access/modify the
|
661
|
+
# request and response.
|
630
662
|
def before(&block)
|
631
663
|
@filters << block
|
632
664
|
end
|
633
665
|
|
666
|
+
# Add a route condition. The route is considered non-matching when the
|
667
|
+
# block returns false.
|
634
668
|
def condition(&block)
|
635
669
|
@conditions << block
|
636
670
|
end
|
@@ -667,6 +701,8 @@ module Sinatra
|
|
667
701
|
end
|
668
702
|
|
669
703
|
public
|
704
|
+
# Defining a `GET` handler also automatically defines
|
705
|
+
# a `HEAD` handler.
|
670
706
|
def get(path, opts={}, &block)
|
671
707
|
conditions = @conditions.dup
|
672
708
|
route('GET', path, opts, &block)
|
@@ -698,10 +734,16 @@ module Sinatra
|
|
698
734
|
lambda { unbound_method.bind(self).call }
|
699
735
|
end
|
700
736
|
|
737
|
+
invoke_hook(:route_added, verb, path)
|
738
|
+
|
701
739
|
(routes[verb] ||= []).
|
702
740
|
push([pattern, keys, conditions, block]).last
|
703
741
|
end
|
704
742
|
|
743
|
+
def invoke_hook(name, *args)
|
744
|
+
extensions.each { |e| e.send(name, *args) if e.respond_to?(name) }
|
745
|
+
end
|
746
|
+
|
705
747
|
def compile(path)
|
706
748
|
keys = []
|
707
749
|
if path.respond_to? :to_str
|
@@ -728,13 +770,20 @@ module Sinatra
|
|
728
770
|
end
|
729
771
|
|
730
772
|
public
|
773
|
+
# Makes the methods defined in the block and in the Modules given
|
774
|
+
# in `extensions` available to the handlers and templates
|
731
775
|
def helpers(*extensions, &block)
|
732
776
|
class_eval(&block) if block_given?
|
733
777
|
include *extensions if extensions.any?
|
734
778
|
end
|
735
779
|
|
780
|
+
def extensions
|
781
|
+
(@extensions + (superclass.extensions rescue [])).uniq
|
782
|
+
end
|
783
|
+
|
736
784
|
def register(*extensions, &block)
|
737
785
|
extensions << Module.new(&block) if block_given?
|
786
|
+
@extensions += extensions
|
738
787
|
extensions.each do |extension|
|
739
788
|
extend extension
|
740
789
|
extension.registered(self) if extension.respond_to?(:registered)
|
@@ -745,16 +794,20 @@ module Sinatra
|
|
745
794
|
def test? ; environment == :test ; end
|
746
795
|
def production? ; environment == :production ; end
|
747
796
|
|
797
|
+
# Set configuration options for Sinatra and/or the app.
|
798
|
+
# Allows scoping of settings for certain environments.
|
748
799
|
def configure(*envs, &block)
|
749
|
-
return if reloading?
|
750
800
|
yield if envs.empty? || envs.include?(environment.to_sym)
|
751
801
|
end
|
752
802
|
|
803
|
+
# Use the specified Rack middleware
|
753
804
|
def use(middleware, *args, &block)
|
754
805
|
@prototype = nil
|
755
806
|
@middleware << [middleware, args, block]
|
756
807
|
end
|
757
808
|
|
809
|
+
# Run the Sinatra app as a self-hosted server using
|
810
|
+
# Thin, Mongrel or WEBrick (in that order)
|
758
811
|
def run!(options={})
|
759
812
|
set options
|
760
813
|
handler = detect_rack_handler
|
@@ -785,28 +838,13 @@ module Sinatra
|
|
785
838
|
builder.use Rack::Session::Cookie if sessions? && !test?
|
786
839
|
builder.use Rack::CommonLogger if logging?
|
787
840
|
builder.use Rack::MethodOverride if methodoverride?
|
788
|
-
@middleware.each { |c,
|
841
|
+
@middleware.each { |c,a,b| builder.use(c, *a, &b) }
|
789
842
|
builder.run super
|
790
843
|
builder.to_app
|
791
844
|
end
|
792
845
|
|
793
846
|
def call(env)
|
794
|
-
synchronize
|
795
|
-
reload! if reload?
|
796
|
-
prototype.call(env)
|
797
|
-
end
|
798
|
-
end
|
799
|
-
|
800
|
-
def reloading?
|
801
|
-
@reloading
|
802
|
-
end
|
803
|
-
|
804
|
-
def reload!
|
805
|
-
@reloading = true
|
806
|
-
reset!
|
807
|
-
$LOADED_FEATURES.delete("sinatra.rb")
|
808
|
-
::Kernel.load app_file
|
809
|
-
@reloading = false
|
847
|
+
synchronize { prototype.call(env) }
|
810
848
|
end
|
811
849
|
|
812
850
|
def reset!(base=superclass)
|
@@ -817,6 +855,7 @@ module Sinatra
|
|
817
855
|
@errors = base.errors.dup
|
818
856
|
@middleware = base.middleware.dup
|
819
857
|
@prototype = nil
|
858
|
+
@extensions = []
|
820
859
|
end
|
821
860
|
|
822
861
|
protected
|
@@ -858,6 +897,20 @@ module Sinatra
|
|
858
897
|
(class << self; self; end).
|
859
898
|
send :define_method, message, &block
|
860
899
|
end
|
900
|
+
|
901
|
+
# Like Kernel#caller but excluding certain magic entries and without
|
902
|
+
# line / method information; the resulting array contains filenames only.
|
903
|
+
def caller_files
|
904
|
+
ignore = [
|
905
|
+
/lib\/sinatra.*\.rb$/, # all sinatra code
|
906
|
+
/\(.*\)/, # generated code
|
907
|
+
/custom_require\.rb$/, # rubygems require hacks
|
908
|
+
/active_support/, # active_support require hacks
|
909
|
+
]
|
910
|
+
caller(1).
|
911
|
+
map { |line| line.split(/:\d/, 2).first }.
|
912
|
+
reject { |file| ignore.any? { |pattern| file =~ pattern } }
|
913
|
+
end
|
861
914
|
end
|
862
915
|
|
863
916
|
set :raise_errors, true
|
@@ -878,8 +931,7 @@ module Sinatra
|
|
878
931
|
set :root, Proc.new { app_file && File.expand_path(File.dirname(app_file)) }
|
879
932
|
set :views, Proc.new { root && File.join(root, 'views') }
|
880
933
|
set :public, Proc.new { root && File.join(root, 'public') }
|
881
|
-
set :
|
882
|
-
set :lock, Proc.new { reload? }
|
934
|
+
set :lock, false
|
883
935
|
|
884
936
|
# static files route
|
885
937
|
get(/.*[^\/]$/) do
|
@@ -980,14 +1032,17 @@ module Sinatra
|
|
980
1032
|
class Application < Default
|
981
1033
|
end
|
982
1034
|
|
1035
|
+
# Sinatra delegation mixin. Mixing this module into an object causes all
|
1036
|
+
# methods to be delegated to the Sinatra::Application class. Used primarily
|
1037
|
+
# at the top-level.
|
983
1038
|
module Delegator #:nodoc:
|
984
1039
|
def self.delegate(*methods)
|
985
1040
|
methods.each do |method_name|
|
986
1041
|
eval <<-RUBY, binding, '(__DELEGATE__)', 1
|
987
1042
|
def #{method_name}(*args, &b)
|
988
|
-
::Sinatra::Application
|
1043
|
+
::Sinatra::Application.send(#{method_name.inspect}, *args, &b)
|
989
1044
|
end
|
990
|
-
private
|
1045
|
+
private #{method_name.inspect}
|
991
1046
|
RUBY
|
992
1047
|
end
|
993
1048
|
end
|
@@ -998,6 +1053,8 @@ module Sinatra
|
|
998
1053
|
:production?, :use_in_file_templates!, :helpers
|
999
1054
|
end
|
1000
1055
|
|
1056
|
+
# Create a new Sinatra application. The block is evaluated in the new app's
|
1057
|
+
# class scope.
|
1001
1058
|
def self.new(base=Base, options={}, &block)
|
1002
1059
|
base = Class.new(base)
|
1003
1060
|
base.send :class_eval, &block if block_given?
|
data/lib/sinatra/main.rb
CHANGED
@@ -6,26 +6,14 @@ module Sinatra
|
|
6
6
|
# we assume that the first file that requires 'sinatra' is the
|
7
7
|
# app_file. all other path related options are calculated based
|
8
8
|
# on this path by default.
|
9
|
-
set :app_file,
|
10
|
-
ignore = [
|
11
|
-
/lib\/sinatra.*\.rb$/, # all sinatra code
|
12
|
-
/\(.*\)/, # generated code
|
13
|
-
/custom_require\.rb$/ # rubygems require hacks
|
14
|
-
]
|
15
|
-
path =
|
16
|
-
caller.map{ |line| line.split(/:\d/, 2).first }.find do |file|
|
17
|
-
next if ignore.any? { |pattern| file =~ pattern }
|
18
|
-
file
|
19
|
-
end
|
20
|
-
path || $0
|
21
|
-
}.call
|
9
|
+
set :app_file, caller_files.first || $0
|
22
10
|
|
23
11
|
set :run, Proc.new { $0 == app_file }
|
24
12
|
|
25
13
|
if run? && ARGV.any?
|
26
14
|
require 'optparse'
|
27
15
|
OptionParser.new { |op|
|
28
|
-
op.on('-x') { set :
|
16
|
+
op.on('-x') { set :lock, true }
|
29
17
|
op.on('-e env') { |val| set :environment, val.to_sym }
|
30
18
|
op.on('-s server') { |val| set :server, val }
|
31
19
|
op.on('-p port') { |val| set :port, val.to_i }
|
data/sinatra.gemspec
CHANGED
@@ -3,8 +3,8 @@ Gem::Specification.new do |s|
|
|
3
3
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
4
4
|
|
5
5
|
s.name = 'sinatra'
|
6
|
-
s.version = '0.9.1.
|
7
|
-
s.date = '2009-03-
|
6
|
+
s.version = '0.9.1.2'
|
7
|
+
s.date = '2009-03-24'
|
8
8
|
|
9
9
|
s.description = "Classy web-development dressed in a DSL"
|
10
10
|
s.summary = "Classy web-development dressed in a DSL"
|
@@ -78,7 +78,6 @@ Gem::Specification.new do |s|
|
|
78
78
|
test/mapped_error_test.rb
|
79
79
|
test/middleware_test.rb
|
80
80
|
test/options_test.rb
|
81
|
-
test/reload_test.rb
|
82
81
|
test/request_test.rb
|
83
82
|
test/response_test.rb
|
84
83
|
test/result_test.rb
|
@@ -104,7 +103,8 @@ Gem::Specification.new do |s|
|
|
104
103
|
s.test_files = s.files.select {|path| path =~ /^test\/.*_test.rb/}
|
105
104
|
|
106
105
|
s.extra_rdoc_files = %w[README.rdoc LICENSE]
|
107
|
-
s.add_dependency 'rack',
|
106
|
+
s.add_dependency 'rack', '>= 0.9.1', '< 1.0'
|
107
|
+
s.add_development_dependency 'shotgun', '>= 0.2', '< 1.0'
|
108
108
|
|
109
109
|
s.has_rdoc = true
|
110
110
|
s.homepage = "http://sinatra.rubyforge.org"
|
data/test/base_test.rb
CHANGED
@@ -42,7 +42,7 @@ end
|
|
42
42
|
describe "Sinatra::Base as Rack middleware" do
|
43
43
|
|
44
44
|
app = lambda { |env|
|
45
|
-
[210, {'X-Downstream' => 'true'}, ['Hello from downstream']] }
|
45
|
+
[210, {'X-Downstream' => 'true', 'X-Bypass-Test' => '1' || ''}, ['Hello from downstream']] }
|
46
46
|
|
47
47
|
class TestMiddleware < Sinatra::Base
|
48
48
|
end
|
@@ -58,6 +58,10 @@ describe "Sinatra::Base as Rack middleware" do
|
|
58
58
|
end
|
59
59
|
|
60
60
|
class TestMiddleware < Sinatra::Base
|
61
|
+
def bypassed
|
62
|
+
env['X-Bypass-Test'] = '1'
|
63
|
+
end
|
64
|
+
|
61
65
|
get '/' do
|
62
66
|
'Hello from middleware'
|
63
67
|
end
|
@@ -78,6 +82,11 @@ describe "Sinatra::Base as Rack middleware" do
|
|
78
82
|
assert_equal 'Hello from downstream', response.body
|
79
83
|
end
|
80
84
|
|
85
|
+
it 'calls #bypassed before forwarding downstream' do
|
86
|
+
response = request.get('/missing')
|
87
|
+
assert_equal '1', response['X-Bypass-Test']
|
88
|
+
end
|
89
|
+
|
81
90
|
class TestMiddleware < Sinatra::Base
|
82
91
|
get '/low-level-forward' do
|
83
92
|
app.call(env)
|
data/test/extensions_test.rb
CHANGED
@@ -25,6 +25,12 @@ describe 'Registering extensions' do
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
module PainExtensions
|
29
|
+
def foo=(name); end
|
30
|
+
def bar?(name); end
|
31
|
+
def fizz!(name); end
|
32
|
+
end
|
33
|
+
|
28
34
|
it 'will add the methods to the DSL for the class in which you register them and its subclasses' do
|
29
35
|
Sinatra::Base.register FooExtensions
|
30
36
|
assert Sinatra::Base.respond_to?(:foo)
|
@@ -50,6 +56,16 @@ describe 'Registering extensions' do
|
|
50
56
|
map { |m| m.to_sym }.include?(:im_hiding_in_ur_foos)
|
51
57
|
end
|
52
58
|
|
59
|
+
it 'will handle special method names' do
|
60
|
+
Sinatra::Default.register PainExtensions
|
61
|
+
assert Sinatra::Delegator.private_instance_methods.
|
62
|
+
map { |m| m.to_sym }.include?(:foo=)
|
63
|
+
assert Sinatra::Delegator.private_instance_methods.
|
64
|
+
map { |m| m.to_sym }.include?(:bar?)
|
65
|
+
assert Sinatra::Delegator.private_instance_methods.
|
66
|
+
map { |m| m.to_sym }.include?(:fizz!)
|
67
|
+
end
|
68
|
+
|
53
69
|
it 'will not delegate methods on Base#register' do
|
54
70
|
Sinatra::Base.register QuuxExtensions
|
55
71
|
assert !Sinatra::Delegator.private_instance_methods.include?("quux")
|
data/test/options_test.rb
CHANGED
@@ -319,56 +319,8 @@ describe_option 'public' do
|
|
319
319
|
end
|
320
320
|
end
|
321
321
|
|
322
|
-
describe_option 'reload' do
|
323
|
-
it 'is enabled when
|
324
|
-
app_file is set,
|
325
|
-
is not a rackup file,
|
326
|
-
and we are in development' do
|
327
|
-
@base.app_file = __FILE__
|
328
|
-
@base.set(:environment, :development)
|
329
|
-
assert @base.reload?
|
330
|
-
|
331
|
-
@default.app_file = __FILE__
|
332
|
-
@default.set(:environment, :development)
|
333
|
-
assert @default.reload?
|
334
|
-
end
|
335
|
-
|
336
|
-
it 'is disabled if app_file is not set' do
|
337
|
-
assert ! @base.reload?
|
338
|
-
assert ! @default.reload?
|
339
|
-
end
|
340
|
-
|
341
|
-
it 'is disabled if app_file is a rackup file' do
|
342
|
-
@base.app_file = 'config.ru'
|
343
|
-
assert ! @base.reload?
|
344
|
-
|
345
|
-
@default.app_file = 'config.ru'
|
346
|
-
assert ! @base.reload?
|
347
|
-
end
|
348
|
-
|
349
|
-
it 'is disabled if we are not in development' do
|
350
|
-
@base.set(:environment, :foo)
|
351
|
-
assert ! @base.reload
|
352
|
-
|
353
|
-
@default.set(:environment, :bar)
|
354
|
-
assert ! @default.reload
|
355
|
-
end
|
356
|
-
end
|
357
|
-
|
358
322
|
describe_option 'lock' do
|
359
|
-
it 'is
|
360
|
-
@base.enable(:reload)
|
361
|
-
assert @base.lock?
|
362
|
-
|
363
|
-
@default.enable(:reload)
|
364
|
-
assert @default.lock?
|
365
|
-
end
|
366
|
-
|
367
|
-
it 'is disabled when reload is disabled' do
|
368
|
-
@base.disable(:reload)
|
323
|
+
it 'is disabled by default' do
|
369
324
|
assert ! @base.lock?
|
370
|
-
|
371
|
-
@default.disable(:reload)
|
372
|
-
assert ! @default.lock?
|
373
325
|
end
|
374
326
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra-sinatra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.1.
|
4
|
+
version: 0.9.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Blake Mizerany
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-03-
|
12
|
+
date: 2009-03-24 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -25,6 +25,19 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: "1.0"
|
27
27
|
version:
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: shotgun
|
30
|
+
type: :development
|
31
|
+
version_requirement:
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: "0.2"
|
37
|
+
- - <
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: "1.0"
|
40
|
+
version:
|
28
41
|
description: Classy web-development dressed in a DSL
|
29
42
|
email: sinatrarb@googlegroups.com
|
30
43
|
executables: []
|
@@ -99,7 +112,6 @@ files:
|
|
99
112
|
- test/mapped_error_test.rb
|
100
113
|
- test/middleware_test.rb
|
101
114
|
- test/options_test.rb
|
102
|
-
- test/reload_test.rb
|
103
115
|
- test/request_test.rb
|
104
116
|
- test/response_test.rb
|
105
117
|
- test/result_test.rb
|
@@ -161,7 +173,6 @@ test_files:
|
|
161
173
|
- test/mapped_error_test.rb
|
162
174
|
- test/middleware_test.rb
|
163
175
|
- test/options_test.rb
|
164
|
-
- test/reload_test.rb
|
165
176
|
- test/request_test.rb
|
166
177
|
- test/response_test.rb
|
167
178
|
- test/result_test.rb
|
data/test/reload_test.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/helper'
|
2
|
-
|
3
|
-
$reload_count = 0
|
4
|
-
$reload_app = nil
|
5
|
-
|
6
|
-
describe "Reloading" do
|
7
|
-
before {
|
8
|
-
@app = mock_app(Sinatra::Default)
|
9
|
-
$reload_app = @app
|
10
|
-
}
|
11
|
-
|
12
|
-
after {
|
13
|
-
$reload_app = nil
|
14
|
-
}
|
15
|
-
|
16
|
-
it 'is enabled by default when in development and the app_file is set' do
|
17
|
-
@app.set :app_file, __FILE__
|
18
|
-
@app.set :environment, :development
|
19
|
-
assert_same true, @app.reload
|
20
|
-
assert_same true, @app.reload?
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'is disabled by default when running in non-development environment' do
|
24
|
-
@app.set :app_file, __FILE__
|
25
|
-
@app.set :environment, :test
|
26
|
-
assert !@app.reload
|
27
|
-
assert_same false, @app.reload?
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'is disabled by default when no app_file is available' do
|
31
|
-
@app.set :app_file, nil
|
32
|
-
@app.set :environment, :development
|
33
|
-
assert !@app.reload
|
34
|
-
assert_same false, @app.reload?
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'is disabled when app_file is a rackup (.ru) file' do
|
38
|
-
@app.set :app_file, __FILE__.sub(/\.rb$/, '.ru')
|
39
|
-
@app.set :environment, :development
|
40
|
-
assert !@app.reload
|
41
|
-
assert_same false, @app.reload?
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'can be turned off explicitly' do
|
45
|
-
@app.set :app_file, __FILE__
|
46
|
-
@app.set :environment, :development
|
47
|
-
assert_same true, @app.reload
|
48
|
-
@app.set :reload, false
|
49
|
-
assert_same false, @app.reload
|
50
|
-
assert_same false, @app.reload?
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'reloads the app_file each time a request is made' do
|
54
|
-
@app.set :app_file, File.dirname(__FILE__) + '/data/reload_app_file.rb'
|
55
|
-
@app.set :reload, true
|
56
|
-
@app.get('/') { 'Hello World' }
|
57
|
-
|
58
|
-
get '/'
|
59
|
-
assert_equal 200, status
|
60
|
-
assert_equal 'Hello from reload file', body
|
61
|
-
assert_equal 1, $reload_count
|
62
|
-
|
63
|
-
get '/'
|
64
|
-
assert_equal 200, status
|
65
|
-
assert_equal 'Hello from reload file', body
|
66
|
-
assert_equal 2, $reload_count
|
67
|
-
end
|
68
|
-
end
|