mirage 2.4.2 → 3.0.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/.simplecov +6 -0
  2. data/Gemfile +11 -3
  3. data/Gemfile.lock +41 -14
  4. data/VERSION +1 -1
  5. data/features/client/clear.feature +41 -50
  6. data/features/client/configure.feature +2 -2
  7. data/features/client/put.feature +17 -6
  8. data/features/client/requests.feature +5 -9
  9. data/features/client/start.feature +19 -11
  10. data/features/client/stop.feature +10 -44
  11. data/features/server/commandline_interface/start.feature +2 -14
  12. data/features/server/commandline_interface/stop.feature +6 -4
  13. data/features/server/logging.feature +2 -2
  14. data/features/server/prime.feature +11 -66
  15. data/features/server/requests/delete.feature +34 -33
  16. data/features/server/requests/get.feature +21 -18
  17. data/features/server/save_and_revert.feature +24 -11
  18. data/features/server/templates/delete.feature +29 -32
  19. data/features/server/templates/get.feature +44 -25
  20. data/features/server/templates/put/put.feature +55 -78
  21. data/features/server/templates/put/put_with_substitutions.feature +12 -32
  22. data/features/server/templates/put/required_content.feature +118 -0
  23. data/features/step_definitions/my_steps.rb +51 -6
  24. data/features/support/env.rb +1 -1
  25. data/features/support/hooks.rb +2 -5
  26. data/{lib/mirage/client → features/support}/web.rb +14 -3
  27. data/lib/mirage/client.rb +5 -2
  28. data/lib/mirage/client/client.rb +22 -129
  29. data/lib/mirage/client/request.rb +25 -0
  30. data/lib/mirage/client/requests.rb +13 -0
  31. data/lib/mirage/client/runner.rb +4 -4
  32. data/lib/mirage/client/template.rb +108 -0
  33. data/lib/mirage/client/template_configuration.rb +22 -0
  34. data/lib/mirage/client/templates.rb +26 -0
  35. data/mirage.gemspec +42 -22
  36. data/mirage_server.rb +1 -135
  37. data/rakefile +22 -7
  38. data/server/app.rb +4 -0
  39. data/server/binary_data_checker.rb +15 -0
  40. data/server/helpers.rb +28 -0
  41. data/server/mock_response.rb +140 -58
  42. data/server/server.rb +167 -0
  43. data/spec/{cli_bridge_spec.rb → client/cli_bridge_spec.rb} +15 -11
  44. data/spec/client/client_spec.rb +139 -0
  45. data/spec/client/request_spec.rb +52 -0
  46. data/spec/client/requests_spec.rb +10 -0
  47. data/spec/{runner_spec.rb → client/runner_spec.rb} +3 -3
  48. data/spec/client/template_configuration_spec.rb +32 -0
  49. data/spec/client/template_spec.rb +241 -0
  50. data/spec/client/templates_spec.rb +79 -0
  51. data/spec/resources/binary.file +0 -0
  52. data/spec/server/binary_data_checker_spec.rb +22 -0
  53. data/spec/server/helpers_spec.rb +34 -0
  54. data/spec/server/mock_response_spec.rb +526 -0
  55. data/spec/server/server_spec.rb +132 -0
  56. data/spec/spec_helper.rb +61 -2
  57. data/test.html +12 -0
  58. data/test.rb +20 -17
  59. data/todo.lst +2 -0
  60. data/views/index.haml +22 -0
  61. data/views/response.haml +24 -0
  62. metadata +134 -49
  63. data/features/server/templates/put/put_as_default.feature +0 -42
  64. data/features/server/templates/put/put_with_delay.feature +0 -8
  65. data/features/server/templates/put/put_with_pattern.feature +0 -80
  66. data/lib/mirage/client/response.rb +0 -29
  67. data/spec/client_spec.rb +0 -38
  68. data/views/index.erb +0 -28
data/lib/mirage/client.rb CHANGED
@@ -1,7 +1,10 @@
1
1
  $LOAD_PATH.unshift "#{File.dirname(__FILE__)}"
2
- require 'client/web'
2
+ require 'client/template_configuration'
3
3
  require 'client/error'
4
4
  require 'client/cli_bridge'
5
5
  require 'client/runner'
6
- require 'client/response'
6
+ require 'client/template'
7
+ require 'client/templates'
8
+ require 'client/requests'
9
+ require 'client/request'
7
10
  require 'client/client'
