assert-response 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,5 +1,6 @@
1
1
  source "http://rubygems.org"
2
2
  gem "rack-test"
3
+ gem "json"
3
4
  group :development do
4
5
  gem "yard"
5
6
  gem "bundler", "~> 1.0.0"
data/README.md CHANGED
@@ -32,6 +32,7 @@ or in rvm:
32
32
 
33
33
  Examples
34
34
  --------
35
+
35
36
  require 'minitest'
36
37
  require 'rack/test'
37
38
  require 'assert-reponse'
@@ -45,6 +46,7 @@ Examples
45
46
  _(for usage without the inclusion of Rack::Test::Methods or with Test::Unit, see AssertResponse::Methods)_
46
47
 
47
48
  And then in your test something like this:
49
+
48
50
  get '/myroute'
49
51
  assert_response_html 'my body'
50
52
 
@@ -58,10 +60,12 @@ This will
58
60
 
59
61
  But you may also want to...
60
62
  check just the mime type:
63
+
61
64
  get '/myroute'
62
65
  assert_response_is_html
63
66
 
64
67
  check for a 404 page:
68
+
65
69
  get '/myroute'
66
70
  assert_response_not_found_html "Not found!"
67
71
 
@@ -95,9 +99,9 @@ There is some additional sugar like
95
99
  assert_response_not_found
96
100
  assert_response_ok
97
101
 
98
- Everything after _assert\_response\__ is the called method of _AssertResponse_, look them up in the documentation.
102
+ Everything after *assert\_response\_* is the called method of _AssertResponse_, look them up in the documentation.
99
103
 
100
- When using the _assert\_response\__ methods always the the *last_response* object is checked.
104
+ When using the *assert\_response\_* methods always the *last_response* object is checked.
101
105
 
102
106
  If you want to check a saved response instead, you may use the little DSL
103
107
 
@@ -111,6 +115,11 @@ If you want to check a saved response instead, you may use the little DSL
111
115
 
112
116
  Now inside the code block you may use the methods of _AssertResponse_ (but without the *assert\_response\_* prefixes).
113
117
 
118
+ TODO
119
+ ----
120
+
121
+ Maybe add some sugar for cookie testing.
122
+
114
123
 
115
124
  Contributing to assert-response
116
125
  -------------------------------
data/Rakefile CHANGED
@@ -20,6 +20,7 @@ Jeweler::Tasks.new do |gem|
20
20
  gem.email = "Base64.decode64('bGludXhAbWFyY3JlbmVhcm5zLmRl\n')"
21
21
  gem.authors = ["Marc Rene Arns"]
22
22
  gem.add_runtime_dependency 'rack-test'
23
+ gem.add_runtime_dependency 'json'
23
24
  # gem.add_development_dependency 'rspec', '> 1.2.3'
24
25
  end
25
26
  Jeweler::RubygemsDotOrgTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0
1
+ 1.1.0
@@ -1,7 +1,71 @@
1
+ require 'json'
2
+
1
3
  class AssertResponse
4
+
5
+ # to allow checking against a parsed json object
6
+ # the code is instance_exec'd in the context of this
7
+ # object. you may call the assert- methods here (even without assert-
8
+ # prefix and you have the json object by calling the json method
9
+ class AssertJSON
10
+ def initialize(test_obj, json_string)
11
+ @test_obj = test_obj
12
+ @json_obj = JSON.parse(json_string)
13
+ end
14
+
15
+ def json
16
+ @json_obj
17
+ end
18
+
19
+ def method_missing(meth, *args, &code)
20
+ if @test_obj.respond_to? meth
21
+ @test_obj.send meth, *args, &code
22
+ elsif @test_obj.respond_to? :"assert_#{meth}"
23
+ @test_obj.send :"assert_#{meth}", *args, &code
24
+ else
25
+ @test_obj.send :method_missing, *args.unshift(meth), &code
26
+ end
27
+ end
28
+ end
2
29
 
3
30
  # error class, raised when a 404 status but another status was expected
