CHANGELOG.md 15.7 KB
Newer Older
1
*   Match `HashWithIndifferentAccess#default`'s behaviour with `Hash#default`.
2 3 4

    *David Cornu*

5 6
*   Adds `:exception_object` key to `ActiveSupport::Notifications::Instrumenter`
    payload when an exception is raised.
7

8 9
    Adds new key/value pair to payload when an exception is raised:
    e.g. `:exception_object => #<RuntimeError: FAIL>`.
10 11 12

    *Ryan T. Hosford*

13 14 15 16
*   Support extended grapheme clusters and UAX 29.

    *Adam Roben*

17
*   Add petabyte and exabyte numeric conversion.
E
eileencodes 已提交
18 19 20

    *Akshay Vishnoi*

21 22
## Rails 5.0.0.beta1 (December 18, 2015) ##

23 24 25 26 27 28 29 30 31 32
*   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
33

34 35 36
      def self.reset() self.account = self.user = nil end
    end

37
    class ApplicationController < ActionController::Base
38 39
      before_action :set_current
      after_action { Current.reset }
40

41 42 43
      private
        def set_current
          Current.account = Account.find(params[:account_id])
44
          Current.user    = Current.account.users.find(params[:user_id])
45 46 47 48 49 50 51 52 53 54 55 56
        end
    end

    class MessagesController < ApplicationController
      def create
        @message = Message.create!(message_params)
      end
    end

    class Message < ApplicationRecord
      has_many :events
      after_create :track_created
57

58 59 60 61 62 63 64
      private
        def track_created
          events.create! origin: self, action: :create
        end
    end

    class Event < ApplicationRecord
65 66
      belongs_to :creator, class_name: 'User'
      before_validation { self.creator ||= Current.user }
67 68 69 70 71
    end

    *DHH*


72 73 74 75 76
*   Deprecated `Module#qualified_const_` in favour of the builtin Module#const_
    methods.

    *Genadi Samokovarov*

77 78 79 80
*   Deprecate passing string to define callback.

    *Yuichiro Kaneko*

81 82 83
*   `ActiveSupport::Cache::Store#namespaced_key`,
    `ActiveSupport::Cache::MemCachedStore#escape_key`, and
    `ActiveSupport::Cache::FileStore#key_file_path`
84
    are deprecated and replaced with `normalize_key` that now calls `super`.
85

86
    `ActiveSupport::Cache::LocaleCache#set_cache_value` is deprecated and replaced with `write_cache_value`.
87

88 89
    *Michael Grosser*

90 91
*   Implements an evented file watcher to asynchronously detect changes in the
    application source code, routes, locales, etc.
92

93 94 95 96 97 98
    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:
99

J
Jon Pascoe 已提交
100
        group :development do
101
          gem 'listen', '~> 3.0.5'
J
Jon Pascoe 已提交
102
        end
103 104 105

    *Puneet Agarwal* and *Xavier Noria*

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

109
    *Jon Pascoe*
J
Jon Pascoe 已提交
110

111
*   Updated `parameterize` to preserve the case of a string, optionally.
112 113 114

    Example:

115 116
        parameterize("Donald E. Knuth", separator: '_') # => "donald_e_knuth"
        parameterize("Donald E. Knuth", preserve_case: true) # => "Donald-E-Knuth"
117 118 119

    *Swaathi Kakarla*

120 121 122 123 124 125
*   `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*

126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
*   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*

142
*   Handle invalid UTF-8 strings when HTML escaping.
143 144 145 146 147 148 149 150

    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 已提交
151 152 153 154 155
*   Update `ActiveSupport::Multibyte::Chars#slice!` to return `nil` if the
    arguments are out of bounds, to mirror the behavior of `String#slice!`

    *Gourav Tiwari*

156 157
*   Fix `number_to_human` so that 999999999 rounds to "1 Billion" instead of
    "1000 Million".
M
Max Jacobson 已提交
158 159 160

    *Max Jacobson*

161 162 163 164 165
*   Fix `ActiveSupport::Deprecation#deprecate_methods` to report using the
    current deprecator instance, where applicable.

    *Brandon Dunne*

166 167 168 169
*   `Cache#fetch` instrumentation marks whether it was a `:hit`.

    *Robin Clowers*

