sinatra 0.3.3 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of sinatra might be problematic. Click here for more details.

Files changed (82) hide show
  1. data/AUTHORS +40 -0
  2. data/CHANGES +189 -0
  3. data/README.rdoc +146 -117
  4. data/Rakefile +33 -10
  5. data/{test → compat}/app_test.rb +11 -10
  6. data/{test → compat}/application_test.rb +10 -5
  7. data/compat/builder_test.rb +101 -0
  8. data/{test → compat}/custom_error_test.rb +0 -0
  9. data/compat/erb_test.rb +136 -0
  10. data/{test → compat}/events_test.rb +16 -3
  11. data/compat/filter_test.rb +30 -0
  12. data/compat/haml_test.rb +233 -0
  13. data/compat/helper.rb +30 -0
  14. data/compat/mapped_error_test.rb +72 -0
  15. data/{test → compat}/pipeline_test.rb +9 -4
  16. data/{test → compat}/public/foo.xml +0 -0
  17. data/compat/sass_test.rb +57 -0
  18. data/{test → compat}/sessions_test.rb +0 -0
  19. data/{test → compat}/streaming_test.rb +4 -1
  20. data/{test → compat}/sym_params_test.rb +0 -0
  21. data/{test → compat}/template_test.rb +0 -0
  22. data/{test → compat}/use_in_file_templates_test.rb +0 -0
  23. data/{test → compat}/views/foo.builder +0 -0
  24. data/{test → compat}/views/foo.erb +0 -0
  25. data/{test → compat}/views/foo.haml +0 -0
  26. data/{test → compat}/views/foo.sass +0 -0
  27. data/{test → compat}/views/foo_layout.erb +0 -0
  28. data/{test → compat}/views/foo_layout.haml +0 -0
  29. data/{test → compat}/views/layout_test/foo.builder +0 -0
  30. data/{test → compat}/views/layout_test/foo.erb +0 -0
  31. data/{test → compat}/views/layout_test/foo.haml +0 -0
  32. data/{test → compat}/views/layout_test/foo.sass +0 -0
  33. data/{test → compat}/views/layout_test/layout.builder +0 -0
  34. data/{test → compat}/views/layout_test/layout.erb +0 -0
  35. data/{test → compat}/views/layout_test/layout.haml +0 -0
  36. data/{test → compat}/views/layout_test/layout.sass +0 -0
  37. data/{test → compat}/views/no_layout/no_layout.builder +0 -0
  38. data/{test → compat}/views/no_layout/no_layout.haml +0 -0
  39. data/lib/sinatra.rb +6 -1484
  40. data/lib/sinatra/base.rb +838 -0
  41. data/lib/sinatra/compat.rb +239 -0
  42. data/{images → lib/sinatra/images}/404.png +0 -0
  43. data/{images → lib/sinatra/images}/500.png +0 -0
  44. data/lib/sinatra/main.rb +48 -0
  45. data/lib/sinatra/test.rb +114 -0
  46. data/lib/sinatra/test/bacon.rb +17 -0
  47. data/lib/sinatra/test/rspec.rb +7 -8
  48. data/lib/sinatra/test/spec.rb +3 -4
  49. data/lib/sinatra/test/unit.rb +3 -5
  50. data/sinatra.gemspec +68 -35
  51. data/test/base_test.rb +68 -0
  52. data/test/builder_test.rb +50 -87
  53. data/test/data/reload_app_file.rb +3 -0
  54. data/test/erb_test.rb +38 -124
  55. data/test/filter_test.rb +27 -22
  56. data/test/haml_test.rb +51 -216
  57. data/test/helper.rb +22 -6
  58. data/test/helpers_test.rb +361 -0
  59. data/test/mapped_error_test.rb +137 -49
  60. data/test/middleware_test.rb +58 -0
  61. data/test/options_test.rb +97 -0
  62. data/test/reload_test.rb +61 -0
  63. data/test/request_test.rb +18 -0
  64. data/test/result_test.rb +88 -0
  65. data/test/routing_test.rb +391 -0
  66. data/test/sass_test.rb +27 -48
  67. data/test/sinatra_test.rb +13 -0
  68. data/test/static_test.rb +57 -0
  69. data/test/templates_test.rb +88 -0
  70. data/test/views/hello.builder +1 -0
  71. data/test/views/hello.erb +1 -0
  72. data/test/views/hello.haml +1 -0
  73. data/test/views/hello.sass +2 -0
  74. data/test/views/hello.test +1 -0
  75. data/test/views/layout2.builder +3 -0
  76. data/test/views/layout2.erb +2 -0
  77. data/test/views/layout2.haml +2 -0
  78. data/test/views/layout2.test +1 -0
  79. metadata +80 -48
  80. data/ChangeLog +0 -96
  81. data/lib/sinatra/test/methods.rb +0 -76
  82. data/test/event_context_test.rb +0 -15
