sham_rack 1.3.3 → 1.3.4
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.markdown +5 -0
- data/README.markdown +1 -1
- data/lib/sham_rack.rb +7 -5
- data/lib/sham_rack/net_http.rb +8 -7
- data/lib/sham_rack/patron.rb +11 -8
- data/lib/sham_rack/registry.rb +18 -11
- data/lib/sham_rack/version.rb +1 -1
- data/spec/sham_rack_spec.rb +29 -15
- metadata +40 -51
data/CHANGES.markdown
CHANGED
data/README.markdown
CHANGED
data/lib/sham_rack.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
require "sham_rack/net_http"
|
2
|
+
require "sham_rack/registry"
|
3
|
+
require "sham_rack/version"
|
4
|
+
|
1
5
|
# ShamRack allows access to Rack applications using Net::Http, but without network traffic.
|
2
6
|
#
|
3
7
|
# For more detail, see http://github.com/mdub/sham_rack
|
4
8
|
#
|
5
|
-
module ShamRack
|
6
|
-
|
7
|
-
|
8
|
-
require "sham_rack/registry"
|
9
|
-
require "sham_rack/version"
|
9
|
+
module ShamRack
|
10
|
+
extend ShamRack::Registry
|
11
|
+
end
|
data/lib/sham_rack/net_http.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
require "net/http"
|
2
|
+
require "rack"
|
2
3
|
require "sham_rack/registry"
|
3
4
|
|
4
|
-
class << Net::HTTP
|
5
|
+
class << Net::HTTP
|
5
6
|
|
6
7
|
alias :new_without_sham_rack :new
|
7
|
-
|
8
|
+
|
8
9
|
def new(address, port = nil, *proxy_args)
|
9
10
|
port ||= Net::HTTP.default_port
|
10
11
|
rack_app = ShamRack.application_for(address, port)
|
@@ -20,14 +21,14 @@ end
|
|
20
21
|
|
21
22
|
module ShamRack
|
22
23
|
module NetHttp
|
23
|
-
|
24
|
+
|
24
25
|
module Extensions
|
25
26
|
|
26
27
|
attr_accessor :rack_app
|
27
28
|
|
28
29
|
def start
|
29
30
|
if block_given?
|
30
|
-
yield self
|
31
|
+
yield self
|
31
32
|
else
|
32
33
|
self
|
33
34
|
end
|
@@ -47,14 +48,14 @@ module ShamRack
|
|
47
48
|
rack_env.merge!(header_env(request))
|
48
49
|
rack_env.merge!(server_env)
|
49
50
|
end
|
50
|
-
|
51
|
+
|
51
52
|
def server_env
|
52
53
|
{
|
53
|
-
"SERVER_NAME" => @address,
|
54
|
+
"SERVER_NAME" => @address,
|
54
55
|
"SERVER_PORT" => @port.to_s
|
55
56
|
}
|
56
57
|
end
|
57
|
-
|
58
|
+
|
58
59
|
def header_env(request)
|
59
60
|
env = {}
|
60
61
|
request.each_header do |header, content|
|
data/lib/sham_rack/patron.rb
CHANGED
@@ -34,13 +34,7 @@ module Patron
|
|
34
34
|
|
35
35
|
def patron_response(rack_response)
|
36
36
|
status, headers, body = rack_response
|
37
|
-
|
38
|
-
res = Patron::Response.new
|
39
|
-
res.instance_variable_set(:@status, status)
|
40
|
-
res.instance_variable_set(:@status_line, "HTTP/1.1 #{status} #{status_code}")
|
41
|
-
res.instance_variable_set(:@body, assemble_body(body))
|
42
|
-
res.instance_variable_set(:@headers, headers)
|
43
|
-
res
|
37
|
+
Patron::Response.new("", status.to_i, 0, assemble_headers(status, headers), assemble_body(body))
|
44
38
|
end
|
45
39
|
|
46
40
|
def header_env(patron_request)
|
@@ -53,6 +47,15 @@ module Patron
|
|
53
47
|
env
|
54
48
|
end
|
55
49
|
|
50
|
+
def assemble_headers(status, headers)
|
51
|
+
status_code = Rack::Utils::HTTP_STATUS_CODES[status.to_i]
|
52
|
+
content = "HTTP/1.1 #{status} #{status_code}\r\n"
|
53
|
+
headers.each do |k, v|
|
54
|
+
content << "#{k}: #{v}\r\n"
|
55
|
+
end
|
56
|
+
content
|
57
|
+
end
|
58
|
+
|
56
59
|
def assemble_body(body)
|
57
60
|
content = ""
|
58
61
|
body.each { |fragment| content << fragment }
|
@@ -61,4 +64,4 @@ module Patron
|
|
61
64
|
|
62
65
|
end
|
63
66
|
|
64
|
-
end
|
67
|
+
end
|
data/lib/sham_rack/registry.rb
CHANGED
@@ -1,12 +1,21 @@
|
|
1
1
|
module ShamRack
|
2
2
|
|
3
3
|
module Registry
|
4
|
-
|
4
|
+
|
5
|
+
ADDRESS_PATTERN = /^[a-z0-9-]+(\.[a-z0-9-]+)*$/i
|
6
|
+
|
5
7
|
def mount(rack_app, address, port = nil)
|
6
|
-
|
8
|
+
unless address =~ ADDRESS_PATTERN
|
9
|
+
raise ArgumentError, "invalid address"
|
10
|
+
end
|
11
|
+
if port.nil?
|
12
|
+
port = Net::HTTP.default_port
|
13
|
+
else
|
14
|
+
port = Integer(port)
|
15
|
+
end
|
7
16
|
registry[[address, port]] = rack_app
|
8
17
|
end
|
9
|
-
|
18
|
+
|
10
19
|
def unmount_all
|
11
20
|
registry.clear
|
12
21
|
end
|
@@ -18,24 +27,22 @@ module ShamRack
|
|
18
27
|
Registrar.new(address, port)
|
19
28
|
end
|
20
29
|
end
|
21
|
-
|
30
|
+
|
22
31
|
def application_for(address, port = nil)
|
23
32
|
port ||= Net::HTTP.default_port
|
24
33
|
registry[[address, port]]
|
25
34
|
end
|
26
35
|
|
27
36
|
private
|
28
|
-
|
37
|
+
|
29
38
|
def registry
|
30
39
|
@registry ||= {}
|
31
40
|
end
|
32
|
-
|
41
|
+
|
33
42
|
end
|
34
|
-
|
35
|
-
extend Registry
|
36
43
|
|
37
44
|
class Registrar
|
38
|
-
|
45
|
+
|
39
46
|
def initialize(address, port = nil)
|
40
47
|
@address = address
|
41
48
|
@port = port
|
@@ -46,7 +53,7 @@ module ShamRack
|
|
46
53
|
app = Rack::Builder.new(&block).to_app
|
47
54
|
ShamRack.mount(app, @address, @port)
|
48
55
|
end
|
49
|
-
|
56
|
+
|
50
57
|
def sinatra(&block)
|
51
58
|
require "sinatra/base"
|
52
59
|
sinatra_app = Class.new(Sinatra::Base)
|
@@ -58,7 +65,7 @@ module ShamRack
|
|
58
65
|
require "sham_rack/stub_web_service"
|
59
66
|
ShamRack.mount(StubWebService.new, @address, @port)
|
60
67
|
end
|
61
|
-
|
68
|
+
|
62
69
|
end
|
63
70
|
|
64
71
|
end
|
data/lib/sham_rack/version.rb
CHANGED
data/spec/sham_rack_spec.rb
CHANGED
@@ -56,6 +56,20 @@ describe ShamRack do
|
|
56
56
|
|
57
57
|
end
|
58
58
|
|
59
|
+
describe ".mount" do
|
60
|
+
|
61
|
+
context "with a URL" do
|
62
|
+
|
63
|
+
it "raises an ArgumentError" do
|
64
|
+
lambda do
|
65
|
+
ShamRack.mount(GreetingApp.new, "http://www.greetings.com")
|
66
|
+
end.should raise_error(ArgumentError, "invalid address")
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
59
73
|
describe ".at" do
|
60
74
|
|
61
75
|
describe "with a block" do
|
@@ -100,7 +114,7 @@ describe ShamRack do
|
|
100
114
|
end
|
101
115
|
end
|
102
116
|
end
|
103
|
-
|
117
|
+
|
104
118
|
it "mounts associated block as a Sinatra app" do
|
105
119
|
open("http://sinatra.xyz/hello/stranger").read.should == "Hello, stranger"
|
106
120
|
end
|
@@ -108,11 +122,11 @@ describe ShamRack do
|
|
108
122
|
it "returns the app" do
|
109
123
|
@return_value.should respond_to(:call)
|
110
124
|
end
|
111
|
-
|
125
|
+
|
112
126
|
end
|
113
127
|
|
114
128
|
describe "#stub" do
|
115
|
-
|
129
|
+
|
116
130
|
before do
|
117
131
|
@return_value = ShamRack.at("stubbed.xyz").stub
|
118
132
|
end
|
@@ -120,28 +134,28 @@ describe ShamRack do
|
|
120
134
|
it "mounts a StubWebService" do
|
121
135
|
ShamRack.application_for("stubbed.xyz").should be_kind_of(ShamRack::StubWebService)
|
122
136
|
end
|
123
|
-
|
137
|
+
|
124
138
|
it "returns the StubWebService" do
|
125
139
|
@return_value.should == ShamRack.application_for("stubbed.xyz")
|
126
140
|
end
|
127
|
-
|
141
|
+
|
128
142
|
end
|
129
|
-
|
143
|
+
|
130
144
|
end
|
131
145
|
|
132
146
|
describe "response" do
|
133
|
-
|
147
|
+
|
134
148
|
before(:each) do
|
135
149
|
ShamRack.at("www.greetings.com") do
|
136
150
|
[
|
137
|
-
"201 Created",
|
151
|
+
"201 Created",
|
138
152
|
{ "Content-Type" => "text/plain", "X-Foo" => "bar" },
|
139
153
|
["BODY"]
|
140
154
|
]
|
141
155
|
end
|
142
156
|
@response = Net::HTTP.get_response(URI.parse("http://www.greetings.com/"))
|
143
157
|
end
|
144
|
-
|
158
|
+
|
145
159
|
it "has status returned by app" do
|
146
160
|
@response.code.should == "201"
|
147
161
|
end
|
@@ -149,17 +163,17 @@ describe ShamRack do
|
|
149
163
|
it "has body returned by app" do
|
150
164
|
@response.body.should == "BODY"
|
151
165
|
end
|
152
|
-
|
166
|
+
|
153
167
|
it "has Content-Type returned by app" do
|
154
168
|
@response.content_type.should == "text/plain"
|
155
169
|
end
|
156
|
-
|
170
|
+
|
157
171
|
it "has other headers returned by app" do
|
158
172
|
@response["x-foo"].should =="bar"
|
159
173
|
end
|
160
|
-
|
174
|
+
|
161
175
|
end
|
162
|
-
|
176
|
+
|
163
177
|
describe "Rack environment" do
|
164
178
|
|
165
179
|
before(:each) do
|
@@ -232,8 +246,8 @@ describe ShamRack do
|
|
232
246
|
patron = Patron::Session.new
|
233
247
|
response = patron.post("http://env.xyz/resource", "<xml/>", "Content-Type" => "application/xml")
|
234
248
|
|
235
|
-
response.status.should ==
|
236
|
-
|
249
|
+
response.status.should == 200
|
250
|
+
|
237
251
|
env["REQUEST_METHOD"].should == "POST"
|
238
252
|
env["rack.input"].read.should == "<xml/>"
|
239
253
|
env["CONTENT_TYPE"].should == "application/xml"
|
metadata
CHANGED
@@ -1,46 +1,39 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: sham_rack
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 3
|
9
|
-
- 3
|
10
|
-
version: 1.3.3
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.3.4
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Mike Williams
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
dependencies:
|
21
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-05-01 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
22
15
|
name: rack
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
25
17
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
33
22
|
type: :runtime
|
34
|
-
|
35
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: ShamRack plumbs Net::HTTP directly into Rack, for quick and easy HTTP
|
31
|
+
testing.
|
36
32
|
email: mdub@dogbiscuit.org
|
37
33
|
executables: []
|
38
|
-
|
39
34
|
extensions: []
|
40
|
-
|
41
35
|
extra_rdoc_files: []
|
42
|
-
|
43
|
-
files:
|
36
|
+
files:
|
44
37
|
- lib/sham_rack/net_http.rb
|
45
38
|
- lib/sham_rack/patron.rb
|
46
39
|
- lib/sham_rack/registry.rb
|
@@ -56,41 +49,37 @@ files:
|
|
56
49
|
- Rakefile
|
57
50
|
- benchmark/benchmark.rb
|
58
51
|
- benchmark/hello_app.rb
|
59
|
-
has_rdoc: true
|
60
52
|
homepage: http://github.com/mdub/sham_rack
|
61
53
|
licenses: []
|
62
|
-
|
63
54
|
post_install_message:
|
64
55
|
rdoc_options: []
|
65
|
-
|
66
|
-
require_paths:
|
56
|
+
require_paths:
|
67
57
|
- lib
|
68
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
59
|
none: false
|
70
|
-
requirements:
|
71
|
-
- -
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
|
74
|
-
segments:
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
segments:
|
75
65
|
- 0
|
76
|
-
|
77
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
hash: -1856658297304903275
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
68
|
none: false
|
79
|
-
requirements:
|
80
|
-
- -
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
|
83
|
-
segments:
|
69
|
+
requirements:
|
70
|
+
- - ! '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
segments:
|
84
74
|
- 0
|
85
|
-
|
75
|
+
hash: -1856658297304903275
|
86
76
|
requirements: []
|
87
|
-
|
88
77
|
rubyforge_project: shamrack
|
89
|
-
rubygems_version: 1.
|
78
|
+
rubygems_version: 1.8.21
|
90
79
|
signing_key:
|
91
80
|
specification_version: 3
|
92
81
|
summary: Net::HTTP-to-Rack plumbing
|
93
|
-
test_files:
|
82
|
+
test_files:
|
94
83
|
- spec/sham_rack/stub_web_service_spec.rb
|
95
84
|
- spec/sham_rack_spec.rb
|
96
85
|
- spec/spec_helper.rb
|