@@ -1,20 +1,15 @@
1
1
  require 'uri'
2
+ require 'httparty'
3
+ require 'base64'
4
+ require 'json'
5
+
2
6
  module Mirage
3
7
  class Client
4
- Defaults = Struct.new(:method, :status, :delay, :content_type, :default)
5
- include Mirage::Web
6
- attr_reader :url
8
+ include HTTParty
7
9
 
10
+ attr_reader :url
8
11
 
9
- # Creates an instance of the Mirage client that can be used to interact with the Mirage Server
10
- #
11
- # Client.new => a client that is configured to connect to Mirage on http://localhost:7001/mirage (the default settings for Mirage)
12
- # Client.new(URL) => a client that is configured to connect to an instance of Mirage running on the specified url.
13
- # Client.new(hash) => a client that is configured to connect to an instance of Mirage running on the specified url or localhost port.
14
- # e.g: Client.new(:url => url) or Client.new(:port => port)
15
- #
16
- # a block can be passed to configure the client with defaults: see configure
17
- def initialize options={:url => "http://localhost:7001/mirage"}, &block
12
+ def initialize options={:url => "http://localhost:7001/mirage"}
18
13
  if options.is_a?(String) && options =~ URI.regexp
19
14
  warn("Client.new(url): Deprecated usage, please use :url => url | :port => port")
20
15
  @url = options
@@ -25,142 +20,40 @@ module Mirage
25
20
  else
26
21
  raise "specify a valid URL or port"
27
22
  end
28
-
29
- reset
30
- configure &block if block_given?
31
- end
32
-
33
-
34
- # Configures default settings to be applied to all response templates put on to Mirage
35
- #
36
- # Example:
37
- # Client.new.configure do
38
- # defaults.method = :post
39
- # defaults.status = 202
40
- # defaults.default = true
41
- # defaults.delay = 2
42
- # defaults.content_type = "text/xml"
43
- # end
44
- def configure &block
45
- yield @defaults
46
- end
47
-
48
- # Remove any defaults applied to this client
49
- def reset
50
- @defaults = Defaults.new
51
- end
52
-
53
- def stop
54
- Mirage.stop :port => URI.parse(@url).port
55
- end
56
-
57
-
58
- # Set a text or file based response template, to be hosted at a given end point. A block can be specified to configure the template
59
- # client.set(endpoint, response, &block) => unique id that can be used to call back to the server
60
- #
61
- # Examples:
62
- # client.put('greeting', 'hello')
63
- #
64
- # client.put('greeting', 'hello') do |response|
65
- # response.pattern = 'pattern' #regex or string literal applied against the request querystring and body
66
- # response.method = :post #By default templates will respond to get requests
67
- # response.content_type = 'text/html' #defaults text/plain
68
- # response.default = true # defaults to false. setting to true will allow this template to respond to request made to sub resources should it match.
69
- # end
70
- def put endpoint, response_value, &block
71
- response = Mirage::Response.new response_value
72
- @defaults.each_pair { |key, value| response.send("#{key}=", value) if value }
73
- yield response if block_given?
74
-
75
- build_response(http_put("#{@url}/templates/#{endpoint}", response.value, response.headers))
76
23
  end
77
24
 
78
- # Use to look to preview the content of a response template would return to a client without actually triggering.
79
- # client.response(response_id) => response held on the server as a String
80
- def response response_id
81
- response = build_response(http_get("#{@url}/templates/#{response_id}"))
82
- case response
83
- when String then
84
- return response
85
- when Mirage::Web::FileResponse then
86
- return response.response.body
87
- end
88
-
25
+ def templates id=nil
26
+ return Template.get("#{@url}/templates/#{id}") if id
27
+ Templates.new(@url)
89
28
  end
90
29
 
91
- # Clear Content from Mirage
92
- #
93
- # If a response id is not valid, a ResponseNotFound exception will be thrown
94
- #
95
- # Example Usage:
96
- # client.clear -> clear all responses and associated requests
97
- # client.clear(response_id) -> Clear the response and tracked request for a given response id
98
- # client.clear(:requests) -> Clear all tracked request information
99
- # client.clear(:request => response_id) -> Clear the tracked request for a given response id
100
- def clear thing=nil
101
-
102
- case thing
103
- when :requests
104
- http_delete("#{@url}/requests")
105
- when Numeric then
106
- http_delete("#{@url}/templates/#{thing}")
107
- when Hash then
108
- puts "deleteing request #{thing[:request]}"
109
- http_delete("#{@url}/requests/#{thing[:request]}") if thing[:request]
110
- else
111
- NilClass
112
- http_delete("#{@url}/templates")
113
- end
114
-
30
+ def requests id=nil
31
+ return Request.get "#{@url}/requests/#{id}" if id
32
+ Requests.new(@url)
115
33
  end