data/Rakefile CHANGED
@@ -8,13 +8,19 @@ task :default => :test
8
8
 
9
9
  desc 'Run specs with story style output'
10
10
  task :spec do
11
- sh 'specrb --specdox -Ilib:test test/*_test.rb'
11
+ pattern = ENV['TEST'] || '.*'
12
+ sh "specrb --testcase '#{pattern}' --specdox -Ilib:test test/*_test.rb"
12
13
  end
13
14
 
14
15
  desc 'Run specs with unit test style output'
15
- task :test => FileList['test/*_test.rb'] do |t|
16
- suite = t.prerequisites.map{|f| "-r#{f.chomp('.rb')}"}.join(' ')
17
- sh "ruby -Ilib:test #{suite} -e ''", :verbose => false
16
+ task :test do |t|
17
+ sh "specrb -Ilib:test test/*_test.rb"
18
+ end
19
+
20
+ desc 'Run compatibility specs'
21
+ task :compat do |t|
22
+ pattern = ENV['TEST'] || '.*'
23
+ sh "specrb --testcase '#{pattern}' -Ilib:test compat/*_test.rb"
18
24
  end
19
25
 
20
26
  # PACKAGING ============================================================
@@ -51,7 +57,12 @@ file package('.gem') => %w[dist/ sinatra.gemspec] + spec.files do |f|
51
57
  end
52
58
 
53
59
  file package('.tar.gz') => %w[dist/] + spec.files do |f|
54
- sh "git archive --format=tar HEAD | gzip > #{f.name}"
60
+ sh <<-SH
61
+ git archive \
62
+ --prefix=sinatra-#{source_version}/ \
63
+ --format=tar \
64
+ HEAD | gzip > #{f.name}
65
+ SH
55
66
  end
56
67
 
57
68
  # Rubyforge Release / Publish Tasks ==================================
@@ -141,11 +152,23 @@ task 'doc:book' => ['book/output/sinatra-book.html']
141
152
 
142
153
  # Gemspec Helpers ====================================================
143
154
 
144
- file 'sinatra.gemspec' => FileList['{lib,test,images}/**','Rakefile'] do |f|
155
+ def source_version
156
+ line = File.read('lib/sinatra/base.rb')[/^\s*VERSION = .*/]
157
+ line.match(/.*VERSION = '(.*)'/)[1]
158
+ end
159
+
160
+ project_files =
161
+ FileList[
162
+ '{lib,test,compat,images}/**',
163
+ 'Rakefile', 'CHANGES', 'README.rdoc'
164
+ ]
165
+ file 'sinatra.gemspec' => project_files do |f|
145
166
  # read spec file and split out manifest section
146
167
  spec = File.read(f.name)
147
- parts = spec.split(" # = MANIFEST =\n")
148
- fail 'bad spec' if parts.length != 3
168
+ head, manifest, tail = spec.split(" # = MANIFEST =\n")
169
+ # replace version and date
170
+ head.sub!(/\.version = '.*'/, ".version = '#{source_version}'")
171
+ head.sub!(/\.date = '.*'/, ".date = '#{Date.today.to_s}'")
149
172
  # determine file list from git ls-files
150
173
  files = `git ls-files`.
151
174
  split("\n").
@@ -155,8 +178,8 @@ file 'sinatra.gemspec' => FileList['{lib,test,images}/**','Rakefile'] do |f|
155
178
  map{ |file| " #{file}" }.
156
179
  join("\n")
157
180
  # piece file back together and write...
158
- parts[1] = " s.files = %w[\n#{files}\n ]\n"
159
- spec = parts.join(" # = MANIFEST =\n")
181
+ manifest = " s.files = %w[\n#{files}\n ]\n"
182
+ spec = [head,manifest,tail].join(" # = MANIFEST =\n")
160
183
  File.open(f.name, 'w') { |io| io.write(spec) }
