actionpack 5.1.0.rc1 → 5.1.0.rc2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionpack might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e2d161d451c124876c1a7514f155780ba418d16e
4
- data.tar.gz: f22881573e854eac0be7c4727d5f1289a7d849e9
3
+ metadata.gz: e39f685ae0790d0a921d6c8671f476b177f76b5c
4
+ data.tar.gz: a5df75af538dd2eddccbb78c9af25812095198bd
5
5
  SHA512:
6
- metadata.gz: d5c053839dd73ab090207928e1a5635c31bf637425f2d875d1dd6d26366d3b23e66e0c7004b4577e38b9049a9b9511c0ca3aa8d679c24784db2e0452bcdc1667
7
- data.tar.gz: 9dd0e7bc6a77d7f84ed680c0298ba3d6d890eb679a0b912a0206e286d536cdee8f1ac6ab53fb1b49e938180a0ff625a6e3189b623d79bdbb082404f683569b90
6
+ metadata.gz: dc81f45547b89eb5d37c9bb0ccf95440693d323634beaaec56797bbfe6e706dd4913a5c8ae0bc92c82af526c829d9632e767570060607a6d12861172e67ae0f5
7
+ data.tar.gz: a7d302843440b69b5596f99f5b1341697f577999599aca6563d7dc8a6d7f7f25beadc85928f4497eea8fac8f8da29101f8b0a6c699e9610ced9baf26d2a823fc
@@ -1,3 +1,70 @@
1
+ ## Rails 5.1.0.rc2 (April 20, 2017) ##
2
+
3
+ * Raise exception when calling `to_h` and `to_hash` in an unpermitted Parameters.
4
+
5
+ Before we returned either an empty hash or only the always permitted parameters
6
+ (`:controller` and `:action` by default).
7
+
8
+ The previous behavior was dangerous because in order to get the attributes users
9
+ usually fallback to use `to_unsafe_h that` could potentially introduce security issues.
10
+
11
+ *Rafael Mendonça França*
12
+
13
+ * Deprecate `config.action_controller.raise_on_unfiltered_parameters`.
14
+
15
+ This option has no effect in Rails 5.1.
16
+
17
+ *Rafael Mendonça França*
18
+
19
+ * Use more specific check for :format in route path
20
+
21
+ The current check for whether to add an optional format to the path is very lax
22
+ and will match things like `:format_id` where there are nested resources, e.g:
23
+
24
+ ``` ruby
25
+ resources :formats do
26
+ resources :items
27
+ end
28
+ ```
29
+
30
+ Fix this by using a more restrictive regex pattern that looks for the patterns
31
+ `(.:format)`, `.:format` or `/` at the end of the path. Note that we need to
32
+ allow for multiple closing parenthesis since the route may be of this form:
33
+
34
+ ``` ruby
35
+ get "/books(/:action(.:format))", controller: "books"
36
+ ```
37
+
38
+ This probably isn't what's intended since it means that the default index action
39
+ route doesn't support a format but we have a test for it so we need to allow it.
40
+
41
+ Fixes #28517.
42
+
43
+ *Andrew White*
44
+
45
+ * Add `action_controller_api` and `action_controller_base` load hooks to be called in `ActiveSupport.on_load`
46
+
47
+ `ActionController::Base` and `ActionController::API` have differing implementations. This means that
48
+ the one umbrella hook `action_controller` is not able to address certain situations where a method
49
+ may not exist in a certain implementation.
50
+
51
+ This is fixed by adding two new hooks so you can target `ActionController::Base` vs `ActionController::API`
52
+
53
+ Fixes #27013.
54
+
55
+ *Julian Nadeau*
56
+
57
+ * Don't include default headers in `ActionController::Metal` responses
58
+
59
+ The commit e16afe6 introduced an unintentional change of behavior where the default
60
+ headers were included in responses from `ActionController::Metai` based controllers.
61
+ This is now reverted to the previous behavior of having no default headers.
62
+
63
+ Fixes #25820.
64
+
65
+ *Jon Moss*
66
+
67
+
1
68
  ## Rails 5.1.0.rc1 (March 20, 2017) ##
2
69
 
3
70
  * Fix `NameError` raised in `ActionController::Renderer#with_defaults`