170 171 172 173 174 175 176 177 178 179 180
*   `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*

181 182
*   Short-circuit `blank?` on date and time values since they are never blank.

183
    Fixes #21657.
184 185 186

    *Andrew White*

187 188 189 190 191
*   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 已提交
192 193 194
*   Updated Unicode version to 8.0.0

    *Anshul Sharma*
195

196 197 198 199 200
*   `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:

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

204
    *Vipul A M*
205

206 207 208 209
*   Deprecate `:prefix` option of `number_to_human_size` with no replacement.

    *Jean Boussier*

210 211 212 213 214 215 216 217
*   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*

218 219 220
*   ActiveSupport::HashWithIndifferentAccess `select` and `reject` will now return
    enumerator if called without block.

221
    Fixes #20095.
222 223 224

    *Bernard Potocki*

225 226 227 228 229
*   Removed `ActiveSupport::Concurrency::Latch`, superseded by `Concurrent::CountDownLatch`
    from the concurrent-ruby gem.

    *Jerry D'Antonio*

Y
yuuji.yaginuma 已提交
230
*   Fix not calling `#default` on `HashWithIndifferentAccess#to_hash` when only
231 232 233 234
    `default_proc` is set, which could raise.

    *Simon Eskildsen*

235
*   Fix setting `default_proc` on `HashWithIndifferentAccess#dup`.
236 237 238

    *Simon Eskildsen*

239
*   Fix a range of values for parameters of the Time#change.
240 241 242

    *Nikolay Kondratyev*

K
Kevin Deisz 已提交
243 244 245 246 247 248 249
*   Add `Enumerable#pluck` to get the same values from arrays as from ActiveRecord
    associations.

    Fixes #20339.

    *Kevin Deisz*

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

253 254
    Before:

A
Aditya Sanghi 已提交
255
        if (slack_url = Rails.application.secrets.slack_url).present?
256
          # Do something worthwhile
257
        else
258
          # Raise as important secret password is not specified
259 260 261 262 263 264 265 266
        end

    After:

        slack_url = Rails.application.secrets.slack_url!

    *Aditya Sanghi*, *Gaurish Sharma*

267 268
*   Remove deprecated `Class#superclass_delegating_accessor`.
    Use `Class#class_attribute` instead.
269 270 271

    *Akshay Vishnoi*

272
*   Patch `Delegator` to work with `#try`.
273

274
    Fixes #5790.
275 276 277

    *Nate Smith*

278 279 280 281
*   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?)`.
282 283 284

    *DHH*

285
*   Encoding `ActiveSupport::TimeWithZone` to YAML now preserves the timezone information.
286 287 288 289 290

    Fixes #9183.

    *Andrew White*

291 292 293 294 295
*   Added `ActiveSupport::TimeZone#strptime` to allow parsing times as if
    from a given timezone.

    *Paul A Jungwirth*

296 297 298 299 300
*   `ActiveSupport::Callbacks#skip_callback` now raises an `ArgumentError` if
    an unrecognized callback is removed.

    *Iain Beeston*

301
*   Added `ActiveSupport::ArrayInquirer` and `Array#inquiry`.
302 303 304 305 306 307 308 309 310 311 312 313 314 315

    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

316 317 318
    `Array#inquiry` is a shortcut for wrapping the receiving array in an
    `ArrayInquirer`.

319 320
    *George Claghorn*

Y
Yves Senn 已提交
321 322
*   Deprecate `alias_method_chain` in favour of `Module#prepend` introduced in
    Ruby 2.0.
323 324 325

    *Kir Shatrov*

T
Todd Bealmear 已提交
326 327 328 329 330
*   Added `#without` on `Enumerable` and `Array` to return a copy of an
    enumerable without the specified elements.

    *Todd Bealmear*

K
karanarora 已提交
331
*   Fixed a problem where `String#truncate_words` would get stuck with a complex
332 333 334 335
    string.

    *Henrik Nygren*

K
karanarora 已提交
336
*   Fixed a roundtrip problem with `AS::SafeBuffer` where primitive-like strings
337 338 339 340
    will be dumped as primitives:

    Before:

341 342 343 344 345
        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
346

347
    After:
348

349 350 351 352 353
        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"
354 355 356

    *Godfrey Chan*

357 358
*   Enable `number_to_percentage` to keep the number's precision by allowing
    `:precision` to be `nil`.
