CHANGELOG.md 13.7 KB
Newer Older
1 2 3 4 5
*   Deprecated `Module#qualified_const_` in favour of the builtin Module#const_
    methods.

    *Genadi Samokovarov*

6 7 8 9
*   Deprecate passing string to define callback.

    *Yuichiro Kaneko*

10 11 12 13
*   `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`.
14

15
    `ActiveSupport::Cache::LocaleCache#set_cache_value` is deprecated and replaced with `write_cache_value`.
16

17 18
    *Michael Grosser*

19 20
*   Implements an evented file watcher to asynchronously detect changes in the
    application source code, routes, locales, etc.
21

22 23 24 25 26 27
    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:
28

J
Jon Pascoe 已提交
29
        group :development do
30
          gem 'listen', '~> 3.0.5'
J
Jon Pascoe 已提交
31
        end
32 33 34

    *Puneet Agarwal* and *Xavier Noria*

35
*   Added `Time.days_in_year` to return the number of days in the given year, or the
36
    current year if no argument is provided.
J
Jon Pascoe 已提交
37

38
    *Jon Pascoe*
J
Jon Pascoe 已提交
39

40
*   Updated `parameterize` to preserve the case of a string, optionally.
41 42 43

    Example:

44 45
        parameterize("Donald E. Knuth", separator: '_') # => "donald_e_knuth"
        parameterize("Donald E. Knuth", preserve_case: true) # => "Donald-E-Knuth"
46 47 48

    *Swaathi Kakarla*

49 50 51 52 53 54
*   `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*

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
*   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*

71 72 73 74 75 76 77 78 79
*   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*

S
Sean Griffin 已提交
80 81 82 83 84
*   Update `ActiveSupport::Multibyte::Chars#slice!` to return `nil` if the
    arguments are out of bounds, to mirror the behavior of `String#slice!`

    *Gourav Tiwari*

85 86
*   Fix `number_to_human` so that 999999999 rounds to "1 Billion" instead of
    "1000 Million".
M
Max Jacobson 已提交
87 88 89

    *Max Jacobson*

90 91 92 93 94
*   Fix `ActiveSupport::Deprecation#deprecate_methods` to report using the
    current deprecator instance, where applicable.

    *Brandon Dunne*

95 96 97 98
*   `Cache#fetch` instrumentation marks whether it was a `:hit`.

    *Robin Clowers*

99 100 101 102 103 104 105 106 107 108 109
*   `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*

110 111 112 113 114 115
*   Short-circuit `blank?` on date and time values since they are never blank.

    Fixes #21657

    *Andrew White*

116 117 118 119 120
*   Replaced deprecated `ThreadSafe::Cache` with its successor `Concurrent::Map` now that
    the thread_safe gem has been merged into concurrent-ruby.

    *Jerry D'Antonio*

A
Anshul Sharma 已提交
121 122 123
*   Updated Unicode version to 8.0.0

    *Anshul Sharma*
124

125 126 127 128 129
*   `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:

130
        number_to_currency(1230000, delimiter_pattern: /(\d+?)(?=(\d\d)+(\d)(?!\d))/, unit: '₹', format: "%u %n")
131 132
        # => '₹ 12,30,000.00'

133
    *Vipul A M*
134

135 136 137 138
*   Deprecate `:prefix` option of `number_to_human_size` with no replacement.

    *Jean Boussier*

139 140 141 142 143 144 145 146
*   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*

147 148 149 150 151 152 153
*   ActiveSupport::HashWithIndifferentAccess `select` and `reject` will now return
    enumerator if called without block.

    Fixes #20095

    *Bernard Potocki*

154 155 156 157 158
*   Removed `ActiveSupport::Concurrency::Latch`, superseded by `Concurrent::CountDownLatch`
    from the concurrent-ruby gem.

    *Jerry D'Antonio*

Y
yuuji.yaginuma 已提交
159
*   Fix not calling `#default` on `HashWithIndifferentAccess#to_hash` when only
160 161 162 163
    `default_proc` is set, which could raise.

    *Simon Eskildsen*