@@ -141,6 +141,7 @@ module ActionController
141
141
  include mod
142
142
  end
143
143
 
144
+ ActiveSupport.run_load_hooks(:action_controller_api, self)
144
145
  ActiveSupport.run_load_hooks(:action_controller, self)
145
146
  end
146
147
  end
@@ -261,6 +261,13 @@ module ActionController
261
261
  PROTECTED_IVARS
262
262
  end
263
263
 
264
+ def self.make_response!(request)
265
+ ActionDispatch::Response.create.tap do |res|
266
+ res.request = request
267
+ end
268
+ end
269
+
270
+ ActiveSupport.run_load_hooks(:action_controller_base, self)
264
271
  ActiveSupport.run_load_hooks(:action_controller, self)
265
272
  end
266
273
  end
@@ -129,7 +129,7 @@ module ActionController
129
129
  end
130
130
 
131
131
  def self.make_response!(request)
132
- ActionDispatch::Response.create.tap do |res|
132
+ ActionDispatch::Response.new.tap do |res|
133
133
  res.request = request
134
134
  end
135
135
  end
@@ -105,7 +105,11 @@ module ActionController
105
105
 
106
106
  unless super || exclude
107
107
  if m.respond_to?(:attribute_names) && m.attribute_names.any?
108
- self.include = m.attribute_names
108
+ if m.respond_to?(:stored_attributes) && !m.stored_attributes.empty?
109
+ self.include = m.attribute_names + m.stored_attributes.values.flatten.map(&:to_s)
110
+ else
111
+ self.include = m.attribute_names
112
+ end
109
113
  end
110
114
  end
111
115
  end
@@ -213,7 +213,11 @@ module ActionController #:nodoc:
213
213
 
214
214
  if !verified_request?
215
215
  if logger && log_warning_on_csrf_failure
216
- logger.warn "Can't verify CSRF token authenticity."
216
+ if valid_request_origin?
217
+ logger.warn "Can't verify CSRF token authenticity."
218
+ else
219
+ logger.warn "HTTP Origin header (#{request.origin}) didn't match request.base_url (#{request.base_url})"
220
+ end
217
221
  end
218
222
  handle_unverified_request
219
223
  end
@@ -43,6 +43,18 @@ module ActionController
43
43
  end
44
44
  end
45
45
 
46
+ # Raised when a Parameters instance is not marked as permitted and
47
+ # an operation to transform it to hash is called.
48
+ #
49
+ # params = ActionController::Parameters.new(a: "123", b: "456")
50
+ # params.to_h
51
+ # # => ActionController::UnfilteredParameters: unable to convert unpermitted parameters to hash
52
+ class UnfilteredParameters < ArgumentError
53
+ def initialize # :nodoc:
54
+ super("unable to convert unpermitted parameters to hash")
55
+ end
56
+ end
57
+
46
58
  # == Action Controller \Parameters
47
59
  #
48
60
  # Allows you to choose which attributes should be whitelisted for mass updating
@@ -53,9 +65,9 @@ module ActionController
53
65
  #
54
66
  # params = ActionController::Parameters.new({
55
67
  # person: {
56
- # name: 'Francesco',
68
+ # name: "Francesco",
57
69
  # age: 22,
58
- # role: 'admin'
70
+ # role: "admin"
59
71
  # }
60
72
  # })
61
73
  #
@@ -103,7 +115,7 @@ module ActionController
103
115
  # You can fetch values of <tt>ActionController::Parameters</tt> using either
104
116
  # <tt>:key</tt> or <tt>"key"</tt>.
105
117
  #
106
- # params = ActionController::Parameters.new(key: 'value')
118
+ # params = ActionController::Parameters.new(key: "value")
107
119
  # params[:key] # => "value"
108
120
  # params["key"] # => "value"
109
121
  class Parameters
@@ -203,13 +215,13 @@ module ActionController
203
215
  # class Person < ActiveRecord::Base
204
216
  # end
205
217
  #
206
- # params = ActionController::Parameters.new(name: 'Francesco')
218
+ # params = ActionController::Parameters.new(name: "Francesco")
207
219
  # params.permitted? # => false
208
220
  # Person.new(params) # => ActiveModel::ForbiddenAttributesError
209
221
  #