116
34
 
117
-
118
- # Retrieve the last request that triggered a response to be returned. If the request contained content in its body, this is returned. If the
119
- # request did not have any content in its body then what ever was in the request query string is returned instead
120
- #
121
- # Example Usage
122
- # client.request(response_id) -> Tracked request as a String
123
- def request response_id
124
- build_response(http_get("#{@url}/requests/#{response_id}"))
35
+ def prime
36
+ self.class.send(:put, "#{@url}/defaults", :body => "")
125
37
  end
126
38
 
127
- # Save the state of the Mirage server so that it can be reverted back to that exact state at a later time.
128
39
  def save
129
- http_put("#{@url}/backup", '').code == 200
40
+ self.class.send(:put, "#{@url}/backup", :body => "")
130
41
  end
131
42
 
132
-
133
- # Revert the state of Mirage back to the state that was last saved
134
- # If there is no snapshot to rollback to, nothing happens
135
43
  def revert
136
- http_put(@url, '').code == 200
44
+ self.class.send(:put, @url, :body => "")
137
45
  end
138
46
 
139
-
140
- # Check to see if mirage is running on the url that the client is pointing to
141
- def running?
142
- Mirage.running?(@url)
47
+ def put endpoint, value, &block
48
+ templates.put endpoint, value, &block
143
49
  end
144
50
 
145
- # Clear down the Mirage Server and load any defaults that are in Mirages default responses directory.
146
- def prime
147
- build_response(http_put("#{@url}/defaults", ''))
51
+ def clear
52
+ templates.delete_all
148
53
  end
149
54
 
150
55
  def == client
151
- client.is_a?(Client) && @url == client.url
152
- end
153
-
154
- private
155
- def build_response response
156
- case response.code.to_i
157
- when 500 then
158
- raise ::Mirage::InternalServerException.new(response.body, response.code.to_i)
159
- when 404 then
160
- raise ::Mirage::ResponseNotFound.new(response.body, response.code.to_i)
161
- else
162
- response.body
163
- end
56
+ client.instance_of?(Client) && self.url == client.url
164
57
  end
165
58
  end
166
59
  end
@@ -0,0 +1,25 @@
1
+ require 'hashie/mash'
2
+ module Mirage
3
+ class Request
4
+ include HTTParty
5
+
6
+ class << self
7
+ alias_method :backedup_get, :get
8
+ def get url
9
+ result = Hashie::Mash.new(backedup_get(url, format: :json))
10
+ request = new
11
+ request.parameters = result.parameters
12
+ request.headers = result.headers
13
+ request.request_url = result.request_url
14
+ request.body = result.body
15
+ request
16
+ end
17
+ end
18
+
19
+ attr_accessor :parameters, :headers, :body, :request_url
20
+
21
+ def delete
22
+ self.class.delete(request_url)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ module Mirage
2
+ class Requests
3
+ include HTTParty
4
+
5
+ def initialize base_url
6
+ @url = "#{base_url}/requests"
7
+ end
8
+
9
+ def delete_all
10
+ self.class.delete(@url)
11
+ end
12
+ end
13
+ end
@@ -2,15 +2,16 @@ require 'thor'
2
2
  require 'waitforit'
3
3
  require 'childprocess'
4
4
  require 'uri'
5
+ require 'httparty'
5
6
  module Mirage
6
7
  class << self
7
- include Web
8
8
 
9
9
  # Start Mirage locally on a given port
10
10
  # Example Usage:
11
11
  #
12
12
  # Mirage.start :port => 9001 -> Configured MirageClient ready to use.
13
- def start options={:port => 7001}
13
+ def start options={}
14
+ options={:port => 7001}.merge(options)
14
15
  Runner.new.invoke(:start, [], options)
15
16
  Mirage::Client.new(options)
16
17
  end
@@ -42,7 +43,7 @@ module Mirage
42
43
  # Mirage.running? url -> boolean indicating whether Mirage is running on the given URL