164 165 166 167
*   Fix setting `default_proc` on `HashWithIndifferentAccess#dup`

    *Simon Eskildsen*

168 169 170 171
*   Fix a range of values for parameters of the Time#change

    *Nikolay Kondratyev*

K
Kevin Deisz 已提交
172 173 174 175 176 177 178
*   Add `Enumerable#pluck` to get the same values from arrays as from ActiveRecord
    associations.

    Fixes #20339.

    *Kevin Deisz*

179 180 181
*   Add a bang version to `ActiveSupport::OrderedOptions` get methods which will raise
    an `KeyError` if the value is `.blank?`

182 183
    Before:

A
Aditya Sanghi 已提交
184
        if (slack_url = Rails.application.secrets.slack_url).present?
185
          # Do something worthwhile
186
        else
187
          # Raise as important secret password is not specified
188 189 190 191 192 193 194 195
        end

    After:

        slack_url = Rails.application.secrets.slack_url!

    *Aditya Sanghi*, *Gaurish Sharma*

196 197
*   Remove deprecated `Class#superclass_delegating_accessor`.
    Use `Class#class_attribute` instead.
198 199 200

    *Akshay Vishnoi*

201
*   Patch `Delegator` to work with `#try`.
202

203
    Fixes #5790.
204 205 206

    *Nate Smith*

207 208 209 210
*   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?)`.
211 212 213

    *DHH*

214
*   Encoding `ActiveSupport::TimeWithZone` to YAML now preserves the timezone information.
215 216 217 218 219

    Fixes #9183.

    *Andrew White*

220 221 222 223 224
*   Added `ActiveSupport::TimeZone#strptime` to allow parsing times as if
    from a given timezone.

    *Paul A Jungwirth*

225 226 227 228 229
*   `ActiveSupport::Callbacks#skip_callback` now raises an `ArgumentError` if
    an unrecognized callback is removed.

    *Iain Beeston*

230
*   Added `ActiveSupport::ArrayInquirer` and `Array#inquiry`.
231 232 233 234 235 236 237 238 239 240 241 242 243 244

    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

245 246 247
    `Array#inquiry` is a shortcut for wrapping the receiving array in an
    `ArrayInquirer`.

248 249
    *George Claghorn*

Y
Yves Senn 已提交
250 251
*   Deprecate `alias_method_chain` in favour of `Module#prepend` introduced in
    Ruby 2.0.
252 253 254

    *Kir Shatrov*

T
Todd Bealmear 已提交
255 256 257 258 259
*   Added `#without` on `Enumerable` and `Array` to return a copy of an
    enumerable without the specified elements.

    *Todd Bealmear*

K
karanarora 已提交
260
*   Fixed a problem where `String#truncate_words` would get stuck with a complex
261 262 263 264
    string.

    *Henrik Nygren*

K
karanarora 已提交
265
*   Fixed a roundtrip problem with `AS::SafeBuffer` where primitive-like strings
266 267 268 269
    will be dumped as primitives:

    Before:

270 271 272 273 274
        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
275

276
    After:
277

278 279 280 281 282
        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"
283 284 285

    *Godfrey Chan*

286 287
*   Enable `number_to_percentage` to keep the number's precision by allowing
    `:precision` to be `nil`.
288

289
    *Jack Xu*
290

291
*   `config_accessor` became a private method, as with Ruby's `attr_accessor`.
292 293 294

    *Akira Matsuda*

295 296 297 298 299
*   `AS::Testing::TimeHelpers#travel_to` now changes `DateTime.now` as well as
    `Time.now` and `Date.today`.

    *Yuki Nishijima*

300 301 302 303 304 305 306 307
*   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*

308 309 310 311
*   Return value of yielded block in `File.atomic_write`.

    *Ian Ker-Seymer*

K
karanarora 已提交
312
*   Duplicate frozen array when assigning it to a `HashWithIndifferentAccess` so
313 314 315 316 317 318
    that it doesn't raise a `RuntimeError` when calling `map!` on it in `convert_value`.

    Fixes #18550.

    *Aditya Kapoor*

