rack-rest_book 1.0.2
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/Gemfile +6 -0
- data/README.markdown +22 -0
- data/lib/rack/rest_book.rb +21 -0
- data/test/test.rb +66 -0
- metadata +118 -0
data/Gemfile
ADDED
data/README.markdown
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Rack::RestBook
|
2
|
+
==============================================
|
3
|
+
|
4
|
+
Make all POST calls become GET. This allows us to do REST development with Facebook, which will always send a POST with iframes (as of March 10, 2011).
|
5
|
+
If you need to actually POST something, add this parameter to the query string: \_method=METHOD (so \_method=post, \_method=put, or \_method=delete).
|
6
|
+
|
7
|
+
Your application will still respond to real HTTP verbs as long as they are not POST. Rack::RestBook ignores other verbs.
|
8
|
+
|
9
|
+
The real documentation for this gem is in test/test.rb.
|
10
|
+
|
11
|
+
Installation and Usage
|
12
|
+
---
|
13
|
+
|
14
|
+
$ gem install rack-rest_book
|
15
|
+
|
16
|
+
require 'rack/rest_book'
|
17
|
+
use Rack::RestBook
|
18
|
+
|
19
|
+
Testing
|
20
|
+
---
|
21
|
+
$ bundle install
|
22
|
+
$ ruby test/test.rb
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Rack
|
2
|
+
class RestBook
|
3
|
+
class RestBookError < StandardError; end
|
4
|
+
|
5
|
+
HTTP_METHODS = %w(GET HEAD PUT POST DELETE OPTIONS)
|
6
|
+
METHOD_OVERRIDE_PARAM_KEY = '_method'.freeze
|
7
|
+
HTTP_METHOD_OVERRIDE_HEADER = 'HTTP_X_HTTP_METHOD_OVERRIDE'.freeze
|
8
|
+
|
9
|
+
def initialize(app); @app = app end
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
if env['REQUEST_METHOD'] == 'POST'
|
13
|
+
req = Request.new env
|
14
|
+
meth = (req.params[METHOD_OVERRIDE_PARAM_KEY] || 'GET').to_s.upcase
|
15
|
+
raise RestBookError, "invalid HTTP verb for method override: #{req.params[METHOD_OVERRIDE_PARAM_KEY]}" unless HTTP_METHODS.include?(meth)
|
16
|
+
env['rack.methodoverride.original_method'] = env['REQUEST_METHOD'] and env['REQUEST_METHOD'] = meth unless meth == env['REQUEST_METHOD']
|
17
|
+
end
|
18
|
+
@app.call env
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/test/test.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
Bundler.setup
|
2
|
+
require 'bundler'
|
3
|
+
require 'test/unit'
|
4
|
+
require 'rack/test'
|
5
|
+
require 'contest'
|
6
|
+
require 'sinatra/base'
|
7
|
+
require 'lib/rack/rest_book'
|
8
|
+
|
9
|
+
def mock_app(base=Sinatra::Base, &block); @app = Sinatra.new base, &block end
|
10
|
+
def app; @app end
|
11
|
+
|
12
|
+
class RackRestBookTest < Test::Unit::TestCase
|
13
|
+
include Rack::Test::Methods
|
14
|
+
|
15
|
+
context 'an sinatra app using Rack::RestBook as middleware' do
|
16
|
+
setup do
|
17
|
+
mock_app do
|
18
|
+
set :show_exceptions, false
|
19
|
+
use Rack::RestBook
|
20
|
+
get('/') {'get'}
|
21
|
+
post('/') {'post'}
|
22
|
+
put('/') {'put'}
|
23
|
+
delete('/') {'delete'}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
test 'should translate POST requests to GET if method override is missing' do
|
28
|
+
post '/'
|
29
|
+
assert_equal 'get', last_response.body
|
30
|
+
end
|
31
|
+
|
32
|
+
test 'should provide GET, PUT and DELETE when set in method override' do
|
33
|
+
%w{post put delete}.each do |meth|
|
34
|
+
send meth.to_sym, '/', '_method' => meth.upcase
|
35
|
+
assert_equal meth, last_response.body
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
test 'responds to real HTTP verbs except POST' do
|
40
|
+
%w{get put delete}.each do |meth|
|
41
|
+
send meth.to_sym, '/'
|
42
|
+
assert_equal meth, last_response.body
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
test 'ignores method override with real HTTP verbs except POST' do
|
47
|
+
%w{get put delete}.each do |meth|
|
48
|
+
send meth.to_sym, '/', '_method' => 'POST'
|
49
|
+
assert_equal meth, last_response.body
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
test 'should respond to method override in a case insensitive way' do
|
54
|
+
['pOsT', 'pUt', 'DeLEtE', 'GeT'].each do |meth|
|
55
|
+
post '/', '_method' => meth
|
56
|
+
assert_equal meth.downcase, last_response.body
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
test 'should fail if given crazy method override' do
|
61
|
+
assert_raises Rack::RestBook::RestBookError do
|
62
|
+
post '/', '_method' => 'dade_murphy'
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
metadata
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rack-rest_book
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 19
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 2
|
10
|
+
version: 1.0.2
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Kyle Drake
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-03-02 00:00:00 -08:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rack
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 23
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
version: 1.0.0
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: sinatra
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - "="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 23
|
46
|
+
segments:
|
47
|
+
- 1
|
48
|
+
- 1
|
49
|
+
- 2
|
50
|
+
version: 1.1.2
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: contest
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - "="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 31
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
- 1
|
65
|
+
- 2
|
66
|
+
version: 0.1.2
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
69
|
+
description: Makes all POST calls assume GET. This allows us to do REST development with Facebook, which always sends POST
|
70
|
+
email:
|
71
|
+
- kyle.drake@dachisgroup.com
|
72
|
+
executables: []
|
73
|
+
|
74
|
+
extensions: []
|
75
|
+
|
76
|
+
extra_rdoc_files: []
|
77
|
+
|
78
|
+
files:
|
79
|
+
- lib/rack/rest_book.rb
|
80
|
+
- test/test.rb
|
81
|
+
- Gemfile
|
82
|
+
- README.markdown
|
83
|
+
has_rdoc: true
|
84
|
+
homepage: http://github.com/dachisgroup/rack-rest_book
|
85
|
+
licenses: []
|
86
|
+
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options: []
|
89
|
+
|
90
|
+
require_paths:
|
91
|
+
- lib
|
92
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
hash: 3
|
98
|
+
segments:
|
99
|
+
- 0
|
100
|
+
version: "0"
|
101
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
|
+
none: false
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
hash: 3
|
107
|
+
segments:
|
108
|
+
- 0
|
109
|
+
version: "0"
|
110
|
+
requirements: []
|
111
|
+
|
112
|
+
rubyforge_project: rack-rest_book
|
113
|
+
rubygems_version: 1.3.7
|
114
|
+
signing_key:
|
115
|
+
specification_version: 3
|
116
|
+
summary: Makes all POST calls assume GET for Facebook Development
|
117
|
+
test_files: []
|
118
|
+
|