359

360
    *Jack Xu*
361

362
*   `config_accessor` became a private method, as with Ruby's `attr_accessor`.
363 364 365

    *Akira Matsuda*

366 367 368 369 370
*   `AS::Testing::TimeHelpers#travel_to` now changes `DateTime.now` as well as
    `Time.now` and `Date.today`.

    *Yuki Nishijima*

371 372 373 374 375 376 377 378
*   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*

379 380 381 382
*   Return value of yielded block in `File.atomic_write`.

    *Ian Ker-Seymer*

K
karanarora 已提交
383
*   Duplicate frozen array when assigning it to a `HashWithIndifferentAccess` so
384 385 386 387 388 389
    that it doesn't raise a `RuntimeError` when calling `map!` on it in `convert_value`.

    Fixes #18550.

    *Aditya Kapoor*

390 391 392 393 394
*   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 已提交
395 396
*   Add `SecureRandom.base58` for generation of random base58 strings.

397
    *Matthew Draper*, *Guillermo Iguaran*
G
Guillermo Iguaran 已提交
398

399 400 401 402 403
*   Add `#prev_day` and `#next_day` counterparts to `#yesterday` and
    `#tomorrow` for `Date`, `Time`, and `DateTime`.

    *George Claghorn*

404 405 406 407 408
*   Add `same_time` option to `#next_week` and `#prev_week` for `Date`, `Time`,
    and `DateTime`.

    *George Claghorn*

409 410 411
*   Add `#on_weekend?`, `#next_weekday`, `#prev_weekday` methods to `Date`,
    `Time`, and `DateTime`.

K
karanarora 已提交
412
    `#on_weekend?` returns `true` if the receiving date/time falls on a Saturday
413 414 415 416 417 418 419 420 421 422
    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*

423 424 425 426
*   Change the default test order from `:sorted` to `:random`.

    *Rafael Mendonça França*

427 428 429 430
*   Remove deprecated `ActiveSupport::JSON::Encoding::CircularReferenceError`.

    *Rafael Mendonça França*

431 432 433 434 435
*   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*

436 437 438 439
*   Remove deprecated `ActiveSupport::SafeBuffer#prepend`.

    *Rafael Mendonça França*

440 441 442 443 444 445
*   Remove deprecated methods at `Kernel`.

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

    *Rafael Mendonça França*

446 447 448 449 450
*   Remove deprecated `active_support/core_ext/big_decimal/yaml_conversions`
    file.

    *Rafael Mendonça França*

451 452 453 454 455
*   Remove deprecated methods `ActiveSupport::Cache::Store.instrument` and
    `ActiveSupport::Cache::Store.instrument=`.

    *Rafael Mendonça França*

456
*   Change the way in which callback chains can be halted.
457

458 459
    The preferred method to halt a callback chain from now on is to explicitly
    `throw(:abort)`.
460 461
    In the past, callbacks could only be halted by explicitly providing a
    terminator and by having a callback match the conditions of the terminator.
462

463
*   Add `ActiveSupport.halt_callback_chains_on_return_false`
464

465
    Setting `ActiveSupport.halt_callback_chains_on_return_false`
466
    to `true` will let an app support the deprecated way of halting Active Record,
467
    and Active Model callback chains by returning `false`.
468

K
karanarora 已提交
469
    Setting the value to `false` will tell the app to ignore any `false` value
470
    returned by those callbacks, and only halt the chain upon `throw(:abort)`.
471 472 473 474 475

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

477
    *claudiob*, *Roque Pinel*
478

K
karanarora 已提交
479
*   Changes arguments and default value of CallbackChain's `:terminator` option
480 481 482 483 484 485

    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
486
    terminator's expectation.
487 488 489

    *claudiob*

490 491 492 493 494 495 496
*   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 已提交
497 498
*   Add support for error dispatcher classes in `ActiveSupport::Rescuable`.
    Now it acts closer to Ruby's rescue.
499

500 501
    Example:

502 503 504 505 506 507 508 509 510 511 512 513 514 515
        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 已提交
516
*   Add `#verified` and `#valid_message?` methods to `ActiveSupport::MessageVerifier`
517

R
Robin Dupret 已提交
518 519 520 521
    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.
522

R
Robin Dupret 已提交
523 524 525
    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.
526

527 528
    *Logan Leger*

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