43
44
  def running? options_or_url = {:port => 7001}
44
45
  url = options_or_url.kind_of?(Hash) ? "http://localhost:#{options_or_url[:port]}/mirage" : options_or_url
45
- http_get(url) and return true
46
+ HTTParty.get(url) and return true
46
47
  rescue Errno::ECONNREFUSED
47
48
  return false
48
49
  end
@@ -50,7 +51,6 @@ module Mirage
50
51
  end
51
52
 
52
53
  class Runner < Thor
53
- include ::Mirage::Web
54
54
  include CLIBridge
55
55
  RUBY_CMD = ChildProcess.jruby? ? 'jruby' : 'ruby'
56
56
 
@@ -0,0 +1,108 @@
1
+ require 'ostruct'
2
+ require 'json'
3
+ require 'httparty'
4
+ require 'hashie/mash'
5
+ module Mirage
6
+
7
+ class Template
8
+ include HTTParty
9
+
10
+ class << self
11
+ alias_method :backedup_get, :get
12
+
13
+ def get url
14
+ response_hashie = Hashie::Mash.new backedup_get(url, :format => :json)
15
+
16
+ response_config = response_hashie.response
17
+ request_config = response_hashie.request
18
+
19
+ template = new(response_hashie.endpoint, response_config.body)
20
+
21
+ template.id = response_hashie.id
22
+ template.default = response_config['default']
23
+ template.delay = response_config.delay
24
+ template.content_type = response_config.content_type
25
+ template.status = response_config.status
26
+
27
+ template.required_parameters = request_config.parameters
28
+ template.required_body_content = request_config.body_content
29
+ template.http_method = request_config.http_method
30
+ template.url = url
31
+ template.requests_url = response_hashie.requests_url
32
+ template.required_headers = request_config.headers
33
+
34
+ template
35
+ end
36
+ end
37
+
38
+ format :json
39
+
40
+ attr_accessor :content_type, :http_method, :default, :status, :delay, :required_parameters, :required_body_content, :required_headers, :endpoint, :id, :url, :requests_url
41
+ attr_reader :value
42
+
43
+
44
+ def initialize endpoint, response, default_config=TemplateConfiguration.new
45
+
46
+ @endpoint = endpoint
47
+ @content_type = default_config.content_type
48
+ @value = response
49
+ @http_method = default_config.http_method
50
+ @status = default_config.status
51
+ @delay = default_config.delay
52
+ @required_parameters = {}
53
+ @required_headers = {}
54
+ @required_body_content = []
55
+ @default = default_config.default
56
+ end
57
+
58
+ def create
59
+ @id = self.class.put("#{@endpoint}", :body => self.to_json, :headers => {'content-type' => 'application/json'})['id']
60
+ self
61
+ end
62
+
63
+ def delete
64
+ self.class.delete(url)
65
+ Request.delete requests_url
66
+ end
67
+
68
+
69
+ def to_json
70
+ {
71
+ :response => {
72
+ :body => Base64.encode64(@value),
73
+ :status => status,
74
+ :default => default,
75
+ :content_type => content_type
76
+
77
+ },
78
+ :request => {
79
+ :parameters => encode_regexs(required_parameters),
80
+ :headers => encode_regexs(required_headers),
81
+ :body_content => encode_regexs(required_body_content),
82
+ :http_method => http_method
83
+
84
+ },
85
+ :delay => delay
86
+ }.to_json
87
+ end
88
+
89
+
90
+ def encode_regexs hash_or_array
91
+ case hash_or_array
92
+ when Array
93
+ hash_or_array.collect { |value| encode(value) }
94
+ else
95
+ encoded = {}
96
+ hash_or_array.each do |key, value|
97
+ encoded[key] = encode(value)
98
+ end
99
+ encoded
100
+ end
101
+ end
102
+
103
+ def encode(value)
104
+ value.is_a?(Regexp) ? "%r{#{value.source}}" : value
105
+ end
106
+
107
+ end
108
+ end
@@ -0,0 +1,22 @@
1
+ module Mirage
2
+ class TemplateConfiguration
3
+ attr_accessor :http_method, :status, :delay, :content_type, :default
4
+ DEFAULT_HTTP_METHOD=:get
5
+ DEFAULT_STATUS=200
6
+ DEFAULT_DELAY=0
7
+ DEFAULT_CONTENT_TYPE="text/plain"
8
+ DEFAULT_DEFAULT=false
9
+
10
+ def initialize
11
+ reset
12
+ end
13
+
14
+ def reset
15
+ @http_method = DEFAULT_HTTP_METHOD
16
+ @status = DEFAULT_STATUS
17
+ @delay = DEFAULT_DELAY
18
+ @content_type = DEFAULT_CONTENT_TYPE
19
+ @default = DEFAULT_DEFAULT
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,26 @@
1
+ module Mirage
2
+ class Templates
3
+ include HTTParty
4
+ def initialize base_url
5
+ @url = "#{base_url}/templates"
6
+ @requests = Requests.new(base_url)
7
+ @default_config = TemplateConfiguration.new
8
+ end
9
+
10
+ def default_config &block
11
+ return @default_config unless block_given?
12
+ yield @default_config
13
+ end
14
+
15
+ def delete_all
16
+ self.class.delete(@url)
17
+ @requests.delete_all
18
+ end
19
+
20
+ def put endpoint, response
21
+ template = Mirage::Template.new "#{@url}/#{endpoint}", response, @default_config
22
+ yield template if block_given?
23
+ template.create
24
+ end
25
+ end
26
+ end
data/mirage.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "mirage"
8
- s.version = "2.4.2"
8
+ s.version = "3.0.0.alpha.1"
9
9
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
10
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Leon Davis"]
12
- s.date = "2012-09-20"
12
+ s.date = "2013-04-01"
13
13
  s.description = "Mirage aids testing of your applications by hosting mock responses so that your applications do not have to talk to real endpoints. Its accessible via HTTP and has a RESTful interface."