4
- class Status404 < Exception ; end
31
+ class HttpError < Exception ; end
32
+ class Status404 < HttpError ; end
33
+
34
+ # Hash with names for the http 1.1 status codes
35
+ HTTP_STATUS_CODES = {
36
+ :ok => 200,
37
+ :not_found => 404,
38
+ :created => 201,
39
+ :bad_request => 400,
40
+ :unauthorized => 401,
41
+ :forbidden => 403,
42
+ :timeout => 408,
43
+ :gateway_timeout => 504,
44
+ :bad_gateway => 502,
45
+ :conflict => 409,
46
+ :gone => 410,
47
+ :too_many_requests => 429,
48
+ :upgrade_required => 426,
49
+ :teapot => 418,
50
+ :no_response => 444,
51
+ :bandwidth_limit_exceeded => 509,
52
+ :maintenance => 503,
53
+ :insufficient_storage => 507,
54
+ :http_version_not_supported => 505,
55
+ :payment_required => 402,
56
+ :not_modified => 304,
57
+ :see_other => 303,
58
+ :found => 302,
59
+ :moved => 301,
60
+ :reset => 205,
61
+ :reload => 205,
62
+ :no_content => 204,
63
+ :too_large => 413,
64
+ :uri_too_long => 414,
65
+ :unsupported_media_type => 415,
66
+ :not_implemented => 501,
67
+ :error => 500
68
+ }
5
69
 
6
70
  # Hash to collection available content-types (prefilled with the Rack::Mime::MIME_TYPES)
7
71
  #
@@ -24,13 +88,23 @@ class AssertResponse
24
88
  # add content_type 'text/plain' as :text
25
89
  AssertResponse.add_content_type :text, 'text/plain'
26
90
 
91
+ # Adds custom http code to
92
+ # {AssertResponse::HTTP_STATUS_CODES}. We would then have all the test methods for the status code
93
+ # @param [Symbol] name name of the http status code
94
+ # @param [Integer] code code number (eg. 404)
95
+ def AssertResponse.add_http_status_code(name, code)
96
+ raise "invalid code" unless code =~ /^[1-9][0-9]{2}$/
97
+ HTTP_STATUS_CODES.update(name => code)
98
+ end
99
+
27
100
  # Creates a new {AssertResponse} Object. Usually you will want to +instance_exec+ some code on it.
28
101
  #
29
102
  # @param [Object] delegate_to the test object that has all the +assert_equal+, +assert_match+ and +assert+ methods that we need
30
103
  # @param [MockResponse, Response] response the response object that is checked
31
- def initialize(delegate_to, response, &code)
104
+ def initialize(delegate_to, response, request, &code)
32
105
  @delegate_to = delegate_to
33
106
  @response = response
107
+ @request = request
34
108
  @error = nil
35
109
  check_for_error()
36
110
  end
@@ -50,43 +124,105 @@ class AssertResponse
50
124
  when /^not_found_(.+)$/ # not_found_[content_type] methods
51
125
  if ctype = CONTENT_TYPES[$1.to_sym]
52
126
  content_type ctype
53
- return body(args.first, 404)
127
+ return body(args.first, :not_found)
54
128
  end
55
129
  else
56
- if ctype = CONTENT_TYPES[meth] # [content_type] methods
57
- ok()
130
+ if ctype = CONTENT_TYPES[meth] # [content_type] methods
58
131
  content_type ctype
59
- return body(args.first)
132
+ return body(*args)
133
+ elsif HTTP_STATUS_CODES[meth]
134
+ return status HTTP_STATUS_CODES[meth]
60
135
  end
61
136
  end
62
137
  @delegate_to.send meth, *args, &code
63
138
  end
64
139
 
65
- # Checks if status is 200.
140
+ # Checks if status is some of the ok-codes.
66
141
  def ok()
67
- status 200
142
+ status /^20[0-9]$/
143
+ end
144
+
145
+ # shortcut to the path of the last request
146
+ def path_info
147
+ @request.env['PATH_INFO']
148
+ end
149
+
150
+ # shortcut to the url of the last request
151
+ def url
152
+ @request.url
153
+ end
154
+
155
+ # shortcut to the query string of the last request
156
+ def query_string
157
+ @request.env['QUERY_STRING']
158
+ end
159
+
160
+ # this method checks for content_type json and then it has 2 modes
161
+ # if no code block is given, it acts as "body"
162
+ # if a code block is given, arg1 is the status and arg2 is ignored
163
+ # the code is executed in the context of a AssertJSON object, where
164
+ # you can use the usual assert- methods (even without assert prefix)
165
+ # and the json method gives you the parsed json object to test against
166
+ def json(arg1=nil, arg2=nil, &code)
167
+ content_type CONTENT_TYPES[:json]
168
+ if code
169
+ status arg1
170
+ file, line, rest = caller[0].split(':', 3)
171
+ AssertJSON.new(@delegate_to, @response.body).instance_exec(file, line.to_i, &code)
172
+ elsif arg1
173
+ body arg1, arg2
174
+ end
68
175
  end
