activesupport 7.2.1 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +67 -189
 - data/lib/active_support/backtrace_cleaner.rb +1 -1
 - data/lib/active_support/benchmark.rb +21 -0
 - data/lib/active_support/benchmarkable.rb +3 -2
 - data/lib/active_support/broadcast_logger.rb +14 -14
 - data/lib/active_support/cache/file_store.rb +12 -2
 - data/lib/active_support/cache/memory_store.rb +6 -2
 - data/lib/active_support/cache/redis_cache_store.rb +5 -2
 - data/lib/active_support/cache.rb +18 -13
 - data/lib/active_support/callbacks.rb +1 -2
 - data/lib/active_support/class_attribute.rb +26 -0
 - data/lib/active_support/code_generator.rb +9 -0
 - data/lib/active_support/concurrency/share_lock.rb +0 -1
 - data/lib/active_support/configuration_file.rb +15 -6
 - data/lib/active_support/core_ext/benchmark.rb +6 -9
 - data/lib/active_support/core_ext/class/attribute.rb +10 -19
 - data/lib/active_support/core_ext/date/conversions.rb +2 -0
 - data/lib/active_support/core_ext/date_and_time/compatibility.rb +2 -2
 - data/lib/active_support/core_ext/enumerable.rb +8 -3
 - data/lib/active_support/core_ext/hash/except.rb +0 -12
 - data/lib/active_support/core_ext/module/attr_internal.rb +3 -4
 - data/lib/active_support/core_ext/object/json.rb +20 -12
 - data/lib/active_support/core_ext/string/multibyte.rb +1 -1
 - data/lib/active_support/core_ext/thread/backtrace/location.rb +2 -7
 - data/lib/active_support/core_ext/time/calculations.rb +14 -2
 - data/lib/active_support/core_ext/time/compatibility.rb +9 -1
 - data/lib/active_support/core_ext/time/conversions.rb +2 -0
 - data/lib/active_support/core_ext/time/zones.rb +1 -1
 - data/lib/active_support/current_attributes.rb +7 -3
 - data/lib/active_support/delegation.rb +0 -2
 - data/lib/active_support/dependencies.rb +0 -1
 - data/lib/active_support/deprecation/reporting.rb +2 -21
 - data/lib/active_support/deprecation.rb +1 -1
 - data/lib/active_support/duration.rb +14 -10
 - data/lib/active_support/encrypted_configuration.rb +20 -2
 - data/lib/active_support/encrypted_file.rb +1 -1
 - data/lib/active_support/error_reporter.rb +25 -1
 - data/lib/active_support/evented_file_update_checker.rb +0 -1
 - data/lib/active_support/gem_version.rb +3 -3
 - data/lib/active_support/hash_with_indifferent_access.rb +16 -16
 - data/lib/active_support/i18n_railtie.rb +19 -11
 - data/lib/active_support/isolated_execution_state.rb +0 -2
 - data/lib/active_support/json/encoding.rb +2 -2
 - data/lib/active_support/notifications/fanout.rb +0 -1
 - data/lib/active_support/number_helper.rb +22 -0
 - data/lib/active_support/railtie.rb +4 -0
 - data/lib/active_support/tagged_logging.rb +5 -0
 - data/lib/active_support/testing/assertions.rb +79 -21
 - data/lib/active_support/testing/isolation.rb +2 -2
 - data/lib/active_support/testing/parallelization/server.rb +3 -0
 - data/lib/active_support/testing/strict_warnings.rb +3 -0
 - data/lib/active_support/testing/time_helpers.rb +2 -1
 - data/lib/active_support/time_with_zone.rb +22 -13
 - data/lib/active_support/values/time_zone.rb +17 -15
 - data/lib/active_support.rb +10 -3
 - metadata +40 -11
 - data/lib/active_support/proxy_object.rb +0 -20
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 8d43c6938627c736f544a0a9f0af6f8a538e8dd6c147ff51e368946c4d57d7c4
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 6e57c37c1735b475cb5a2d96c0af1ed0f6f2f2d41a776743bc97cc0b61e4b778
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: c01d045e73ab8eb2c3a3494180490bb5fa39a082343d5445593bd591333cd95cca84ad0d79668afe6603389ac675c8cbe3f98a0bb5612bfb5a3ec8d77fa26d9b
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: b5a92add8986b7bb4f73a5e7c4ff82525dfcfb4a1ca0bcedb6364a338f88cb5b411595c1704d508d68ad0ed2df850788132a2270e4f1421d672b1394c49e8306
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,258 +1,136 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            ## Rails  
     | 
| 
      
 1 
     | 
    
         
            +
            ## Rails 8.0.0 (November 07, 2024) ##
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            *   No changes.
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
            ## Rails  
     | 
| 
      
 6 
     | 
    
         
            +
            ## Rails 8.0.0.rc2 (October 30, 2024) ##
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
     | 
    
         
            -
            *    
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
                ```ruby
         
     | 
| 
       11 
     | 
    
         
            -
                class Person
         
     | 
| 
       12 
     | 
    
         
            -
                  delegate_missing_to :address, allow_nil: true
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                  def address
         
     | 
| 
       15 
     | 
    
         
            -
                    nil
         
     | 
| 
       16 
     | 
    
         
            -
                  end
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
                  def berliner?
         
     | 
| 
       19 
     | 
    
         
            -
                    city == "Berlin"
         
     | 
| 
       20 
     | 
    
         
            -
                  end
         
     | 
| 
       21 
     | 
    
         
            -
                end
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
                Person.new.city # => nil
         
     | 
| 
       24 
     | 
    
         
            -
                Person.new.berliner? # undefined local variable or method `city' for an instance of Person (NameError)
         
     | 
| 
       25 
     | 
    
         
            -
                ```
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                *Jean Boussier*
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
            *   Add `logger` as a dependency since it is a bundled gem candidate for Ruby 3.5
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                *Earlopain*
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
            *   Define `Digest::UUID.nil_uuid`, which returns the so-called nil UUID.
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
                *Xavier Noria*
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
            *   Support `duration` type in `ActiveSupport::XmlMini`.
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
                *heka1024*
         
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
            *   Remove deprecated `ActiveSupport::Notifications::Event#children` and  `ActiveSupport::Notifications::Event#parent_of?`.
         
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
                *Rafael Mendonça França*
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
            *   Remove deprecated support to call the following methods without passing a deprecator:
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
                - `deprecate`
         
     | 
| 
       48 
     | 
    
         
            -
                - `deprecate_constant`
         
     | 
| 
       49 
     | 
    
         
            -
                - `ActiveSupport::Deprecation::DeprecatedObjectProxy.new`
         
     | 
| 
       50 
     | 
    
         
            -
                - `ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new`
         
     | 
| 
       51 
     | 
    
         
            -
                - `ActiveSupport::Deprecation::DeprecatedConstantProxy.new`
         
     | 
