CHANGELOG.md 15.2 KB
Newer Older
1 2
## Rails 5.0.0.beta1 (December 18, 2015) ##

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
*   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 < ActiveController::Base
      before_action :set_current
      after_action { Current.reset }
    
      private
        def set_current
          Current.account = Account.find(params[:account_id])
24
          Current.user    = Current.account.users.find(params[:user_id])
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
        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
45 46
      belongs_to :creator, class_name: 'User'
      before_validation { self.creator ||= Current.user }
47 48 49 50 51
    end

    *DHH*


52 53 54 55 56
*   Deprecated `Module#qualified_const_` in favour of the builtin Module#const_
    methods.

    *Genadi Samokovarov*

57 58 59 60
*   Deprecate passing string to define callback.

    *Yuichiro Kaneko*

61 62 63 64
*   `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`.
65

66
    `ActiveSupport::Cache::LocaleCache#set_cache_value` is deprecated and replaced with `write_cache_value`.
67

68 69
    *Michael Grosser*

70 71
*   Implements an evented file watcher to asynchronously detect changes in the
    application source code, routes, locales, etc.
72

73 74 75 76 77 78
    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:
79

J
Jon Pascoe 已提交
80
        group :development do
81
          gem 'listen', '~> 3.0.5'
J
Jon Pascoe 已提交
82
        end
83 84 85

    *Puneet Agarwal* and *Xavier Noria*

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

89
    *Jon Pascoe*
J
Jon Pascoe 已提交
90

91
*   Updated `parameterize` to preserve the case of a string, optionally.
92 93 94

    Example:

95 96
        parameterize("Donald E. Knuth", separator: '_') # => "donald_e_knuth"
        parameterize("Donald E. Knuth", preserve_case: true) # => "Donald-E-Knuth"
97 98 99

    *Swaathi Kakarla*

100 101 102 103 104 105
*   `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*

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
*   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*

122 123 124 125 126 127 128 129 130
*   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 已提交
131 132 133 134 135
*   Update `ActiveSupport::Multibyte::Chars#slice!` to return `nil` if the
    arguments are out of bounds, to mirror the behavior of `String#slice!`

    *Gourav Tiwari*

136 137
*   Fix `number_to_human` so that 999999999 rounds to "1 Billion" instead of
    "1000 Million".
M
Max Jacobson 已提交
138 139 140

    *Max Jacobson*

141 142 143 144 145
*   Fix `ActiveSupport::Deprecation#deprecate_methods` to report using the
    current deprecator instance, where applicable.

    *Brandon Dunne*

146 147 148 149
*   `Cache#fetch` instrumentation marks whether it was a `:hit`.

    *Robin Clowers*

150 151 152 153 154 155 156 157 158 159 160
*   `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*

161 162 163 164 165 166
*   Short-circuit `blank?` on date and time values since they are never blank.

    Fixes #21657

    *Andrew White*

167 168 169 170 171
*   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 已提交
172 173 174
*   Updated Unicode version to 8.0.0

    *Anshul Sharma*
175

176 177 178 179 180
*   `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:

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

184
    *Vipul A M*
185

186 187 188 189
*   Deprecate `:prefix` option of `number_to_human_size` with no replacement.

    *Jean Boussier*

190 191 192 193 194 195 196 197
*   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*

198 199 200 201 202 203 204
*   ActiveSupport::HashWithIndifferentAccess `select` and `reject` will now return
    enumerator if called without block.

    Fixes #20095

    *Bernard Potocki*

205 206 207 208 209
*   Removed `ActiveSupport::Concurrency::Latch`, superseded by `Concurrent::CountDownLatch`
    from the concurrent-ruby gem.

    *Jerry D'Antonio*

Y
yuuji.yaginuma 已提交
210
*   Fix not calling `#default` on `HashWithIndifferentAccess#to_hash` when only
211 212 213 214
    `default_proc` is set, which could raise.

    *Simon Eskildsen*

215 216 217 218
*   Fix setting `default_proc` on `HashWithIndifferentAccess#dup`

    *Simon Eskildsen*

219 220 221 222
*   Fix a range of values for parameters of the Time#change

    *Nikolay Kondratyev*

K
Kevin Deisz 已提交
223 224 225 226 227 228 229
*   Add `Enumerable#pluck` to get the same values from arrays as from ActiveRecord
    associations.

    Fixes #20339.

    *Kevin Deisz*

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

233 234
    Before:

A
Aditya Sanghi 已提交
235
        if (slack_url = Rails.application.secrets.slack_url).present?
236
          # Do something worthwhile
237
        else
238
          # Raise as important secret password is not specified
239 240 241 242 243 244 245 246
        end

    After:

        slack_url = Rails.application.secrets.slack_url!

    *Aditya Sanghi*, *Gaurish Sharma*

247 248
*   Remove deprecated `Class#superclass_delegating_accessor`.
    Use `Class#class_attribute` instead.
249 250 251

    *Akshay Vishnoi*

252
*   Patch `Delegator` to work with `#try`.
253

254
    Fixes #5790.
255 256 257

    *Nate Smith*

258 259 260 261
*   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?)`.
262 263 264

    *DHH*

265
*   Encoding `ActiveSupport::TimeWithZone` to YAML now preserves the timezone information.
266 267 268 269 270

    Fixes #9183.

    *Andrew White*

271 272 273 274 275
*   Added `ActiveSupport::TimeZone#strptime` to allow parsing times as if
    from a given timezone.

    *Paul A Jungwirth*

276 277 278 279 280
*   `ActiveSupport::Callbacks#skip_callback` now raises an `ArgumentError` if
    an unrecognized callback is removed.

    *Iain Beeston*