69
176
 
70
177
  # Checks if the status is +status+. For status other then 5xx and error is raised if the response has an error.
71
178
  # For status other than 404 an error Status404 is thrown if response status is 404
179
+ # If we do not check for a 4xx or 5xx code an StatusError is raised if such a code is found and the body is given as error message
72
180
  #
73
- # @params [Integer] status the expected status
181
+ # @params [Integer, Regexp, Symbol] status the expected status (if it's a symbol it is looked up in HTTP_STATUS_CODES
74
182
  def status(status)
75
- raise_error() unless status =~ /^5/ or @response.errors.empty?
76
- Kernel.raise(Status404, "not found") unless status == 404 or @response.status != 404
77
- assert_equal(status, @response.status)
78
- end
79
-
80
- # Checks if the response status is 404.
81
- def not_found()
82
- status 404
183
+ return ok() if status.nil?
184
+ if status.is_a?(Symbol)
185
+ raise "unknown status #{status}" unless HTTP_STATUS_CODES[status]
186
+ status = HTTP_STATUS_CODES[status]
187
+ end
188
+ look_for_5xx = case status
189
+ when Regexp
190
+ ((50.to_s =~ status) || (51.to_s =~ status))? true : false
191
+ else
192
+ (status.to_s =~ /^5/) ? true : false
193
+ end
194
+ look_for_404 = case status
195
+ when Regexp
196
+ (404.to_s =~ status) ? true : false
197
+ else
198
+ (status.to_s == "404") ? true : false
199
+ end
200
+ look_for_4xx = case status
201
+ when Regexp
202
+ ((40.to_s =~ status) || (41.to_s =~ status))? true : false
203
+ else
204
+ (status.to_s =~ /^4/) ? true : false
205
+ end
206
+ raise_error() unless look_for_5xx or @response.errors.empty?
207
+ Kernel.raise(Status404, "(#{url}) not found") unless look_for_404 or @response.status != 404
208
+
209
+ case status
210
+ when Regexp
211
+ raise_http_error() if @response.status.to_s =~ /^5/ and !look_for_5xx
212
+ raise_http_error() if @response.status.to_s =~ /^4/ and !look_for_4xx
213
+ assert_match(status, @response.status.to_s)
214
+ else
215
+ raise_http_error() if @response.status.to_s =~ /^5/ and status.to_s !~ /^5/
216
+ raise_http_error() if @response.status.to_s =~ /^4/ and status.to_s !~ /^4/
217
+ assert_equal(status, @response.status)
218
+ end
83
219
  end
84
220
 
85
221
  # Checks if the status is 302, and the header "Location" matches the +pattern+
86
222
  #
87
223
  # @param [String,Regexp] pattern the pattern to match against.
88
224
  def redirect(pattern)
89
- status 302
225
+ status /^30(2|3|7)$/
90
226
  header 'Location', pattern
91
227
  end
92
228
 
@@ -97,8 +233,10 @@ class AssertResponse
97
233
  def header(key, pattern=:exists)
98
234
  if pattern == :exists
99
235
  assert !@response.headers[key].to_s.empty?, "Header '#{key}' not found"
100
- else
236
+ elsif pattern.is_a? Regexp
101
237
  assert_match normalize_pattern(pattern), @response.headers[key].to_s
238
+ else
239
+ assert_equal pattern.to_s, @response.headers[key].to_s
102
240
  end
103
241
  end
104
242
 
@@ -106,14 +244,14 @@ class AssertResponse
106
244
  #
107
245
  # @param [String,Regexp] pattern the pattern to match against.
108
246
  def content_type(pattern)