| 
       52 
     | 
    
         
            -
                - `assert_deprecated`
         
     | 
| 
       53 
     | 
    
         
            -
                - `assert_not_deprecated`
         
     | 
| 
       54 
     | 
    
         
            -
                - `collect_deprecations`
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                *Rafael Mendonça França*
         
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
            *   Remove deprecated `ActiveSupport::Deprecation` delegation to instance.
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
                *Rafael Mendonça França*
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
            *   Remove deprecated `SafeBuffer#clone_empty`.
         
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
                *Rafael Mendonça França*
         
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
            *   Remove deprecated `#to_default_s` from `Array`, `Date`, `DateTime` and `Time`.
         
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
                *Rafael Mendonça França*
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
            *   Remove deprecated support to passing `Dalli::Client` instances to `MemCacheStore`.
         
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
                *Rafael Mendonça França*
         
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
            *   Remove deprecated `config.active_support.use_rfc4122_namespaced_uuids`.
         
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
                *Rafael Mendonça França*
         
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
            *   Remove deprecated `config.active_support.remove_deprecated_time_with_zone_name`.
         
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
                *Rafael Mendonça França*
         
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
            *   Remove deprecated `config.active_support.disable_to_s_conversion`.
         
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
     | 
    
         
            -
                *Rafael Mendonça França*
         
     | 
| 
      
 8 
     | 
    
         
            +
            *   No changes.
         
     | 
| 
       85 
9 
     | 
    
         | 
| 
       86 
     | 
    
         
            -
            *   Remove deprecated support to bolding log text with positional boolean in `ActiveSupport::LogSubscriber#color`.
         
     | 
| 
       87 
10 
     | 
    
         | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
            ## Rails 8.0.0.rc1 (October 19, 2024) ##
         
     | 
| 
       89 
12 
     | 
    
         | 
| 
       90 
     | 
    
         
            -
            *   Remove deprecated  
     | 
| 
      
 13 
     | 
    
         
            +
            *   Remove deprecated support to passing an array of strings to `ActiveSupport::Deprecation#warn`.
         
     | 
| 
       91 
14 
     | 
    
         | 
| 
       92 
15 
     | 
    
         
             
                *Rafael Mendonça França*
         
     | 
| 
       93 
16 
     | 
    
         | 
| 
       94 
     | 
    
         
            -
            *   Remove deprecated support  
     | 
| 
      
 17 
     | 
    
         
            +
            *   Remove deprecated support to setting `attr_internal_naming_format` with a `@` prefix.
         
     | 
| 
       95 
18 
     | 
    
         | 
| 
       96 
19 
     | 
    
         
             
                *Rafael Mendonça França*
         
     | 
| 
       97 
20 
     | 
    
         | 
| 
       98 
     | 
    
         
            -
            *   Remove deprecated  
     | 
| 
      
 21 
     | 
    
         
            +
            *   Remove deprecated `ActiveSupport::ProxyObject`.
         
     | 
| 
       99 
22 
     | 
    
         | 
| 
       100 
23 
     | 
    
         
             
                *Rafael Mendonça França*
         
     | 
| 
       101 
24 
     | 
    
         | 
| 
       102 
     | 
    
         
            -
            *    
     | 
| 
       103 
     | 
    
         
            -
             
     | 
| 
       104 
     | 
    
         
            -
                `ActiveSupport::TestCase` now warns when tests do not run any assertions.
         
     | 
| 
       105 
     | 
    
         
            -
                This is helpful in detecting broken tests that do not perform intended assertions.
         
     | 
| 
       106 
     | 
    
         
            -
             
     | 
| 
       107 
     | 
    
         
            -
                *fatkodima*
         
     | 
| 
       108 
     | 
    
         
            -
             
     | 
| 
       109 
     | 
    
         
            -
            *   Support `hexBinary` type in `ActiveSupport::XmlMini`.
         
     | 
| 
      
 25 
     | 
    
         
            +
            *   Don't execute i18n watcher on boot. It shouldn't catch any file changes initially,
         
     | 
| 
      
 26 
     | 
    
         
            +
                and unnecessarily slows down boot of applications with lots of translations.
         
     | 
| 
       110 
27 
     | 
    
         | 
| 
       111 
     | 
    
         
            -
                * 
     | 
| 
      
 28 
     | 
    
         
            +
                *Gannon McGibbon*, *David Stosik*
         
     | 
| 
       112 
29 
     | 
    
         | 
| 
       113 
     | 
    
         
            -
            *    
     | 
| 
      
 30 
     | 
    
         
            +
            *   Fix `ActiveSupport::HashWithIndifferentAccess#stringify_keys` to stringify all keys not just symbols.
         
     | 
| 
       114 
31 
     | 
    
         | 
| 
       115 
     | 
    
         
            -
                 
     | 
| 
       116 
     | 
    
         
            -
             
     | 
| 
       117 
     | 
    
         
            -
            *   `stub_const` now accepts a `exists: false` parameter to allow stubbing missing constants.
         
     | 
| 
       118 
     | 
    
         
            -
             
     | 
| 
       119 
     | 
    
         
            -
                *Jean Boussier*
         
     | 
| 
       120 
     | 
    
         
            -
             
     | 
| 
       121 
     | 
    
         
            -
            *   Make `ActiveSupport::BacktraceCleaner` copy filters and silencers on dup and clone.
         
     | 
| 
      
 32 
     | 
    
         
            +
                Previously:
         
     | 
| 
       122 
33 
     | 
    
         | 
| 
       123 
     | 
    
         
            -
                 
     | 
| 
       124 
     | 
    
         
            -
                 
     | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
       126 
     | 
    
         
            -
                *Jean Boussier*
         
     | 
| 
       127 
     | 
    
         
            -
             
     | 
| 
       128 
     | 
    
         
            -
            *   Updating Astana with Western Kazakhstan TZInfo identifier.
         
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
       130 
     | 
    
         
            -
                *Damian Nelson*
         
     | 
| 
      
 34 
     | 
    
         
            +
                ```ruby
         
     | 
| 
      
 35 
     | 
    
         
            +
                { 1 => 2 }.with_indifferent_access.stringify_keys[1] # => 2
         
     | 
| 
      
 36 
     | 
    
         
            +
                ```
         
     | 
| 
       131 
37 
     | 
    
         | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
      
 38 
     | 
    
         
            +
                After this change:
         
     | 
| 
       133 
39 
     | 
    
         | 
| 
       134 
40 
     | 
    
         
             
                ```ruby
         
     | 
| 
       135 
     | 
    
         
            -
                 
     | 
| 
       136 
     | 
    
         
            -
                ActiveSupport::Logger.logger_outputs_to?(logger, '/var/log/rails.log')
         
     | 
| 
      
 41 
     | 
    
         
            +
                { 1 => 2 }.with_indifferent_access.stringify_keys["1"] # => 2
         
     | 
| 
       137 
42 
     | 
    
         
             
                ```
         
     | 
