mdub-sham_rack 1.0.0 → 1.1.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/.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
|