sinatra-sinatra 0.8.9

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 (80) hide show
  1. data/AUTHORS +40 -0
  2. data/CHANGES +174 -0
  3. data/LICENSE +22 -0
  4. data/README.rdoc +545 -0
  5. data/Rakefile +180 -0
  6. data/compat/app_test.rb +300 -0
  7. data/compat/application_test.rb +334 -0
  8. data/compat/builder_test.rb +101 -0
  9. data/compat/custom_error_test.rb +62 -0
  10. data/compat/erb_test.rb +136 -0
  11. data/compat/events_test.rb +78 -0
  12. data/compat/filter_test.rb +30 -0
  13. data/compat/haml_test.rb +233 -0
  14. data/compat/helper.rb +30 -0
  15. data/compat/mapped_error_test.rb +72 -0
  16. data/compat/pipeline_test.rb +71 -0
  17. data/compat/public/foo.xml +1 -0
  18. data/compat/sass_test.rb +57 -0
  19. data/compat/sessions_test.rb +39 -0
  20. data/compat/streaming_test.rb +121 -0
  21. data/compat/sym_params_test.rb +19 -0
  22. data/compat/template_test.rb +30 -0
  23. data/compat/use_in_file_templates_test.rb +47 -0
  24. data/compat/views/foo.builder +1 -0
  25. data/compat/views/foo.erb +1 -0
  26. data/compat/views/foo.haml +1 -0
  27. data/compat/views/foo.sass +2 -0
  28. data/compat/views/foo_layout.erb +2 -0
  29. data/compat/views/foo_layout.haml +2 -0
  30. data/compat/views/layout_test/foo.builder +1 -0
  31. data/compat/views/layout_test/foo.erb +1 -0
  32. data/compat/views/layout_test/foo.haml +1 -0
  33. data/compat/views/layout_test/foo.sass +2 -0
  34. data/compat/views/layout_test/layout.builder +3 -0
  35. data/compat/views/layout_test/layout.erb +1 -0
  36. data/compat/views/layout_test/layout.haml +1 -0
  37. data/compat/views/layout_test/layout.sass +2 -0
  38. data/compat/views/no_layout/no_layout.builder +1 -0
  39. data/compat/views/no_layout/no_layout.haml +1 -0
  40. data/lib/sinatra/base.rb +818 -0
  41. data/lib/sinatra/compat.rb +239 -0
  42. data/lib/sinatra/images/404.png +0 -0
  43. data/lib/sinatra/images/500.png +0 -0
  44. data/lib/sinatra/main.rb +48 -0
  45. data/lib/sinatra/test/bacon.rb +17 -0
  46. data/lib/sinatra/test/rspec.rb +9 -0
  47. data/lib/sinatra/test/spec.rb +9 -0
  48. data/lib/sinatra/test/unit.rb +11 -0
  49. data/lib/sinatra/test.rb +109 -0
  50. data/lib/sinatra.rb +4 -0
  51. data/sinatra.gemspec +109 -0
  52. data/test/base_test.rb +68 -0
  53. data/test/builder_test.rb +64 -0
  54. data/test/data/reload_app_file.rb +3 -0
  55. data/test/erb_test.rb +50 -0
  56. data/test/filter_test.rb +35 -0
  57. data/test/haml_test.rb +68 -0
  58. data/test/helper.rb +20 -0
  59. data/test/helpers_test.rb +361 -0
  60. data/test/mapped_error_test.rb +160 -0
  61. data/test/middleware_test.rb +58 -0
  62. data/test/options_test.rb +97 -0
  63. data/test/reload_test.rb +61 -0
  64. data/test/request_test.rb +9 -0
  65. data/test/result_test.rb +88 -0
  66. data/test/routing_test.rb +334 -0
  67. data/test/sass_test.rb +36 -0
  68. data/test/sinatra_test.rb +13 -0
  69. data/test/static_test.rb +57 -0
  70. data/test/templates_test.rb +88 -0
  71. data/test/views/hello.builder +1 -0
  72. data/test/views/hello.erb +1 -0
  73. data/test/views/hello.haml +1 -0
  74. data/test/views/hello.sass +2 -0
  75. data/test/views/hello.test +1 -0
  76. data/test/views/layout2.builder +3 -0
  77. data/test/views/layout2.erb +2 -0
  78. data/test/views/layout2.haml +2 -0
  79. data/test/views/layout2.test +1 -0
  80. metadata +161 -0
