sinatra-sinatra 0.8.9 → 0.8.10

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.
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: []