210
222
  # ActionController::Parameters.permit_all_parameters = true
211
223
  #
212
- # params = ActionController::Parameters.new(name: 'Francesco')
224
+ # params = ActionController::Parameters.new(name: "Francesco")
213
225
  # params.permitted? # => true
214
226
  # Person.new(params) # => #<Person id: nil, name: "Francesco">
215
227
  def initialize(parameters = {})
@@ -228,13 +240,14 @@ module ActionController
228
240
  end
229
241
 
230
242
  # Returns a safe <tt>ActiveSupport::HashWithIndifferentAccess</tt>
231
- # representation of this parameter with all unpermitted keys removed.
243
+ # representation of the parameters with all unpermitted keys removed.
232
244
  #
233
245
  # params = ActionController::Parameters.new({
234
- # name: 'Senjougahara Hitagi',
235
- # oddity: 'Heavy stone crab'
246
+ # name: "Senjougahara Hitagi",
247
+ # oddity: "Heavy stone crab"
236
248
  # })
237
- # params.to_h # => {}
249
+ # params.to_h
250
+ # # => ActionController::UnfilteredParameters: unable to convert unfiltered parameters to hash
238
251
  #
239
252
  # safe_params = params.permit(:name)
240
253
  # safe_params.to_h # => {"name"=>"Senjougahara Hitagi"}
@@ -242,17 +255,61 @@ module ActionController
242
255
  if permitted?
243
256
  convert_parameters_to_hashes(@parameters, :to_h)
244
257
  else
245
- slice(*self.class.always_permitted_parameters).permit!.to_h
258
+ raise UnfilteredParameters
246
259
  end
247
260
  end
248
261
 
262
+ # Returns a safe <tt>Hash</tt> representation of the parameters
263
+ # with all unpermitted keys removed.
264
+ #
265
+ # params = ActionController::Parameters.new({
266
+ # name: "Senjougahara Hitagi",
267
+ # oddity: "Heavy stone crab"
268
+ # })
269
+ # params.to_hash
270
+ # # => ActionController::UnfilteredParameters: unable to convert unfiltered parameters to hash
271
+ #
272
+ # safe_params = params.permit(:name)
273
+ # safe_params.to_hash # => {"name"=>"Senjougahara Hitagi"}
274
+ def to_hash
275
+ to_h.to_hash
276
+ end
277
+
278
+ # Returns a string representation of the receiver suitable for use as a URL
279
+ # query string:
280
+ #
281
+ # params = ActionController::Parameters.new({
282
+ # name: "David",
283
+ # nationality: "Danish"
284
+ # })
285
+ # params.to_query
286
+ # # => "name=David&nationality=Danish"
287
+ #
288
+ # An optional namespace can be passed to enclose key names:
289
+ #
290
+ # params = ActionController::Parameters.new({
291
+ # name: "David",
292
+ # nationality: "Danish"
293
+ # })
294
+ # params.to_query("user")
295
+ # # => "user%5Bname%5D=David&user%5Bnationality%5D=Danish"
296
+ #
297
+ # The string pairs "key=value" that conform the query string
298
+ # are sorted lexicographically in ascending order.
299
+ #
300
+ # This method is also aliased as +to_param+.
301
+ def to_query(*args)
302
+ to_h.to_query(*args)
303
+ end
304
+ alias_method :to_param, :to_query
305
+
249
306
  # Returns an unsafe, unfiltered
250
- # <tt>ActiveSupport::HashWithIndifferentAccess</tt> representation of this
251
- # parameter.
307
+ # <tt>ActiveSupport::HashWithIndifferentAccess</tt> representation of the
308
+ # parameters.
252
309
  #
253
310
  # params = ActionController::Parameters.new({
254
- # name: 'Senjougahara Hitagi',
255
- # oddity: 'Heavy stone crab'
311
+ # name: "Senjougahara Hitagi",
312
+ # oddity: "Heavy stone crab"
256
313
  # })
257
314
  # params.to_unsafe_h
258
315
  # # => {"name"=>"Senjougahara Hitagi", "oddity" => "Heavy stone crab"}
@@ -297,7 +354,7 @@ module ActionController
297
354
  # class Person < ActiveRecord::Base
298
355
  # end
299
356
  #