319 320 321 322 323
*   Add missing time zone definitions for Russian Federation and sync them
    with `zone.tab` file from tzdata version 2014j (latest).

    *Andrey Novikov*

G
Guillermo Iguaran 已提交
324 325
*   Add `SecureRandom.base58` for generation of random base58 strings.

326
    *Matthew Draper*, *Guillermo Iguaran*
G
Guillermo Iguaran 已提交
327

328 329 330 331 332
*   Add `#prev_day` and `#next_day` counterparts to `#yesterday` and
    `#tomorrow` for `Date`, `Time`, and `DateTime`.

    *George Claghorn*

333 334 335 336 337
*   Add `same_time` option to `#next_week` and `#prev_week` for `Date`, `Time`,
    and `DateTime`.

    *George Claghorn*

338 339 340
*   Add `#on_weekend?`, `#next_weekday`, `#prev_weekday` methods to `Date`,
    `Time`, and `DateTime`.

K
karanarora 已提交
341
    `#on_weekend?` returns `true` if the receiving date/time falls on a Saturday
342 343 344 345 346 347 348 349 350 351
    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*

352 353 354 355
*   Change the default test order from `:sorted` to `:random`.

    *Rafael Mendonça França*

356 357 358 359
*   Remove deprecated `ActiveSupport::JSON::Encoding::CircularReferenceError`.

    *Rafael Mendonça França*

360 361 362 363 364
*   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*

365 366 367 368
*   Remove deprecated `ActiveSupport::SafeBuffer#prepend`.

    *Rafael Mendonça França*

369 370 371 372 373 374
*   Remove deprecated methods at `Kernel`.

    `silence_stderr`, `silence_stream`, `capture` and `quietly`.

    *Rafael Mendonça França*

375 376 377 378 379
*   Remove deprecated `active_support/core_ext/big_decimal/yaml_conversions`
    file.

    *Rafael Mendonça França*

380 381 382 383 384
*   Remove deprecated methods `ActiveSupport::Cache::Store.instrument` and
    `ActiveSupport::Cache::Store.instrument=`.

    *Rafael Mendonça França*

385
*   Change the way in which callback chains can be halted.
386

387 388
    The preferred method to halt a callback chain from now on is to explicitly
    `throw(:abort)`.
389 390
    In the past, callbacks could only be halted by explicitly providing a
    terminator and by having a callback match the conditions of the terminator.
391

392
*   Add `ActiveSupport.halt_callback_chains_on_return_false`
393

394
    Setting `ActiveSupport.halt_callback_chains_on_return_false`
395
    to `true` will let an app support the deprecated way of halting Active Record,
396
    and Active Model callback chains by returning `false`.
397

K
karanarora 已提交
398
    Setting the value to `false` will tell the app to ignore any `false` value
399
    returned by those callbacks, and only halt the chain upon `throw(:abort)`.
400 401 402 403 404

    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.
405

406
    *claudiob*, *Roque Pinel*
407

K
karanarora 已提交
408
*   Changes arguments and default value of CallbackChain's `:terminator` option
409 410 411 412 413 414

    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
415
    terminator's expectation.
416 417 418

    *claudiob*

419 420 421 422 423 424 425
*   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*

R
Robin Dupret 已提交
426 427
*   Add support for error dispatcher classes in `ActiveSupport::Rescuable`.
    Now it acts closer to Ruby's rescue.
428

429 430
    Example:

431 432 433 434 435 436 437 438 439 440 441 442 443 444
        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*

R
Robin Dupret 已提交
445
*   Add `#verified` and `#valid_message?` methods to `ActiveSupport::MessageVerifier`
446

R
Robin Dupret 已提交
447 448 449 450
    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.
451

R
Robin Dupret 已提交
452 453 454
    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.
455

456 457
    *Logan Leger*

458
Please check [4-2-stable](https://github.com/rails/rails/blob/4-2-stable/activesupport/CHANGELOG.md) for previous changes.