@@ -0,0 +1,239 @@
1
+ # Sinatra 0.3.x compatibility module.
2
+ #
3
+ # The following code makes Sinatra 0.9.x compatible with Sinatra 0.3.x to
4
+ # ease the transition to the final 1.0 release. Everything defined in this
5
+ # file will be removed for the 1.0 release.
6
+
7
+ require 'ostruct'
8
+ require 'sinatra/base'
9
+ require 'sinatra/main'
10
+
11
+ # Like Kernel#warn but outputs the location that triggered the warning.
12
+ def sinatra_warn(*message)
13
+ line = caller.
14
+ detect { |line| line !~ /(?:lib\/sinatra\/|__DELEGATE__)/ }.
15
+ sub(/:in .*/, '')
16
+ warn "#{line}: warning: #{message.join(' ')}"
17
+ end
18
+
19
+ # Rack now supports evented and swiftiplied mongrels through separate
20
+ # handler.
21
+ if ENV['SWIFT']
22
+ sinatra_warn 'the SWIFT environment variable is deprecated;',
23
+ 'use Rack::Handler::SwiftipliedMongrel instead.'
24
+ require 'swiftcore/swiftiplied_mongrel'
25
+ puts "Using Swiftiplied Mongrel"
26
+ elsif ENV['EVENT']
27
+ sinatra_warn 'the EVENT environment variable is deprecated;',
28
+ 'use Rack::Handler::EventedMongrel instead.'
29
+ require 'swiftcore/evented_mongrel'
30
+ puts "Using Evented Mongrel"
31
+ end
32
+
33
+ # Make Rack 0.9.0 backward compatibile with 0.4.0 mime types. This isn't
34
+ # technically a Sinatra issue but many Sinatra apps access the old
35
+ # MIME_TYPES constants due to Sinatra example code.
36
+ require 'rack/file'
37
+ class Rack::File
38
+ def self.const_missing(const_name)
39
+ if const_name == :MIME_TYPES
40
+ hash = Hash.new { |hash,key| Rack::Mime::MIME_TYPES[".#{key}"] }
41
+ const_set :MIME_TYPES, hash
42
+ sinatra_warn 'Rack::File::MIME_TYPES is deprecated; use Rack::Mime instead.'
43
+ hash
44
+ else
45
+ super
46
+ end
47
+ end
48
+ end
49
+
50
+ module Sinatra
51
+ module Compat
52
+ end
53
+
54
+ # The ServerError exception is deprecated. Any exception is considered an
55
+ # internal server error.
56
+ class ServerError < RuntimeError
57
+ def initialize(*args, &block)
58
+ sinatra_warn 'Sinatra::ServerError is deprecated;',
59
+ 'use another exception, error, or Kernel#fail instead.'
60
+ end
61
+ def code ; 500 ; end
62
+ end
63
+
64
+ class Default < Base
65
+ def self.const_missing(const_name)
66
+ if const_name == :FORWARD_METHODS
67
+ sinatra_warn 'Sinatra::Application::FORWARD_METHODS is deprecated;',
68
+ 'use Sinatra::Delegator::METHODS instead.'
69
+ const_set :FORWARD_METHODS, Sinatra::Delegator::METHODS
70
+ Sinatra::Delegator::METHODS
71
+ else
72
+ super
73
+ end
74
+ end
75
+
76
+ # Deprecated. Use: response['Header-Name']
77
+ def headers(header=nil)
78
+ sinatra_warn "The 'headers' method is deprecated; use 'response' instead."
79
+ response.headers.merge!(header) if header
80
+ response.headers
81
+ end
82
+ alias :header :headers
83
+
84
+ # Deprecated. Use: halt
85
+ def stop(*args, &block)
86
+ sinatra_warn "The 'stop' method is deprecated; use 'halt' instead."
87
+ halt(*args, &block)
88
+ end
89
+
90
+ # Deprecated. Use: etag
91
+ def entity_tag(*args, &block)
92
+ sinatra_warn "The 'entity_tag' method is deprecated; use 'etag' instead."
93
+ etag(*args, &block)
94
+ end
95
+
96
+ # The :disposition option is deprecated; use: #attachment. This method
97
+ # setting the Content-Transfer-Encoding header is deprecated.
98
+ #--
99
+ # TODO deprecation warning for :disposition argument.
100
+ def send_file(path, opts={})
101
+ opts[:disposition] = 'attachment' if !opts.key?(:disposition)
102
+ attachment opts[:filename] || path if opts[:filename] || opts[:disposition]
103
+ response['Content-Transfer-Encoding'] = 'binary' if opts[:disposition]
104
+ super(path, opts)
105
+ end
106
+
107
+ # Throwing halt with a Symbol and the to_result convention are
108
+ # deprecated. Override the invoke method to detect those types of return
109
+ # values.
110
+ def invoke(handler)
111
+ res = super
112
+ case
113
+ when res.kind_of?(Symbol)
114
+ sinatra_warn "Invoking the :#{res} helper by returning a Symbol is deprecated;",
115
+ "call the helper directly instead."
116
+ @response.body = __send__(res)
117
+ when res.respond_to?(:to_result)
118
+ sinatra_warn "The to_result convention is deprecated."
119
+ @response.body = res.to_result(self)
120
+ end
121
+ res
122
+ end
123
+
124
+ def options
125
+ Options.new(self.class)
126
+ end
127
+
128
+ class Options < Struct.new(:target) #:nodoc:
129
+ def method_missing(name, *args, &block)
130
+ if target.respond_to?(name)
131
+ target.__send__(name, *args, &block)
132
+ elsif args.empty? && name.to_s !~ /=$/
133
+ sinatra_warn 'accessing undefined options will raise a NameError in Sinatra 1.0'
134
+ nil
135
+ else
136
+ super
137
+ end
138
+ end
139
+ end
140
+
141
+ class << self
142
+ # Deprecated. Options are stored directly on the class object.
143
+ def options
144
+ sinatra_warn "The 'options' class method is deprecated; use 'self' instead."
145
+ Options.new(self)
146
+ end
147
+
148
+ # Deprecated. Use: configure
149
+ def configures(*args, &block)
150
+ sinatra_warn "The 'configures' method is deprecated; use 'configure' instead."
151
+ configure(*args, &block)
152
+ end
153
+
154
+ # Deprecated. Use: set
155
+ def default_options
156
+ sinatra_warn "Sinatra::Application.default_options is deprecated; use 'set' instead."
157
+ fake = lambda { |options| set(options) }
158
+ def fake.merge!(options) ; call(options) ; end
159
+ fake
160
+ end
161
+
162
+ # Deprecated. Use: set
163
+ def set_option(*args, &block)
164
+ sinatra_warn "The 'set_option' method is deprecated; use 'set' instead."
165
+ set(*args, &block)
166
+ end
167
+
168
+ def set_options(*args, &block)
169
+ sinatra_warn "The 'set_options' method is deprecated; use 'set' instead."
170
+ set(*args, &block)
171
+ end
172
+
173
+ # Deprecated. Use: set :environment, ENV
174
+ def env=(value)
175
+ sinatra_warn "The :env option is deprecated; use :environment instead."
176
+ set :environment, value
177
+ end
178
+
179
+ # Deprecated. Use: options.environment
180
+ def env
181
+ sinatra_warn "The :env option is deprecated; use :environment instead."
182
+ environment
183
+ end
184
+ end
185
+
186
+ # Deprecated. Missing messages are no longer delegated to @response.
187
+ def method_missing(name, *args, &b)
188
+ if @response.respond_to?(name)
189
+ sinatra_warn "The '#{name}' method is deprecated; use 'response.#{name}' instead."
190
+ @response.send(name, *args, &b)
191
+ else
192
+ super
193
+ end
194
+ end
195
+ end
196
+
197
+ class << self
198
+ # Deprecated. Use: Sinatra::Application
199
+ def application
200
+ sinatra_warn "Sinatra.application is deprecated; use Sinatra::Application instead."
201
+ Sinatra::Application
202
+ end
203
+
204
+ # Deprecated. Use: Sinatra::Application.reset!
205
+ def application=(value)
206
+ raise ArgumentError unless value.nil?
207
+ sinatra_warn "Setting Sinatra.application to nil is deprecated; create a new instance instead."
208
+ Sinatra.class_eval do
209
+ remove_const :Application
210
+ const_set :Application, Class.new(Sinatra::Default)
211
+ end
212
+ end
213
+
214
+ def build_application
215
+ sinatra_warn "Sinatra.build_application is deprecated; use Sinatra::Application instead."
216
+ Sinatra::Application
217
+ end
218
+
219
+ def options
220
+ sinatra_warn "Sinatra.options is deprecated; use Sinatra::Application.option_name instead."
221
+ Sinatra::Application.options
222
+ end
223
+
224
+ def port
225
+ sinatra_warn "Sinatra.port is deprecated; use Sinatra::Application.port instead."
226
+ options.port
227
+ end
228
+
229
+ def host
230
+ sinatra_warn "Sinatra.host is deprecated; use Sinatra::Application.host instead."
231
+ options.host
232
+ end
233
+
234
+ def env
235
+ sinatra_warn "Sinatra.env is deprecated; use Sinatra::Application.environment instead."
236
+ options.environment
237
+ end
238
+ end
239
+ end
Binary file
Binary file
@@ -0,0 +1,48 @@
1
+ require 'sinatra/base'
2
+
3
+ module Sinatra
4
+ class Default < Base
5
+ set :app_file, lambda {
6
+ ignore = [
7
+ /lib\/sinatra.*\.rb$/, # all sinatra code
8
+ /\(.*\)/, # generated code
9
+ /custom_require\.rb$/ # rubygems require hacks
10
+ ]
11
+ path =
12
+ caller.map{ |line| line.split(':', 2).first }.find do |file|
13
+ next if ignore.any? { |pattern| file =~ pattern }
14
+ file
15
+ end
16
+ path || $0
17
+ }.call
18
+
19
+ set :run, Proc.new { $0 == app_file }
20
+ set :reload, Proc.new{ app_file? && development? }
21
+
22
+ if run? && ARGV.any?
23
+ require 'optparse'
24
+ OptionParser.new { |op|
25
+ op.on('-x') { set :mutex, true }
26
+ op.on('-e env') { |val| set :environment, val.to_sym }
27
+ op.on('-s server') { |val| set :server, val }
28
+ op.on('-p port') { |val| set :port, val.to_i }
29
+ }.parse!(ARGV.dup)
30
+ end
31
+ end
32
+ end
33
+
34
+ include Sinatra::Delegator
35
+
36
+ def helpers(&block)
37
+ Sinatra::Application.send :class_eval, &block
38
+ end
39
+
40
+ def mime(ext, type)
41
+ ext = ".#{ext}" unless ext.to_s[0] == ?.
42
+ Rack::Mime::MIME_TYPES[ext.to_s] = type
43
+ end
44
+
45
+ at_exit do
46
+ raise $! if $!
47
+ Sinatra::Application.run! if Sinatra::Application.run?
48
+ end
@@ -0,0 +1,17 @@
1
+ require 'bacon'
2
+ require 'sinatra/test'
3
+
4
+ Sinatra::Default.set(
5
+ :env => :test,
6
+ :run => false,
7
+ :raise_errors => true,
8
+ :logging => false
9
+ )
10
+
11
+ module Sinatra::Test
12
+ def should
13
+ @response.should
14
+ end
15
+ end
16
+
17
+ Bacon::Context.send(:include, Sinatra::Test)
@@ -0,0 +1,9 @@
1
+ require 'sinatra/test'
2
+ require 'spec/interop/test'
3
+
4
+ Sinatra::Default.set(
5
+ :env => :test,
6
+ :run => false,
7
+ :raise_errors => true,
8
+ :logging => false
9
+ )
@@ -0,0 +1,9 @@
1
+ require 'test/spec'
2
+ require 'sinatra/test'
3
+ require 'sinatra/test/unit'
4
+
5
+ module Sinatra::Test
6
+ def should
7
+ @response.should
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ require 'sinatra/test'
2
+ require 'test/unit'
3
+
4
+ Test::Unit::TestCase.send :include, Sinatra::Test
5
+
6
+ Sinatra::Default.set(
7
+ :env => :test,
8
+ :run => false,
9
+ :raise_errors => true,
10
+ :logging => false
11
+ )
@@ -0,0 +1,109 @@
1
+ require 'sinatra/base'
2
+
3
+ module Sinatra
4
+
5
+ module Test
6
+ include Rack::Utils
7
+
8
+ attr_reader :app, :request, :response
9
+
10
+ def test_request(verb, path, *args)
11
+ @app = Sinatra::Application if @app.nil? && defined?(Sinatra::Application)
12
+ fail "@app not set - cannot make request" if @app.nil?
13
+ @request = Rack::MockRequest.new(@app)
14
+ opts, input =
15
+ case args.size
16
+ when 2 # input, env
17
+ input, env = args
18
+ if input.kind_of?(Hash) # params, env
19
+ [env, param_string(input)]
20
+ else
21
+ [env, input]
22
+ end
23
+ when 1 # params
24
+ if (data = args.first).kind_of?(Hash)
25
+ env = (data.delete(:env) || {})
26
+ [env, param_string(data)]
27
+ else
28
+ [{}, data]
29
+ end
30
+ when 0
31
+ [{}, '']
32
+ else
33
+ raise ArgumentError, "zero, one, or two arguments expected"
34
+ end
35
+ opts = rack_opts(opts)
36
+ opts[:input] ||= input
37
+ yield @request if block_given?
38
+ @response = @request.request(verb, path, opts)
39
+ end
40
+
41
+ def get(path, *args, &b) ; test_request('GET', path, *args, &b) ; end
42
+ def head(path, *args, &b) ; test_request('HEAD', path, *args, &b) ; end
43
+ def post(path, *args, &b) ; test_request('POST', path, *args, &b) ; end
44
+ def put(path, *args, &b) ; test_request('PUT', path, *args, &b) ; end
45
+ def delete(path, *args, &b) ; test_request('DELETE', path, *args, &b) ; end
46
+
47
+ def follow!
48
+ test_request 'GET', @response.location
49
+ end
50
+
51
+ def body ; @response.body ; end
52
+ def status ; @response.status ; end
53
+
54
+ # Delegate other missing methods to @response.
55
+ def method_missing(name, *args, &block)
56
+ if @response && @response.respond_to?(name)
57
+ @response.send(name, *args, &block)
58
+ else
59
+ super
60
+ end
61
+ end
62
+
63
+ RACK_OPT_NAMES = {
64
+ :accept => "HTTP_ACCEPT",
65
+ :agent => "HTTP_USER_AGENT",
66
+ :host => "HTTP_HOST",
67
+ :session => "HTTP_COOKIE",
68
+ :cookies => "HTTP_COOKIE",
69
+ :content_type => "CONTENT_TYPE"
70
+ }
71
+
72
+ def rack_opts(opts)
73
+ opts.inject({}) do |hash,(key,val)|
74
+ key = RACK_OPT_NAMES[key] || key
75
+ hash[key] = val
76
+ hash
77
+ end
78
+ end
79
+
80
+ def env_for(opts={})
81
+ opts = rack_opts(opts)
82
+ Rack::MockRequest.env_for(opts)
83
+ end
84
+
85
+ def param_string(hash)
86
+ hash.map { |pair| pair.map{|v|escape(v)}.join('=') }.join('&')
87
+ end
88
+
89
+ if defined? Sinatra::Compat
90
+ # Deprecated. Use: "get" instead of "get_it".
91
+ %w(get head post put delete).each do |verb|
92
+ eval <<-RUBY, binding, __FILE__, __LINE__
93
+ def #{verb}_it(*args, &block)
94
+ sinatra_warn "The #{verb}_it method is deprecated; use #{verb} instead."
95
+ test_request('#{verb.upcase}', *args, &block)
96
+ end
97
+ RUBY
98
+ end
99
+ end
100
+ end
101
+
102
+ class TestHarness
103
+ include Test
104
+
105
+ def initialize(app=nil)
106
+ @app = app || Sinatra::Application
107
+ end
108
+ end
109
+ end
data/lib/sinatra.rb ADDED
@@ -0,0 +1,4 @@
1
+ $LOAD_PATH.unshift File.dirname(__FILE__)
2
+ require 'sinatra/base'
3
+ require 'sinatra/main'
4
+ require 'sinatra/compat'
data/sinatra.gemspec ADDED
@@ -0,0 +1,109 @@
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.8.9'
7
+ s.date = '2009-01-14'
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
+
14
+ # = MANIFEST =
15
+ s.files = %w[
16
+ AUTHORS
17
+ CHANGES
18
+ LICENSE
19
+ README.rdoc
20
+ Rakefile
21
+ compat/app_test.rb
22
+ compat/application_test.rb
23
+ compat/builder_test.rb
24
+ compat/custom_error_test.rb
25
+ compat/erb_test.rb
26
+ compat/events_test.rb
27
+ compat/filter_test.rb
28
+ compat/haml_test.rb
29
+ compat/helper.rb
30
+ compat/mapped_error_test.rb
31
+ compat/pipeline_test.rb
32
+ compat/public/foo.xml
33
+ compat/sass_test.rb
34
+ compat/sessions_test.rb
35
+ compat/streaming_test.rb
36
+ compat/sym_params_test.rb
37
+ compat/template_test.rb
38
+ compat/use_in_file_templates_test.rb
39
+ compat/views/foo.builder
40
+ compat/views/foo.erb
41
+ compat/views/foo.haml
42
+ compat/views/foo.sass
43
+ compat/views/foo_layout.erb
44
+ compat/views/foo_layout.haml
45
+ compat/views/layout_test/foo.builder
46
+ compat/views/layout_test/foo.erb
47
+ compat/views/layout_test/foo.haml
48
+ compat/views/layout_test/foo.sass
49
+ compat/views/layout_test/layout.builder
50
+ compat/views/layout_test/layout.erb
51
+ compat/views/layout_test/layout.haml
52
+ compat/views/layout_test/layout.sass
53
+ compat/views/no_layout/no_layout.builder
54
+ compat/views/no_layout/no_layout.haml
55
+ lib/sinatra.rb
56
+ lib/sinatra/base.rb
57
+ lib/sinatra/compat.rb
58
+ lib/sinatra/images/404.png
59
+ lib/sinatra/images/500.png
60
+ lib/sinatra/main.rb
61
+ lib/sinatra/test.rb
62
+ lib/sinatra/test/bacon.rb
63
+ lib/sinatra/test/rspec.rb
64
+ lib/sinatra/test/spec.rb
65
+ lib/sinatra/test/unit.rb
66
+ sinatra.gemspec
67
+ test/base_test.rb
68
+ test/builder_test.rb
69
+ test/data/reload_app_file.rb
70
+ test/erb_test.rb
71
+ test/filter_test.rb
72
+ test/haml_test.rb
73
+ test/helper.rb
74
+ test/helpers_test.rb
75
+ test/mapped_error_test.rb
76
+ test/middleware_test.rb
77
+ test/options_test.rb
78
+ test/reload_test.rb
79
+ test/request_test.rb
80
+ test/result_test.rb
81
+ test/routing_test.rb
82
+ test/sass_test.rb
83
+ test/sinatra_test.rb
84
+ test/static_test.rb
85
+ test/templates_test.rb
86
+ test/views/hello.builder
87
+ test/views/hello.erb
88
+ test/views/hello.haml
89
+ test/views/hello.sass
90
+ test/views/hello.test
91
+ test/views/layout2.builder
92
+ test/views/layout2.erb
93
+ test/views/layout2.haml
94
+ test/views/layout2.test
95
+ ]
96
+ # = MANIFEST =
97
+
98
+ s.test_files = s.files.select {|path| path =~ /^test\/.*_test.rb/}
99
+
100
+ s.extra_rdoc_files = %w[README.rdoc LICENSE]
101
+ s.add_dependency 'rack', '>= 0.9.0'
102
+
103
+ s.has_rdoc = true
104
+ s.homepage = "http://sinatra.rubyforge.org"
105
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Sinatra", "--main", "README.rdoc"]
106
+ s.require_paths = %w[lib]
107
+ s.rubyforge_project = 'sinatra'
108
+ s.rubygems_version = '1.1.1'
109
+ end
data/test/base_test.rb ADDED
@@ -0,0 +1,68 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ describe 'Sinatra::Base' do
4
+ it 'includes Rack::Utils' do
5
+ assert Sinatra::Base.included_modules.include?(Rack::Utils)
6
+ end
7
+
8
+ it 'can be used as a Rack application' do
9
+ mock_app {
10
+ get '/' do
11
+ 'Hello World'
12
+ end
13
+ }
14
+ assert @app.respond_to?(:call)
15
+
16
+ request = Rack::MockRequest.new(@app)
17
+ response = request.get('/')
18
+ assert response.ok?
19
+ assert_equal 'Hello World', response.body
20
+ end
21
+
22
+ it 'can be used as Rack middleware' do
23
+ app = lambda { |env| [200, {}, ['Goodbye World']] }
24
+ mock_middleware =
25
+ mock_app {
26
+ get '/' do
27
+ 'Hello World'
28
+ end
29
+ get '/goodbye' do
30
+ @app.call(request.env)
31
+ end
32
+ }
33
+ middleware = mock_middleware.new(app)
34
+ assert_same app, middleware.app
35
+
36
+ request = Rack::MockRequest.new(middleware)
37
+ response = request.get('/')
38
+ assert response.ok?
39
+ assert_equal 'Hello World', response.body
40
+
41
+ response = request.get('/goodbye')
42
+ assert response.ok?
43
+ assert_equal 'Goodbye World', response.body
44
+ end
45
+
46
+ it 'can take multiple definitions of a route' do
47
+ app = mock_app {
48
+ user_agent(/Foo/)
49
+ get '/foo' do
50
+ 'foo'
51
+ end
52
+
53
+ get '/foo' do
54
+ 'not foo'
55
+ end
56
+ }
57
+
58
+ request = Rack::MockRequest.new(app)
59
+ response = request.get('/foo', 'HTTP_USER_AGENT' => 'Foo')
60
+ assert response.ok?
61
+ assert_equal 'foo', response.body
62
+
63
+ request = Rack::MockRequest.new(app)
64
+ response = request.get('/foo')
65
+ assert response.ok?
66
+ assert_equal 'not foo', response.body
67
+ end
68
+ 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