CHANGELOG.md 10.1 KB
Newer Older
1 2
## Rails 6.0.0.beta2 (February 25, 2019) ##

3 4 5 6
*   New autoloading based on [Zeitwerk](https://github.com/fxn/zeitwerk).

    *Xavier Noria*

Z
zvkemp 已提交
7 8 9 10
*   Revise `ActiveSupport::Notifications.unsubscribe` to correctly handle Regex or other multiple-pattern subscribers.

    *Zach Kemp*

11 12 13 14
*   Add `before_reset` callback to `CurrentAttributes` and define `after_reset` as an alias of `resets` for symmetry.

    *Rosa Gutierrez*

15
*   Remove the `` Kernel#` `` override that suppresses ENOENT and accidentally returns nil on Unix systems.
16 17 18

    *Akinori Musha*

19 20 21 22 23 24
*   Add `ActiveSupport::HashWithIndifferentAccess#assoc`.

    `assoc` can now be called with either a string or a symbol.

    *Stefan Schüßler*

25 26 27 28
*   Add `Hash#deep_transform_values`, and `Hash#deep_transform_values!`.

    *Guillermo Iguaran*

29 30
## Rails 6.0.0.beta1 (January 18, 2019) ##

31 32 33 34
*   Remove deprecated `Module#reachable?` method.

    *Rafael Mendonça França*

35 36 37 38
*   Remove deprecated `#acronym_regex` method from `Inflections`.

    *Rafael Mendonça França*

39 40 41 42
*   Fix `String#safe_constantize` throwing a `LoadError` for incorrectly cased constant references.

    *Keenan Brock*

43 44 45 46 47 48
*   Preserve key order passed to `ActiveSupport::CacheStore#fetch_multi`.

    `fetch_multi(*names)` now returns its results in the same order as the `*names` requested, rather than returning cache hits followed by cache misses.

    *Gannon McGibbon*

49 50 51 52
*   If the same block is `included` multiple times for a Concern, an exception is no longer raised.

    *Mark J. Titorenko*, *Vlad Bokov*

53 54 55 56 57
*   Fix bug where `#to_options` for `ActiveSupport::HashWithIndifferentAccess`
    would not act as alias for `#symbolize_keys`.

    *Nick Weiland*

58 59 60 61
*   Improve the logic that detects non-autoloaded constants.

    *Jan Habermann*, *Xavier Noria*

62 63 64 65 66
*   Deprecate `ActiveSupport::Multibyte::Unicode#pack_graphemes(array)` and `ActiveSuppport::Multibyte::Unicode#unpack_graphemes(string)`
    in favor of `array.flatten.pack("U*")` and `string.scan(/\X/).map(&:codepoints)`, respectively.

    *Francesco Rodríguez*

67 68 69 70
*   Deprecate `ActiveSupport::Multibyte::Chars.consumes?` in favor of `String#is_utf8?`.

    *Francesco Rodríguez*

71 72 73 74 75 76 77 78 79
*   Fix duration being rounded to a full second.
    ```
      time = DateTime.parse("2018-1-1")
      time += 0.51.seconds
    ```
    Will now correctly add 0.51 second and not 1 full second.

    *Edouard Chin*

80 81 82 83 84
*   Deprecate `ActiveSupport::Multibyte::Unicode#normalize` and `ActiveSuppport::Multibyte::Chars#normalize`
    in favor of `String#unicode_normalize`

    *Francesco Rodríguez*

85 86 87 88 89
*   Deprecate `ActiveSupport::Multibyte::Unicode#downcase/upcase/swapcase` in favor of
    `String#downcase/upcase/swapcase`.

    *Francesco Rodríguez*

90 91 92 93
*   Add `ActiveSupport::ParameterFilter`.

    *Yoshiyuki Kinjo*

94 95 96 97 98
*   Rename `Module#parent`, `Module#parents`, and `Module#parent_name` to
    `module_parent`, `module_parents`, and `module_parent_name`.

    *Gannon McGibbon*

99 100 101 102
*   Deprecate the use of `LoggerSilence` in favor of `ActiveSupport::LoggerSilence`

    *Edouard Chin*

103 104 105 106
*   Deprecate using negative limits in `String#first` and `String#last`.

    *Gannon McGibbon*, *Eric Turner*

107 108 109 110 111
*   Fix bug where `#without` for `ActiveSupport::HashWithIndifferentAccess` would fail
    with symbol arguments

    *Abraham Chan*

112 113 114 115 116
*   Treat `#delete_prefix`, `#delete_suffix` and `#unicode_normalize` results as non-`html_safe`.
    Ensure safety of arguments for `#insert`, `#[]=` and `#replace` calls on `html_safe` Strings.

    *Janosch Müller*

117 118
*   Changed `ActiveSupport::TaggedLogging.new` to return a new logger instance instead
    of mutating the one received as parameter.
119 120 121

    *Thierry Joyal*

122 123 124 125 126 127
*   Define `unfreeze_time` as an alias of `travel_back` in `ActiveSupport::Testing::TimeHelpers`.

    The alias is provided for symmetry with `freeze_time`.

    *Ryan Davidson*

X
Xavier Noria 已提交
128 129 130 131 132 133 134 135 136
*   Add support for tracing constant autoloads. Just throw

        ActiveSupport::Dependencies.logger = Rails.logger
        ActiveSupport::Dependencies.verbose = true

    in an initializer.

    *Xavier Noria*

R
Ryuta Kamizono 已提交
137
*   Maintain `html_safe?` on html_safe strings when sliced.
138 139 140 141

        string = "<div>test</div>".html_safe
        string[-1..1].html_safe? # => true

R
Ryuta Kamizono 已提交
142
    *Elom Gomez*, *Yumin Wong*
143

B
bogdanvlviv 已提交
144 145 146 147 148 149 150 151 152 153 154
*   Add `Array#extract!`.

    The method removes and returns the elements for which the block returns a true value.
    If no block is given, an Enumerator is returned instead.

        numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        odd_numbers = numbers.extract! { |number| number.odd? } # => [1, 3, 5, 7, 9]
        numbers # => [0, 2, 4, 6, 8]

    *bogdanvlviv*

155 156 157 158 159 160 161
*   Support not to cache `nil` for `ActiveSupport::Cache#fetch`.

        cache.fetch('bar', skip_nil: true) { nil }
        cache.exist?('bar') # => false

    *Martin Hong*

A
Aaron Patterson 已提交
162
*   Add "event object" support to the notification system.
A
Aaron Patterson 已提交
163
    Before this change, end users were forced to create hand made artisanal
A
Aaron Patterson 已提交
164 165 166 167 168
    event objects on their own, like this:

        ActiveSupport::Notifications.subscribe('wait') do |*args|
          @event = ActiveSupport::Notifications::Event.new(*args)
        end
169

A
Aaron Patterson 已提交
170 171 172
        ActiveSupport::Notifications.instrument('wait') do
          sleep 1
        end
173

A
Aaron Patterson 已提交
174 175 176 177 178 179 180 181 182
        @event.duration # => 1000.138

    After this change, if the block passed to `subscribe` only takes one
    parameter, the framework will yield an event object to the block.  Now
    end users are no longer required to make their own:

        ActiveSupport::Notifications.subscribe('wait') do |event|
          @event = event
        end
183

A
Aaron Patterson 已提交
184 185 186
        ActiveSupport::Notifications.instrument('wait') do
          sleep 1
        end
187

A
Aaron Patterson 已提交
188 189 190 191 192 193 194 195
        p @event.allocations # => 7
        p @event.cpu_time    # => 0.256
        p @event.idle_time   # => 1003.2399

    Now you can enjoy event objects without making them yourself.  Neat!

    *Aaron "t.lo" Patterson*

R
Ryuta Kamizono 已提交
196
*   Add cpu_time, idle_time, and allocations to Event.
197 198 199

    *Eileen M. Uchitelle*, *Aaron Patterson*

K
Kasper Timm Hansen 已提交
200 201 202 203 204 205 206 207 208 209
*   RedisCacheStore: support key expiry in increment/decrement.

    Pass `:expires_in` to `#increment` and `#decrement` to set a Redis EXPIRE on the key.

    If the key is already set to expire, RedisCacheStore won't extend its expiry.

        Rails.cache.increment("some_key", 1, expires_in: 2.minutes)

    *Jason Lee*

R
Ryuta Kamizono 已提交
210
*   Allow `Range#===` and `Range#cover?` on Range.
U
utilum 已提交
211 212 213 214 215 216 217 218 219 220

    `Range#cover?` can now accept a range argument like `Range#include?` and
    `Range#===`. `Range#===` works correctly on Ruby 2.6. `Range#include?` is moved
    into a new file, with these two methods.

    *Requiring active_support/core_ext/range/include_range is now deprecated.*
    *Use `require "active_support/core_ext/range/compare_range"` instead.*

    *utilum*

221 222 223 224 225 226 227 228 229 230 231
*   Add `index_with` to Enumerable.

    Allows creating a hash from an enumerable with the value from a passed block
    or a default argument.

        %i( title body ).index_with { |attr| post.public_send(attr) }
        # => { title: "hey", body: "what's up?" }

        %i( title body ).index_with(nil)
        # => { title: nil, body: nil }

232
    Closely linked with `index_by`, which creates a hash where the keys are extracted from a block.
233 234 235

    *Kasper Timm Hansen*

236
*   Fix bug where `ActiveSupport::Timezone.all` would fail when tzinfo data for
237
    any timezone defined in `ActiveSupport::TimeZone::MAPPING` is missing.
238 239 240

    *Dominik Sander*

241 242 243 244 245
*   Redis cache store: `delete_matched` no longer blocks the Redis server.
    (Switches from evaled Lua to a batched SCAN + DEL loop.)

    *Gleb Mazovetskiy*

246 247 248 249 250 251 252
*   Fix bug where `ActiveSupport::Cache` will massively inflate the storage
    size when compression is enabled (which is true by default). This patch
    does not attempt to repair existing data: please manually flush the cache
    to clear out the problematic entries.

    *Godfrey Chan*

253
*   Fix bug where `URI.unescape` would fail with mixed Unicode/escaped character input:
254 255 256 257 258 259 260

        URI.unescape("\xe3\x83\x90")  # => "バ"
        URI.unescape("%E3%83%90")  # => "バ"
        URI.unescape("\xe3\x83\x90%E3%83%90")  # => Encoding::CompatibilityError

    *Ashe Connor*, *Aaron Patterson*

261 262 263 264 265
*   Add `before?` and `after?` methods to `Date`, `DateTime`,
    `Time`, and `TimeWithZone`.

    *Nick Holden*

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
*   `ActiveSupport::Inflector#ordinal` and `ActiveSupport::Inflector#ordinalize` now support
    translations through I18n.

        # locale/fr.rb

        {
          fr: {
            number: {
              nth: {
                ordinals: lambda do |_key, number:, **_options|
                  if number.to_i.abs == 1
                    'er'
                  else
                    'e'
                  end
                end,

                ordinalized: lambda do |_key, number:, **_options|
                  "#{number}#{ActiveSupport::Inflector.ordinal(number)}"
                end
              }
            }
          }
        }


    *Christian Blais*

294 295
*   Add `:private` option to ActiveSupport's `Module#delegate`
    in order to delegate methods as private:
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311

        class User < ActiveRecord::Base
          has_one :profile
          delegate :date_of_birth, to: :profile, private: true

          def age
            Date.today.year - date_of_birth.year
          end
        end

        # User.new.age  # => 29
        # User.new.date_of_birth
        # => NoMethodError: private method `date_of_birth' called for #<User:0x00000008221340>

    *Tomas Valent*

312 313 314 315 316
*   `String#truncate_bytes` to truncate a string to a maximum bytesize without
    breaking multibyte characters or grapheme clusters like 👩‍👩‍👦‍👦.

    *Jeremy Daer*

317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
*   `String#strip_heredoc` preserves frozenness.

        "foo".freeze.strip_heredoc.frozen?  # => true

    Fixes that frozen string literals would inadvertently become unfrozen:

        # frozen_string_literal: true

        foo = <<-MSG.strip_heredoc
          la la la
        MSG

        foo.frozen?  # => false !??

    *Jeremy Daer*

K
Kasper Timm Hansen 已提交
333
*   Rails 6 requires Ruby 2.5.0 or newer.
J
Jeremy Daer 已提交
334

K
Kasper Timm Hansen 已提交
335
    *Jeremy Daer*, *Kasper Timm Hansen*
J
Jeremy Daer 已提交
336

B
bogdanvlviv 已提交
337
*   Adds parallel testing to Rails.
J
Jeremy Daer 已提交
338 339 340 341

    Parallelize your test suite with forked processes or threads.

    *Eileen M. Uchitelle*, *Aaron Patterson*
E
eileencodes 已提交
342

343

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