tricycle-rack-contrib 0.9.0

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 (56) hide show
  1. data/COPYING +18 -0
  2. data/README.rdoc +78 -0
  3. data/Rakefile +97 -0
  4. data/lib/rack/contrib.rb +37 -0
  5. data/lib/rack/contrib/accept_format.rb +46 -0
  6. data/lib/rack/contrib/backstage.rb +20 -0
  7. data/lib/rack/contrib/bounce_favicon.rb +16 -0
  8. data/lib/rack/contrib/callbacks.rb +37 -0
  9. data/lib/rack/contrib/config.rb +16 -0
  10. data/lib/rack/contrib/cookies.rb +50 -0
  11. data/lib/rack/contrib/csshttprequest.rb +39 -0
  12. data/lib/rack/contrib/deflect.rb +137 -0
  13. data/lib/rack/contrib/etag.rb +20 -0
  14. data/lib/rack/contrib/evil.rb +12 -0
  15. data/lib/rack/contrib/garbagecollector.rb +14 -0
  16. data/lib/rack/contrib/jsonp.rb +41 -0
  17. data/lib/rack/contrib/lighttpd_script_name_fix.rb +16 -0
  18. data/lib/rack/contrib/locale.rb +31 -0
  19. data/lib/rack/contrib/mailexceptions.rb +120 -0
  20. data/lib/rack/contrib/nested_params.rb +143 -0
  21. data/lib/rack/contrib/not_found.rb +18 -0
  22. data/lib/rack/contrib/post_body_content_type_parser.rb +40 -0
  23. data/lib/rack/contrib/proctitle.rb +30 -0
  24. data/lib/rack/contrib/profiler.rb +108 -0
  25. data/lib/rack/contrib/relative_redirect.rb +44 -0
  26. data/lib/rack/contrib/response_cache.rb +116 -0
  27. data/lib/rack/contrib/route_exceptions.rb +49 -0
  28. data/lib/rack/contrib/sendfile.rb +142 -0
  29. data/lib/rack/contrib/signals.rb +63 -0
  30. data/lib/rack/contrib/time_zone.rb +25 -0
  31. data/test/404.html +1 -0
  32. data/test/Maintenance.html +1 -0
  33. data/test/mail_settings.rb +12 -0
  34. data/test/spec_rack_accept_format.rb +72 -0
  35. data/test/spec_rack_backstage.rb +26 -0
  36. data/test/spec_rack_callbacks.rb +65 -0
  37. data/test/spec_rack_config.rb +22 -0
  38. data/test/spec_rack_contrib.rb +8 -0
  39. data/test/spec_rack_csshttprequest.rb +66 -0
  40. data/test/spec_rack_deflect.rb +107 -0
  41. data/test/spec_rack_etag.rb +23 -0
  42. data/test/spec_rack_evil.rb +19 -0
  43. data/test/spec_rack_garbagecollector.rb +13 -0
  44. data/test/spec_rack_jsonp.rb +34 -0
  45. data/test/spec_rack_lighttpd_script_name_fix.rb +16 -0
  46. data/test/spec_rack_mailexceptions.rb +97 -0
  47. data/test/spec_rack_nested_params.rb +46 -0
  48. data/test/spec_rack_not_found.rb +17 -0
  49. data/test/spec_rack_post_body_content_type_parser.rb +32 -0
  50. data/test/spec_rack_proctitle.rb +26 -0
  51. data/test/spec_rack_profiler.rb +37 -0
  52. data/test/spec_rack_relative_redirect.rb +78 -0
  53. data/test/spec_rack_response_cache.rb +181 -0
  54. data/test/spec_rack_sendfile.rb +86 -0
  55. data/tricycle-rack-contrib.gemspec +88 -0
  56. metadata +175 -0