14
14
  s.executables = ["mirage"]
15
15
  s.extra_rdoc_files = [
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
17
17
  ]
18
18
  s.files = [
19
19
  ".rvmrc",
20
+ ".simplecov",
20
21
  "Gemfile",
21
22
  "Gemfile.lock",
22
23
  "HISTORY",
@@ -43,43 +44,62 @@ Gem::Specification.new do |s|
43
44
  "features/server/templates/delete.feature",
44
45
  "features/server/templates/get.feature",
45
46
  "features/server/templates/put/put.feature",
46
- "features/server/templates/put/put_as_default.feature",
47
- "features/server/templates/put/put_with_delay.feature",
48
- "features/server/templates/put/put_with_pattern.feature",
49
47
  "features/server/templates/put/put_with_substitutions.feature",
48
+ "features/server/templates/put/required_content.feature",
50
49
  "features/server/web_user_interface.feature",
51
50
  "features/step_definitions/my_steps.rb",
52
51
  "features/support/command_line.rb",
53
52
  "features/support/env.rb",
54
53
  "features/support/hooks.rb",
55
54
  "features/support/mirage.rb",
55
+ "features/support/web.rb",
56
56
  "full_build.sh",
57
57
  "lib/mirage/client.rb",
58
58
  "lib/mirage/client/cli_bridge.rb",
59
59
  "lib/mirage/client/client.rb",
60
60
  "lib/mirage/client/error.rb",
61
- "lib/mirage/client/response.rb",
61
+ "lib/mirage/client/request.rb",
62
+ "lib/mirage/client/requests.rb",
62
63
  "lib/mirage/client/runner.rb",
63
- "lib/mirage/client/web.rb",
64
+ "lib/mirage/client/template.rb",
65
+ "lib/mirage/client/template_configuration.rb",
66
+ "lib/mirage/client/templates.rb",
64
67
  "mirage.gemspec",
65
68
  "mirage_server.rb",
66
69
  "rakefile",
67
70
  "responses/default_responses.rb",
71
+ "server/app.rb",
72
+ "server/binary_data_checker.rb",
68
73
  "server/extensions/hash.rb",
69
74
  "server/extensions/object.rb",
75
+ "server/helpers.rb",
70
76
  "server/mock_response.rb",
71
- "spec/cli_bridge_spec.rb",
72
- "spec/client_spec.rb",
73
- "spec/runner_spec.rb",
77
+ "server/server.rb",
78
+ "spec/client/cli_bridge_spec.rb",
79
+ "spec/client/client_spec.rb",
80
+ "spec/client/request_spec.rb",
81
+ "spec/client/requests_spec.rb",
82
+ "spec/client/runner_spec.rb",
83
+ "spec/client/template_configuration_spec.rb",
84
+ "spec/client/template_spec.rb",
85
+ "spec/client/templates_spec.rb",
86
+ "spec/resources/binary.file",
87
+ "spec/server/binary_data_checker_spec.rb",
88
+ "spec/server/helpers_spec.rb",
89
+ "spec/server/mock_response_spec.rb",
90
+ "spec/server/server_spec.rb",
74
91
  "spec/spec_helper.rb",
92
+ "test.html",
75
93
  "test.rb",
76
- "views/index.erb"
94
+ "todo.lst",
95
+ "views/index.haml",
96
+ "views/response.haml"
77
97
  ]