| 
       138 
43 
     | 
    
         | 
| 
       139 
     | 
    
         
            -
                 
     | 
| 
      
 44 
     | 
    
         
            +
                This change can be seen as a bug fix, but since it behaved like this for a very long time, we're deciding
         
     | 
| 
      
 45 
     | 
    
         
            +
                to not backport the fix and to make the change in a major release.
         
     | 
| 
       140 
46 
     | 
    
         | 
| 
       141 
     | 
    
         
            -
            * 
     | 
| 
       142 
     | 
    
         
            -
                `ActiveSupport::MessagePack` serializer.
         
     | 
| 
      
 47 
     | 
    
         
            +
                *Jean Boussier*
         
     | 
| 
       143 
48 
     | 
    
         | 
| 
       144 
     | 
    
         
            -
             
     | 
| 
       145 
     | 
    
         
            -
                still be read, and new payloads will be readable by older versions of Rails.
         
     | 
| 
      
 49 
     | 
    
         
            +
            ## Rails 8.0.0.beta1 (September 26, 2024) ##
         
     | 
| 
       146 
50 
     | 
    
         | 
| 
       147 
     | 
    
         
            -
             
     | 
| 
      
 51 
     | 
    
         
            +
            *   Include options when instrumenting `ActiveSupport::Cache::Store#delete` and `ActiveSupport::Cache::Store#delete_multi`.
         
     | 
| 
       148 
52 
     | 
    
         | 
| 
       149 
     | 
    
         
            -
            * 
     | 
| 
      
 53 
     | 
    
         
            +
                *Adam Renberg Tamm*
         
     | 
| 
       150 
54 
     | 
    
         | 
| 
       151 
     | 
    
         
            -
             
     | 
| 
       152 
     | 
    
         
            -
                class Current < ActiveSupport::CurrentAttributes
         
     | 
| 
       153 
     | 
    
         
            -
                  attribute :counter, default: 0
         
     | 
| 
       154 
     | 
    
         
            -
                end
         
     | 
| 
       155 
     | 
    
         
            -
                ```
         
     | 
| 
      
 55 
     | 
    
         
            +
            *   Print test names when running `rails test -v` for parallel tests.
         
     | 
| 
       156 
56 
     | 
    
         | 
| 
       157 
     | 
    
         
            -
                * 
     | 
| 
      
 57 
     | 
    
         
            +
                *John Hawthorn*, *Abeid Ahmed*
         
     | 
| 
       158 
58 
     | 
    
         | 
| 
       159 
     | 
    
         
            -
            *    
     | 
| 
      
 59 
     | 
    
         
            +
            *   Deprecate `Benchmark.ms` core extension.
         
     | 
| 
       160 
60 
     | 
    
         | 
| 
       161 
     | 
    
         
            -
                 
     | 
| 
       162 
     | 
    
         
            -
                client.with(timeout: 5_000) do |c|
         
     | 
| 
       163 
     | 
    
         
            -
                  c.get("/commits")
         
     | 
| 
       164 
     | 
    
         
            -
                end
         
     | 
| 
       165 
     | 
    
         
            -
                ```
         
     | 
| 
      
 61 
     | 
    
         
            +
                The `benchmark` gem will become bundled in Ruby 3.5
         
     | 
| 
       166 
62 
     | 
    
         | 
| 
       167 
     | 
    
         
            -
                * 
     | 
| 
      
 63 
     | 
    
         
            +
                *Earlopain*
         
     | 
| 
       168 
64 
     | 
    
         | 
| 
       169 
     | 
    
         
            -
            *    
     | 
| 
       170 
     | 
    
         
            -
                default number of workers when parallelizing tests.
         
     | 
| 
      
 65 
     | 
    
         
            +
            *   `ActiveSupport::TimeWithZone#inspect` now uses ISO 8601 style time like `Time#inspect`
         
     | 
| 
       171 
66 
     | 
    
         | 
| 
       172 
     | 
    
         
            -
                * 
     | 
| 
      
 67 
     | 
    
         
            +
                *John Hawthorn*
         
     | 
| 
       173 
68 
     | 
    
         | 
| 
       174 
     | 
    
         
            -
            *    
     | 
| 
      
 69 
     | 
    
         
            +
            *   `ActiveSupport::ErrorReporter#report` now assigns a backtrace to unraised exceptions.
         
     | 
| 
       175 
70 
     | 
    
         | 
| 
       176 
     | 
    
         
            -
                 
     | 
| 
       177 
     | 
    
         
            -
                 
     | 
| 
       178 
     | 
    
         
            -
                returning results in that remembered timezone. However, the expected
         
     | 
| 
       179 
     | 
    
         
            -
                behavior is to return results in a system timezone.
         
     | 
| 
      
 71 
     | 
    
         
            +
                Previously reporting an un-raised exception would result in an error report without
         
     | 
| 
      
 72 
     | 
    
         
            +
                a backtrace. Now it automatically generates one.
         
     | 
| 
       180 
73 
     | 
    
         | 
| 
       181 
     | 
    
         
            -
                * 
     | 
| 
      
 74 
     | 
    
         
            +
                *Jean Boussier*
         
     | 
| 
       182 
75 
     | 
    
         | 
| 
       183 
     | 
    
         
            -
            *   Add ` 
     | 
| 
      
 76 
     | 
    
         
            +
            *   Add `escape_html_entities` option to `ActiveSupport::JSON.encode`.
         
     | 
| 
       184 
77 
     | 
    
         | 
| 
       185 
     | 
    
         
            -
                 
     | 
| 
      
 78 
     | 
    
         
            +
                This allows for overriding the global configuration found at
         
     | 
| 
      
 79 
     | 
    
         
            +
                `ActiveSupport.escape_html_entities_in_json` for specific calls to `to_json`.
         
     | 
| 
       186 
80 
     | 
    
         | 
| 
      
 81 
     | 
    
         
            +
                This should be usable from controllers in the following manner:
         
     | 
| 
       187 
82 
     | 
    
         
             
                ```ruby
         
     | 
| 
       188 
     | 
    
         
            -
                 
     | 
| 
       189 
     | 
    
         
            -
                   
     | 
| 
       190 
     | 
    
         
            -
                     
     | 
| 
       191 
     | 
    
         
            -
                    return false
         
     | 
| 
      
 83 
     | 
    
         
            +
                class MyController < ApplicationController
         
     | 
| 
      
 84 
     | 
    
         
            +
                  def index
         
     | 
| 
      
 85 
     | 
    
         
            +
                    render json: { hello: "world" }, escape_html_entities: false
         
     | 
| 
       192 