109
- header 'Content-Type', pattern
247
+ header 'Content-Type', normalize_pattern(pattern)
110
248
  end
111
249
 
112
250
  # Check if body matches +pattern+ and status is +status+.
113
251
  #
114
252
  # @param [String,Regexp] pattern the pattern to match against.
115
253
  # @params [Integer] status the expected status (default 200, see {#ok})
116
- def body(pattern, status=200)
254
+ def body(pattern, status=nil)
117
255
  status(status)
118
256
  assert_match normalize_pattern(pattern), @response.body
119
257
  end
@@ -128,10 +266,28 @@ class AssertResponse
128
266
  assert !@error.nil?
129
267
  end
130
268
 
269
+ # redirect to get
270
+ def see_other(pattern)
271
+ status 303
272
+ header 'Location', pattern
273
+ end
274
+
275
+ # temporary move
276
+ def found(pattern)
277
+ status 302
278
+ header 'Location', pattern
279
+ end
280
+
281
+ # permanent move
282
+ def moved(pattern)
283
+ status 301
284
+ header 'Location', pattern
285
+ end
286
+
131
287
  private
132
288
 
133
289
  def normalize_pattern(pattern)
134
- pattern.is_a?(Regexp) ? pattern : /#{Regexp.escape(pattern.to_s)}/
290
+ pattern.is_a?(Regexp) ? pattern : /#{Regexp.escape(pattern.to_s)}/i
135
291
  end
136
292
 
137
293
  def check_for_error
@@ -139,6 +295,7 @@ class AssertResponse
139
295
  end
140
296
 
141
297
  def normalize_error
298
+ #p [:l, last_request] #@response
142
299
  message, backtrace = @response.errors.split "\n", 2
143
300
  backtrace = backtrace.split
144
301
  err_klass, message = message.split '-', 2
@@ -151,6 +308,10 @@ class AssertResponse
151
308
  Kernel.raise @error
152
309
  end
153
310
 
311
+ def raise_http_error()
312
+ raise HttpError, "#{@response.status} (#{url}) #{@response.body}"
313
+ end
314
+
154
315
  # these methods are included in Rack::Test::Methods to be used in a Test Class
155
316
  #
156
317
  # call assert_response with a code block to use the DSL (methods from {AssertResponse})
@@ -237,7 +398,7 @@ class AssertResponse
237
398
  # @see AssertResponse
238
399
  def method_missing(meth, *args, &code)
239
400
  if meth.to_s =~ /^assert_response_(.+)$/
240
- AssertResponse.new(self, last_response).send($1.to_sym, *args)
401
+ AssertResponse.new(self, last_response, last_request).send($1.to_sym, *args, &code)
241
402
  else
242
403
  super
243
404
  end
@@ -245,9 +406,9 @@ class AssertResponse
245
406
 
246
407
  # creates an {AssertResponse} Object and +instance_exec+ the code (DSL) in it
247
408
  # @see AssertResponse
248
- def assert_response(response=last_response, &code)
409
+ def assert_response(response=last_response, request=last_request, &code)
249
410
  file, line, rest = caller[0].split(':', 3)
250
- AssertResponse.new(self, response).instance_exec(file, line.to_i, &code)
411
+ AssertResponse.new(self, response, request).instance_exec(file, line.to_i, &code)
251
412
  end
252
413
  end
253
414
  end
@@ -2,6 +2,8 @@ require 'backports' if RUBY_VERSION =~ /1.8/
2
2
  require_relative "helper.rb"
3
3
  require_relative File.join("..", "lib", "assert-response.rb")
4
4
 
5
+ ENV['RACK_ENV'] = 'test'
6
+
5
7
  include Rack::Test::Methods
6
8
 
7
9
  def handle_exception(env)
@@ -32,6 +34,13 @@ def app
32
34
  when '/json'
33
35
  headers['Content-Type'] = 'application/json'
34
36
  body = '{"response":"ok"}'
37
+ when '/create_with_json'
38
+ headers['Content-Type'] = 'application/json'
39
+ body = '{"id":"new_id"}'
40
+ status = 201
41
+ when '/bad_request'
42
+ body = 'you are so bad!'
43
+ status = 400
35
44
  when '/text'
36
45
  headers['Content-Type'] = 'text/plain'
