CHANGELOG.md 5.7 KB
Newer Older
1 2 3 4 5
*   `Module#delegate_missing_to` now raises `DelegationError` if target is nil,
    similar to `Module#delegate`.

    *Anton Khamets*

6
*   Update `String#camelize` to provide feedback when wrong option is passed
7

8
    `String#camelize` was returning nil without any feedback when an
J
Jon Moss 已提交
9
    invalid option was passed as a parameter.
10 11 12 13 14 15 16 17 18 19 20 21 22

    Previously:

        'one_two'.camelize(true)
        => nil

    Now:

        'one_two'.camelize(true)
        => ArgumentError: Invalid option, use either :upper or :lower.

    *Ricardo Díaz*

23 24
*   Fix modulo operations involving durations

J
Jon Moss 已提交
25 26 27
    Rails 5.1 introduced `ActiveSupport::Duration::Scalar` as a wrapper
    around numeric values as a way of ensuring a duration was the outcome of
    an expression. However, the implementation was missing support for modulo
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
    operations. This support has now been added and should result in a duration
    being returned from expressions involving modulo operations.

    Prior to Rails 5.1:

        5.minutes % 2.minutes
        => 60

    Now:

        5.minutes % 2.minutes
        => 1 minute

    Fixes #29603 and #29743.

    *Sayan Chakraborty*, *Andrew White*

45 46 47 48 49 50 51 52 53 54
*   Fix division where a duration is the denominator

    PR #29163 introduced a change in behavior when a duration was the denominator
    in a calculation - this was incorrect as dividing by a duration should always
    return a `Numeric`. The behavior of previous versions of Rails has been restored.

    Fixes #29592.

    *Andrew White*

55 56
*   Add purpose and expiry support to `ActiveSupport::MessageVerifier` &
   `ActiveSupport::MessageEncryptor`.
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

    For instance, to ensure a message is only usable for one intended purpose:

        token = @verifier.generate("x", purpose: :shipping)

        @verifier.verified(token, purpose: :shipping) # => "x"
        @verifier.verified(token)                     # => nil

    Or make it expire after a set time:

        @verifier.generate("x", expires_in: 1.month)
        @verifier.generate("y", expires_at: Time.now.end_of_year)

    Showcased with `ActiveSupport::MessageVerifier`, but works the same for
    `ActiveSupport::MessageEncryptor`'s `encrypt_and_sign` and `decrypt_and_verify`.

    Pull requests: #29599, #29854

    *Assain Jaleel*

E
Erol Fornoles 已提交
77 78 79 80
*   Make the order of `Hash#reverse_merge!` consistent with `HashWithIndifferentAccess`.

    *Erol Fornoles*

81
*   Add `freeze_time` helper which freezes time to `Time.now` in tests.
82

83
    *Prathamesh Sonpatki*
84

85
*   Default `ActiveSupport::MessageEncryptor` to use AES 256 GCM encryption.
86

87 88
    On for new Rails 5.2 apps. Upgrading apps can find the config as a new
    framework default.
89

90
    *Assain Jaleel*
91

J
Jeremy Daer 已提交
92
*   Cache: `write_multi`
93

J
Jeremy Daer 已提交
94
        Rails.cache.write_multi foo: 'bar', baz: 'qux'
95

J
Jeremy Daer 已提交
96 97 98
    Plus faster fetch_multi with stores that implement `write_multi_entries`.
    Keys that aren't found may be written to the cache store in one shot
    instead of separate writes.
99

J
Jeremy Daer 已提交
100 101 102
    The default implementation simply calls `write_entry` for each entry.
    Stores may override if they're capable of one-shot bulk writes, like
    Redis `MSET`.
103

J
Jeremy Daer 已提交
104
    *Jeremy Daer*
105

106
*   Add default option to module and class attribute accessors.
107

108
        mattr_accessor :settings, default: {}
109

110 111
    Works for `mattr_reader`, `mattr_writer`, `cattr_accessor`, `cattr_reader`,
    and `cattr_writer` as well.
112

113
    *Genadi Samokovarov*
114

115
*   Add `Date#prev_occurring` and `Date#next_occurring` to return specified next/previous occurring day of week.
116

117
    *Shota Iguchi*
118

119
*   Add default option to `class_attribute`.
120 121 122

    Before:

J
Jon Moss 已提交
123 124
        class_attribute :settings
        self.settings = {}
A
Andrew White 已提交
125

126
    Now:
127

J
Jon Moss 已提交
128
        class_attribute :settings, default: {}
129

130
    *DHH*
131

132
*   `#singularize` and `#pluralize` now respect uncountables for the specified locale.
133

134
    *Eilis Hamilton*
135

J
Jon Moss 已提交
136
*   Add `ActiveSupport::CurrentAttributes` to provide a thread-isolated attributes singleton.
137
    Primary use case is keeping all the per-request attributes easily available to the whole system.
138

139
    *DHH*
140

141
*   Fix implicit coercion calculations with scalars and durations
142

J
Jon Moss 已提交
143 144
    Previously, calculations where the scalar is first would be converted to a duration
    of seconds, but this causes issues with dates being converted to times, e.g:
145

146 147 148 149
        Time.zone = "Beijing"           # => Asia/Shanghai
        date = Date.civil(2017, 5, 20)  # => Mon, 20 May 2017
        2 * 1.day                       # => 172800 seconds
        date + 2 * 1.day                # => Mon, 22 May 2017 00:00:00 CST +08:00
150

J
Jon Moss 已提交
151
    Now, the `ActiveSupport::Duration::Scalar` calculation methods will try to maintain
152
    the part structure of the duration where possible, e.g:
153

154 155 156 157
        Time.zone = "Beijing"           # => Asia/Shanghai
        date = Date.civil(2017, 5, 20)  # => Mon, 20 May 2017
        2 * 1.day                       # => 2 days
        date + 2 * 1.day                # => Mon, 22 May 2017
158

159
    Fixes #29160, #28970.
A
Andrew White 已提交
160 161 162

    *Andrew White*

163
*   Add support for versioned cache entries. This enables the cache stores to recycle cache keys, greatly saving
R
Ryuta Kamizono 已提交
164
    on storage in cases with frequent churn. Works together with the separation of `#cache_key` and `#cache_version`
165
    in Active Record and its use in Action Pack's fragment caching.
A
Andrew White 已提交
166

167
    *DHH*
A
Andrew White 已提交
168

169
*   Pass gem name and deprecation horizon to deprecation notifications.
A
Andrew White 已提交
170

171
    *Willem van Bergen*
A
Andrew White 已提交
172

173
*   Add support for `:offset` and `:zone` to `ActiveSupport::TimeWithZone#change`
A
Andrew White 已提交
174 175 176

    *Andrew White*

177
*   Add support for `:offset` to `Time#change`
A
Andrew White 已提交
178

179
    Fixes #28723.
A
Andrew White 已提交
180 181 182

    *Andrew White*

183
*   Add `fetch_values` for `HashWithIndifferentAccess`
A
Andrew White 已提交
184

185
    The method was originally added to `Hash` in Ruby 2.3.0.
A
Andrew White 已提交
186

187
    *Josh Pencheon*
A
Andrew White 已提交
188

189

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