161
184
  puts "updated #{f.name}"
162
185
  end
@@ -108,7 +108,9 @@ context "Sinatra" do
108
108
  end
109
109
 
110
110
  specify "renders a body with a redirect" do
111
- Sinatra::EventContext.any_instance.expects(:foo).returns('blah')
111
+ helpers do
112
+ def foo ; 'blah' ; end
113
+ end
112
114
  get "/" do
113
115
  redirect 'foo', :foo
114
116
  end
@@ -130,13 +132,10 @@ context "Sinatra" do
130
132
  end
131
133
 
132
134
  specify "stop sets content and ends event" do
133
-
134
- Sinatra::EventContext.any_instance.expects(:foo).never
135
-
136
135
  get '/set_body' do
137
136
  stop 'Hello!'
138
137
  stop 'World!'
139
- foo
138
+ fail 'stop should have halted'
140
139
  end
141
140
 
142
141
  get_it '/set_body'
@@ -146,8 +145,13 @@ context "Sinatra" do
146
145
 
147
146
  end
148
147
 
149
- specify "should set status then call helper with a var" do
150
- Sinatra::EventContext.any_instance.expects(:foo).once.with(1).returns('bah!')
148
+ # Deprecated. WTF was going on here? What's the 1 in [:foo, 1] do?
149
+ xspecify "should set status then call helper with a var" do
150
+ helpers do
151
+ def foo
152
+ 'bah!'
153
+ end
154
+ end
151
155
 
152
156
  get '/set_body' do
153
157
  stop [404, [:foo, 1]]
@@ -252,8 +256,6 @@ context "Sinatra" do
252
256
  assert_equal 'puted', body
253
257
  end
254
258
 
255
- # Some Ajax libraries downcase the _method parameter value. Make
256
- # sure we can handle that.
257
259
  specify "rewrites POSTs with lowercase _method param to PUT" do
258
260
  put '/' do
259
261
  'puted'
@@ -262,7 +264,6 @@ context "Sinatra" do
262
264
  body.should.equal 'puted'
263
265
  end
264
266
 
265
- # Ignore any _method parameters specified in GET requests or on the query string in POST requests.
266
267
  specify "does not rewrite GETs with _method param to PUT" do
267
268
  get '/' do
268
269
  'getted'
@@ -16,7 +16,8 @@ context "Looking up a request" do
16
16
  Sinatra.application = nil
17
17
  end
18
18
 
19
- specify "returns what's at the end" do
19
+ # Deprecated. The lookup method is no longer used.
20
+ xspecify "returns what's at the end" do
20
21
  block = Proc.new { 'Hello' }
21
22
  get '/', &block
22
23
 
@@ -31,7 +32,8 @@ context "Looking up a request" do
31
32
  result.block.should.be block
32
33
  end
33
34
 
34
- specify "takes params in path" do
35
+ # Deprecated. The lookup method is no longer used.
36
+ xspecify "takes params in path" do
35
37
  block = Proc.new { 'Hello' }
36
38
  get '/:foo', &block
37
39
 
@@ -83,7 +85,8 @@ context "An app returns" do
83
85
 
84
86
  end
85
87
 
86
- specify "the body set if set before the last" do
88
+ # Deprecated. The body method no longer halts.
89
+ xspecify "the body set if set before the last" do
87
90
 
88
91
  get '/' do
89
92
  body 'Blake'
@@ -142,14 +145,16 @@ end
142
145
 
143
146
  context "Default Application Configuration" do
144
147
 
145
- specify "includes 404 and 500 error handlers" do
148
+ # Sinatra::ServerError is no longer used
149
+ xspecify "includes 404 and 500 error handlers" do
146
150
  Sinatra.application.errors.should.include(Sinatra::ServerError)
147
151
  Sinatra.application.errors[Sinatra::ServerError].should.not.be.nil
148
152
  Sinatra.application.errors.should.include(Sinatra::NotFound)
149
153
  Sinatra.application.errors[Sinatra::NotFound].should.not.be.nil
150
154
  end
151
155
 
152
- specify "includes Static event" do
156
+ # Deprecated. No such thing as a Static event anymore.
157
+ xspecify "includes Static event" do
153
158
  assert Sinatra.application.events[:get].any? { |e| Sinatra::Static === e }
154
159
  end
155
160
 
