mdub-sham_rack 1.0.0 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/CHANGES.markdown +13 -0
- data/README.markdown +16 -8
- data/Rakefile +29 -11
- data/VERSION.yml +2 -2
- data/lib/sham_rack.rb +6 -0
- data/lib/sham_rack/http.rb +25 -3
- data/lib/sham_rack/registry.rb +30 -16
- data/sham_rack.gemspec +50 -0
- data/spec/sham_rack_spec.rb +73 -25
- metadata +6 -3
data/.gitignore
ADDED
data/CHANGES.markdown
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
## 5-Jun-2009 [mdub@dogbiscuit.org]
|
2
|
+
|
3
|
+
* Add support for Net::HTTP.get_response.
|
4
|
+
* Pass back headers provided by Rack app in the HTTPResponse.
|
5
|
+
|
6
|
+
## 3-Jun-2009 [mdub@dogbiscuit.org]
|
7
|
+
|
8
|
+
* Introduced ShamRack#at to simplify registration of apps.
|
9
|
+
|
10
|
+
## 13-May-2009 [mdub@dogbiscuit.org]
|
11
|
+
|
12
|
+
* Added accessors on HTTP object for address, port and rack_app.
|
13
|
+
* Added accessors to imitate "net/https".
|
data/README.markdown
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
ShamRack
|
2
2
|
========
|
3
3
|
|
4
|
-
ShamRack plumbs Net:HTTP into [Rack][rack]
|
4
|
+
ShamRack plumbs Net:HTTP into [Rack][rack].
|
5
5
|
|
6
6
|
What's it for, again?
|
7
7
|
---------------------
|
8
8
|
|
9
|
-
Well, you can _test your HTTP client code_, using ShamRack to
|
9
|
+
Well, you can _test your HTTP client code_, using ShamRack to stub out an external web-service. Think of it as [FakeWeb][fakeweb] on steriods.
|
10
10
|
|
11
|
-
Or, you can
|
11
|
+
Or, you can _test your Rack application_ (or Sinatra, or Rails, or Merb) using arbitrary HTTP client libraries, to check interoperability. For instance, you could hit a local app using:
|
12
12
|
|
13
13
|
* [`rest-client`][rest-client]
|
14
14
|
* [`httparty`][httparty]
|
@@ -23,17 +23,20 @@ Installing it
|
|
23
23
|
Using it
|
24
24
|
--------
|
25
25
|
|
26
|
+
### A simple inline application
|
27
|
+
|
26
28
|
require 'sham_rack'
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
|
30
|
+
ShamRack.at("www.example.com") do |env|
|
31
|
+
["200 OK", { "Content-type" => "text/plain" }, "Hello, world!"]
|
32
|
+
end
|
30
33
|
|
31
34
|
require 'open-uri'
|
32
35
|
open("http://www.example.com/").read #=> "Hello, world!"
|
33
36
|
|
34
37
|
### Sinatra integration
|
35
38
|
|
36
|
-
ShamRack.
|
39
|
+
ShamRack.at("sinatra.xyz").sinatra do
|
37
40
|
get "/hello/:subject" do
|
38
41
|
"Hello, #{params[:subject]}"
|
39
42
|
end
|
@@ -43,12 +46,16 @@ Using it
|
|
43
46
|
|
44
47
|
### Rackup support
|
45
48
|
|
46
|
-
ShamRack.
|
49
|
+
ShamRack.at("rackup.xyz").rackup do
|
47
50
|
use Some::Middleware
|
48
51
|
use Some::Other::Middleware
|
49
52
|
run MyApp.new
|
50
53
|
end
|
51
54
|
|
55
|
+
### Any old app
|
56
|
+
|
57
|
+
ShamRack.mount(my_google_stub, "google.com")
|
58
|
+
|
52
59
|
What's the catch?
|
53
60
|
-----------------
|
54
61
|
|
@@ -59,6 +66,7 @@ Thanks to
|
|
59
66
|
---------
|
60
67
|
|
61
68
|
* Blaine Cook for [FakeWeb][fakeweb], which was an inspiration for ShamRack.
|
69
|
+
* Perryn Fowler for his efforts plumbing Net::HTTP into ActionController::TestProcess.
|
62
70
|
* Christian Neukirchen et al for the chewy goodness that is [Rack][rack].
|
63
71
|
|
64
72
|
[rack]: http://rack.rubyforge.org/
|
data/Rakefile
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "rake"
|
3
|
+
|
1
4
|
require "spec/rake/spectask"
|
2
5
|
|
3
6
|
task "default" => "spec"
|
@@ -7,16 +10,31 @@ Spec::Rake::SpecTask.new do |t|
|
|
7
10
|
t.spec_files = FileList['spec/**/*_spec.rb']
|
8
11
|
end
|
9
12
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
require "jeweler"
|
14
|
+
|
15
|
+
Jeweler::Tasks.new do |g|
|
16
|
+
g.name = "sham_rack"
|
17
|
+
g.summary = "Net::HTTP-to-Rack plumbing"
|
18
|
+
g.email = "mdub@dogbiscuit.org"
|
19
|
+
g.homepage = "http://github.com/mdub/sham_rack"
|
20
|
+
g.description = "ShamRack plumbs Net::HTTP directly into Rack, for quick and easy HTTP testing."
|
21
|
+
g.authors = ["Mike Williams"]
|
22
|
+
g.rubyforge_project = "shamrack"
|
23
|
+
end
|
24
|
+
|
25
|
+
Jeweler::RubyforgeTasks.new
|
26
|
+
|
27
|
+
require 'rake/rdoctask'
|
28
|
+
Rake::RDocTask.new do |rdoc|
|
29
|
+
if File.exist?('VERSION.yml')
|
30
|
+
config = YAML.load(File.read('VERSION.yml'))
|
31
|
+
version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
|
32
|
+
else
|
33
|
+
version = ""
|
19
34
|
end
|
20
|
-
|
21
|
-
|
35
|
+
|
36
|
+
rdoc.rdoc_dir = 'rdoc'
|
37
|
+
rdoc.title = "ShamRack #{version}"
|
38
|
+
rdoc.main = "ShamRack"
|
39
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
22
40
|
end
|
data/VERSION.yml
CHANGED
data/lib/sham_rack.rb
CHANGED
data/lib/sham_rack/http.rb
CHANGED
@@ -8,13 +8,16 @@ module ShamRack
|
|
8
8
|
@port = port
|
9
9
|
@rack_app = rack_app
|
10
10
|
end
|
11
|
+
|
12
|
+
attr_reader :address, :port, :rack_app
|
11
13
|
|
14
|
+
attr_accessor :read_timeout, :open_timeout
|
15
|
+
attr_accessor :use_ssl,:key, :cert, :ca_file, :ca_path, :verify_mode, :verify_callback, :verify_depth, :cert_store
|
16
|
+
|
12
17
|
def start
|
13
18
|
yield self
|
14
19
|
end
|
15
|
-
|
16
|
-
attr_accessor :use_ssl, :verify_mode, :read_timeout, :open_timeout
|
17
|
-
|
20
|
+
|
18
21
|
def request(req, body = nil)
|
19
22
|
env = default_env
|
20
23
|
env.merge!(path_env(req.path))
|
@@ -26,6 +29,22 @@ module ShamRack
|
|
26
29
|
return response
|
27
30
|
end
|
28
31
|
|
32
|
+
def request_get(path, initheader = nil, &block)
|
33
|
+
request Net::HTTP::Get.new(path, initheader), &block
|
34
|
+
end
|
35
|
+
|
36
|
+
def request_head(path, initheader = nil, &block)
|
37
|
+
request Net::HTTP::Head.new(path, initheader), &block
|
38
|
+
end
|
39
|
+
|
40
|
+
def request_post(path, data, initheader = nil, &block)
|
41
|
+
request Net::HTTP::Post.new(path, initheader), data, &block
|
42
|
+
end
|
43
|
+
|
44
|
+
def request_put(path, data, initheader = nil, &block)
|
45
|
+
request Net::HTTP::Put.new(path, initheader), data, &block
|
46
|
+
end
|
47
|
+
|
29
48
|
private
|
30
49
|
|
31
50
|
def default_env
|
@@ -81,6 +100,9 @@ module ShamRack
|
|
81
100
|
response = Net::HTTPResponse.send(:response_class, code).new("Sham", code, message)
|
82
101
|
response.instance_variable_set(:@body, assemble_body(body))
|
83
102
|
response.instance_variable_set(:@read, true)
|
103
|
+
headers.each do |k,v|
|
104
|
+
response.add_field(k, v)
|
105
|
+
end
|
84
106
|
response.extend ShamRack::ResponseExtensions
|
85
107
|
return response
|
86
108
|
end
|
data/lib/sham_rack/registry.rb
CHANGED
@@ -7,25 +7,17 @@ module ShamRack
|
|
7
7
|
registry[[address, port]] = rack_app
|
8
8
|
end
|
9
9
|
|
10
|
-
def rackup(address, port = nil, &block)
|
11
|
-
app = Rack::Builder.new(&block).to_app
|
12
|
-
mount(app, address, port)
|
13
|
-
end
|
14
|
-
|
15
|
-
def lambda(address, port = nil, &block)
|
16
|
-
mount(block, address, port)
|
17
|
-
end
|
18
|
-
|
19
|
-
def sinatra(address, port = nil, &block)
|
20
|
-
require "sinatra/base"
|
21
|
-
sinatra_app = Class.new(Sinatra::Base)
|
22
|
-
sinatra_app.class_eval(&block)
|
23
|
-
mount(sinatra_app.new, address, port)
|
24
|
-
end
|
25
|
-
|
26
10
|
def unmount_all
|
27
11
|
registry.clear
|
28
12
|
end
|
13
|
+
|
14
|
+
def at(address, port = nil, &block)
|
15
|
+
if block
|
16
|
+
mount(block, address, port)
|
17
|
+
else
|
18
|
+
Registrar.new(address, port)
|
19
|
+
end
|
20
|
+
end
|
29
21
|
|
30
22
|
def application_for(address, port = nil)
|
31
23
|
port ||= Net::HTTP.default_port
|
@@ -42,4 +34,26 @@ module ShamRack
|
|
42
34
|
|
43
35
|
extend Registry
|
44
36
|
|
37
|
+
class Registrar
|
38
|
+
|
39
|
+
def initialize(address, port = nil)
|
40
|
+
@address = address
|
41
|
+
@port = port
|
42
|
+
end
|
43
|
+
|
44
|
+
def rackup(&block)
|
45
|
+
require "rack"
|
46
|
+
app = Rack::Builder.new(&block).to_app
|
47
|
+
ShamRack.mount(app, @address, @port)
|
48
|
+
end
|
49
|
+
|
50
|
+
def sinatra(&block)
|
51
|
+
require "sinatra/base"
|
52
|
+
sinatra_app = Class.new(Sinatra::Base)
|
53
|
+
sinatra_app.class_eval(&block)
|
54
|
+
ShamRack.mount(sinatra_app.new, @address, @port)
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
45
59
|
end
|
data/sham_rack.gemspec
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{sham_rack}
|
5
|
+
s.version = "1.1.2"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Mike Williams"]
|
9
|
+
s.date = %q{2009-06-05}
|
10
|
+
s.description = %q{ShamRack plumbs Net::HTTP directly into Rack, for quick and easy HTTP testing.}
|
11
|
+
s.email = %q{mdub@dogbiscuit.org}
|
12
|
+
s.extra_rdoc_files = [
|
13
|
+
"README.markdown"
|
14
|
+
]
|
15
|
+
s.files = [
|
16
|
+
".gitignore",
|
17
|
+
"CHANGES.markdown",
|
18
|
+
"README.markdown",
|
19
|
+
"Rakefile",
|
20
|
+
"VERSION.yml",
|
21
|
+
"lib/sham_rack.rb",
|
22
|
+
"lib/sham_rack/core_ext/net/http.rb",
|
23
|
+
"lib/sham_rack/http.rb",
|
24
|
+
"lib/sham_rack/registry.rb",
|
25
|
+
"sham_rack.gemspec",
|
26
|
+
"spec/sham_rack_spec.rb",
|
27
|
+
"spec/spec_helper.rb"
|
28
|
+
]
|
29
|
+
s.has_rdoc = true
|
30
|
+
s.homepage = %q{http://github.com/mdub/sham_rack}
|
31
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
32
|
+
s.require_paths = ["lib"]
|
33
|
+
s.rubyforge_project = %q{shamrack}
|
34
|
+
s.rubygems_version = %q{1.3.2}
|
35
|
+
s.summary = %q{Net::HTTP-to-Rack plumbing}
|
36
|
+
s.test_files = [
|
37
|
+
"spec/sham_rack_spec.rb",
|
38
|
+
"spec/spec_helper.rb"
|
39
|
+
]
|
40
|
+
|
41
|
+
if s.respond_to? :specification_version then
|
42
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
43
|
+
s.specification_version = 3
|
44
|
+
|
45
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
46
|
+
else
|
47
|
+
end
|
48
|
+
else
|
49
|
+
end
|
50
|
+
end
|
data/spec/sham_rack_spec.rb
CHANGED
@@ -75,6 +75,11 @@ describe ShamRack do
|
|
75
75
|
response.body.should == "Hello, world"
|
76
76
|
end
|
77
77
|
|
78
|
+
it "can be accessed using Net::HTTP#get_response" do
|
79
|
+
response = Net::HTTP.get_response(URI.parse("http://www.test.xyz/"))
|
80
|
+
response.body.should == "Hello, world"
|
81
|
+
end
|
82
|
+
|
78
83
|
it "can be accessed using open-uri" do
|
79
84
|
response = open("http://www.test.xyz")
|
80
85
|
response.status.should == ["200", "OK"]
|
@@ -89,47 +94,90 @@ describe ShamRack do
|
|
89
94
|
|
90
95
|
end
|
91
96
|
|
92
|
-
describe "
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
97
|
+
describe "response" do
|
98
|
+
|
99
|
+
before(:each) do
|
100
|
+
ShamRack.at("www.test.xyz") do
|
101
|
+
[
|
102
|
+
"201 Created",
|
103
|
+
{ "Content-Type" => "text/plain", "X-Foo" => "bar" },
|
104
|
+
"BODY"
|
105
|
+
]
|
99
106
|
end
|
100
|
-
|
101
|
-
|
102
|
-
|
107
|
+
@response = Net::HTTP.get_response(URI.parse("http://www.test.xyz/"))
|
108
|
+
end
|
109
|
+
|
110
|
+
it "has status returned by app" do
|
111
|
+
@response.code.should == "201"
|
103
112
|
end
|
104
113
|
|
114
|
+
it "has body returned by app" do
|
115
|
+
@response.body.should == "BODY"
|
116
|
+
end
|
117
|
+
|
118
|
+
it "has Content-Type returned by app" do
|
119
|
+
@response.content_type.should == "text/plain"
|
120
|
+
end
|
121
|
+
|
122
|
+
it "has other headers returned by app" do
|
123
|
+
@response["x-foo"].should =="bar"
|
124
|
+
end
|
125
|
+
|
105
126
|
end
|
127
|
+
|
128
|
+
describe "#at" do
|
106
129
|
|
107
|
-
|
130
|
+
describe "with a block" do
|
108
131
|
|
109
|
-
|
132
|
+
it "mounts associated block as an app" do
|
110
133
|
|
111
|
-
|
112
|
-
|
113
|
-
|
134
|
+
ShamRack.at("simple.xyz") do |env|
|
135
|
+
["200 OK", { "Content-type" => "text/plain" }, "Easy, huh?"]
|
136
|
+
end
|
114
137
|
|
115
|
-
|
138
|
+
open("http://simple.xyz").read.should == "Easy, huh?"
|
139
|
+
|
140
|
+
end
|
116
141
|
|
117
142
|
end
|
118
143
|
|
119
|
-
|
144
|
+
describe "#rackup" do
|
120
145
|
|
121
|
-
|
146
|
+
before do
|
147
|
+
@return_value = ShamRack.at("rackup.xyz").rackup do
|
148
|
+
use UpcaseBody
|
149
|
+
run SimpleMessageApp.new("Racked!")
|
150
|
+
end
|
151
|
+
end
|
122
152
|
|
123
|
-
|
153
|
+
it "mounts an app created using Rack::Builder" do
|
154
|
+
open("http://rackup.xyz").read.should == "RACKED!"
|
155
|
+
end
|
124
156
|
|
125
|
-
|
126
|
-
|
127
|
-
"Hello, #{params[:subject]}"
|
128
|
-
end
|
157
|
+
it "returns the app" do
|
158
|
+
@return_value.should respond_to(:call)
|
129
159
|
end
|
130
160
|
|
131
|
-
|
161
|
+
end
|
162
|
+
|
163
|
+
describe "#sinatra" do
|
132
164
|
|
165
|
+
before do
|
166
|
+
@return_value = ShamRack.at("sinatra.xyz").sinatra do
|
167
|
+
get "/hello/:subject" do
|
168
|
+
"Hello, #{params[:subject]}"
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
it "mounts associated block as a Sinatra app" do
|
174
|
+
open("http://sinatra.xyz/hello/stranger").read.should == "Hello, stranger"
|
175
|
+
end
|
176
|
+
|
177
|
+
it "returns the app" do
|
178
|
+
@return_value.should respond_to(:call)
|
179
|
+
end
|
180
|
+
|
133
181
|
end
|
134
182
|
|
135
183
|
end
|
@@ -138,7 +186,7 @@ describe ShamRack do
|
|
138
186
|
|
139
187
|
before(:each) do
|
140
188
|
@env_recorder = recorder = EnvRecordingApp.new
|
141
|
-
ShamRack.
|
189
|
+
ShamRack.at("env.xyz").rackup do
|
142
190
|
use Rack::Lint
|
143
191
|
run recorder
|
144
192
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mdub-sham_rack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Williams
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-05
|
12
|
+
date: 2009-06-05 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -22,6 +22,8 @@ extensions: []
|
|
22
22
|
extra_rdoc_files:
|
23
23
|
- README.markdown
|
24
24
|
files:
|
25
|
+
- .gitignore
|
26
|
+
- CHANGES.markdown
|
25
27
|
- README.markdown
|
26
28
|
- Rakefile
|
27
29
|
- VERSION.yml
|
@@ -29,6 +31,7 @@ files:
|
|
29
31
|
- lib/sham_rack/core_ext/net/http.rb
|
30
32
|
- lib/sham_rack/http.rb
|
31
33
|
- lib/sham_rack/registry.rb
|
34
|
+
- sham_rack.gemspec
|
32
35
|
- spec/sham_rack_spec.rb
|
33
36
|
- spec/spec_helper.rb
|
34
37
|
has_rdoc: true
|
@@ -52,7 +55,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
52
55
|
version:
|
53
56
|
requirements: []
|
54
57
|
|
55
|
-
rubyforge_project:
|
58
|
+
rubyforge_project: shamrack
|
56
59
|
rubygems_version: 1.2.0
|
57
60
|
signing_key:
|
58
61
|
specification_version: 3
|