300
- # params = ActionController::Parameters.new(name: 'Francesco')
357
+ # params = ActionController::Parameters.new(name: "Francesco")
301
358
  # params.permitted? # => false
302
359
  # Person.new(params) # => ActiveModel::ForbiddenAttributesError
303
360
  # params.permit!
@@ -319,7 +376,7 @@ module ActionController
319
376
  # When passed a single key, if it exists and its associated value is
320
377
  # either present or the singleton +false+, returns said value:
321
378
  #
322
- # ActionController::Parameters.new(person: { name: 'Francesco' }).require(:person)
379
+ # ActionController::Parameters.new(person: { name: "Francesco" }).require(:person)
323
380
  # # => <ActionController::Parameters {"name"=>"Francesco"} permitted: false>
324
381
  #
325
382
  # Otherwise raises <tt>ActionController::ParameterMissing</tt>:
@@ -352,7 +409,7 @@ module ActionController
352
409
  # Technically this method can be used to fetch terminal values:
353
410
  #
354
411
  # # CAREFUL
355
- # params = ActionController::Parameters.new(person: { name: 'Finn' })
412
+ # params = ActionController::Parameters.new(person: { name: "Finn" })
356
413
  # name = params.require(:person).require(:name) # CAREFUL
357
414
  #
358
415
  # but take into account that at some point those ones have to be permitted:
@@ -382,7 +439,7 @@ module ActionController
382
439
  # for the object to +true+. This is useful for limiting which attributes
383
440
  # should be allowed for mass updating.
384
441
  #
385
- # params = ActionController::Parameters.new(user: { name: 'Francesco', age: 22, role: 'admin' })
442
+ # params = ActionController::Parameters.new(user: { name: "Francesco", age: 22, role: "admin" })
386
443
  # permitted = params.require(:user).permit(:name, :age)
387
444
  # permitted.permitted? # => true
388
445
  # permitted.has_key?(:name) # => true
@@ -402,7 +459,7 @@ module ActionController
402
459
  # You may declare that the parameter should be an array of permitted scalars
403
460
  # by mapping it to an empty array:
404
461
  #
405
- # params = ActionController::Parameters.new(tags: ['rails', 'parameters'])
462
+ # params = ActionController::Parameters.new(tags: ["rails", "parameters"])
406
463
  # params.permit(tags: [])
407
464
  #
408
465
  # Sometimes it is not possible or convenient to declare the valid keys of
@@ -418,11 +475,11 @@ module ActionController
418
475
  #
419
476
  # params = ActionController::Parameters.new({
420
477
  # person: {
421
- # name: 'Francesco',
478
+ # name: "Francesco",
422
479
  # age: 22,
423
480
  # pets: [{
424
- # name: 'Purplish',
425
- # category: 'dogs'
481
+ # name: "Purplish",
482
+ # category: "dogs"
426
483
  # }]
427
484
  # }
428
485
  # })
@@ -441,8 +498,8 @@ module ActionController
441
498
  # params = ActionController::Parameters.new({
442
499
  # person: {
443
500
  # contact: {
444
- # email: 'none@test.com',
445
- # phone: '555-1234'
501
+ # email: "none@test.com",
502
+ # phone: "555-1234"
446
503
  # }
447
504
  # }
448
505
  # })
@@ -475,7 +532,7 @@ module ActionController
475
532
  # Returns a parameter for the given +key+. If not found,
476
533
  # returns +nil+.
477
534
  #
478
- # params = ActionController::Parameters.new(person: { name: 'Francesco' })
535
+ # params = ActionController::Parameters.new(person: { name: "Francesco" })
479
536
  # params[:person] # => <ActionController::Parameters {"name"=>"Francesco"} permitted: false>
480
537
  # params[:none] # => nil
481
538
  def [](key)
@@ -494,11 +551,11 @@ module ActionController
494
551
  # if more arguments are given, then that will be returned; if a block
495
552
  # is given, then that will be run and its result returned.
496
553
  #
497
- # params = ActionController::Parameters.new(person: { name: 'Francesco' })
554
+ # params = ActionController::Parameters.new(person: { name: "Francesco" })
498
555
  # params.fetch(:person) # => <ActionController::Parameters {"name"=>"Francesco"} permitted: false>