78
98
  s.homepage = "https://github.com/lashd/mirage"
79
99
  s.licenses = ["MIT"]
80
100
  s.post_install_message = "\n===============================================================================\nThanks you for installing mirage. \n\nRun Mirage with:\n\nmirage start \n\nFor more information go to: https://github.com/lashd/mirage/wiki\n===============================================================================\n"
81
101
  s.require_paths = ["lib"]
82
- s.rubygems_version = "1.8.17"
102
+ s.rubygems_version = "1.8.24"
83
103
  s.summary = "Mirage is a easy mock server for testing your applications"
84
104
 
85
105
  if s.respond_to? :specification_version then
@@ -90,10 +110,10 @@ Gem::Specification.new do |s|
90
110
  s.add_runtime_dependency(%q<childprocess>, [">= 0"])
91
111
  s.add_runtime_dependency(%q<waitforit>, [">= 0"])
92
112
  s.add_runtime_dependency(%q<thor>, [">= 0"])
93
- s.add_development_dependency(%q<thin>, [">= 0"])
113
+ s.add_runtime_dependency(%q<ptools>, [">= 0"])
114
+ s.add_runtime_dependency(%q<httparty>, [">= 0"])
115
+ s.add_runtime_dependency(%q<haml>, [">= 0"])
94
116
  s.add_development_dependency(%q<rake>, [">= 0"])
95
- s.add_development_dependency(%q<cucumber>, [">= 0"])
96
- s.add_development_dependency(%q<rspec>, [">= 0"])
97
117
  s.add_development_dependency(%q<jeweler>, [">= 0"])
98
118
  s.add_development_dependency(%q<sinatra-contrib>, [">= 0"])
99
119
  s.add_development_dependency(%q<mechanize>, [">= 0"])
@@ -104,10 +124,10 @@ Gem::Specification.new do |s|
104
124
  s.add_dependency(%q<childprocess>, [">= 0"])
105
125
  s.add_dependency(%q<waitforit>, [">= 0"])
106
126
  s.add_dependency(%q<thor>, [">= 0"])
107
- s.add_dependency(%q<thin>, [">= 0"])
127
+ s.add_dependency(%q<ptools>, [">= 0"])
128
+ s.add_dependency(%q<httparty>, [">= 0"])
129
+ s.add_dependency(%q<haml>, [">= 0"])
108
130
  s.add_dependency(%q<rake>, [">= 0"])
109
- s.add_dependency(%q<cucumber>, [">= 0"])
110
- s.add_dependency(%q<rspec>, [">= 0"])
111
131
  s.add_dependency(%q<jeweler>, [">= 0"])
112
132
  s.add_dependency(%q<sinatra-contrib>, [">= 0"])
113
133
  s.add_dependency(%q<mechanize>, [">= 0"])
@@ -119,10 +139,10 @@ Gem::Specification.new do |s|
119
139
  s.add_dependency(%q<childprocess>, [">= 0"])
120
140
  s.add_dependency(%q<waitforit>, [">= 0"])
121
141
  s.add_dependency(%q<thor>, [">= 0"])
122
- s.add_dependency(%q<thin>, [">= 0"])
142
+ s.add_dependency(%q<ptools>, [">= 0"])
143
+ s.add_dependency(%q<httparty>, [">= 0"])
144
+ s.add_dependency(%q<haml>, [">= 0"])
123
145
  s.add_dependency(%q<rake>, [">= 0"])
124
- s.add_dependency(%q<cucumber>, [">= 0"])
125
- s.add_dependency(%q<rspec>, [">= 0"])
126
146
  s.add_dependency(%q<jeweler>, [">= 0"])
127
147
  s.add_dependency(%q<sinatra-contrib>, [">= 0"])
128
148
  s.add_dependency(%q<mechanize>, [">= 0"])