darkhelmet-sinatra 0.9.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/AUTHORS +41 -0
  2. data/CHANGES +243 -0
  3. data/LICENSE +22 -0
  4. data/README.rdoc +535 -0
  5. data/Rakefile +136 -0
  6. data/compat/app_test.rb +301 -0
  7. data/compat/application_test.rb +334 -0
  8. data/compat/builder_test.rb +101 -0
  9. data/compat/compat_test.rb +12 -0
  10. data/compat/custom_error_test.rb +62 -0
  11. data/compat/erb_test.rb +136 -0
  12. data/compat/events_test.rb +78 -0
  13. data/compat/filter_test.rb +30 -0
  14. data/compat/haml_test.rb +233 -0
  15. data/compat/helper.rb +30 -0
  16. data/compat/mapped_error_test.rb +72 -0
  17. data/compat/pipeline_test.rb +71 -0
  18. data/compat/public/foo.xml +1 -0
  19. data/compat/sass_test.rb +57 -0
  20. data/compat/sessions_test.rb +39 -0
  21. data/compat/streaming_test.rb +133 -0
  22. data/compat/sym_params_test.rb +19 -0
  23. data/compat/template_test.rb +30 -0
  24. data/compat/use_in_file_templates_test.rb +47 -0
  25. data/compat/views/foo.builder +1 -0
  26. data/compat/views/foo.erb +1 -0
  27. data/compat/views/foo.haml +1 -0
  28. data/compat/views/foo.sass +2 -0
  29. data/compat/views/foo_layout.erb +2 -0
  30. data/compat/views/foo_layout.haml +2 -0
  31. data/compat/views/layout_test/foo.builder +1 -0
  32. data/compat/views/layout_test/foo.erb +1 -0
  33. data/compat/views/layout_test/foo.haml +1 -0
  34. data/compat/views/layout_test/foo.sass +2 -0
  35. data/compat/views/layout_test/layout.builder +3 -0
  36. data/compat/views/layout_test/layout.erb +1 -0
  37. data/compat/views/layout_test/layout.haml +1 -0
  38. data/compat/views/layout_test/layout.sass +2 -0
  39. data/compat/views/no_layout/no_layout.builder +1 -0
  40. data/compat/views/no_layout/no_layout.haml +1 -0
  41. data/lib/sinatra/base.rb +1007 -0
  42. data/lib/sinatra/compat.rb +252 -0
  43. data/lib/sinatra/images/404.png +0 -0
  44. data/lib/sinatra/images/500.png +0 -0
  45. data/lib/sinatra/main.rb +47 -0
  46. data/lib/sinatra/test/bacon.rb +19 -0
  47. data/lib/sinatra/test/rspec.rb +13 -0
  48. data/lib/sinatra/test/spec.rb +11 -0
  49. data/lib/sinatra/test/unit.rb +13 -0
  50. data/lib/sinatra/test.rb +121 -0
  51. data/lib/sinatra.rb +8 -0
  52. data/sinatra.gemspec +116 -0
  53. data/test/base_test.rb +112 -0
  54. data/test/builder_test.rb +64 -0
  55. data/test/data/reload_app_file.rb +3 -0
  56. data/test/erb_test.rb +81 -0
  57. data/test/extensions_test.rb +63 -0
  58. data/test/filter_test.rb +99 -0
  59. data/test/haml_test.rb +68 -0
  60. data/test/helper.rb +85 -0
  61. data/test/helpers_test.rb +467 -0
  62. data/test/mapped_error_test.rb +160 -0
  63. data/test/middleware_test.rb +60 -0
  64. data/test/options_test.rb +374 -0
  65. data/test/reload_test.rb +68 -0
  66. data/test/request_test.rb +18 -0
  67. data/test/response_test.rb +42 -0
  68. data/test/result_test.rb +98 -0
  69. data/test/routing_test.rb +712 -0
  70. data/test/sass_test.rb +36 -0
  71. data/test/server_test.rb +41 -0
  72. data/test/sinatra_test.rb +13 -0
  73. data/test/static_test.rb +65 -0
  74. data/test/templates_test.rb +88 -0
  75. data/test/test_test.rb +109 -0
  76. data/test/views/hello.builder +1 -0
  77. data/test/views/hello.erb +1 -0
  78. data/test/views/hello.haml +1 -0
  79. data/test/views/hello.sass +2 -0
  80. data/test/views/hello.test +1 -0
  81. data/test/views/layout2.builder +3 -0
  82. data/test/views/layout2.erb +2 -0
  83. data/test/views/layout2.haml +2 -0
  84. data/test/views/layout2.test +1 -0
  85. metadata +184 -0