@@ -0,0 +1,101 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ context "Builder" do
4
+
5
+ setup do
6
+ Sinatra.application = nil
7
+ end
8
+
9
+ context "without layouts" do
10
+
11
+ setup do
12
+ Sinatra.application = nil
13
+ end
14
+
15
+ specify "should render" do
16
+
17
+ get '/no_layout' do
18
+ builder 'xml.instruct!'
19
+ end
20
+
21
+ get_it '/no_layout'
22
+ should.be.ok
23
+ body.should == %(<?xml version="1.0" encoding="UTF-8"?>\n)
24
+
25
+ end
26
+
27
+ specify "should render inline block" do
28
+
29
+ get '/no_layout_and_inlined' do
30
+ @name = "Frank & Mary"
31
+ builder do |xml|
32
+ xml.couple @name
33
+ end
34
+ end
35
+
36
+ get_it '/no_layout_and_inlined'
37
+ should.be.ok
38
+ body.should == %(<couple>Frank &amp; Mary</couple>\n)
39
+
40
+ end
41
+
42
+ end
43
+
44
+
45
+
46
+ context "Templates (in general)" do
47
+
48
+ setup do
49
+ Sinatra.application = nil
50
+ end
51
+
52
+ specify "are read from files if Symbols" do
53
+
54
+ get '/from_file' do
55
+ @name = 'Blue'
56
+ builder :foo, :views_directory => File.dirname(__FILE__) + "/views"
57
+ end
58
+
59
+ get_it '/from_file'
60
+ should.be.ok
61
+ body.should.equal %(<exclaim>You rock Blue!</exclaim>\n)
62
+
63
+ end
64
+
65
+ specify "use layout.ext by default if available" do
66
+
67
+ get '/' do
68
+ builder :foo, :views_directory => File.dirname(__FILE__) + "/views/layout_test"
69
+ end
70
+
71
+ get_it '/'
72
+ should.be.ok
73
+ body.should.equal "<layout>\n<this>is foo!</this>\n</layout>\n"
74
+
75
+ end
76
+
77
+ specify "renders without layout" do
78
+
79
+ get '/' do
80
+ builder :no_layout, :views_directory => File.dirname(__FILE__) + "/views/no_layout"
81
+ end
82
+
83
+ get_it '/'
84
+ should.be.ok
85
+ body.should.equal "<foo>No Layout!</foo>\n"
86
+
87
+ end
88
+
89
+ specify "raises error if template not found" do
90
+
91
+ get '/' do
92
+ builder :not_found
93
+ end
94
+
95
+ lambda { get_it '/' }.should.raise(Errno::ENOENT)
96
+
97
+ end
98
+
99
+ end
100
+
101
+ end
File without changes
@@ -0,0 +1,136 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ context "Erb" do
4
+
5
+ setup do
6
+ Sinatra.application = nil
7
+ end
8
+
9
+ context "without layouts" do
10
+
11
+ setup do
12
+ Sinatra.application = nil
13
+ end
14
+
15
+ specify "should render" do
16
+
17
+ get '/no_layout' do
18
+ erb '<%= 1 + 1 %>'
19
+ end
20
+
21
+ get_it '/no_layout'
22
+ should.be.ok
23
+ body.should == '2'
24
+
25
+ end
26
+
27
+ specify "should take an options hash with :locals set with a string" do
28
+ get '/locals' do
29
+ erb '<%= foo %>', :locals => {:foo => "Bar"}
30
+ end
31
+
32
+ get_it '/locals'
33
+ should.be.ok
34
+ body.should == 'Bar'
35
+ end
36
+
37
+ specify "should take an options hash with :locals set with a complex object" do
38
+ get '/locals-complex' do
39
+ erb '<%= foo[0] %>', :locals => {:foo => ["foo", "bar", "baz"]}
40
+ end
41
+
42
+ get_it '/locals-complex'
43
+ should.be.ok
44
+ body.should == 'foo'
45
+ end
46
+ end
47
+
48
+ context "with layouts" do
49
+
50
+ setup do
51
+ Sinatra.application = nil
52
+ end
53
+
54
+ specify "can be inline" do
55
+
56
+ layout do
57
+ %Q{This is <%= yield %>!}
58
+ end
59
+
60
+ get '/lay' do
61
+ erb 'Blake'
62
+ end
63
+
64
+ get_it '/lay'
65
+ should.be.ok
66
+ body.should.equal 'This is Blake!'
67
+
68
+ end
69
+
70
+ specify "can use named layouts" do
71
+
72
+ layout :pretty do
73
+ %Q{<h1><%= yield %></h1>}
74
+ end
75
+
76
+ get '/pretty' do
77
+ erb 'Foo', :layout => :pretty
78
+ end
79
+
80
+ get '/not_pretty' do
81
+ erb 'Bar'
82
+ end
83
+
84
+ get_it '/pretty'
85
+ body.should.equal '<h1>Foo</h1>'
86
+
87
+ get_it '/not_pretty'
88
+ body.should.equal 'Bar'
89
+
90
+ end
91
+
92
+ specify "can be read from a file if they're not inlined" do
93
+
94
+ get '/foo' do
95
+ @title = 'Welcome to the Hello Program'
96
+ erb 'Blake', :layout => :foo_layout,
97
+ :views_directory => File.dirname(__FILE__) + "/views"
98
+ end
99
+
100
+ get_it '/foo'
101
+ body.should.equal "Welcome to the Hello Program\nHi Blake\n"
102
+
103
+ end
104
+
105
+ end
106
+
107
+ context "Templates (in general)" do
108
+
109
+ specify "are read from files if Symbols" do
110
+
111
+ get '/from_file' do
112
+ @name = 'Alena'
113
+ erb :foo, :views_directory => File.dirname(__FILE__) + "/views"
114
+ end
115
+
116
+ get_it '/from_file'
117
+
118
+ body.should.equal 'You rock Alena!'
119
+
120
+ end
121
+
122
+ specify "use layout.ext by default if available" do
123
+
124
+ get '/layout_from_file' do
125
+ erb :foo, :views_directory => File.dirname(__FILE__) + "/views/layout_test"
126
+ end
127
+
128
+ get_it '/layout_from_file'
129
+ should.be.ok
130
+ body.should.equal "x This is foo! x \n"
131
+
132
+ end
133
+
134
+ end
135
+
136
+ end
@@ -1,7 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/helper'
2
2
 