@@ -0,0 +1,181 @@
1
+ require 'test/spec'
2
+ require 'rack/mock'
3
+ #require 'rack/contrib/response_cache'
4
+ require File.join(File.dirname(__FILE__), '../lib/rack/contrib/response_cache')
5
+ require 'fileutils'
6
+
7
+ context Rack::ResponseCache do
8
+ F = ::File
9
+
10
+ def request(opts={}, &block)
11
+ Rack::MockRequest.new(Rack::ResponseCache.new(block||@def_app, opts[:cache]||@cache, &opts[:rc_block])).send(opts[:meth]||:get, opts[:path]||@def_path, opts[:headers]||{})
12
+ end
13
+
14
+ setup do
15
+ @cache = {}
16
+ @def_disk_cache = F.join(F.dirname(__FILE__), 'response_cache_test_disk_cache')
17
+ @def_value = ["rack-response-cache"]
18
+ @def_path = '/path/to/blah'
19
+ @def_app = lambda { |env| [200, {'Content-Type' => env['CT'] || 'text/html'}, @def_value]}
20
+ end
21
+ teardown do
22
+ FileUtils.rm_rf(@def_disk_cache)
23
+ end
24
+
25
+ specify "should cache results to disk if cache is a string" do
26
+ request(:cache=>@def_disk_cache)
27
+ F.read(F.join(@def_disk_cache, 'path', 'to', 'blah.html')).should.equal @def_value.first
28
+ request(:path=>'/path/3', :cache=>@def_disk_cache)
29
+ F.read(F.join(@def_disk_cache, 'path', '3.html')).should.equal @def_value.first
30
+ end
31
+
32
+ specify "should cache results to given cache if cache is not a string" do
33
+ request
34
+ @cache.should.equal('/path/to/blah.html'=>@def_value)
35
+ request(:path=>'/path/3')
36
+ @cache.should.equal('/path/to/blah.html'=>@def_value, '/path/3.html'=>@def_value)
37
+ end
38
+
39
+ specify "should not cache results if request method is not GET" do
40
+ request(:meth=>:post)
41
+ @cache.should.equal({})
42
+ request(:meth=>:put)
43
+ @cache.should.equal({})
44
+ request(:meth=>:delete)
45
+ @cache.should.equal({})
46
+ end
47
+
48
+ specify "should not cache results if there is a query string" do
49
+ request(:path=>'/path/to/blah?id=1')
50
+ @cache.should.equal({})
51
+ request(:path=>'/path/to/?id=1')
52
+ @cache.should.equal({})
53
+ request(:path=>'/?id=1')
54
+ @cache.should.equal({})
55
+ end
56
+
57
+ specify "should cache results if there is an empty query string" do
58
+ request(:path=>'/?')
59
+ @cache.should.equal('/index.html'=>@def_value)
60
+ end
61
+
62
+ specify "should not cache results if the request is not sucessful (status 200)" do
63
+ request{|env| [404, {'Content-Type' => 'text/html'}, ['']]}
64
+ @cache.should.equal({})
65
+ request{|env| [500, {'Content-Type' => 'text/html'}, ['']]}
66
+ @cache.should.equal({})
67
+ request{|env| [302, {'Content-Type' => 'text/html'}, ['']]}
68
+ @cache.should.equal({})
69
+ end
70
+
71
+ specify 'should not cache when "no cache" cache control directives' do
72
+ request{|env| [200, {'Content-Type' => 'text/html', 'Cache-Control' => 'no-cache'}, ['']]}
73
+ @cache.should.equal({})
74
+ end
75
+
76
+ specify 'should not cache when "private" cache control directives' do
77
+ request{|env| [200, {'Content-Type' => 'text/html', 'Cache-Control' => 'private'}, ['']]}
78
+ request{|env| [200, {'Content-Type' => 'text/html', 'Cache-Control' => "private, max-age=0, must-revalidate"}, ['']]}
79
+ @cache.should.equal({})
80
+ end
81
+
82
+ specify 'should cache requests when is "public" cache control directives' do
83
+ request{|env| [200, {'Content-Type' => 'text/html', 'Cache-Control' => 'public'}, ['one']]}
84
+ @cache.should.equal({'/path/to/blah.html' => ['one']})
85
+ end
86
+
87
+ specify 'should cache requests when including "public" cache control directives' do
88
+ request{|env| [200, {'Content-Type' => 'text/html', 'Cache-Control' => 'max-age=300, public'}, ['many']]}
89
+ @cache.should.equal({'/path/to/blah.html' => ['many']})
90
+ end
91
+
92
+ specify 'should cache when no cache control directives' do
93
+ request{|env| [200, {'Content-Type' => 'text/html'}, ['none']]}
94
+ @cache.should.equal({'/path/to/blah.html' => ['none']})
95
+ end
96
+
97
+ specify "should not cache results if the block returns nil or false" do
98
+ request(:rc_block=>proc{false})
99
+ @cache.should.equal({})
100
+ request(:rc_block=>proc{nil})
101
+ @cache.should.equal({})
102
+ end
103
+
104
+ specify "should cache results to path returned by block" do
105
+ request(:rc_block=>proc{"1"})
106
+ @cache.should.equal("1"=>@def_value)
107
+ request(:rc_block=>proc{"2"})
108
+ @cache.should.equal("1"=>@def_value, "2"=>@def_value)
109
+ end
110
+
111
+ specify "should pass the environment and response to the block" do
112
+ e, r = nil, nil
113
+ request(:rc_block=>proc{|env,res| e, r = env, res; nil})
114
+ e['PATH_INFO'].should.equal @def_path
115
+ e['REQUEST_METHOD'].should.equal 'GET'
116
+ e['QUERY_STRING'].should.equal ''
117
+ r.should.equal([200, {"Content-Type"=>"text/html"}, ["rack-response-cache"]])
118
+ end
119
+
120
+ specify "should unescape the path by default" do
121
+ request(:path=>'/path%20with%20spaces')
122
+ @cache.should.equal('/path with spaces.html'=>@def_value)
123
+ request(:path=>'/path%3chref%3e')
124
+ @cache.should.equal('/path with spaces.html'=>@def_value, '/path<href>.html'=>@def_value)
125
+ end
126
+
127
+ specify "should cache html mime_type without extension at .html" do
128
+ request(:path=>'/a')
129
+ @cache.should.equal('/a.html'=>@def_value)
130
+ end
131
+
132
+ {
133
+ :css => %w[text/css],
134
+ :csv => %w[text/csv],
135
+ :html => %w[text/html],
136
+ :js => %w[text/javascript application/javascript],
137
+ :pdf => %w[application/pdf],
138
+ :txt => %w[text/plain],
139
+ :xhtml => %w[application/xhtml+xml],
140
+ :xml => %w[text/xml],
141
+ }.each do |extension, mime_types|
142
+ mime_types.each do |mime_type|
143
+ specify "should cache #{mime_type} responses with the extension ('#{extension}') unchanged" do
144
+ request(:path=>"/a.#{extension}", :headers=>{'CT'=>mime_type})
145
+ @cache.should.equal("/a.#{extension}"=>@def_value)
146
+ end
147
+
148
+ specify "should cache #{mime_type} responses with the relevant extension ('#{extension}') added if not already present" do
149
+ request(:path=>'/a', :headers=>{'CT'=>mime_type})
150
+ @cache.should.equal("/a.#{extension}"=>@def_value)
151
+ end
152
+ end
153
+ end
154
+
155
+ specify "should cache 'text/html' responses with the extension ('htm') unchanged" do
156
+ request(:path=>"/a.htm", :headers=>{'CT'=>"text/html"})
157
+ @cache.should.equal("/a.htm"=>@def_value)
158
+ end
159
+
160
+ [:css, :xml, :xhtml, :js, :txt, :pdf, :csv].each do |extension|
161
+ specify "should not cache if extension and content-type don't agree" do
162
+ request(:path=>"/d.#{extension}", :headers=>{'CT'=>'text/html'})
163
+ @cache.should.equal({})
164
+ end
165
+ end
166
+
167
+ specify "should cache html responses with empty basename to index.html by default" do
168
+ request(:path=>'/')
169
+ @cache.should.equal('/index.html'=>@def_value)
170
+ request(:path=>'/blah/')
171
+ @cache.should.equal('/index.html'=>@def_value, '/blah/index.html'=>@def_value)
172
+ request(:path=>'/blah/2/')
173
+ @cache.should.equal('/index.html'=>@def_value, '/blah/index.html'=>@def_value, '/blah/2/index.html'=>@def_value)
174
+ end
175
+
176
+ specify "should raise an error if a cache argument is not provided" do
177
+ app = Rack::Builder.new{use Rack::ResponseCache; run lambda { |env| [200, {'Content-Type' => 'text/plain'}, Rack::Request.new(env).POST]}}
178
+ proc{Rack::MockRequest.new(app).get('/')}.should.raise(ArgumentError)
179
+ end
180
+
181
+ end
@@ -0,0 +1,86 @@
1
+ require 'test/spec'
2
+ require 'rack/mock'
3
+ require 'rack/contrib/sendfile'
4
+
5
+ context "Rack::File" do
6
+ specify "should respond to #to_path" do
7
+ Rack::File.new(Dir.pwd).should.respond_to :to_path
8
+ end
9
+ end
10
+
11
+ context "Rack::Sendfile" do
12
+ def sendfile_body
13
+ res = ['Hello World']
14
+ def res.to_path ; "/tmp/hello.txt" ; end
15
+ res
16
+ end
17
+
18
+ def simple_app(body=sendfile_body)
19
+ lambda { |env| [200, {'Content-Type' => 'text/plain'}, body] }
20
+ end
21
+
22
+ def sendfile_app(body=sendfile_body)
23
+ Rack::Sendfile.new(simple_app(body))
24
+ end
25
+
26
+ setup do
27
+ @request = Rack::MockRequest.new(sendfile_app)
28
+ end
29
+
30
+ def request(headers={})
31
+ yield @request.get('/', headers)
32
+ end
33
+
34
+ specify "does nothing when no X-Sendfile-Type header present" do
35
+ request do |response|
36
+ response.should.be.ok
37
+ response.body.should.equal 'Hello World'
38
+ response.headers.should.not.include 'X-Sendfile'
39
+ end
40
+ end
41
+
42
+ specify "sets X-Sendfile response header and discards body" do
43
+ request 'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile' do |response|
44
+ response.should.be.ok
45
+ response.body.should.be.empty
46
+ response.headers['X-Sendfile'].should.equal '/tmp/hello.txt'
47
+ end
48
+ end
49
+
50
+ specify "sets X-Lighttpd-Send-File response header and discards body" do
51
+ request 'HTTP_X_SENDFILE_TYPE' => 'X-Lighttpd-Send-File' do |response|
52
+ response.should.be.ok
53
+ response.body.should.be.empty
54
+ response.headers['X-Lighttpd-Send-File'].should.equal '/tmp/hello.txt'
55
+ end
56
+ end
57
+
58
+ specify "sets X-Accel-Redirect response header and discards body" do
59
+ headers = {
60
+ 'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect',
61
+ 'HTTP_X_ACCEL_MAPPING' => '/tmp/=/foo/bar/'
62
+ }
63
+ request headers do |response|
64
+ response.should.be.ok
65
+ response.body.should.be.empty
66
+ response.headers['X-Accel-Redirect'].should.equal '/foo/bar/hello.txt'
67
+ end
68
+ end
69
+
70
+ specify 'writes to rack.error when no X-Accel-Mapping is specified' do
71
+ request 'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect' do |response|
72
+ response.should.be.ok
73
+ response.body.should.equal 'Hello World'
74
+ response.headers.should.not.include 'X-Accel-Redirect'
75
+ response.errors.should.include 'X-Accel-Mapping'
76
+ end
77
+ end
78
+
79
+ specify 'does nothing when body does not respond to #to_path' do
80
+ @request = Rack::MockRequest.new(sendfile_app(['Not a file...']))
81
+ request 'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile' do |response|
82
+ response.body.should.equal 'Not a file...'
83
+ response.headers.should.not.include 'X-Sendfile'
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,88 @@
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 = 'tricycle-rack-contrib'
6
+ s.version = '0.9.0'
7
+ s.date = '2010-01-06'
8
+
9
+ s.description = "Contributed Rack Middleware and Utilities, including Tricycle's modifications"
10
+ s.summary = "Contributed Rack Middleware and Utilities, including Tricycle's modifications"
11
+
12
+ s.authors = ["tricycle", "rack-devel"]
13
+ s.email = "gems@tricycledevelopments.com"
14
+
15
+ # = MANIFEST =
16
+ s.files = %w[
17
+ COPYING
18
+ README.rdoc
19
+ Rakefile
20
+ lib/rack/contrib.rb
21
+ lib/rack/contrib/accept_format.rb
22
+ lib/rack/contrib/backstage.rb
23
+ lib/rack/contrib/bounce_favicon.rb
24
+ lib/rack/contrib/callbacks.rb
25
+ lib/rack/contrib/config.rb
26
+ lib/rack/contrib/cookies.rb
27
+ lib/rack/contrib/csshttprequest.rb
28
+ lib/rack/contrib/deflect.rb
29
+ lib/rack/contrib/etag.rb
30
+ lib/rack/contrib/evil.rb
31
+ lib/rack/contrib/garbagecollector.rb
32
+ lib/rack/contrib/jsonp.rb
33
+ lib/rack/contrib/lighttpd_script_name_fix.rb
34
+ lib/rack/contrib/locale.rb
35
+ lib/rack/contrib/mailexceptions.rb
36
+ lib/rack/contrib/nested_params.rb
37
+ lib/rack/contrib/not_found.rb
38
+ lib/rack/contrib/post_body_content_type_parser.rb
39
+ lib/rack/contrib/proctitle.rb
40
+ lib/rack/contrib/profiler.rb
41
+ lib/rack/contrib/relative_redirect.rb
42
+ lib/rack/contrib/response_cache.rb
43
+ lib/rack/contrib/route_exceptions.rb
44
+ lib/rack/contrib/sendfile.rb
45
+ lib/rack/contrib/signals.rb
46
+ lib/rack/contrib/time_zone.rb
47
+ tricycle-rack-contrib.gemspec
48
+ test/404.html
49
+ test/Maintenance.html
50
+ test/mail_settings.rb
51
+ test/spec_rack_accept_format.rb
52
+ test/spec_rack_backstage.rb
53
+ test/spec_rack_callbacks.rb
54
+ test/spec_rack_config.rb
55
+ test/spec_rack_contrib.rb
56
+ test/spec_rack_csshttprequest.rb
57
+ test/spec_rack_deflect.rb
58
+ test/spec_rack_etag.rb
59
+ test/spec_rack_evil.rb
60
+ test/spec_rack_garbagecollector.rb
61
+ test/spec_rack_jsonp.rb
62
+ test/spec_rack_lighttpd_script_name_fix.rb
63
+ test/spec_rack_mailexceptions.rb
64
+ test/spec_rack_nested_params.rb
65
+ test/spec_rack_not_found.rb
66
+ test/spec_rack_post_body_content_type_parser.rb
67
+ test/spec_rack_proctitle.rb
68
+ test/spec_rack_profiler.rb
69
+ test/spec_rack_relative_redirect.rb
70
+ test/spec_rack_response_cache.rb
71
+ test/spec_rack_sendfile.rb
72
+ ]
73
+ # = MANIFEST =
74
+
75
+ s.test_files = s.files.select {|path| path =~ /^test\/spec_.*\.rb/}
76
+
77
+ s.extra_rdoc_files = %w[README.rdoc COPYING]
78
+ s.add_dependency 'rack', '>= 0.9.1'
79
+ s.add_development_dependency 'test-spec', '~> 0.9.0'
80
+ s.add_development_dependency 'tmail', '>= 1.2'
81
+ s.add_development_dependency 'json', '>= 1.1'
82
+
83
+ s.has_rdoc = true
84
+ s.homepage = "http://github.com/tricycle/rack-contrib/"
85
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "tricycle-rack-contrib", "--main", "README"]
86
+ s.require_paths = %w[lib]
87
+ s.rubygems_version = '1.1.1'
88
+ end
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tricycle-rack-contrib
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
+ platform: ruby
6
+ authors:
7
+ - tricycle
8
+ - rack-devel
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2010-01-06 00:00:00 +11:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rack
18
+ type: :runtime
19
+ version_requirement:
20
+ version_requirements: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: 0.9.1
25
+ version:
26
+ - !ruby/object:Gem::Dependency
27
+ name: test-spec
28
+ type: :development
29
+ version_requirement:
30
+ version_requirements: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: 0.9.0
35
+ version:
36
+ - !ruby/object:Gem::Dependency
37
+ name: tmail
38
+ type: :development
39
+ version_requirement:
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: "1.2"
45
+ version:
46
+ - !ruby/object:Gem::Dependency
47
+ name: json
48
+ type: :development
49
+ version_requirement:
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: "1.1"
55
+ version:
56
+ description: Contributed Rack Middleware and Utilities, including Tricycle's modifications
57
+ email: gems@tricycledevelopments.com
58
+ executables: []
59
+
60
+ extensions: []
61
+
62
+ extra_rdoc_files:
63
+ - README.rdoc
64
+ - COPYING
65
+ files:
66
+ - COPYING
67
+ - README.rdoc
68
+ - Rakefile
69
+ - lib/rack/contrib.rb
70
+ - lib/rack/contrib/accept_format.rb
71
+ - lib/rack/contrib/backstage.rb
72
+ - lib/rack/contrib/bounce_favicon.rb
73
+ - lib/rack/contrib/callbacks.rb
74
+ - lib/rack/contrib/config.rb
75
+ - lib/rack/contrib/cookies.rb
76
+ - lib/rack/contrib/csshttprequest.rb
77
+ - lib/rack/contrib/deflect.rb
78
+ - lib/rack/contrib/etag.rb
79
+ - lib/rack/contrib/evil.rb
80
+ - lib/rack/contrib/garbagecollector.rb
81
+ - lib/rack/contrib/jsonp.rb
82
+ - lib/rack/contrib/lighttpd_script_name_fix.rb
83
+ - lib/rack/contrib/locale.rb
84
+ - lib/rack/contrib/mailexceptions.rb
85
+ - lib/rack/contrib/nested_params.rb
86
+ - lib/rack/contrib/not_found.rb
87
+ - lib/rack/contrib/post_body_content_type_parser.rb
88
+ - lib/rack/contrib/proctitle.rb
89
+ - lib/rack/contrib/profiler.rb
90
+ - lib/rack/contrib/relative_redirect.rb
91
+ - lib/rack/contrib/response_cache.rb
92
+ - lib/rack/contrib/route_exceptions.rb
93
+ - lib/rack/contrib/sendfile.rb
94
+ - lib/rack/contrib/signals.rb
95
+ - lib/rack/contrib/time_zone.rb
96
+ - tricycle-rack-contrib.gemspec
97
+ - test/404.html
98
+ - test/Maintenance.html
99
+ - test/mail_settings.rb
100
+ - test/spec_rack_accept_format.rb
101
+ - test/spec_rack_backstage.rb
102
+ - test/spec_rack_callbacks.rb
103
+ - test/spec_rack_config.rb
104
+ - test/spec_rack_contrib.rb
105
+ - test/spec_rack_csshttprequest.rb
106
+ - test/spec_rack_deflect.rb
107
+ - test/spec_rack_etag.rb
108
+ - test/spec_rack_evil.rb
109
+ - test/spec_rack_garbagecollector.rb
110
+ - test/spec_rack_jsonp.rb
111
+ - test/spec_rack_lighttpd_script_name_fix.rb
112
+ - test/spec_rack_mailexceptions.rb
113
+ - test/spec_rack_nested_params.rb
114
+ - test/spec_rack_not_found.rb
115
+ - test/spec_rack_post_body_content_type_parser.rb
116
+ - test/spec_rack_proctitle.rb
117
+ - test/spec_rack_profiler.rb
118
+ - test/spec_rack_relative_redirect.rb
119
+ - test/spec_rack_response_cache.rb
120
+ - test/spec_rack_sendfile.rb
121
+ has_rdoc: true
122
+ homepage: http://github.com/tricycle/rack-contrib/
123
+ licenses: []
124
+
125
+ post_install_message:
126
+ rdoc_options:
127
+ - --line-numbers
128
+ - --inline-source
129
+ - --title
130
+ - tricycle-rack-contrib
131
+ - --main
132
+ - README
133
+ require_paths:
134
+ - lib
135
+ required_ruby_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: "0"
140
+ version:
141
+ required_rubygems_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: "0"
146
+ version:
147
+ requirements: []
148
+
149
+ rubyforge_project:
150
+ rubygems_version: 1.3.5
151
+ signing_key:
152
+ specification_version: 2
153
+ summary: Contributed Rack Middleware and Utilities, including Tricycle's modifications
154
+ test_files:
155
+ - test/spec_rack_accept_format.rb
156
+ - test/spec_rack_backstage.rb
157
+ - test/spec_rack_callbacks.rb
158
+ - test/spec_rack_config.rb
159
+ - test/spec_rack_contrib.rb
160
+ - test/spec_rack_csshttprequest.rb
161
+ - test/spec_rack_deflect.rb
162
+ - test/spec_rack_etag.rb
163
+ - test/spec_rack_evil.rb
164
+ - test/spec_rack_garbagecollector.rb
165
+ - test/spec_rack_jsonp.rb
166
+ - test/spec_rack_lighttpd_script_name_fix.rb
167
+ - test/spec_rack_mailexceptions.rb
168
+ - test/spec_rack_nested_params.rb
169
+ - test/spec_rack_not_found.rb
170
+ - test/spec_rack_post_body_content_type_parser.rb
171
+ - test/spec_rack_proctitle.rb
172
+ - test/spec_rack_profiler.rb
173
+ - test/spec_rack_relative_redirect.rb
174
+ - test/spec_rack_response_cache.rb
175
+ - test/spec_rack_sendfile.rb