499
556
  # params.fetch(:none) # => ActionController::ParameterMissing: param is missing or the value is empty: none
500
- # params.fetch(:none, 'Francesco') # => "Francesco"
501
- # params.fetch(:none) { 'Francesco' } # => "Francesco"
557
+ # params.fetch(:none, "Francesco") # => "Francesco"
558
+ # params.fetch(:none) { "Francesco" } # => "Francesco"
502
559
  def fetch(key, *args)
503
560
  convert_value_to_parameters(
504
561
  @parameters.fetch(key) {
@@ -713,8 +770,6 @@ module ActionController
713
770
  end
714
771
  end
715
772
 
716
- undef_method :to_param
717
-
718
773
  # Returns duplicate of object including all parameters.
719
774
  def deep_dup
720
775
  self.class.new(@parameters.deep_dup).tap do |duplicate|
@@ -22,6 +22,10 @@ module ActionController
22
22
  initializer "action_controller.parameters_config" do |app|
23
23
  options = app.config.action_controller
24
24
 
25
+ if options.delete(:raise_on_unfiltered_parameters)
26
+ ActiveSupport::Deprecation.warn("raise_on_unfiltered_parameters is deprecated and has no effect in Rails 5.1.")
27
+ end
28
+
25
29
  ActionController::Parameters.permit_all_parameters = options.delete(:permit_all_parameters) { false }
26
30
  if app.config.action_controller[:always_permitted_parameters]
27
31
  ActionController::Parameters.always_permitted_parameters =
@@ -534,7 +534,6 @@ module ActionController
534
534
  @request.delete_header "HTTP_ACCEPT"
535
535
  end
536
536
  @request.query_string = ""
537
- @request.env.delete "PATH_INFO"
538
537
 
539
538
  @response.sent!
540
539
  end
@@ -115,6 +115,7 @@ module ActionDispatch
115
115
  end
116
116
 
117
117
  module ParamsParser
118
- ParseError = ActiveSupport::Deprecation::DeprecatedConstantProxy.new("ActionDispatch::ParamsParser::ParseError", "ActionDispatch::Http::Parameters::ParseError")
118
+ include ActiveSupport::Deprecation::DeprecatedConstantAccessor
119
+ deprecate_constant "ParseError", "ActionDispatch::Http::Parameters::ParseError"
119
120
  end
120
121
  end
@@ -254,14 +254,5 @@ module ActionDispatch
254
254
 
255
255
  SEPARATORS = %w( / . ? ) #:nodoc:
256
256
  HTTP_METHODS = [:get, :head, :post, :patch, :put, :delete, :options] #:nodoc:
257
-
258
- #:stopdoc:
259
- INSECURE_URL_PARAMETERS_MESSAGE = <<-MSG.squish
260
- Attempting to generate a URL from non-sanitized request parameters!
261
-
262
- An attacker can inject malicious data into the generated URL, such as
263
- changing the host. Whitelist and sanitize passed parameters to be secure.
264
- MSG
265
- #:startdoc:
266
257
  end
267
258
  end
@@ -54,6 +54,7 @@ module ActionDispatch
54
54
 
55
55
  class Mapping #:nodoc:
56
56
  ANCHOR_CHARACTERS_REGEX = %r{\A(\\A|\^)|(\\Z|\\z|\$)\Z}
57
+ OPTIONAL_FORMAT_REGEX = %r{(?:\(\.:format\)+|\.:format|/)\Z}
57
58
 
58
59
  attr_reader :requirements, :defaults
59
60
  attr_reader :to, :default_controller, :default_action
@@ -93,7 +94,7 @@ module ActionDispatch
93
94
  end
94
95
 
95
96
  def self.optional_format?(path, format)
96
- format != false && !path.include?(":format") && !path.end_with?("/")
97
+ format != false && path !~ OPTIONAL_FORMAT_REGEX
97
98
  end
98
99
 
99
100
  def initialize(set, ast, defaults, controller, default_action, modyoule, to, formatted, scope_constraints, blocks, via, options_constraints, anchor, options)
@@ -318,11 +318,7 @@ module ActionDispatch
318
318
  when Hash
319
319
  args.pop
320
320
  when ActionController::Parameters
321
- if last.permitted?
322
- args.pop.to_h
323
- else
324
- raise ArgumentError, ActionDispatch::Routing::INSECURE_URL_PARAMETERS_MESSAGE
325
- end
321
+ args.pop.to_h
326
322
  end
327
323
  helper.call self, args, options
328
324
  end
@@ -171,17 +171,10 @@ module ActionDispatch
171
171
  case options
172
172
  when nil
173
173
  _routes.url_for(url_options.symbolize_keys)
174
- when Hash
174
+ when Hash, ActionController::Parameters
175
175
  route_name = options.delete :use_route
176
- _routes.url_for(options.symbolize_keys.reverse_merge!(url_options),
177
- route_name)
178
- when ActionController::Parameters
179
- unless options.permitted?
180
- raise ArgumentError.new(ActionDispatch::Routing::INSECURE_URL_PARAMETERS_MESSAGE)
181
- end
182
- route_name = options.delete :use_route
183
- _routes.url_for(options.to_h.symbolize_keys.
184
- reverse_merge!(url_options), route_name)
176
+ merged_url_options = options.to_h.symbolize_keys.reverse_merge!(url_options)
177
+ _routes.url_for(merged_url_options, route_name)
185
178
  when String
186
179
  options
187
180
  when Symbol
@@ -87,7 +87,7 @@ module ActionDispatch
87
87
 
88
88
  def initialize(*) # :nodoc:
89
89
  super
90
- self.class.superclass.driver.use
90
+ self.class.driver.use
91
91
  end
92
92
 
93
93
  def self.start_application # :nodoc:
@@ -100,6 +100,8 @@ module ActionDispatch
100
100
  SystemTesting::Server.new.run
101
101
  end
102
102
 
103
+ class_attribute :driver, instance_accessor: false
104
+
103
105
  # System Test configuration options
104
106
  #
105
107
  # The default settings are Selenium, using Chrome, with a screen size
@@ -113,13 +115,10 @@ module ActionDispatch
113
115
  #
114
116
  # driven_by :selenium, screen_size: [800, 800]
115
117
  def self.driven_by(driver, using: :chrome, screen_size: [1400, 1400], options: {})
116
- @driver = SystemTesting::Driver.new(driver, using: using, screen_size: screen_size, options: options)
118
+ self.driver = SystemTesting::Driver.new(driver, using: using, screen_size: screen_size, options: options)
117
119
  end
118
120
 
119
- # Returns the driver object for the initialized system test
120
- def self.driver
121
- @driver ||= SystemTestCase.driven_by(:selenium)
122
- end
121
+ driven_by :selenium
123
122
  end
124
123
 
125
124
  SystemTestCase.start_application
@@ -8,7 +8,7 @@ module ActionPack
8
8
  MAJOR = 5
9
9
  MINOR = 1
10
10
  TINY = 0
11
- PRE = "rc1"
11
+ PRE = "rc2"
12
12
 
13
13
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
14
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: actionpack
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0.rc1
4
+ version: 5.1.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-20 00:00:00.000000000 Z
11
+ date: 2017-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 5.1.0.rc1
19
+ version: 5.1.0.rc2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 5.1.0.rc1
26
+ version: 5.1.0.rc2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rack
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -92,28 +92,28 @@ dependencies:
92
92
  requirements:
93
93
  - - '='
94
94
  - !ruby/object:Gem::Version
95
- version: 5.1.0.rc1
95
+ version: 5.1.0.rc2
96
96
  type: :runtime
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - '='
101
101
  - !ruby/object:Gem::Version
102
- version: 5.1.0.rc1
102
+ version: 5.1.0.rc2
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: activemodel
105
105
  requirement: !ruby/object:Gem::Requirement
106
106
  requirements:
107
107
  - - '='
108
108
  - !ruby/object:Gem::Version
109
- version: 5.1.0.rc1
109
+ version: 5.1.0.rc2
110
110
  type: :development
111
111
  prerelease: false
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
114
  - - '='
115
115
  - !ruby/object:Gem::Version
116
- version: 5.1.0.rc1
116
+ version: 5.1.0.rc2
117
117
  description: Web apps on Rails. Simple, battle-tested conventions for building and
118
118
  testing MVC web applications. Works with any Rack-compatible server.
119
119
  email: david@loudthinking.com