86 
     | 
    
         
             
                  end
         
     | 
| 
       193 
     | 
    
         
            -
                  # ...
         
     | 
| 
       194 
87 
     | 
    
         
             
                end
         
     | 
| 
       195 
88 
     | 
    
         
             
                ```
         
     | 
| 
       196 
89 
     | 
    
         | 
| 
       197 
     | 
    
         
            -
                 
     | 
| 
       198 
     | 
    
         
            -
             
     | 
| 
       199 
     | 
    
         
            -
                *Jean Boussier*
         
     | 
| 
       200 
     | 
    
         
            -
             
     | 
| 
       201 
     | 
    
         
            -
            *   Make the order of read_multi and write_multi notifications for `Cache::Store#fetch_multi` operations match the order they are executed in.
         
     | 
| 
       202 
     | 
    
         
            -
             
     | 
| 
       203 
     | 
    
         
            -
                *Adam Renberg Tamm*
         
     | 
| 
       204 
     | 
    
         
            -
             
     | 
| 
       205 
     | 
    
         
            -
            *   Make return values of `Cache::Store#write` consistent.
         
     | 
| 
       206 
     | 
    
         
            -
             
     | 
| 
       207 
     | 
    
         
            -
                The return value was not specified before. Now it returns `true` on a successful write,
         
     | 
| 
       208 
     | 
    
         
            -
                `nil` if there was an error talking to the cache backend, and `false` if the write failed
         
     | 
| 
       209 
     | 
    
         
            -
                for another reason (e.g. the key already exists and `unless_exist: true` was passed).
         
     | 
| 
      
 90 
     | 
    
         
            +
                *Nigel Baillie*
         
     | 
| 
       210 
91 
     | 
    
         | 
| 
       211 
     | 
    
         
            -
             
     | 
| 
      
 92 
     | 
    
         
            +
            *   Raise when using key which can't respond to `#to_sym` in `EncryptedConfiguration`.
         
     | 
| 
       212 
93 
     | 
    
         | 
| 
       213 
     | 
    
         
            -
             
     | 
| 
      
 94 
     | 
    
         
            +
                As is the case when trying to use an Integer or Float as a key, which is unsupported.
         
     | 
| 
       214 
95 
     | 
    
         | 
| 
       215 
     | 
    
         
            -
                * 
     | 
| 
      
 96 
     | 
    
         
            +
                *zzak*
         
     | 
| 
       216 
97 
     | 
    
         | 
| 
       217 
     | 
    
         
            -
            *    
     | 
| 
      
 98 
     | 
    
         
            +
            *   Deprecate addition and since between two `Time` and `ActiveSupport::TimeWithZone`.
         
     | 
| 
       218 
99 
     | 
    
         | 
| 
       219 
     | 
    
         
            -
                ` 
     | 
| 
       220 
     | 
    
         
            -
                to differentiate nil from empty strings, strings from symbols, etc.
         
     | 
| 
       221 
     | 
    
         
            -
                `assert_no_changes` error messages now surface the actual value.
         
     | 
| 
      
 100 
     | 
    
         
            +
                Previously adding time instances together such as `10.days.ago + 10.days.ago` or `10.days.ago.since(10.days.ago)` produced a nonsensical future date. This behavior is deprecated and will be removed in Rails 8.1.
         
     | 
| 
       222 
101 
     | 
    
         | 
| 
       223 
     | 
    
         
            -
                * 
     | 
| 
      
 102 
     | 
    
         
            +
                *Nick Schwaderer*
         
     | 
| 
       224 
103 
     | 
    
         | 
| 
       225 
     | 
    
         
            -
            *    
     | 
| 
       226 
     | 
    
         
            -
             
     | 
| 
       227 
     | 
    
         
            -
                *Earlopain*
         
     | 
| 
      
 104 
     | 
    
         
            +
            *   Support rfc2822 format for Time#to_fs & Date#to_fs.
         
     | 
| 
       228 
105 
     | 
    
         | 
| 
       229 
     | 
    
         
            -
            * 
     | 
| 
      
 106 
     | 
    
         
            +
                *Akshay Birajdar*
         
     | 
| 
       230 
107 
     | 
    
         | 
| 
       231 
     | 
    
         
            -
             
     | 
| 
      
 108 
     | 
    
         
            +
            *   Optimize load time for `Railtie#initialize_i18n`. Filter `I18n.load_path`s passed to the file watcher to only those
         
     | 
| 
      
 109 
     | 
    
         
            +
                under `Rails.root`. Previously the watcher would grab all available locales, including those in gems
         
     | 
| 
      
 110 
     | 
    
         
            +
                which do not require a watcher because they won't change.
         
     | 
| 
       232 
111 
     | 
    
         | 
| 
       233 
     | 
    
         
            -
            * 
     | 
| 
      
 112 
     | 
    
         
            +
                *Nick Schwaderer*
         
     | 
| 
       234 
113 
     | 
    
         | 
| 
       235 
     | 
    
         
            -
             
     | 
| 
      
 114 
     | 
    
         
            +
            *   Add a `filter` option to `in_order_of` to prioritize certain values in the sorting without filtering the results
         
     | 
| 
      
 115 
     | 
    
         
            +
                by these values.
         
     | 
| 
       236 
116 
     | 
    
         | 
| 
       237 
     | 
    
         
            -
            * 
     | 
| 
      
 117 
     | 
    
         
            +
                *Igor Depolli*
         
     | 
| 
       238 
118 
     | 
    
         | 
| 
       239 
     | 
    
         
            -
             
     | 
| 
       240 
     | 
    
         
            -
                 
     | 
| 
      
 119 
     | 
    
         
            +
            *   Improve error message when using `assert_difference` or `assert_changes` with a
         
     | 
| 
      
 120 
     | 
    
         
            +
                proc by printing the proc's source code (MRI only).
         
     | 
| 
       241 
121 
     | 
    
         | 
| 
       242 
     | 
    
         
            -
                 
     | 
| 
       243 
     | 
    
         
            -
                `SemanticLogger` instance.
         
     | 
| 
      
 122 
     | 
    
         
            +
                *Richard Böhme*, *Jean Boussier*
         
     | 
| 
       244 
123 
     | 
    
         | 
| 
       245 
     | 
    
         
            -
             
     | 
| 
      
 124 
     | 
    
         
            +
            *   Add a new configuration value `:zone` for `ActiveSupport.to_time_preserves_timezone` and rename the previous `true` value to `:offset`. The new default value is `:zone`.
         
     | 
| 
       246 
125 
     | 
    
         | 
| 
       247 
     | 
    
         
            -
            * 
     | 
| 
      
 126 
     | 
    
         
            +
                *Jason Kim*, *John Hawthorn*
         
     | 
| 
       248 
127 
     | 
    
         | 
| 
       249 
     | 
    
         
            -
             
     | 
