sinatra-sinatra 0.8.9 → 0.8.10

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -8,6 +8,10 @@
8
8
  Documentation on using these features is forth-coming; the following
9
9
  provides the basic gist: http://gist.github.com/38605
10
10
 
11
+ * Parameters with subscripts are now parsed into a nested/recursive
12
+ Hash structure. e.g., "post[title]=Hello&post[body]=World" yields
13
+ params: {'post' => {'title' => 'Hello', 'body' => 'World'}}.
14
+
11
15
  * Regular expressions may now be used in route pattens; captures are
12
16
  available at "params[:captures]".
13
17
 
@@ -41,6 +45,13 @@
41
45
  has the status code specified. It's also possible to register an error
42
46
  page for a range of status codes: "error(500..599)".
43
47
 
48
+ * Sinatra's testing support is no longer dependent on Test::Unit. Requiring
49
+ 'sinatra/test' adds the Sinatra::Test module and Sinatra::TestHarness
50
+ class, which can be used with any test framework. The 'sinatra/test/unit',
51
+ 'sinatra/test/spec', 'sinatra/test/rspec', or 'sinatra/test/bacon' files
52
+ can be required to setup a framework-specific testing environment. See the
53
+ README for more information.
54
+
44
55
  * Added support for Bacon (test framework). The 'sinatra/test/bacon' file
45
56
  can be required to setup Sinatra test helpers on Bacon::Context.
46
57
 
data/README.rdoc CHANGED
@@ -464,13 +464,14 @@ friends.
464
464
 
465
465
  Sinatra applications can be run directly:
466
466
 
467
- ruby myapp.rb [-h] [-x] [-p PORT] [-e ENVIRONMENT]
467
+ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-s HANDLER]
468
468
 
469
469
  Options are:
470
470
 
471
471
  -h # help
472
472
  -p # set the port (default is 4567)
473
473
  -e # set the environment (default is development)
474
+ -s # specify rack server/handler (default is thin)
474
475
  -x # turn on the mutex lock (default is off)
475
476
 
476
477
  == Contributing
data/lib/sinatra/base.rb CHANGED
@@ -4,7 +4,7 @@ require 'rack'
4
4
  require 'rack/builder'
5
5
 
6
6
  module Sinatra
7
- VERSION = '0.8.9'
7
+ VERSION = '0.8.10'
8
8
 
9
9
  class Request < Rack::Request
10
10
  def user_agent
@@ -14,6 +14,13 @@ module Sinatra
14
14
  def accept
15
15
  @env['HTTP_ACCEPT'].split(',').map { |a| a.strip }
16
16
  end
17
+
18
+ # Override Rack 0.9.x's #params implementation (see #72 in lighthouse)
19
+ def params
20
+ self.GET.update(self.POST)
21
+ rescue EOFError => boom
22
+ self.GET
23
+ end
17
24
  end
18
25
 
19
26
  class Response < Rack::Response
@@ -324,8 +331,7 @@ module Sinatra
324
331
  self.class.filters.each {|block| instance_eval(&block)}
325
332
  if routes = self.class.routes[@request.request_method]
326
333
  path = @request.path_info
327
- original_params = Hash.new{ |hash,k| hash[k.to_s] if Symbol === k }
328
- original_params.merge! @request.params
334
+ original_params = nested_params(@request.params)
329
335
 
330
336
  routes.each do |pattern, keys, conditions, method_name|
331
337
  if pattern =~ path
@@ -345,8 +351,7 @@ module Sinatra
345
351
  else
346
352
  {}
347
353
  end
348
- @params = original_params.dup
349
- @params.merge!(params)
354
+ @params = original_params.merge(params)
350
355
 