281
*   Added `ActiveSupport::ArrayInquirer` and `Array#inquiry`.
282 283 284 285 286 287 288 289 290 291 292 293 294 295

    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

296 297 298
    `Array#inquiry` is a shortcut for wrapping the receiving array in an
    `ArrayInquirer`.

299 300
    *George Claghorn*

Y
Yves Senn 已提交
301 302
*   Deprecate `alias_method_chain` in favour of `Module#prepend` introduced in
    Ruby 2.0.
303 304 305

    *Kir Shatrov*

T
Todd Bealmear 已提交
306 307 308 309 310
*   Added `#without` on `Enumerable` and `Array` to return a copy of an
    enumerable without the specified elements.

    *Todd Bealmear*

K
karanarora 已提交
311
*   Fixed a problem where `String#truncate_words` would get stuck with a complex
312 313 314 315
    string.

    *Henrik Nygren*

K
karanarora 已提交
316
*   Fixed a roundtrip problem with `AS::SafeBuffer` where primitive-like strings
317 318 319 320
    will be dumped as primitives:

    Before:

321 322 323 324 325
        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
326

327
    After:
328

329 330 331 332 333
        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"
334 335 336

    *Godfrey Chan*

337 338
*   Enable `number_to_percentage` to keep the number's precision by allowing
    `:precision` to be `nil`.
339

340
    *Jack Xu*
341

342
*   `config_accessor` became a private method, as with Ruby's `attr_accessor`.
343 344 345

    *Akira Matsuda*

346 347 348 349 350
*   `AS::Testing::TimeHelpers#travel_to` now changes `DateTime.now` as well as
    `Time.now` and `Date.today`.

    *Yuki Nishijima*

351 352 353 354 355 356 357 358
*   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*

359 360 361 362
*   Return value of yielded block in `File.atomic_write`.

    *Ian Ker-Seymer*

K
karanarora 已提交
363
*   Duplicate frozen array when assigning it to a `HashWithIndifferentAccess` so
364 365 366 367 368 369
    that it doesn't raise a `RuntimeError` when calling `map!` on it in `convert_value`.

    Fixes #18550.

    *Aditya Kapoor*

370 371 372 373 374
*   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 已提交
375 376
*   Add `SecureRandom.base58` for generation of random base58 strings.

377
    *Matthew Draper*, *Guillermo Iguaran*
G
Guillermo Iguaran 已提交
378

379 380 381 382 383
*   Add `#prev_day` and `#next_day` counterparts to `#yesterday` and
    `#tomorrow` for `Date`, `Time`, and `DateTime`.

    *George Claghorn*

384 385 386 387 388
*   Add `same_time` option to `#next_week` and `#prev_week` for `Date`, `Time`,
    and `DateTime`.

    *George Claghorn*

389 390 391
*   Add `#on_weekend?`, `#next_weekday`, `#prev_weekday` methods to `Date`,
    `Time`, and `DateTime`.

K
karanarora 已提交
392
    `#on_weekend?` returns `true` if the receiving date/time falls on a Saturday
393 394 395 396 397 398 399 400 401 402
    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*

403 404 405 406
*   Change the default test order from `:sorted` to `:random`.

    *Rafael Mendonça França*

407 408 409 410
*   Remove deprecated `ActiveSupport::JSON::Encoding::CircularReferenceError`.

    *Rafael Mendonça França*

411 412 413 414 415
*   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*

416 417 418 419
*   Remove deprecated `ActiveSupport::SafeBuffer#prepend`.

    *Rafael Mendonça França*

420 421 422 423 424 425
*   Remove deprecated methods at `Kernel`.

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

    *Rafael Mendonça França*

426 427 428 429 430
*   Remove deprecated `active_support/core_ext/big_decimal/yaml_conversions`
    file.

    *Rafael Mendonça França*

431 432 433 434 435
*   Remove deprecated methods `ActiveSupport::Cache::Store.instrument` and
    `ActiveSupport::Cache::Store.instrument=`.

    *Rafael Mendonça França*

436
*   Change the way in which callback chains can be halted.
437

438 439
    The preferred method to halt a callback chain from now on is to explicitly
    `throw(:abort)`.
440 441
    In the past, callbacks could only be halted by explicitly providing a
    terminator and by having a callback match the conditions of the terminator.
442

443
*   Add `ActiveSupport.halt_callback_chains_on_return_false`
444

445
    Setting `ActiveSupport.halt_callback_chains_on_return_false`
446
    to `true` will let an app support the deprecated way of halting Active Record,
447
    and Active Model callback chains by returning `false`.
448

K
karanarora 已提交
449
    Setting the value to `false` will tell the app to ignore any `false` value
450
    returned by those callbacks, and only halt the chain upon `throw(:abort)`.
451 452 453 454 455

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

457
    *claudiob*, *Roque Pinel*
458

K
karanarora 已提交
459
*   Changes arguments and default value of CallbackChain's `:terminator` option
460 461 462 463 464 465

    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
466
    terminator's expectation.
467 468 469

    *claudiob*

470 471 472 473 474 475 476
*   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 已提交
477 478
*   Add support for error dispatcher classes in `ActiveSupport::Rescuable`.
    Now it acts closer to Ruby's rescue.
479

480 481
    Example:

482 483 484 485 486 487 488 489 490 491 492 493 494 495
        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 已提交
496
*   Add `#verified` and `#valid_message?` methods to `ActiveSupport::MessageVerifier`
497

R
Robin Dupret 已提交
498 499 500 501
    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.
502

R
Robin Dupret 已提交
503 504 505
    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.
506

507 508
    *Logan Leger*

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