1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
|
* Match `HashWithIndifferentAccess#default`'s behaviour with `Hash#default`
*David Cornu*
* Adds `:exception_object` key to `ActiveSupport::Notifications::Instrumenter` payload when an exception is raised.
Adds new key/value pair to payload when an exception is raised: e.g. `:exception_object => #<RuntimeError: FAIL>`.
*Ryan T. Hosford*
* Support extended grapheme clusters and UAX 29.
*Adam Roben*
* Add petabyte and exabyte numeric conversion.
*Akshay Vishnoi*
## Rails 5.0.0.beta1 (December 18, 2015) ##
* Add thread_m/cattr_accessor/reader/writer suite of methods for declaring class and module variables that live per-thread.
This makes it easy to declare per-thread globals that are encapsulated. Note: This is a sharp edge. A wild proliferation
of globals is A Bad Thing. But like other sharp tools, when it's right, it's right.
Here's an example of a simple event tracking system where the object being tracked needs not pass a creator that it
doesn't need itself along:
module Current
thread_mattr_accessor :account
thread_mattr_accessor :user
def self.reset() self.account = self.user = nil end
end
class ApplicationController < ActionController::Base
before_action :set_current
after_action { Current.reset }
private
def set_current
Current.account = Account.find(params[:account_id])
Current.user = Current.account.users.find(params[:user_id])
end
end
class MessagesController < ApplicationController
def create
@message = Message.create!(message_params)
end
end
class Message < ApplicationRecord
has_many :events
after_create :track_created
private
def track_created
events.create! origin: self, action: :create
end
end
class Event < ApplicationRecord
belongs_to :creator, class_name: 'User'
before_validation { self.creator ||= Current.user }
end
*DHH*
* Deprecated `Module#qualified_const_` in favour of the builtin Module#const_
methods.
*Genadi Samokovarov*
* Deprecate passing string to define callback.
*Yuichiro Kaneko*
* `ActiveSupport::Cache::Store#namespaced_key`,
`ActiveSupport::Cache::MemCachedStore#escape_key`, and
`ActiveSupport::Cache::FileStore#key_file_path`
are deprecated and replaced with `normalize_key` that now calls `super`.
`ActiveSupport::Cache::LocaleCache#set_cache_value` is deprecated and replaced with `write_cache_value`.
*Michael Grosser*
* Implements an evented file watcher to asynchronously detect changes in the
application source code, routes, locales, etc.
This watcher is disabled by default, applications my enable it in the configuration:
# config/environments/development.rb
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
This feature depends on the [listen](https://github.com/guard/listen) gem:
group :development do
gem 'listen', '~> 3.0.5'
end
*Puneet Agarwal* and *Xavier Noria*
* Added `Time.days_in_year` to return the number of days in the given year, or the
current year if no argument is provided.
*Jon Pascoe*
* Updated `parameterize` to preserve the case of a string, optionally.
Example:
parameterize("Donald E. Knuth", separator: '_') # => "donald_e_knuth"
parameterize("Donald E. Knuth", preserve_case: true) # => "Donald-E-Knuth"
*Swaathi Kakarla*
* `HashWithIndifferentAccess.new` respects the default value or proc on objects
that respond to `#to_hash`. `.new_from_hash_copying_default` simply invokes `.new`.
All calls to `.new_from_hash_copying_default` are replaced with `.new`.
*Gordon Chan*
* Change Integer#year to return a Fixnum instead of a Float to improve
consistency.
Integer#years returned a Float while the rest of the accompanying methods
(days, weeks, months, etc.) return a Fixnum.
Before:
1.year # => 31557600.0
After:
1.year # => 31557600
*Konstantinos Rousis*
* Handle invalid UTF-8 strings when HTML escaping.
Use `ActiveSupport::Multibyte::Unicode.tidy_bytes` to handle invalid UTF-8
strings in `ERB::Util.unwrapped_html_escape` and `ERB::Util.html_escape_once`.
Prevents user-entered input passed from a querystring into a form field from
causing invalid byte sequence errors.
*Grey Baker*
* Update `ActiveSupport::Multibyte::Chars#slice!` to return `nil` if the
arguments are out of bounds, to mirror the behavior of `String#slice!`
*Gourav Tiwari*
* Fix `number_to_human` so that 999999999 rounds to "1 Billion" instead of
"1000 Million".
*Max Jacobson*
* Fix `ActiveSupport::Deprecation#deprecate_methods` to report using the
current deprecator instance, where applicable.
*Brandon Dunne*
* `Cache#fetch` instrumentation marks whether it was a `:hit`.
*Robin Clowers*
* `assert_difference` and `assert_no_difference` now returns the result of the
yielded block.
Example:
post = assert_difference -> { Post.count }, 1 do
Post.create
end
*Lucas Mazza*
* Short-circuit `blank?` on date and time values since they are never blank.
Fixes #21657.
*Andrew White*
* Replaced deprecated `ThreadSafe::Cache` with its successor `Concurrent::Map` now that
the thread_safe gem has been merged into concurrent-ruby.
*Jerry D'Antonio*
* Updated Unicode version to 8.0.0
*Anshul Sharma*
* `number_to_currency` and `number_with_delimiter` now accept custom `delimiter_pattern` option
to handle placement of delimiter, to support currency formats like INR
Example:
number_to_currency(1230000, delimiter_pattern: /(\d+?)(?=(\d\d)+(\d)(?!\d))/, unit: '₹', format: "%u %n")
# => '₹ 12,30,000.00'
*Vipul A M*
* Deprecate `:prefix` option of `number_to_human_size` with no replacement.
*Jean Boussier*
* Fix `TimeWithZone#eql?` to properly handle `TimeWithZone` created from `DateTime`:
twz = DateTime.now.in_time_zone
twz.eql?(twz.dup) => true
Fixes #14178.
*Roque Pinel*
* ActiveSupport::HashWithIndifferentAccess `select` and `reject` will now return
enumerator if called without block.
Fixes #20095.
*Bernard Potocki*
* Removed `ActiveSupport::Concurrency::Latch`, superseded by `Concurrent::CountDownLatch`
from the concurrent-ruby gem.
*Jerry D'Antonio*
* Fix not calling `#default` on `HashWithIndifferentAccess#to_hash` when only
`default_proc` is set, which could raise.
*Simon Eskildsen*
* Fix setting `default_proc` on `HashWithIndifferentAccess#dup`.
*Simon Eskildsen*
* Fix a range of values for parameters of the Time#change.
*Nikolay Kondratyev*
* Add `Enumerable#pluck` to get the same values from arrays as from ActiveRecord
associations.
Fixes #20339.
*Kevin Deisz*
* Add a bang version to `ActiveSupport::OrderedOptions` get methods which will raise
an `KeyError` if the value is `.blank?`.
Before:
if (slack_url = Rails.application.secrets.slack_url).present?
# Do something worthwhile
else
# Raise as important secret password is not specified
end
After:
slack_url = Rails.application.secrets.slack_url!
*Aditya Sanghi*, *Gaurish Sharma*
* Remove deprecated `Class#superclass_delegating_accessor`.
Use `Class#class_attribute` instead.
*Akshay Vishnoi*
* Patch `Delegator` to work with `#try`.
Fixes #5790.
*Nate Smith*
* Add `Integer#positive?` and `Integer#negative?` query methods
in the vein of `Fixnum#zero?`.
This makes it nicer to do things like `bunch_of_numbers.select(&:positive?)`.
*DHH*
* Encoding `ActiveSupport::TimeWithZone` to YAML now preserves the timezone information.
Fixes #9183.
*Andrew White*
* Added `ActiveSupport::TimeZone#strptime` to allow parsing times as if
from a given timezone.
*Paul A Jungwirth*
* `ActiveSupport::Callbacks#skip_callback` now raises an `ArgumentError` if
an unrecognized callback is removed.
*Iain Beeston*
* Added `ActiveSupport::ArrayInquirer` and `Array#inquiry`.
Wrapping an array in an `ArrayInquirer` gives a friendlier way to check its
contents:
variants = ActiveSupport::ArrayInquirer.new([:phone, :tablet])
variants.phone? # => true
variants.tablet? # => true
variants.desktop? # => false
variants.any?(:phone, :tablet) # => true
variants.any?(:phone, :desktop) # => true
variants.any?(:desktop, :watch) # => false
`Array#inquiry` is a shortcut for wrapping the receiving array in an
`ArrayInquirer`.
*George Claghorn*
* Deprecate `alias_method_chain` in favour of `Module#prepend` introduced in
Ruby 2.0.
*Kir Shatrov*
* Added `#without` on `Enumerable` and `Array` to return a copy of an
enumerable without the specified elements.
*Todd Bealmear*
* Fixed a problem where `String#truncate_words` would get stuck with a complex
string.
*Henrik Nygren*
* Fixed a roundtrip problem with `AS::SafeBuffer` where primitive-like strings
will be dumped as primitives:
Before:
YAML.load ActiveSupport::SafeBuffer.new("Hello").to_yaml # => "Hello"
YAML.load ActiveSupport::SafeBuffer.new("true").to_yaml # => true
YAML.load ActiveSupport::SafeBuffer.new("false").to_yaml # => false
YAML.load ActiveSupport::SafeBuffer.new("1").to_yaml # => 1
YAML.load ActiveSupport::SafeBuffer.new("1.1").to_yaml # => 1.1
After:
YAML.load ActiveSupport::SafeBuffer.new("Hello").to_yaml # => "Hello"
YAML.load ActiveSupport::SafeBuffer.new("true").to_yaml # => "true"
YAML.load ActiveSupport::SafeBuffer.new("false").to_yaml # => "false"
YAML.load ActiveSupport::SafeBuffer.new("1").to_yaml # => "1"
YAML.load ActiveSupport::SafeBuffer.new("1.1").to_yaml # => "1.1"
*Godfrey Chan*
* Enable `number_to_percentage` to keep the number's precision by allowing
`:precision` to be `nil`.
*Jack Xu*
* `config_accessor` became a private method, as with Ruby's `attr_accessor`.
*Akira Matsuda*
* `AS::Testing::TimeHelpers#travel_to` now changes `DateTime.now` as well as
`Time.now` and `Date.today`.
*Yuki Nishijima*
* Add `file_fixture` to `ActiveSupport::TestCase`.
It provides a simple mechanism to access sample files in your test cases.
By default file fixtures are stored in `test/fixtures/files`. This can be
configured per test-case using the `file_fixture_path` class attribute.
*Yves Senn*
* Return value of yielded block in `File.atomic_write`.
*Ian Ker-Seymer*
* Duplicate frozen array when assigning it to a `HashWithIndifferentAccess` so
that it doesn't raise a `RuntimeError` when calling `map!` on it in `convert_value`.
Fixes #18550.
*Aditya Kapoor*
* Add missing time zone definitions for Russian Federation and sync them
with `zone.tab` file from tzdata version 2014j (latest).
*Andrey Novikov*
* Add `SecureRandom.base58` for generation of random base58 strings.
*Matthew Draper*, *Guillermo Iguaran*
* Add `#prev_day` and `#next_day` counterparts to `#yesterday` and
`#tomorrow` for `Date`, `Time`, and `DateTime`.
*George Claghorn*
* Add `same_time` option to `#next_week` and `#prev_week` for `Date`, `Time`,
and `DateTime`.
*George Claghorn*
* Add `#on_weekend?`, `#next_weekday`, `#prev_weekday` methods to `Date`,
`Time`, and `DateTime`.
`#on_weekend?` returns `true` if the receiving date/time falls on a Saturday
or Sunday.
`#next_weekday` returns a new date/time representing the next day that does
not fall on a Saturday or Sunday.
`#prev_weekday` returns a new date/time representing the previous day that
does not fall on a Saturday or Sunday.
*George Claghorn*
* Change the default test order from `:sorted` to `:random`.
*Rafael Mendonça França*
* Remove deprecated `ActiveSupport::JSON::Encoding::CircularReferenceError`.
*Rafael Mendonça França*
* Remove deprecated methods `ActiveSupport::JSON::Encoding.encode_big_decimal_as_string=`
and `ActiveSupport::JSON::Encoding.encode_big_decimal_as_string`.
*Rafael Mendonça França*
* Remove deprecated `ActiveSupport::SafeBuffer#prepend`.
*Rafael Mendonça França*
* Remove deprecated methods at `Kernel`.
`silence_stderr`, `silence_stream`, `capture` and `quietly`.
*Rafael Mendonça França*
* Remove deprecated `active_support/core_ext/big_decimal/yaml_conversions`
file.
*Rafael Mendonça França*
* Remove deprecated methods `ActiveSupport::Cache::Store.instrument` and
`ActiveSupport::Cache::Store.instrument=`.
*Rafael Mendonça França*
* Change the way in which callback chains can be halted.
The preferred method to halt a callback chain from now on is to explicitly
`throw(:abort)`.
In the past, callbacks could only be halted by explicitly providing a
terminator and by having a callback match the conditions of the terminator.
* Add `ActiveSupport.halt_callback_chains_on_return_false`
Setting `ActiveSupport.halt_callback_chains_on_return_false`
to `true` will let an app support the deprecated way of halting Active Record,
and Active Model callback chains by returning `false`.
Setting the value to `false` will tell the app to ignore any `false` value
returned by those callbacks, and only halt the chain upon `throw(:abort)`.
When the configuration option is missing, its value is `true`, so older apps
ported to Rails 5.0 will not break (but display a deprecation warning).
For new Rails 5.0 apps, its value is set to `false` in an initializer, so
these apps will support the new behavior by default.
*claudiob*, *Roque Pinel*
* Changes arguments and default value of CallbackChain's `:terminator` option
Chains of callbacks defined without an explicit `:terminator` option will
now be halted as soon as a `before_` callback throws `:abort`.
Chains of callbacks defined with a `:terminator` option will maintain their
existing behavior of halting as soon as a `before_` callback matches the
terminator's expectation.
*claudiob*
* Deprecate `MissingSourceFile` in favor of `LoadError`.
`MissingSourceFile` was just an alias to `LoadError` and was not being
raised inside the framework.
*Rafael Mendonça França*
* Add support for error dispatcher classes in `ActiveSupport::Rescuable`.
Now it acts closer to Ruby's rescue.
Example:
class BaseController < ApplicationController
module ErrorDispatcher
def self.===(other)
Exception === other && other.respond_to?(:status)
end
end
rescue_from ErrorDispatcher do |error|
render status: error.status, json: { error: error.to_s }
end
end
*Genadi Samokovarov*
* Add `#verified` and `#valid_message?` methods to `ActiveSupport::MessageVerifier`
Previously, the only way to decode a message with `ActiveSupport::MessageVerifier`
was to use `#verify`, which would raise an exception on invalid messages. Now
`#verified` can also be used, which returns `nil` on messages that cannot be
decoded.
Previously, there was no way to check if a message's format was valid without
attempting to decode it. `#valid_message?` is a boolean convenience method that
checks whether the message is valid without actually decoding it.
*Logan Leger*
Please check [4-2-stable](https://github.com/rails/rails/blob/4-2-stable/activesupport/CHANGELOG.md) for previous changes.
|