37
46
  body = 'foo-bar and others'
@@ -43,11 +52,17 @@ def app
43
52
  when '/redirect'
44
53
  headers['Location'] = '/target'
45
54
  status = 302
55
+ when '/moved'
56
+ headers['Location'] = '/target'
57
+ status = 301
46
58
  when '/arg_error'
47
59
  handle_exception(env) do
48
60
  tester 234
49
61
  end
50
62
  status = 500
63
+ when '/error_code'
64
+ status = 500
65
+ body = "some error message"
51
66
  when '/not_found'
52
67
  status = 404
53
68
  body = "<body>Not found</body>"
@@ -58,9 +73,18 @@ def app
58
73
  }
59
74
  end
60
75
 
76
+ describe "without assert-response" do
77
+ it "should raise no error" do
78
+ get '/error'
79
+ assert_equal 500, last_response.status
80
+ end
81
+
82
+ end
83
+
61
84
  describe "assert-response" do
62
85
  it "should check json" do
63
86
  get '/json'
87
+ assert_response_body /ok/, :ok
64
88
  assert_response_json /ok/
65
89
  end
66
90
 
@@ -69,6 +93,32 @@ describe "assert-response" do
69
93
  assert_response_html '<body>'
70
94
  end
71
95
 
96
+ it "should check for status regex" do
97
+ get '/html'
98
+ assert_response_status /200/
99
+ end
100
+
101
+ it "should check for json body content" do
102
+ get '/json'
103
+ assert_response_json do
104
+ assert_equal "ok", json["response"]
105
+ end
106
+ end
107
+
108
+ it "should check for json body content for a created ressource" do
109
+ get '/create_with_json'
110
+ assert_response_json :created do
111
+ assert_equal "new_id", json["id"]
112
+ end
113
+ end
114
+
115
+ it "should check for json body content without assert prefix" do
116
+ get '/create_with_json'
117
+ assert_response_json :created do
118
+ equal "new_id", json["id"]
119
+ end
120
+ end
121
+
72
122
  it "should check css" do
73
123
  get '/css'
74
124
  assert_response_css 'color'
@@ -92,6 +142,11 @@ describe "assert-response" do
92
142
  assert_response_redirect '/target'
93
143
  end
94
144
 
145
+ it "should check moved" do
146
+ get '/moved'
147
+ assert_response_moved '/target'
148
+ end
149
+
95
150
  it "should not find missing pages" do
96
151
  get '/settings'
97
152
  assert_response_not_found
@@ -107,6 +162,12 @@ describe "assert-response" do
107
162
  assert_response_raises ArgumentError
108
163
  end
109
164
 
165
+ it "check server-error without a raised error" do
166
+ get '/error_code'
167
+ assert_response_error
168
+ assert_response_body "some error message", :error
169
+ end
170
+
110
171
  it "should raise errors for some other sinatra errors" do
111
172
  get '/error'
112
173
  assert_raises RuntimeError do
@@ -133,3 +194,99 @@ describe "assert-response" do
133
194
  assert_response_not_found_html "<body>Not found</body>"
134
195
  end
135
196
  end