| 
      
 128 
     | 
    
         
            +
            *   Align instrumentation `payload[:key]` in ActiveSupport::Cache to follow the same pattern, with namespaced and normalized keys.
         
     | 
| 
       250 
129 
     | 
    
         | 
| 
       251 
     | 
    
         
            -
            * 
     | 
| 
      
 130 
     | 
    
         
            +
                *Frederik Erbs Spang Thomsen*
         
     | 
| 
       252 
131 
     | 
    
         | 
| 
       253 
     | 
    
         
            -
             
     | 
| 
       254 
     | 
    
         
            -
                method from the `Hash` class, which was not able to access values using indifferent keys.
         
     | 
| 
      
 132 
     | 
    
         
            +
            *   Fix `travel_to` to set usec 0 when `with_usec` is `false` and the given argument String or DateTime.
         
     | 
| 
       255 
133 
     | 
    
         | 
| 
       256 
     | 
    
         
            -
                * 
     | 
| 
      
 134 
     | 
    
         
            +
                *mopp*
         
     | 
| 
       257 
135 
     | 
    
         | 
| 
       258 
     | 
    
         
            -
            Please check [7- 
     | 
| 
      
 136 
     | 
    
         
            +
            Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/activesupport/CHANGELOG.md) for previous changes.
         
     | 
| 
         @@ -18,7 +18,7 @@ module ActiveSupport 
     | 
|
| 
       18 
18 
     | 
    
         
             
              #
         
     | 
| 
       19 
19 
     | 
    
         
             
              #   bc = ActiveSupport::BacktraceCleaner.new
         
     | 
| 
       20 
20 
     | 
    
         
             
              #   root = "#{Rails.root}/"
         
     | 
| 
       21 
     | 
    
         
            -
              #   bc.add_filter   { |line| line. 
     | 
| 
      
 21 
     | 
    
         
            +
              #   bc.add_filter   { |line| line.delete_prefix(root) } # strip the Rails.root prefix
         
     | 
| 
       22 
22 
     | 
    
         
             
              #   bc.add_silencer { |line| /puma|rubygems/.match?(line) } # skip any lines from puma or rubygems
         
     | 
| 
       23 
23 
     | 
    
         
             
              #   bc.clean(exception.backtrace) # perform the cleanup
         
     | 
| 
       24 
24 
     | 
    
         
             
              #
         
     | 
| 
         @@ -0,0 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ActiveSupport
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Benchmark # :nodoc:
         
     | 
| 
      
 5 
     | 
    
         
            +
                # Benchmark realtime in the specified time unit. By default,
         
     | 
| 
      
 6 
     | 
    
         
            +
                # the returned unit is in seconds.
         
     | 
| 
      
 7 
     | 
    
         
            +
                #
         
     | 
| 
      
 8 
     | 
    
         
            +
                #   ActiveSupport::Benchmark.realtime { sleep 0.1 }
         
     | 
| 
      
 9 
     | 
    
         
            +
                #   # => 0.10007
         
     | 
| 
      
 10 
     | 
    
         
            +
                #
         
     | 
| 
      
 11 
     | 
    
         
            +
                #   ActiveSupport::Benchmark.realtime(:float_millisecond) { sleep 0.1 }
         
     | 
| 
      
 12 
     | 
    
         
            +
                #   # => 100.07
         
     | 
| 
      
 13 
     | 
    
         
            +
                #
         
     | 
| 
      
 14 
     | 
    
         
            +
                # `unit` can be any of the values accepted by Ruby's `Process.clock_gettime`.
         
     | 
| 
      
 15 
     | 
    
         
            +
                def self.realtime(unit = :float_second, &block)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  time_start = Process.clock_gettime(Process::CLOCK_MONOTONIC, unit)
         
     | 
| 
      
 17 
     | 
    
         
            +
                  yield
         
     | 
| 
      
 18 
     | 
    
         
            +
                  Process.clock_gettime(Process::CLOCK_MONOTONIC, unit) - time_start
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -1,6 +1,5 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            require "active_support/core_ext/benchmark"
         
     | 
| 
       4 
3 
     | 
    
         
             
            require "active_support/core_ext/hash/keys"
         
     | 
| 
       5 
4 
     | 
    
         | 
| 
       6 
5 
     | 
    
         
             
            module ActiveSupport
         
     | 
| 
         @@ -41,7 +40,9 @@ module ActiveSupport 
     | 
|
| 
       41 
40 
     | 
    
         
             
                    options[:level] ||= :info
         
     | 
| 
       42 
41 
     | 
    
         | 
| 
       43 
42 
     | 
    
         
             
                    result = nil
         
     | 
| 
       44 
     | 
    
         
            -
                    ms = Benchmark. 
     | 
| 
      
 43 
     | 
    
         
            +
                    ms = ActiveSupport::Benchmark.realtime(:float_millisecond) do
         
     | 
| 
      
 44 
     | 
    
         
            +
                      result = options[:silence] ? logger.silence(&block) : yield
         
     | 
| 
      
 45 
     | 
    
         
            +
                    end
         
     | 
| 
       45 
46 
     | 
    
         
             
                    logger.public_send(options[:level], "%s (%.1fms)" % [ message, ms ])
         
     | 
| 
       46 
47 
     | 
    
         
             
                    result
         
     | 
| 
       47 
48 
     | 
    
         
             
                  else
         
     | 
| 
         @@ -113,33 +113,33 @@ module ActiveSupport 
     | 
|
| 
       113 
113 
     | 
    
         
             
                  dispatch { |logger| logger.<<(message) }
         
     | 
| 
       114 
114 
     | 
    
         
             
                end
         
     | 
| 
       115 
115 
     | 
    
         | 