3
3
  context "Simple Events" do
4
-
5
4
  def simple_request_hash(method, path)
6
5
  Rack::Request.new({
7
6
  'REQUEST_METHOD' => method.to_s.upcase,
@@ -9,11 +8,21 @@ context "Simple Events" do
9
8
  })
10
9
  end
11
10
 
11
+ class MockResult < Struct.new(:block, :params)
12
+ end
13
+
12
14
  def invoke_simple(path, request_path, &b)
13
- event = Sinatra::Event.new(path, &b)
14
- event.invoke(simple_request_hash(:get, request_path))
15
+ params = nil
16
+ get path do
17
+ params = self.params
18
+ b.call if b
19
+ end
20
+ get_it request_path
21
+ MockResult.new(b, params)
15
22
  end
16
23
 
24
+ setup { Sinatra.application = nil }
25
+
17
26
  specify "return last value" do
18
27
  block = Proc.new { 'Simple' }
19
28
  result = invoke_simple('/', '/', &block)
@@ -28,6 +37,7 @@ context "Simple Events" do
28
37
  result.params.should.equal "foo" => 'a', "bar" => 'b'
29
38
 
30
39
  # unscapes
40
+ Sinatra.application = nil
31
41
  result = invoke_simple('/:foo/:bar', '/a/blake%20mizerany')
32
42
  result.should.not.be.nil
33
43
  result.params.should.equal "foo" => 'a', "bar" => 'blake mizerany'
@@ -38,14 +48,17 @@ context "Simple Events" do
38
48
  result.should.not.be.nil
39
49
  result.params.should.equal "foo" => 'a', "bar" => 'b'
40
50
 
51
+ Sinatra.application = nil
41
52
  result = invoke_simple('/?:foo?/?:bar?', '/a/')
42
53
  result.should.not.be.nil
43
54
  result.params.should.equal "foo" => 'a', "bar" => nil
44
55
 
56
+ Sinatra.application = nil
45
57
  result = invoke_simple('/?:foo?/?:bar?', '/a')
46
58
  result.should.not.be.nil
47
59
  result.params.should.equal "foo" => 'a', "bar" => nil
48
60
 
61
+ Sinatra.application = nil
49
62
  result = invoke_simple('/:foo?/?:bar?', '/')
50
63
  result.should.not.be.nil
51
64
  result.params.should.equal "foo" => nil, "bar" => nil