rack_doubles 0.0.1

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 ADDED
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ .rvmrc
4
+ Gemfile.lock
5
+ pkg/*
6
+ .DS_Store
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in hubcaps.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,90 @@
1
+ # Rack Doubles
2
+
3
+ Rack Doubles is a simpler clone of [rack-stubs](https://github.com/featurist/rack-stubs) a rack middleware for stubbing reponses to GET requests on HTTP web services
4
+ Rack Doubles uses the HTTP PUT request method to create stubs
5
+
6
+ ## Installation
7
+
8
+ gem install rack_doubles
9
+
10
+ ## Rack Doubles middleware
11
+
12
+ Rack Doubles is implemented as rack middleware, so you would typically host it as part of a rack web app. You can write a rack configuration (`config.ru`) like this if you want to get started:
13
+
14
+ require 'rubygems'
15
+ require 'rack_doubles'
16
+
17
+ use RackDoubles::Middleware
18
+ run lambda { |e| [404, { 'Content-Type' => 'text/plain' }, ["Not found"]] }
19
+
20
+ Then you can run the rackup binary:
21
+
22
+ rackup
23
+
24
+ ...and you'll have a server with Rack Doubles running at http://127.0.0.1:9292
25
+
26
+ You create a stubbed response for a resource by issuing a PUT request to that resource location with a body that represents the tuple of http response you want to receive with a subsequent GET or POST request.
27
+ For example you want a HTTP GET requests to `/some-service` to return an HTTP `200` status, with the body `"Hello World"` and the `Content-Type:"text/plain"`.
28
+ Rack requires a `Content-Type` to be set for all responses so failure to include one in the stub request will generate a `400` response
29
+ Using a HTTP request tool such as [rest-client](https://github.com/archiloque/rest-client) or [httpparty](http://johnnunemaker.com/httparty) you make the following request:
30
+
31
+ method : PUT
32
+ action : http://127.0.0.1:9292/some-service
33
+ body : [200, { "Content-Type": "text/plain" }, ["Hello World"]]
34
+ headers : Content-Type=application/json
35
+
36
+ All subsequent GET requests to http://127.0.0.1:9292/some-service should now return the resonse:
37
+
38
+ HTTP 200 status,
39
+ Content-Type=text/plain
40
+ "Hello World"
41
+
42
+ The body of the PUT request is json, and is implemented as a hash of simple rack-style response tuples.
43
+
44
+ A list of all stubbed responses can be obtainined as a JSON representation by sending a GET request to '/'.
45
+
46
+ put /example, [200, { "Content-Type": "text/plain" }, ["Hello World"]]
47
+
48
+ then
49
+
50
+ get /
51
+
52
+ and the response body is:
53
+
54
+ {'/example: [200, { "Content-Type": "text/plain" }, ["Hello World"]] }
55
+
56
+ Individual stub responses can be removed by sending a DELETE request to their resource location, to remove all stubs send a DELETE request to '/'.
57
+
58
+ ## Logging
59
+
60
+ For basic mocking purposes individual counts for all the requests made to the stub service can be obtained by making a GET request to the url '/log':
61
+
62
+ put /example, [200, { "Content-Type": "text/plain" }, ["Hello World"]]
63
+
64
+ get /example
65
+ get /another-example
66
+ get /another-example
67
+
68
+ then
69
+
70
+ get /log
71
+
72
+ and the response body is:
73
+
74
+ {"/example": {"200": 1}, "/another-example": {"404": 2}}
75
+
76
+ ## Rack Doubles client
77
+
78
+ To use Rack Doubles from Ruby without invoking a HTTP PUT request, Rack Doubles includes a small client library.
79
+ To set up the same stub on a GET request to 'some-service' you would use the Rack Doubles client like this:
80
+
81
+ client = RackDoubles::Client.new("http://127.0.0.1:9292")
82
+ client.stub("/some-service").to_return(200, { "Content-Type" => "text/plain" }, ["Hello World"])
83
+
84
+ To delete individual stubs use:
85
+
86
+ client.delete some-service
87
+
88
+ and to delete all stub responses use:
89
+
90
+ client.delete_all
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/config.ru ADDED
@@ -0,0 +1,14 @@
1
+ require 'rack_doubles'
2
+
3
+ root=File.dirname(__FILE__)
4
+
5
+ map '/' do
6
+ run lambda { |e| [200, { 'Content-Type' => 'text/plain' }, ["Rack service is up"]] }
7
+ end
8
+
9
+ map '/rack-doubles' do
10
+ use RackDoubles::Middleware do
11
+ map to: '/rack-doubles'
12
+ end
13
+ run lambda { |e| [404, { 'Content-Type' => 'text/plain' }, ["404: Rack Doubles Stub Not Found"]] }
14
+ end
@@ -0,0 +1,44 @@
1
+ Transform /^(\d\d\d)$/ do |number|
2
+ number.to_i
3
+ end
4
+
5
+ Given /^all responses have been cleared$/ do
6
+ RackDoubles::Middleware.responses.clear
7
+ RackDoubles::Middleware.requests.clear
8
+ end
9
+
10
+ Given /^a GET request to "([^"]*)" returns "(\d+)" with the body "([^"]*)"$/ do |path, status, body|
11
+ get path
12
+ last_response.body.should == body
13
+ last_response.status.should == status
14
+ end
15
+
16
+ When /^I make a PUT request to "([^"]*)" with the body:$/ do |path, body|
17
+ put path, body, { 'Content-Type' => 'application/json' }
18
+ end
19
+
20
+ When /^I make a DELETE request to "([^"]*)"$/ do |path|
21
+ delete path
22
+ end
23
+
24
+ Then /^the response returns "([^"]*)" with the body:$/ do |status, body|
25
+ last_response.status.should == status
26
+ JSON.parse(last_response.body).should == JSON.parse(body)
27
+ end
28
+
29
+ Then /^the response returns "([^"]*)" with the body "([^"]*)"$/ do |status, body|
30
+ last_response.status.should == status
31
+ JSON.parse(last_response.body).should == JSON.parse(body)
32
+ end
33
+
34
+ Then /^a GET request to "([^"]*)" returns "([^"]*)" with the body:$/ do |path, status, body|
35
+ get path
36
+ last_response.status.should == status
37
+ JSON.parse(last_response.body).should == JSON.parse(body)
38
+ end
39
+
40
+ Then /^a GET request to "([^"]*)" returns "([^"]*)" with the head:$/ do |path, status, head|
41
+ get path
42
+ last_response.status.should == status
43
+ last_response.header.should include({"Location"=>"http://www.example.com"})
44
+ end
@@ -0,0 +1,95 @@
1
+ Feature: Stub Responses
2
+ In order to simulate behaviour of third-party web services
3
+ As a test for my application
4
+ I want to simulate http service behaviour
5
+
6
+ Background:
7
+ Given all responses have been cleared
8
+ Given a GET request to "/example-service" returns "404" with the body "Not Found"
9
+ And a GET request to "/another-example-service" returns "404" with the body "Not Found"
10
+
11
+ Scenario: Stub a url end point
12
+ When I make a PUT request to "/example-service" with the body:
13
+ """
14
+ [200, { "Content-Type": "text/plain" }, ["results"]]
15
+ """
16
+ Then the response returns "201" with the body:
17
+ """
18
+ { "url": "/example-service", "response": [200, { "Content-Type": "text/plain" }, ["results"]] }
19
+ """
20
+ And a GET request to "/example-service" returns "200" with the body "results"
21
+ And a GET request to "/" returns "200" with the body:
22
+ """
23
+ { "/example-service": [200, { "Content-Type": "text/plain" }, ["results"]] }
24
+ """
25
+ And a GET request to "/log" returns "200" with the body:
26
+ """
27
+ {"/example-service": {"404": 1, "200": 1}, "/another-example-service": {"404": 1}}
28
+ """
29
+
30
+ Scenario: Returns 400 if the stub request fails to contain a Content-Type pair
31
+ When I make a PUT request to "/example-service" with the body:
32
+ """
33
+ [200, { }, ["results"]]
34
+ """
35
+ Then the response returns "400" with the body:
36
+ """
37
+ {"reason": "Subbing a response requires the body of the PUT request to contain a tuple with the response status and header Content-Type"}
38
+ """
39
+
40
+ Scenario: Stub a url end point to 302
41
+ When I make a PUT request to "/redirect-this-request" with the body:
42
+ """
43
+ [302, { "Content-Type": "text/plain", "Location": "http://www.example.com" }, []]
44
+ """
45
+ Then the response returns "201" with the body:
46
+ """
47
+ { "url": "/redirect-this-request", "response": [302, { "Content-Type": "text/plain", "Location": "http://www.example.com" }, []] }
48
+ """
49
+ And a GET request to "/redirect-this-request" returns "302" with the head:
50
+ """
51
+ { "Content-Type": "text/plain", "Location": "http://www.example.com" }
52
+ """
53
+
54
+ Scenario: Clear all stub responses
55
+ When I make a PUT request to "/example-service" with the body:
56
+ """
57
+ [200, {}, ["Another response"]]
58
+ """
59
+ When I make a DELETE request to "/"
60
+ Then the response returns "200" with the body "{}"
61
+ And a GET request to "/" returns "200" with the body "{}"
62
+ And a GET request to "/example-service" returns "404" with the body "Not Found"
63
+ And a GET request to "/log" returns "200" with the body:
64
+ """
65
+ {"/example-service": {"404": 2}, "/another-example-service": {"404": 1}}
66
+ """
67
+
68
+ Scenario: Clear single stub responses
69
+ And I make a PUT request to "/example-service" with the body:
70
+ """
71
+ [200, { "Content-Type": "text/plain" }, ["Example response"]]
72
+ """
73
+ And I make a PUT request to "/another-example-service" with the body:
74
+ """
75
+ [200, { "Content-Type": "text/plain" }, ["Another response"]]
76
+ """
77
+ When I make a DELETE request to "/example-service"
78
+ Then the response returns "200" with the body:
79
+ """
80
+ {"/another-example-service": [200, { "Content-Type": "text/plain" }, ["Another response"]]}
81
+ """
82
+ And a GET request to "/example-service" returns "404" with the body "Not Found"
83
+ And a GET request to "/" returns "200" with the body:
84
+ """
85
+ {"/another-example-service": [200, { "Content-Type": "text/plain" }, ["Another response"]]}
86
+ """
87
+ And a GET request to "/log" returns "200" with the body:
88
+ """
89
+ {"/example-service": {"404": 2}, "/another-example-service": {"404": 1}}
90
+ """
91
+
92
+ Scenario: Clear the log
93
+ When I make a DELETE request to "/log"
94
+ Then the response returns "200" with the body "{}"
95
+ Then a GET request to "/log" returns "200" with the body "{}"
@@ -0,0 +1,14 @@
1
+ $: << './lib/rack_doubles'
2
+ require 'rack'
3
+ require 'middleware'
4
+ require 'rack/test'
5
+ require 'json'
6
+
7
+
8
+ module RackDoubles
9
+ def app
10
+ RackDoubles::Middleware.new(lambda{ |env| [404, {}, 'Not Found'] })
11
+ end
12
+ end
13
+
14
+ World(Rack::Test::Methods, RackDoubles)
@@ -0,0 +1,43 @@
1
+ require 'rest-client'
2
+
3
+ module RackDoubles
4
+
5
+ class Client
6
+
7
+ def initialize(service, http_client = RestClient)
8
+ @service = service
9
+ @http_client = http_client
10
+ end
11
+
12
+ def stub resource
13
+ @stub = Stub.new url_for(resource), @http_client
14
+ end
15
+
16
+ def delete resource
17
+ @http_client.delete url_for(resource)
18
+ end
19
+
20
+ def delete_all
21
+ @http_client.delete url_for('/')
22
+ end
23
+
24
+ def url_for path
25
+ @service.gsub(/\/+$/, '') + '/' + path.gsub(/^\/+/, '')
26
+ end
27
+
28
+ end
29
+
30
+ class Stub
31
+
32
+ def initialize url, http_client
33
+ @url = url
34
+ @http_client = http_client
35
+ end
36
+
37
+ def to_return status, headers, body
38
+ @http_client.put(@url, [200, headers, [body]].to_json, { 'Content-Type' => 'application/json' })
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,100 @@
1
+ require 'json'
2
+
3
+ module RackDoubles
4
+
5
+ class Middleware
6
+
7
+ @responses = {}
8
+ @requests = Hash.new { |hash, key| hash[key] = Hash.new(0) }
9
+
10
+ class << self; attr_accessor :responses, :requests, :errors; end
11
+
12
+ def responses
13
+ self.class.responses
14
+ end
15
+
16
+ def requests
17
+ self.class.requests
18
+ end
19
+
20
+ def errors
21
+ self.class.errors
22
+ end
23
+
24
+ def initialize(app, &block)
25
+ @app = app
26
+ @path = '/'
27
+ yield self if block_given?
28
+ end
29
+
30
+ attr_accessor :path
31
+
32
+ def call(env)
33
+ request = Rack::Request.new(env)
34
+ if request.get?
35
+ case request.path
36
+ when /#{path}\/?$/
37
+ [200, {"Content-Type" => "application/json"}, [responses.to_json]]
38
+ when /log\/?$/
39
+ [200, {"Content-Type" => "application/json"}, [requests.to_json]]
40
+ else
41
+ begin
42
+ response = responses.fetch(request.path)
43
+ record_success request.path
44
+ response
45
+ rescue KeyError
46
+ record_error request.path
47
+ @app.call(env)
48
+ end
49
+ end
50
+ elsif request.delete?
51
+ case request.path
52
+ when path
53
+ responses.clear
54
+ [200, {"Content-Type" => "application/json"}, [responses.to_json]]
55
+ when /\/log/
56
+ requests.clear
57
+ [200, {"Content-Type" => "application/json"}, [requests.to_json]]
58
+ else
59
+ responses.delete request.path
60
+ [200, {"Content-Type" => "application/json"}, [responses.to_json]]
61
+ end
62
+ elsif request.put?
63
+ body_of_request = JSON.parse(request.body.read.to_s)
64
+ status, headers, body = body_of_request
65
+ begin
66
+ raise ArgumentError if [status, headers].any?(&:nil?) || headers['Content-Type'].nil?
67
+ responses.merge!({request.path => body_of_request})
68
+ [201, { 'Content-Type' => 'application/json' }, [%|{ "url": "#{request.path}", "response": #{responses.fetch(request.path).to_json} }|]]
69
+ rescue ArgumentError
70
+ [400, { 'Content-Type' => 'application/json' }, [%|{ "reason": "Subbing a response requires the body of the PUT request to contain a tuple with the response status and header Content-Type" }|]]
71
+ end
72
+ end
73
+ end
74
+
75
+ def stub path
76
+ Response.new(responses, path)
77
+ end
78
+
79
+ def record_success request_url
80
+ requests[request_url]['200'] += 1
81
+ end
82
+
83
+ def record_error request_url
84
+ requests[request_url]['404'] += 1
85
+ end
86
+
87
+ class Response
88
+
89
+ def initialize(responses, path)
90
+ @responses, @path = responses, path
91
+ end
92
+
93
+ def to_return(status, headers, body)
94
+ @responses[@path] = [status, headers, body]
95
+ end
96
+
97
+ end
98
+
99
+ end
100
+ end
@@ -0,0 +1,3 @@
1
+ module RackDoubles
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,11 @@
1
+ require "rack_doubles/version"
2
+ require 'rack_doubles/middleware'
3
+ require 'rack_doubles/client'
4
+
5
+
6
+ module RackDoubles
7
+ # Your code goes here...
8
+ end
9
+
10
+
11
+
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "rack_doubles/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "rack_doubles"
7
+ spec.version = RackDoubles::VERSION
8
+ spec.author = "Anthony Green"
9
+ spec.email = "anthony.green@bbc.co.uk"
10
+ spec.homepage = "https://github.com/anthonygreen/rack_doubles"
11
+ spec.summary = "Rack middleware for stubbing responses from HTTP web services"
12
+ spec.description = "Rack middleware for creating faking responses for HTTP web services that an application under test communicates with"
13
+
14
+ spec.rubyforge_project = "rack_doubles"
15
+
16
+ spec.files = `git ls-files`.split("\n")
17
+ spec.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.required_ruby_version = '>= 1.9.3'
22
+
23
+ spec.add_development_dependency 'rspec'
24
+ spec.add_development_dependency 'cucumber'
25
+ spec.add_development_dependency 'rack-test'
26
+ spec.add_development_dependency 'rest-client'
27
+
28
+ spec.add_runtime_dependency 'json'
29
+ spec.add_runtime_dependency 'rack'
30
+ spec.add_runtime_dependency 'rest-client'
31
+
32
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+ require 'json'
3
+
4
+ module RackDoubles
5
+
6
+ describe Client do
7
+
8
+ def http_client_should_stub(url, response)
9
+ @http_client.should_receive(:put).with(url, response, {'Content-Type' => 'application/json'})
10
+ end
11
+
12
+ before do
13
+ @http_client = mock("http_client")
14
+ @client = Client.new("http://path-to-service", @http_client)
15
+ end
16
+
17
+ it "stubs url end points" do
18
+ http_client_should_stub("http://path-to-service/resource", [200, {}, ["This should be the response body"]].to_json)
19
+ @client.stub("/resource").to_return(200, {}, "This should be the response body")
20
+ end
21
+
22
+ it "deletes a stub" do
23
+ @http_client.should_receive(:delete).with("http://path-to-service/some-resource")
24
+ @client.delete 'some-resource'
25
+ end
26
+
27
+ it "deletes all stubs" do
28
+ @http_client.should_receive(:delete).with("http://path-to-service/")
29
+ @client.delete_all
30
+ end
31
+
32
+
33
+ end
34
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ module RackDoubles
4
+
5
+ describe Middleware do
6
+
7
+ it "allows stub behaviour to be specified using the client interface" do
8
+ app = mock('app')
9
+ env = Rack::MockRequest.env_for('/some-service')
10
+ middleware = Middleware.new(app)
11
+ middleware.stub('/some-service').to_return(200, {}, 'Successful')
12
+ middleware.call(env).should == [200, {}, 'Successful']
13
+ end
14
+
15
+ it "deletes all stubbed responses" do
16
+ app = mock('app')
17
+ middleware = Middleware.new(app)
18
+ middleware.stub('/service').to_return(200, {}, 'Success')
19
+ middleware.stub('/another_service').to_return(200, {}, 'OK')
20
+ middleware.responses.clear
21
+ get_env = Rack::MockRequest.env_for('/service')
22
+ get_env2 = Rack::MockRequest.env_for('/another_service')
23
+ app.should_receive('call').with(get_env)
24
+ app.should_receive('call').with(get_env2)
25
+ middleware.call(get_env)
26
+ middleware.call(get_env2)
27
+ end
28
+
29
+ it "deletes a single stubbed response" do
30
+ app = mock('app')
31
+ middleware = Middleware.new(app)
32
+ middleware.stub('/service').to_return(200, {}, 'Success')
33
+ middleware.stub('/another-service').to_return(200, {}, 'OK')
34
+ middleware.responses.delete('/service')
35
+ middleware.responses.delete('/service-that-does-not-exist')
36
+ get_env = Rack::MockRequest.env_for('/service')
37
+ get_env2 = Rack::MockRequest.env_for('/another-service')
38
+ app.should_receive('call').with(get_env)
39
+ app.should_not_receive('call').with(get_env2)
40
+ middleware.call(get_env)
41
+ middleware.call(get_env2)
42
+ end
43
+
44
+ it "can map to a base path" do
45
+ app = mock('app')
46
+ env = Rack::MockRequest.env_for('/rack-doubles')
47
+ middleware = Middleware.new(app) do |app|
48
+ app.path = '/rack-doubles'
49
+ end
50
+ middleware.stub('/rack-doubles/some-service').to_return(200, {}, 'Successful')
51
+ middleware.call(env).should == [200, { "Content-Type"=>"application/json" }, [%|{"/another-service":[200,{},"OK"],"/rack-doubles/some-service":[200,{},"Successful"]}|]]
52
+ end
53
+
54
+
55
+ end
56
+ end
@@ -0,0 +1,3 @@
1
+ require 'rack'
2
+ require 'rack_doubles/middleware'
3
+ require 'rack_doubles/client'
metadata ADDED
@@ -0,0 +1,179 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack_doubles
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Anthony Green
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
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
+ - !ruby/object:Gem::Dependency
31
+ name: cucumber
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rack-test
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rest-client
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: json
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: rack
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rest-client
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: Rack middleware for creating faking responses for HTTP web services that
127
+ an application under test communicates with
128
+ email: anthony.green@bbc.co.uk
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - .gitignore
134
+ - Gemfile
135
+ - README.md
136
+ - Rakefile
137
+ - config.ru
138
+ - features/step_definitions/stub_responses_steps.rb
139
+ - features/stub_responses.feature
140
+ - features/support/env.rb
141
+ - lib/rack_doubles.rb
142
+ - lib/rack_doubles/client.rb
143
+ - lib/rack_doubles/middleware.rb
144
+ - lib/rack_doubles/version.rb
145
+ - rack_doubles.gemspec
146
+ - spec/rack_doubles/client_spec.rb
147
+ - spec/rack_doubles/middleware_spec.rb
148
+ - spec/spec_helper.rb
149
+ homepage: https://github.com/anthonygreen/rack_doubles
150
+ licenses: []
151
+ post_install_message:
152
+ rdoc_options: []
153
+ require_paths:
154
+ - lib
155
+ required_ruby_version: !ruby/object:Gem::Requirement
156
+ none: false
157
+ requirements:
158
+ - - ! '>='
159
+ - !ruby/object:Gem::Version
160
+ version: 1.9.3
161
+ required_rubygems_version: !ruby/object:Gem::Requirement
162
+ none: false
163
+ requirements:
164
+ - - ! '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubyforge_project: rack_doubles
169
+ rubygems_version: 1.8.24
170
+ signing_key:
171
+ specification_version: 3
172
+ summary: Rack middleware for stubbing responses from HTTP web services
173
+ test_files:
174
+ - features/step_definitions/stub_responses_steps.rb
175
+ - features/stub_responses.feature
176
+ - features/support/env.rb
177
+ - spec/rack_doubles/client_spec.rb
178
+ - spec/rack_doubles/middleware_spec.rb
179
+ - spec/spec_helper.rb