| 
       116 
     | 
    
         
            -
                def add( 
     | 
| 
       117 
     | 
    
         
            -
                  dispatch { |logger| logger.add( 
     | 
| 
      
 116 
     | 
    
         
            +
                def add(...)
         
     | 
| 
      
 117 
     | 
    
         
            +
                  dispatch { |logger| logger.add(...) }
         
     | 
| 
       118 
118 
     | 
    
         
             
                end
         
     | 
| 
       119 
119 
     | 
    
         
             
                alias_method :log, :add
         
     | 
| 
       120 
120 
     | 
    
         | 
| 
       121 
     | 
    
         
            -
                def debug( 
     | 
| 
       122 
     | 
    
         
            -
                  dispatch { |logger| logger.debug( 
     | 
| 
      
 121 
     | 
    
         
            +
                def debug(...)
         
     | 
| 
      
 122 
     | 
    
         
            +
                  dispatch { |logger| logger.debug(...) }
         
     | 
| 
       123 
123 
     | 
    
         
             
                end
         
     | 
| 
       124 
124 
     | 
    
         | 
| 
       125 
     | 
    
         
            -
                def info( 
     | 
| 
       126 
     | 
    
         
            -
                  dispatch { |logger| logger.info( 
     | 
| 
      
 125 
     | 
    
         
            +
                def info(...)
         
     | 
| 
      
 126 
     | 
    
         
            +
                  dispatch { |logger| logger.info(...) }
         
     | 
| 
       127 
127 
     | 
    
         
             
                end
         
     | 
| 
       128 
128 
     | 
    
         | 
| 
       129 
     | 
    
         
            -
                def warn( 
     | 
| 
       130 
     | 
    
         
            -
                  dispatch { |logger| logger.warn( 
     | 
| 
      
 129 
     | 
    
         
            +
                def warn(...)
         
     | 
| 
      
 130 
     | 
    
         
            +
                  dispatch { |logger| logger.warn(...) }
         
     | 
| 
       131 
131 
     | 
    
         
             
                end
         
     | 
| 
       132 
132 
     | 
    
         | 
| 
       133 
     | 
    
         
            -
                def error( 
     | 
| 
       134 
     | 
    
         
            -
                  dispatch { |logger| logger.error( 
     | 
| 
      
 133 
     | 
    
         
            +
                def error(...)
         
     | 
| 
      
 134 
     | 
    
         
            +
                  dispatch { |logger| logger.error(...) }
         
     | 
| 
       135 
135 
     | 
    
         
             
                end
         
     | 
| 
       136 
136 
     | 
    
         | 
| 
       137 
     | 
    
         
            -
                def fatal( 
     | 
| 
       138 
     | 
    
         
            -
                  dispatch { |logger| logger.fatal( 
     | 
| 
      
 137 
     | 
    
         
            +
                def fatal(...)
         
     | 
| 
      
 138 
     | 
    
         
            +
                  dispatch { |logger| logger.fatal(...) }
         
     | 
| 
       139 
139 
     | 
    
         
             
                end
         
     | 
| 
       140 
140 
     | 
    
         | 
| 
       141 
     | 
    
         
            -
                def unknown( 
     | 
| 
       142 
     | 
    
         
            -
                  dispatch { |logger| logger.unknown( 
     | 
| 
      
 141 
     | 
    
         
            +
                def unknown(...)
         
     | 
| 
      
 142 
     | 
    
         
            +
                  dispatch { |logger| logger.unknown(...) }
         
     | 
| 
       143 
143 
     | 
    
         
             
                end
         
     | 
| 
       144 
144 
     | 
    
         | 
| 
       145 
145 
     | 
    
         
             
                def formatter=(formatter)
         
     | 
| 
         @@ -58,7 +58,12 @@ module ActiveSupport 
     | 
|
| 
       58 
58 
     | 
    
         
             
                  #   cache.increment("baz") # => 6
         
     | 
| 
       59 
59 
     | 
    
         
             
                  #
         
     | 
| 
       60 
60 
     | 
    
         
             
                  def increment(name, amount = 1, options = nil)
         
     | 
| 
       61 
     | 
    
         
            -
                     
     | 
| 
      
 61 
     | 
    
         
            +
                    options = merged_options(options)
         
     | 
| 
      
 62 
     | 
    
         
            +
                    key = normalize_key(name, options)
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                    instrument(:increment, key, amount: amount) do
         
     | 
| 
      
 65 
     | 
    
         
            +
                      modify_value(name, amount, options)
         
     | 
| 
      
 66 
     | 
    
         
            +
                    end
         
     | 
| 
       62 
67 
     | 
    
         
             
                  end
         
     | 
| 
       63 
68 
     | 
    
         | 
| 
       64 
69 
     | 
    
         
             
                  # Decrement a cached integer value. Returns the updated value.
         
     | 
| 
         @@ -73,7 +78,12 @@ module ActiveSupport 
     | 
|
| 
       73 
78 
     | 
    
         
             
                  #   cache.decrement("baz") # => 4
         
     | 
| 
       74 
79 
     | 
    
         
             
                  #
         
     | 
| 
       75 
80 
     | 
    
         
             
                  def decrement(name, amount = 1, options = nil)
         
     | 
| 
       76 
     | 
    
         
            -
                     
     | 
| 
      
 81 
     | 
    
         
            +
                    options = merged_options(options)
         
     | 
| 
      
 82 
     | 
    
         
            +
                    key = normalize_key(name, options)
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
                    instrument(:decrement, key, amount: amount) do
         
     | 
| 
      
 85 
     | 
    
         
            +
                      modify_value(name, -amount, options)
         
     | 
| 
      
 86 
     | 
    
         
            +
                    end
         
     | 
| 
       77 
87 
     | 
    
         
             
                  end
         
     | 
| 
       78 
88 
     | 
    
         | 
| 
       79 
89 
     | 
    
         
             
                  def delete_matched(matcher, options = nil)
         
     | 
| 
         @@ -147,7 +147,9 @@ module ActiveSupport 
     | 
|
| 
       147 
147 
     | 
    
         
             
                  #   cache.increment("baz") # => 6
         
     | 
| 
       148 
148 
     | 
    
         
             
                  #
         
     | 
| 
       149 
149 
     | 
    
         
             
                  def increment(name, amount = 1, options = nil)
         
     | 
| 
       150 
     | 
    
         
            -
                     
     | 
| 
      
 150 
     | 
    
         
            +
                    instrument(:increment, name, amount: amount) do
         
     | 
| 
      
 151 
     | 
    
         
            +
                      modify_value(name, amount, options)
         
     | 
| 
      
 152 
     | 
    
         
            +
                    end
         
     | 
| 
       151 
153 
     | 
    
         
             
                  end
         
     | 
| 
       152 
154 
     | 
    
         | 
| 
       153 
155 
     | 
    
         
             
                  # Decrement a cached integer value. Returns the updated value.
         
     | 
| 
         @@ -162,7 +164,9 @@ module ActiveSupport 
     | 
|
| 
       162 
164 
     | 
    
         
             
                  #   cache.decrement("baz") # => 4
         
     | 
| 
       163 
165 
     | 
    
         
             
                  #
         
     | 
| 
       164 
166 
     | 
    
         
             
                  def decrement(name, amount = 1, options = nil)
         
     | 
| 
       165 
     | 
    
         
            -
                     
     | 
| 
      
 167 
     | 
    
         
            +
                    instrument(:decrement, name, amount: amount) do
         
     | 
| 
      
 168 
     | 
    
         
            +
                      modify_value(name, -amount, options)
         
     | 
| 
      
 169 
     | 
    
         
            +
                    end
         
     | 
| 
       166 
170 
     | 
    
         
             
                  end
         
     | 
| 
       167 
171 
     | 
    
         | 
| 
       168 
172 
     | 
    
         
             
                  # Deletes cache entries if the cache key matches a given pattern.
         
     | 
| 
         @@ -173,9 +173,12 @@ module ActiveSupport 
     | 
|
| 
       173 
173 
     | 
    
         
             
                    return {} if names.empty?
         
     | 
| 
       174 
174 
     | 
    
         | 
| 
       175 
175 
     | 
    
         
             
                    options = names.extract_options!
         
     | 
| 
       176 
     | 
    
         
            -
                     
     | 
| 
      
 176 
     | 
    
         
            +
                    options = merged_options(options)
         
     | 
| 
      
 177 
     | 
    
         
            +
                    keys    = names.map { |name| normalize_key(name, options) }
         
     | 
| 
      
 178 
     | 
    
         
            +
             
     | 
| 
      
 179 
     | 
    
         
            +
                    instrument_multi(:read_multi, keys, options) do |payload|
         
     | 
| 
       177 
180 
     | 
    
         
             
                      read_multi_entries(names, **options).tap do |results|
         
     | 
| 
       178 
     | 
    
         
            -
                        payload[:hits] = results.keys
         
     | 
| 
      
 181 
     | 
    
         
            +
                        payload[:hits] = results.keys.map { |name| normalize_key(name, options) }
         
     | 
| 
       179 
182 
     | 
    
         
             
                      end
         
     | 
| 
       180 
183 
     | 
    
         
             
                    end
         
     | 
| 
       181 
184 
     | 
    
         
             
                  end
         
     | 
    
        data/lib/active_support/cache.rb
    CHANGED
    
    | 
         @@ -286,7 +286,7 @@ module ActiveSupport 
     | 
|
| 
       286 
286 
     | 
    
         
             
                  #   <tt>coder: nil</tt> to avoid the overhead of safeguarding against
         
     | 
| 
       287 
287 
     | 
    
         
             
                  #   mutation.
         
     | 
| 
       288 
288 
     | 
    
         
             
                  #
         
     | 
| 
       289 
     | 
    
         
            -
                  #   The +:coder+ option is  
     | 
| 
      
 289 
     | 
    
         
            +
                  #   The +:coder+ option is mutually exclusive with the +:serializer+ and
         
     | 
| 
       290 
290 
     | 
    
         
             
                  #   +:compressor+ options. Specifying them together will raise an
         
     | 
| 
       291 
291 
     | 
    
         
             
                  #   +ArgumentError+.
         
     | 
| 
       292 
292 
     | 
    
         
             
                  #
         
     | 
| 
         @@ -419,7 +419,7 @@ module ActiveSupport 
     | 
|
| 
       419 
419 
     | 
    
         
             
                  #     t1.join
         
     | 
| 
       420 
420 
     | 
    
         
             
                  #
         
     | 
| 
       421 
421 
     | 
    
         
             
                  #     p val_1 # => "new value 1"
         
     | 
| 
       422 
     | 
    
         
            -
                  #     p val_2 # => " 
     | 
| 
      
 422 
     | 
    
         
            +
                  #     p val_2 # => "original value"
         
     | 
| 
       423 
423 
     | 
    
         
             
                  #     p cache.fetch("foo") # => "new value 1"
         
     | 
| 
       424 
424 
     | 
    
         
             
                  #
         
     | 
| 
       425 
425 
     | 
    
         
             
                  #     # The entry requires 3 seconds to expire (expires_in + race_condition_ttl)
         
     | 
| 
         @@ -538,10 +538,11 @@ module ActiveSupport 
     | 
|
| 
       538 
538 
     | 
    
         | 
| 
       539 
539 
     | 
    
         
             
                    options = names.extract_options!
         
     | 
| 
       540 
540 
     | 
    
         
             
                    options = merged_options(options)
         
     | 
| 
      
 541 
     | 
    
         
            +
                    keys    = names.map { |name| normalize_key(name, options) }
         
     | 
| 
       541 
542 
     | 
    
         | 
| 
       542 
     | 
    
         
            -
                    instrument_multi :read_multi,  
     | 
| 
      
 543 
     | 
    
         
            +
                    instrument_multi :read_multi, keys, options do |payload|
         
     | 
| 
       543 
544 
     | 
    
         
             
                      read_multi_entries(names, **options, event: payload).tap do |results|
         
     | 
| 
       544 
     | 
    
         
            -
                        payload[:hits] = results.keys
         
     | 
| 
      
 545 
     | 
    
         
            +
                        payload[:hits] = results.keys.map { |name| normalize_key(name, options) }
         
     | 
| 
       545 
546 
     | 
    
         
             
                      end
         
     | 
| 
       546 
547 
     | 
    
         
             
                    end
         
     | 
| 
       547 
548 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -551,8 +552,9 @@ module ActiveSupport 
     | 
|
| 
       551 
552 
     | 
    
         
             
                    return hash if hash.empty?
         
     | 
| 
       552 
553 
     | 
    
         | 
| 
       553 
554 
     | 
    
         
             
                    options = merged_options(options)
         
     | 
| 
      
 555 
     | 
    
         
            +
                    normalized_hash = hash.transform_keys { |key| normalize_key(key, options) }
         
     | 
| 
       554 
556 
     | 
    
         | 
| 
       555 
     | 
    
         
            -
                    instrument_multi :write_multi,  
     | 
| 
      
 557 
     | 
    
         
            +
                    instrument_multi :write_multi, normalized_hash, options do |payload|
         
     | 
| 
       556 
558 
     | 
    
         
             
                      entries = hash.each_with_object({}) do |(name, value), memo|
         
     | 
| 
       557 
559 
     | 
    
         
             
                        memo[normalize_key(name, options)] = Entry.new(value, **options.merge(version: normalize_version(name, options)))
         
     | 
| 
       558 
560 
     | 
    
         
             
                      end
         
     | 
| 
         @@ -596,9 +598,9 @@ module ActiveSupport 
     | 
|
| 
       596 
598 
     | 
    
         | 
| 
       597 
599 
     | 
    
         
             
                    options = names.extract_options!
         
     | 
| 
       598 
600 
     | 
    
         
             
                    options = merged_options(options)
         
     | 
| 
       599 
     | 
    
         
            -
             
     | 
| 
      
 601 
     | 
    
         
            +
                    keys    = names.map { |name| normalize_key(name, options) }
         
     | 
| 
       600 
602 
     | 
    
         
             
                    writes  = {}
         
     | 
| 
       601 
     | 
    
         
            -
                    ordered = instrument_multi :read_multi,  
     | 
| 
      
 603 
     | 
    
         
            +
                    ordered = instrument_multi :read_multi, keys, options do |payload|
         
     | 
| 
       602 
604 
     | 
    
         
             
                      if options[:force]
         
     | 
| 
       603 
605 
     | 
    
         
             
                        reads = {}
         
     | 
| 
       604 
606 
     | 
    
         
             
                      else
         
     | 
| 
         @@ -610,7 +612,7 @@ module ActiveSupport 
     | 
|
| 
       610 
612 
     | 
    
         
             
                      end
         
     | 
| 
       611 
613 
     | 
    
         
             
                      writes.compact! if options[:skip_nil]
         
     | 
| 
       612 
614 
     | 
    
         | 
| 
       613 
     | 
    
         
            -
                      payload[:hits] = reads.keys
         
     | 
| 
      
 615 
     | 
    
         
            +
                      payload[:hits] = reads.keys.map { |name| normalize_key(name, options) }
         
     | 
| 
       614 
616 
     | 
    
         
             
                      payload[:super_operation] = :fetch_multi
         
     | 
| 
       615 
617 
     | 
    
         | 
| 
       616 
618 
     | 
    
         
             
                      ordered
         
     | 
| 
         @@ -675,7 +677,7 @@ module ActiveSupport 
     | 
|
| 
       675 
677 
     | 
    
         
             
                    options = merged_options(options)
         
     | 
| 
       676 
678 
     | 
    
         
             
                    key = normalize_key(name, options)
         
     | 
| 
       677 
679 
     | 
    
         | 
| 
       678 
     | 
    
         
            -
                    instrument(:delete, key) do
         
     | 
| 
      
 680 
     | 
    
         
            +
                    instrument(:delete, key, options) do
         
     | 
| 
       679 
681 
     | 
    
         
             
                      delete_entry(key, **options)
         
     | 
| 
       680 
682 
     | 
    
         
             
                    end
         
     | 
| 
       681 
683 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -690,7 +692,7 @@ module ActiveSupport 
     | 
|
| 
       690 
692 
     | 
    
         
             
                    options = merged_options(options)
         
     | 
| 
       691 
693 
     | 
    
         
             
                    names.map! { |key| normalize_key(key, options) }
         
     | 
| 
       692 
694 
     | 
    
         | 
| 
       693 
     | 
    
         
            -
                    instrument_multi 
     | 
| 
      
 695 
     | 
    
         
            +
                    instrument_multi(:delete_multi, names, options) do
         
     | 
| 
       694 
696 
     | 
    
         
             
                      delete_multi_entries(names, **options)
         
     | 
| 
       695 
697 
     | 
    
         
             
                    end
         
     | 
| 
       696 
698 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -943,9 +945,12 @@ module ActiveSupport 
     | 
|
| 
       943 
945 
     | 
    
         
             
                    #
         
     | 
| 
       944 
946 
     | 
    
         
             
                    #   namespace_key 'foo', namespace: -> { 'cache' }
         
     | 
| 
       945 
947 
     | 
    
         
             
                    #   # => 'cache:foo'
         
     | 
| 
       946 
     | 
    
         
            -
                    def namespace_key(key,  
     | 
| 
       947 
     | 
    
         
            -
                       
     | 
| 
       948 
     | 
    
         
            -
             
     | 
| 
      
 948 
     | 
    
         
            +
                    def namespace_key(key, call_options = nil)
         
     | 
| 
      
 949 
     | 
    
         
            +
                      namespace = if call_options&.key?(:namespace)
         
     | 
| 
      
 950 
     | 
    
         
            +
                        call_options[:namespace]
         
     | 
| 
      
 951 
     | 
    
         
            +
                      else
         
     | 
| 
      
 952 
     | 
    
         
            +
                        options[:namespace]
         
     | 
| 
      
 953 
     | 
    
         
            +
                      end
         
     | 
| 
       949 
954 
     | 
    
         | 
| 
       950 
955 
     | 
    
         
             
                      if namespace.respond_to?(:call)
         
     | 
| 
       951 
956 
     | 
    
         
             
                        namespace = namespace.call
         
     | 
| 
         @@ -6,7 +6,6 @@ require "active_support/core_ext/array/extract_options" 
     | 
|
| 
       6 
6 
     | 
    
         
             
            require "active_support/core_ext/class/attribute"
         
     | 
| 
       7 
7 
     | 
    
         
             
            require "active_support/core_ext/string/filters"
         
     | 
| 
       8 
8 
     | 
    
         
             
            require "active_support/core_ext/object/blank"
         
     | 
| 
       9 
     | 
    
         
            -
            require "thread"
         
     | 
| 
       10 
9 
     | 
    
         | 
| 
       11 
10 
     | 
    
         
             
            module ActiveSupport
         
     | 
| 
       12 
11 
     | 
    
         
             
              # = Active Support \Callbacks
         
     | 
| 
         @@ -67,7 +66,7 @@ module ActiveSupport 
     | 
|
| 
       67 
66 
     | 
    
         | 
| 
       68 
67 
     | 
    
         
             
                included do
         
     | 
| 
       69 
68 
     | 
    
         
             
                  extend ActiveSupport::DescendantsTracker
         
     | 
| 
       70 
     | 
    
         
            -
                  class_attribute :__callbacks, instance_writer: false, default: {}
         
     | 
| 
      
 69 
     | 
    
         
            +
                  class_attribute :__callbacks, instance_writer: false, instance_predicate: false, default: {}
         
     | 
| 
       71 
70 
     | 
    
         
             
                end
         
     | 
| 
       72 
71 
     | 
    
         | 
| 
       73 
72 
     | 
    
         
             
                CALLBACK_FILTER_TYPES = [:before, :after, :around].freeze
         
     | 
| 
         @@ -0,0 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ActiveSupport
         
     | 
| 
      
 4 
     | 
    
         
            +
              module ClassAttribute # :nodoc:
         
     | 
| 
      
 5 
     | 
    
         
            +
                class << self
         
     | 
| 
      
 6 
     | 
    
         
            +
                  def redefine(owner, name, value)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    if owner.singleton_class?
         
     | 
| 
      
 8 
     | 
    
         
            +
                      owner.redefine_method(name) { value }
         
     | 
| 
      
 9 
     | 
    
         
            +
                      owner.send(:public, name)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                    owner.redefine_singleton_method(name) { value }
         
     | 
| 
      
 13 
     | 
    
         
            +
                    owner.singleton_class.send(:public, name)
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                    owner.redefine_singleton_method("#{name}=") do |new_value|
         
     | 
| 
      
 16 
     | 
    
         
            +
                      if owner.equal?(self)
         
     | 
| 
      
 17 
     | 
    
         
            +
                        value = new_value
         
     | 
| 
      
 18 
     | 
    
         
            +
                      else
         
     | 
| 
      
 19 
     | 
    
         
            +
                        ::ActiveSupport::ClassAttribute.redefine(self, name, new_value)
         
     | 
| 
      
 20 
     | 
    
         
            +
                      end
         
     | 
| 
      
 21 
     | 
    
         
            +
                    end
         
     | 
| 
      
 22 
     | 
    
         
            +
                    owner.singleton_class.send(:public, "#{name}=")
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     |