darkhelmet-sinatra 0.9.0.5

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.
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