351
356
  catch(:pass) {
352
357
  conditions.each { |cond|
@@ -359,6 +364,22 @@ module Sinatra
359
364
  raise NotFound
360
365
  end
361
366
 
367
+ def nested_params(params)
368
+ return indifferent_hash.merge(params) if !params.keys.join.include?('[')
369
+ params.inject indifferent_hash do |res, (key,val)|
370
+ if key =~ /\[.*\]/
371
+ splat = key.scan(/(^[^\[]+)|\[([^\]]+)\]/).flatten.compact
372
+ head, last = splat[0..-2], splat[-1]
373
+ head.inject(res){ |s,v| s[v] ||= indifferent_hash }[last] = val
374
+ end
375
+ res
376
+ end
377
+ end
378
+
379
+ def indifferent_hash
380
+ Hash.new {|hash,key| hash[key.to_s] if Symbol === key }
381
+ end
382
+
362
383
  def invoke(handler)
363
384
  res = catch(:halt) {
364
385
  if handler.respond_to?(:call)
data/lib/sinatra/test.rb CHANGED
@@ -60,6 +60,11 @@ module Sinatra
60
60
  end
61
61
  end
62
62
 
63
+ # Also check @response since we delegate there.
64
+ def respond_to?(symbol, include_private=false)
65
+ super || (@response && @response.respond_to?(symbol, include_private))
66
+ end
67
+
63
68
  RACK_OPT_NAMES = {
64
69
  :accept => "HTTP_ACCEPT",
65
70
  :agent => "HTTP_USER_AGENT",
data/sinatra.gemspec CHANGED
@@ -3,13 +3,14 @@ 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.8.9'
7
- s.date = '2009-01-14'
6
+ s.version = '0.8.10'
7
+ s.date = '2009-01-16'
8
8
 
9
9
  s.description = "Classy web-development dressed in a DSL"
10
10
  s.summary = "Classy web-development dressed in a DSL"
11
11
 
12
12
  s.authors = ["Blake Mizerany"]
13
+ s.email = "sinatrarb@googlegroups.com"
13
14
 
14
15
  # = MANIFEST =
15
16
  s.files = %w[
@@ -98,7 +99,7 @@ Gem::Specification.new do |s|
98
99
  s.test_files = s.files.select {|path| path =~ /^test\/.*_test.rb/}
99
100
 
100
101
  s.extra_rdoc_files = %w[README.rdoc LICENSE]
101
- s.add_dependency 'rack', '>= 0.9.0'
102
+ s.add_dependency 'rack', '>= 0.9.1'
102
103
 
103
104
  s.has_rdoc = true
104
105
  s.homepage = "http://sinatra.rubyforge.org"
data/test/filter_test.rb CHANGED
@@ -6,11 +6,11 @@ describe "Filters" do
6
6
  mock_app do
7
7
  get('/') { 'Hello World' }
8
8
  before {
9
- fail 'count != 0' if count != 0
9
+ assert_equal 0, count
10
10
  count = 1
11
11
  }
12
12
  before {
13
- fail 'count != 1' if count != 1
13
+ assert_equal 1, count
14
14
  count = 2
15
15
  }
16
16
  end
data/test/helper.rb CHANGED
@@ -18,3 +18,8 @@ module Sinatra::Test
18
18
  @app = Sinatra.new(base, &block)
19
19
  end
20
20
  end
21
+
22
+ class Sinatra::Base
23
+ # Allow assertions in request context
24
+ include Test::Unit::Assertions
25
+ end
data/test/helpers_test.rb CHANGED
@@ -142,7 +142,7 @@ describe 'Sinatra::Helpers' do
142
142
  it 'creates a new session when none provided' do
143
143
  mock_app {
144
144
  get '/' do
145
- fail "session != {}" unless session.empty?
145
+ assert session.empty?
146
146
  session[:foo] = 'bar'
147
147
  'Hi'
148
148
  end
@@ -34,8 +34,8 @@ describe 'Exception Mappings' do
34
34
  mock_app {
35
35
  set :raise_errors, false
36
36
  error(FooError) {
37
- fail "!env.include?('sinatra.error')" if !env.include?('sinatra.error')
38
- fail unless env['sinatra.error'].kind_of?(FooError)
37
+ assert env.include?('sinatra.error')
38
+ assert env['sinatra.error'].kind_of?(FooError)
39
39
  'looks good'
40
40
  }
41
41
  get '/' do
data/test/request_test.rb CHANGED
@@ -6,4 +6,13 @@ describe 'Sinatra::Request' do
6
6
  assert request.respond_to?(:user_agent)
7
7
  assert_equal 'Test', request.user_agent
8
8
  end
9
+
10
+ it 'parses POST params when Content-Type is form-dataish' do
11
+ request = Sinatra::Request.new(
12
+ 'REQUEST_METHOD' => 'PUT',
13
+ 'CONTENT_TYPE' => 'application/x-www-form-urlencoded',
14
+ 'rack.input' => StringIO.new('foo=bar')
15
+ )
16
+ assert_equal 'bar', request.params['foo']
17
+ end
9
18
  end
data/test/routing_test.rb CHANGED
@@ -27,8 +27,8 @@ describe "Routing" do
27
27
  it "exposes params with indifferent hash" do
28
28
  mock_app {
29
29
  get '/:foo' do
30
- fail unless params['foo'] == 'bar'
31
- fail unless params[:foo] == 'bar'
30
+ assert_equal 'bar', params['foo']
31
+ assert_equal 'bar', params[:foo]
32
32
  'well, alright'
33
33
  end
34
34
  }
@@ -39,8 +39,8 @@ describe "Routing" do
39
39
  it "merges named params and query string params in params" do
40
40
  mock_app {
41
41
  get '/:foo' do
42
- fail unless params['foo'] == 'bar'
43
- fail unless params['baz'] == 'biz'
42
+ assert_equal 'bar', params['foo']
43
+ assert_equal 'biz', params['baz']
44
44
  end
45
45
  }
46
46
  get '/bar?baz=biz'
@@ -80,7 +80,7 @@ describe "Routing" do
80
80
  it "supports single splat params like /*" do
81
81
  mock_app {
82
82
  get '/*' do
83
- fail unless params['splat'].kind_of?(Array)
83
+ assert params['splat'].kind_of?(Array)
84
84
  params['splat'].join "\n"
85
85
  end
86
86
  }
@@ -95,7 +95,7 @@ describe "Routing" do
95
95
  it "supports mixing multiple splat params like /*/foo/*/*" do
96
96
  mock_app {
97
97
  get '/*/foo/*/*' do
98
- fail unless params['splat'].kind_of?(Array)
98
+ assert params['splat'].kind_of?(Array)
99
99
  params['splat'].join "\n"
100
100
  end
101
101
  }
@@ -110,8 +110,8 @@ describe "Routing" do
110
110
  it "supports mixing named and splat params like /:foo/*" do
111
111
  mock_app {
112
112
  get '/:foo/*' do
113
- fail unless params['foo'] == 'foo'
114
- fail unless params['splat'] == ['bar/baz']
113
+ assert_equal 'foo', params['foo']
114
+ assert_equal ['bar/baz'], params['splat']
115
115
  end
116
116
  }
117
117
 
@@ -119,6 +119,63 @@ describe "Routing" do
119
119
  assert ok?
120
120
  end
121
121
 
122
+ it "supports basic nested params" do
123
+ mock_app {
124
+ get '/hi' do
125
+ params["person"]["name"]
126
+ end
127
+ }
128
+
129
+ get "/hi?person[name]=John+Doe"
130
+ assert ok?
131
+ assert_equal "John Doe", body
132
+ end
133
+
134
+ it "exposes nested params with indifferent hash" do
135
+ mock_app {
136
+ get '/testme' do
137
+ assert_equal 'baz', params['bar']['foo']
138
+ assert_equal 'baz', params['bar'][:foo]
139
+ 'well, alright'
140
+ end
141
+ }
142
+ get '/testme?bar[foo]=baz'
143
+ assert_equal 'well, alright', body
144
+ end
145
+
146
+ it "supports deeply nested params" do
147
+ input = {
148
+ 'browser[chrome][engine][name]' => 'V8',
149
+ 'browser[chrome][engine][version]' => '1.0',
150
+ 'browser[firefox][engine][name]' => 'spidermonkey',
151
+ 'browser[firefox][engine][version]' => '1.7.0',
152
+ 'emacs[map][goto-line]' => 'M-g g',
153
+ 'emacs[version]' => '22.3.1',
154
+ 'paste[name]' => 'hello world',
155
+ 'paste[syntax]' => 'ruby'
156
+ }
157
+ expected = {
158
+ "emacs" => {
159
+ "map" => { "goto-line" => "M-g g" },
160
+ "version" => "22.3.1"
161
+ },
162
+ "browser" => {
163
+ "firefox" => {"engine" => {"name"=>"spidermonkey", "version"=>"1.7.0"}},
164
+ "chrome" => {"engine" => {"name"=>"V8", "version"=>"1.0"}}
165
+ },
166
+ "paste" => {"name"=>"hello world", "syntax"=>"ruby"}
167
+ }
168
+ mock_app {
169
+ get '/foo' do
170
+ assert_equal expected, params
171
+ 'looks good'
172
+ end
173
+ }
174
+ get "/foo?#{param_string(input)}"
175
+ assert ok?
176
+ assert_equal 'looks good', body
177
+ end
178
+
122
179
  it "supports paths that include spaces" do
123
180
  mock_app {
124
181
  get '/path with spaces' do
@@ -134,8 +191,8 @@ describe "Routing" do
134
191
  it "URL decodes named parameters and splats" do
135
192
  mock_app {
136
193
  get '/:foo/*' do
137
- fail unless params['foo'] == 'hello world'
138
- fail unless params['splat'] == ['how are you']
194
+ assert_equal 'hello world', params['foo']
195
+ assert_equal ['how are you'], params['splat']
139
196
  nil
140
197
  end
141
198
  }
@@ -159,7 +216,7 @@ describe "Routing" do
159
216
  it 'makes regular expression captures available in params[:captures]' do
160
217
  mock_app {
161
218
  get(/^\/fo(.*)\/ba(.*)/) do
162
- fail unless params[:captures] == ['orooomma', 'f']
219
+ assert_equal ['orooomma', 'f'], params[:captures]
163
220
  'right on'
164
221
  end
165
222
  }
@@ -190,7 +247,7 @@ describe "Routing" do
190
247
  end
191
248
 
192
249
  get '/*' do
193
- fail if params.include?('foo')
250
+ assert !params.include?('foo')
194
251
  'Hello World'
195
252
  end
196
253
  }
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.8.9
4
+ version: 0.8.10
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-01-14 00:00:00 -08:00
12
+ date: 2009-01-16 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -19,10 +19,10 @@ dependencies:
19
19
  requirements:
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 0.9.0
22
+ version: 0.9.1
23
23
  version:
24
24
  description: Classy web-development dressed in a DSL
25
- email:
25
+ email: sinatrarb@googlegroups.com
26
26
  executables: []
27
27
 
28
28
  extensions: []