data/lib/sinatra.rb ADDED
@@ -0,0 +1,8 @@
1
+ libdir = File.dirname(__FILE__)
2
+ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
3
+
4
+ require 'sinatra/base'
5
+ require 'sinatra/main'
6
+ require 'sinatra/compat'
7
+
8
+ use_in_file_templates!
data/sinatra.gemspec ADDED
@@ -0,0 +1,116 @@
1
+ Gem::Specification.new do |s|
2
+ s.specification_version = 2 if s.respond_to? :specification_version=
3
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
4
+
5
+ s.name = 'sinatra'
6
+ s.version = '0.9.0.5'
7
+ s.date = '2009-02-10'
8
+
9
+ s.description = "Classy web-development dressed in a DSL"
10
+ s.summary = "Classy web-development dressed in a DSL"
11
+
12
+ s.authors = ["Blake Mizerany"]
13
+ s.email = "sinatrarb@googlegroups.com"
14
+
15
+ # = MANIFEST =
16
+ s.files = %w[
17
+ AUTHORS
18
+ CHANGES
19
+ LICENSE
20
+ README.rdoc
21
+ Rakefile
22
+ compat/app_test.rb
23
+ compat/application_test.rb
24
+ compat/builder_test.rb
25
+ compat/compat_test.rb
26
+ compat/custom_error_test.rb
27
+ compat/erb_test.rb
28
+ compat/events_test.rb
29
+ compat/filter_test.rb
30
+ compat/haml_test.rb
31
+ compat/helper.rb
32
+ compat/mapped_error_test.rb
33
+ compat/pipeline_test.rb
34
+ compat/public/foo.xml
35
+ compat/sass_test.rb
36
+ compat/sessions_test.rb
37
+ compat/streaming_test.rb
38
+ compat/sym_params_test.rb
39
+ compat/template_test.rb
40
+ compat/use_in_file_templates_test.rb
41
+ compat/views/foo.builder
42
+ compat/views/foo.erb
43
+ compat/views/foo.haml
44
+ compat/views/foo.sass
45
+ compat/views/foo_layout.erb
46
+ compat/views/foo_layout.haml
47
+ compat/views/layout_test/foo.builder
48
+ compat/views/layout_test/foo.erb
49
+ compat/views/layout_test/foo.haml
50
+ compat/views/layout_test/foo.sass
51
+ compat/views/layout_test/layout.builder
52
+ compat/views/layout_test/layout.erb
53
+ compat/views/layout_test/layout.haml
54
+ compat/views/layout_test/layout.sass
55
+ compat/views/no_layout/no_layout.builder
56
+ compat/views/no_layout/no_layout.haml
57
+ lib/sinatra.rb
58
+ lib/sinatra/base.rb
59
+ lib/sinatra/compat.rb
60
+ lib/sinatra/images/404.png
61
+ lib/sinatra/images/500.png
62
+ lib/sinatra/main.rb
63
+ lib/sinatra/test.rb
64
+ lib/sinatra/test/bacon.rb
65
+ lib/sinatra/test/rspec.rb
66
+ lib/sinatra/test/spec.rb
67
+ lib/sinatra/test/unit.rb
68
+ sinatra.gemspec
69
+ test/base_test.rb
70
+ test/builder_test.rb
71
+ test/data/reload_app_file.rb
72
+ test/erb_test.rb
73
+ test/extensions_test.rb
74
+ test/filter_test.rb
75
+ test/haml_test.rb
76
+ test/helper.rb
77
+ test/helpers_test.rb
78
+ test/mapped_error_test.rb
79
+ test/middleware_test.rb
80
+ test/options_test.rb
81
+ test/reload_test.rb
82
+ test/request_test.rb
83
+ test/response_test.rb
84
+ test/result_test.rb
85
+ test/routing_test.rb
86
+ test/sass_test.rb
87
+ test/server_test.rb
88
+ test/sinatra_test.rb
89
+ test/static_test.rb
90
+ test/templates_test.rb
91
+ test/test_test.rb
92
+ test/views/hello.builder
93
+ test/views/hello.erb
94
+ test/views/hello.haml
95
+ test/views/hello.sass
96
+ test/views/hello.test
97
+ test/views/layout2.builder
98
+ test/views/layout2.erb
99
+ test/views/layout2.haml
100
+ test/views/layout2.test
101
+ ]
102
+ # = MANIFEST =
103
+
104
+ s.test_files = s.files.select {|path| path =~ /^test\/.*_test.rb/}
105
+
106
+ s.extra_rdoc_files = %w[README.rdoc LICENSE]
107
+ s.add_dependency 'rack', '>= 0.9.1'
108
+ s.add_dependency 'rack', '>= 0.9.1', '< 1.0'
109
+
110
+ s.has_rdoc = true
111
+ s.homepage = "http://sinatra.rubyforge.org"
112
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Sinatra", "--main", "README.rdoc"]
113
+ s.require_paths = %w[lib]
114
+ s.rubyforge_project = 'sinatra'
115
+ s.rubygems_version = '1.1.1'
116
+ end
data/test/base_test.rb ADDED
@@ -0,0 +1,112 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe 'Sinatra::Base subclasses' do
4
+
5
+ class TestApp < Sinatra::Base
6
+ get '/' do
7
+ 'Hello World'
8
+ end
9
+ end
10
+
11
+ it 'include Rack::Utils' do
12
+ assert TestApp.included_modules.include?(Rack::Utils)
13
+ end
14
+
15
+ it 'processes requests with #call' do
16
+ assert TestApp.respond_to?(:call)
17
+
18
+ request = Rack::MockRequest.new(TestApp)
19
+ response = request.get('/')
20
+ assert response.ok?
21
+ assert_equal 'Hello World', response.body
22
+ end
23
+
24
+ class TestApp < Sinatra::Base
25
+ get '/state' do
26
+ body = "Foo: #{@foo}"
27
+ @foo = 'discard'
28
+ body
29
+ end
30
+ end
31
+
32
+ it 'does not maintain state between requests' do
33
+ request = Rack::MockRequest.new(TestApp)
34
+ 2.times do
35
+ response = request.get('/state')
36
+ assert response.ok?
37
+ assert_equal 'Foo: ', response.body
38
+ end
39
+ end
40
+ end
41
+
42
+ describe "Sinatra::Base as Rack middleware" do
43
+
44
+ app = lambda { |env|
45
+ [210, {'X-Downstream' => 'true'}, ['Hello from downstream']] }
46
+
47
+ class TestMiddleware < Sinatra::Base
48
+ end
49
+
50
+ it 'creates a middleware that responds to #call with .new' do
51
+ middleware = TestMiddleware.new(app)
52
+ assert middleware.respond_to?(:call)
53
+ end
54
+
55
+ it 'exposes the downstream app' do
56
+ middleware = TestMiddleware.new(app)
57
+ assert_same app, middleware.app
58
+ end
59
+
60
+ class TestMiddleware < Sinatra::Base
61
+ get '/' do
62
+ 'Hello from middleware'
63
+ end
64
+ end
65
+
66
+ middleware = TestMiddleware.new(app)
67
+ request = Rack::MockRequest.new(middleware)
68
+
69
+ it 'intercepts requests' do
70
+ response = request.get('/')
71
+ assert response.ok?
72
+ assert_equal 'Hello from middleware', response.body
73
+ end
74
+
75
+ it 'automatically forwards requests downstream when no matching route found' do
76
+ response = request.get('/missing')
77
+ assert_equal 210, response.status
78
+ assert_equal 'Hello from downstream', response.body
79
+ end
80
+
81
+ class TestMiddleware < Sinatra::Base
82
+ get '/low-level-forward' do
83
+ app.call(env)
84
+ end
85
+ end
86
+
87
+ it 'can call the downstream app directly and return result' do
88
+ response = request.get('/low-level-forward')
89
+ assert_equal 210, response.status
90
+ assert_equal 'true', response['X-Downstream']
91
+ assert_equal 'Hello from downstream', response.body
92
+ end
93
+
94
+ class TestMiddleware < Sinatra::Base
95
+ get '/explicit-forward' do
96
+ response['X-Middleware'] = 'true'
97
+ res = forward
98
+ assert_nil res
99
+ assert_equal 210, response.status
100
+ assert_equal 'true', response['X-Downstream']
101
+ assert_equal ['Hello from downstream'], response.body
102
+ 'Hello after explicit forward'
103
+ end
104
+ end
105
+
106
+ it 'forwards the request downstream and integrates the response into the current context' do
107
+ response = request.get('/explicit-forward')
108
+ assert_equal 210, response.status
109
+ assert_equal 'true', response['X-Downstream']
110
+ assert_equal 'Hello after explicit forward', response.body
111
+ end
112
+ end
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe "Builder Templates" do
4
+ def builder_app(&block)
5
+ mock_app {
6
+ set :views, File.dirname(__FILE__) + '/views'
7
+ get '/', &block
8
+ }
9
+ get '/'
10
+ end
11
+
12
+ it 'renders inline Builder strings' do
13
+ builder_app { builder 'xml.instruct!' }
14
+ assert ok?
15
+ assert_equal %{<?xml version="1.0" encoding="UTF-8"?>\n}, body
16
+ end
17
+
18
+ it 'renders inline blocks' do
19
+ builder_app {
20
+ @name = "Frank & Mary"
21
+ builder do |xml|
22
+ xml.couple @name
23
+ end
24
+ }
25
+ assert ok?
26
+ assert_equal "<couple>Frank &amp; Mary</couple>\n", body
27
+ end
28
+
29
+ it 'renders .builder files in views path' do
30
+ builder_app {
31
+ @name = "Blue"
32
+ builder :hello
33
+ }
34
+ assert ok?
35
+ assert_equal %(<exclaim>You're my boy, Blue!</exclaim>\n), body
36
+ end
37
+
38
+ it "renders with inline layouts" do
39
+ mock_app {
40
+ layout do
41
+ %(xml.layout { xml << yield })
42
+ end
43
+ get('/') { builder %(xml.em 'Hello World') }
44
+ }
45
+ get '/'
46
+ assert ok?
47
+ assert_equal "<layout>\n<em>Hello World</em>\n</layout>\n", body
48
+ end
49
+
50
+ it "renders with file layouts" do
51
+ builder_app {
52
+ builder %(xml.em 'Hello World'), :layout => :layout2
53
+ }
54
+ assert ok?
55
+ assert_equal "<layout>\n<em>Hello World</em>\n</layout>\n", body
56
+ end
57
+
58
+ it "raises error if template not found" do
59
+ mock_app {
60
+ get('/') { builder :no_such_template }
61
+ }
62
+ assert_raise(Errno::ENOENT) { get('/') }
63
+ end
64
+ end
@@ -0,0 +1,3 @@
1
+ $reload_count += 1
2
+
3
+ $reload_app.get('/') { 'Hello from reload file' }
data/test/erb_test.rb ADDED
@@ -0,0 +1,81 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe "ERB Templates" do
4
+ def erb_app(&block)
5
+ mock_app {
6
+ set :views, File.dirname(__FILE__) + '/views'
7
+ get '/', &block
8
+ }
9
+ get '/'
10
+ end
11
+
12
+ it 'renders inline ERB strings' do
13
+ erb_app { erb '<%= 1 + 1 %>' }
14
+ assert ok?
15
+ assert_equal '2', body
16
+ end
17
+
18
+ it 'renders .erb files in views path' do
19
+ erb_app { erb :hello }
20
+ assert ok?
21
+ assert_equal "Hello World\n", body
22
+ end
23
+
24
+ it 'takes a :locals option' do
25
+ erb_app {
26
+ locals = {:foo => 'Bar'}
27
+ erb '<%= foo %>', :locals => locals
28
+ }
29
+ assert ok?
30
+ assert_equal 'Bar', body
31
+ end
32
+
33
+ it "renders with inline layouts" do
34
+ mock_app {
35
+ layout { 'THIS. IS. <%= yield.upcase %>!' }
36
+ get('/') { erb 'Sparta' }
37
+ }
38
+ get '/'
39
+ assert ok?
40
+ assert_equal 'THIS. IS. SPARTA!', body
41
+ end
42
+
43
+ it "renders with file layouts" do
44
+ erb_app {
45
+ erb 'Hello World', :layout => :layout2
46
+ }
47
+ assert ok?
48
+ assert_equal "ERB Layout!\nHello World\n", body
49
+ end
50
+
51
+ it "renders erb with blocks" do
52
+ mock_app {
53
+ def container
54
+ @_out_buf << "THIS."
55
+ yield
56
+ @_out_buf << "SPARTA!"
57
+ end
58
+ def is; "IS." end
59
+ get '/' do
60
+ erb '<% container do %> <%= is %> <% end %>'
61
+ end
62
+ }
63
+ get '/'
64
+ assert ok?
65
+ assert_equal 'THIS. IS. SPARTA!', body
66
+ end
67
+
68
+ it "can be used in a nested fashion for partials and whatnot" do
69
+ mock_app {
70
+ template(:inner) { "<inner><%= 'hi' %></inner>" }
71
+ template(:outer) { "<outer><%= erb :inner %></outer>" }
72
+ get '/' do
73
+ erb :outer
74
+ end
75
+ }
76
+
77
+ get '/'
78
+ assert ok?
79
+ assert_equal '<outer><inner>hi</inner></outer>', body
80
+ end
81
+ end
@@ -0,0 +1,63 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe 'Registering extensions' do
4
+ module FooExtensions
5
+ def foo
6
+ end
7
+
8
+ private
9
+ def im_hiding_in_ur_foos
10
+ end
11
+ end
12
+
13
+ module BarExtensions
14
+ def bar
15
+ end
16
+ end
17
+
18
+ module BazExtensions
19
+ def baz
20
+ end
21
+ end
22
+
23
+ module QuuxExtensions
24
+ def quux
25
+ end
26
+ end
27
+
28
+ it 'will add the methods to the DSL for the class in which you register them and its subclasses' do
29
+ Sinatra::Base.register FooExtensions
30
+ assert Sinatra::Base.respond_to?(:foo)
31
+
32
+ Sinatra::Default.register BarExtensions
33
+ assert Sinatra::Default.respond_to?(:bar)
34
+ assert Sinatra::Default.respond_to?(:foo)
35
+ assert !Sinatra::Base.respond_to?(:bar)
36
+ end
37
+
38
+ it 'allows extending by passing a block' do
39
+ Sinatra::Base.register {
40
+ def im_in_ur_anonymous_module; end
41
+ }
42
+ assert Sinatra::Base.respond_to?(:im_in_ur_anonymous_module)
43
+ end
44
+
45
+ it 'will make sure any public methods added via Default#register are delegated to Sinatra::Delegator' do
46
+ Sinatra::Default.register FooExtensions
47
+ assert Sinatra::Delegator.private_instance_methods.
48
+ map { |m| m.to_sym }.include?(:foo)
49
+ assert !Sinatra::Delegator.private_instance_methods.
50
+ map { |m| m.to_sym }.include?(:im_hiding_in_ur_foos)
51
+ end
52
+
53
+ it 'will not delegate methods on Base#register' do
54
+ Sinatra::Base.register QuuxExtensions
55
+ assert !Sinatra::Delegator.private_instance_methods.include?("quux")
56
+ end
57
+
58
+ it 'will extend the Sinatra::Default application by default' do
59
+ Sinatra.register BazExtensions
60
+ assert !Sinatra::Base.respond_to?(:baz)
61
+ assert Sinatra::Default.respond_to?(:baz)
62
+ end
63
+ end