197
+
198
+ describe "status tests" do
199
+ it "should check for ok status (20x) if asked to do, or if nil is passed to status" do
200
+ get '/html'
201
+ assert_response_ok
202
+ assert_response_status nil
203
+ assert_response_status 200
204
+
205
+ get '/create_with_json'
206
+ assert_response_ok
207
+ assert_response_status nil
208
+ assert_response_status 201
209
+
210
+ get '/not_found'
211
+ assert_raises AssertResponse::Status404 do
212
+ assert_response_ok
213
+ end
214
+
215
+ assert_raises AssertResponse::Status404 do
216
+ assert_response_status nil
217
+ end
218
+
219
+ assert_raises AssertResponse::Status404 do
220
+ assert_response_status 201
221
+ end
222
+ end
223
+
224
+ it "check for a named status if asked to do so" do
225
+ get '/create_with_json'
226
+ assert_response_created
227
+ assert_response_status :created
228
+ assert_response_status 201
229
+
230
+ get '/not_found'
231
+ end
232
+
233
+ it "check for a regexp status if asked to do so" do
234
+ get '/create_with_json'
235
+ assert_response_created
236
+ assert_response_status /20/
237
+
238
+ get '/html'
239
+ assert_response_status 200
240
+ assert_response_status /20/
241
+ end
242
+
243
+ it "should raise an error if asked for a non 4xx/5xx code and a 4xx/5xx code is returned" do
244
+
245
+ {
246
+ '/error_code' => AssertResponse::HttpError,
247
+ '/error' => RuntimeError,
248
+ '/not_found' => AssertResponse::Status404
249
+ }.each do |url,error|
250
+
251
+ get url
252
+
253
+ assert_raises error do
254
+ assert_response_ok
255
+ end
256
+
257
+ assert_raises error do
258
+ assert_response_status nil
259
+ end
260
+
261
+ assert_raises error do
262
+ assert_response_created
263
+ end
264
+
265
+ assert_raises error do
266
+ assert_response_status :moved
267
+ end
268
+
269
+ assert_raises error do
270
+ assert_response_status /^3/
271
+ end
272
+ end
273
+
274
+ end
275
+
276
+ it "should raise no error if asked for a 4xx/5xx code and a 4xx/5xx code is returned" do
277
+
278
+ get '/error_code'
279
+
280
+ assert_response_status 500
281
+ assert_response_status /^5/
282
+ assert_response_status :error
283
+
284
+ get '/not_found'
285
+
286
+ assert_response_status 404
287
+ assert_response_status /^4/
288
+ assert_response_status :not_found
289
+
290
+ end
291
+
292
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: assert-response
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-15 00:00:00.000000000Z
12
+ date: 2011-12-23 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack-test
16
- requirement: &16339740 !ruby/object:Gem::Requirement
16
+ requirement: &22354580 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,21 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *16339740
24
+ version_requirements: *22354580
25
+ - !ruby/object:Gem::Dependency
26
+ name: json
27
+ requirement: &22354100 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *22354100
25
36
  - !ruby/object:Gem::Dependency
26
37
  name: yard
27
- requirement: &16337540 !ruby/object:Gem::Requirement
38
+ requirement: &22353580 !ruby/object:Gem::Requirement
28
39
  none: false
29
40
  requirements:
30
41
  - - ! '>='
@@ -32,10 +43,10 @@ dependencies:
32
43
  version: '0'
33
44
  type: :development
34
45
  prerelease: false
35
- version_requirements: *16337540
46
+ version_requirements: *22353580
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: bundler
38
- requirement: &16336000 !ruby/object:Gem::Requirement
49
+ requirement: &22353100 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ~>
@@ -43,10 +54,10 @@ dependencies:
43
54
  version: 1.0.0
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *16336000
57
+ version_requirements: *22353100
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: jeweler
49
- requirement: &16333600 !ruby/object:Gem::Requirement
60
+ requirement: &22352580 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ~>
@@ -54,10 +65,10 @@ dependencies:
54
65
  version: 1.5.2
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *16333600
68
+ version_requirements: *22352580
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: rcov
60
- requirement: &16332240 !ruby/object:Gem::Requirement
71
+ requirement: &22352100 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ! '>='
@@ -65,10 +76,21 @@ dependencies:
65
76
  version: '0'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *16332240
79
+ version_requirements: *22352100
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: rack-test
71
- requirement: &16329940 !ruby/object:Gem::Requirement
82
+ requirement: &22351620 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: *22351620
91
+ - !ruby/object:Gem::Dependency
92
+ name: json
93
+ requirement: &22351140 !ruby/object:Gem::Requirement
72
94
  none: false
73
95
  requirements:
74
96
  - - ! '>='
@@ -76,7 +98,7 @@ dependencies:
76
98
  version: '0'
77
99
  type: :runtime
78
100
  prerelease: false
79
- version_requirements: *16329940
101
+ version_requirements: *22351140
80
102
  description:
81
103
  email: ! 'Base64.decode64(''bGludXhAbWFyY3JlbmVhcm5zLmRl
82
104
 
@@ -111,7 +133,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
111
133
  version: '0'
112
134
  segments:
113
135
  - 0
114
- hash: -850628618767669317
136
+ hash: 2830934270081401981
115
137
  required_rubygems_version: !ruby/object:Gem::Requirement
116
138
  none: false
117
139
  requirements: