activesupport 6.0.0.beta2 → 6.0.2.rc1
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.
Potentially problematic release.
This version of activesupport might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +287 -3
- data/README.rdoc +2 -1
- data/lib/active_support.rb +1 -0
- data/lib/active_support/actionable_error.rb +48 -0
- data/lib/active_support/backtrace_cleaner.rb +5 -1
- data/lib/active_support/cache.rb +5 -5
- data/lib/active_support/cache/memory_store.rb +2 -0
- data/lib/active_support/cache/redis_cache_store.rb +9 -6
- data/lib/active_support/concern.rb +24 -1
- data/lib/active_support/configurable.rb +3 -3
- data/lib/active_support/core_ext/array/access.rb +18 -6
- data/lib/active_support/core_ext/class/attribute.rb +10 -15
- data/lib/active_support/core_ext/date_and_time/calculations.rb +0 -30
- data/lib/active_support/core_ext/digest.rb +3 -0
- data/lib/active_support/core_ext/enumerable.rb +24 -4
- data/lib/active_support/core_ext/hash/deep_transform_values.rb +2 -2
- data/lib/active_support/core_ext/hash/except.rb +1 -1
- data/lib/active_support/core_ext/module/attribute_accessors.rb +5 -5
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +5 -5
- data/lib/active_support/core_ext/module/delegation.rb +6 -0
- data/lib/active_support/core_ext/object/duplicable.rb +7 -117
- data/lib/active_support/core_ext/range/compare_range.rb +27 -12
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +2 -2
- data/lib/active_support/core_ext/string/filters.rb +1 -1
- data/lib/active_support/core_ext/string/inflections.rb +7 -2
- data/lib/active_support/core_ext/string/output_safety.rb +51 -4
- data/lib/active_support/core_ext/time/calculations.rb +31 -2
- data/lib/active_support/dependencies.rb +41 -5
- data/lib/active_support/dependencies/zeitwerk_integration.rb +44 -21
- data/lib/active_support/deprecation/method_wrappers.rb +7 -18
- data/lib/active_support/deprecation/proxy_wrappers.rb +24 -3
- data/lib/active_support/descendants_tracker.rb +52 -6
- data/lib/active_support/duration.rb +2 -3
- data/lib/active_support/evented_file_update_checker.rb +14 -2
- data/lib/active_support/gem_version.rb +2 -2
- data/lib/active_support/hash_with_indifferent_access.rb +6 -3
- data/lib/active_support/i18n_railtie.rb +6 -1
- data/lib/active_support/inflector/transliterate.rb +43 -14
- data/lib/active_support/logger_thread_safe_level.rb +2 -1
- data/lib/active_support/notifications/fanout.rb +2 -2
- data/lib/active_support/notifications/instrumenter.rb +12 -11
- data/lib/active_support/ordered_hash.rb +1 -1
- data/lib/active_support/ordered_options.rb +1 -1
- data/lib/active_support/parameter_filter.rb +6 -1
- data/lib/active_support/security_utils.rb +1 -1
- data/lib/active_support/subscriber.rb +55 -6
- data/lib/active_support/testing/parallelization.rb +21 -2
- metadata +13 -14
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: c35751435bf6b8ea8c0e7cedff5faefd17d4705611bde8bcdc4084fa6fd6bafd
         | 
| 4 | 
            +
              data.tar.gz: 344effe21fcb3d7b96bb296d204d1c263eb192cfedfd95a2df0b2863ebdf3741
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 5ecce6010ef9f38738b014a8920d33418404a2c249a1419a697d1622de7ae012961f44abaa5fffad8979994ffa939ec09a99594419658f9f01094927fdf4cc3a
         | 
| 7 | 
            +
              data.tar.gz: 591c2737dbe3f382f0bc874a9ee91edd3f7ee3b5995c6ef0423c0c5685ca41100da6c3dac3f57a57a9912d3023f359d2ad59b23a2c3162bd235c7a8e3ca83f1a
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,286 @@ | |
| 1 | 
            +
            ## Rails 6.0.2.rc1 (November 27, 2019) ##
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            *   Eager load translations during initialization.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                *Diego Plentz*
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            *   Use per-thread CPU time clock on `ActiveSupport::Notifications`.
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                *George Claghorn*
         | 
| 10 | 
            +
             | 
| 11 | 
            +
             | 
| 12 | 
            +
            ## Rails 6.0.1 (November 5, 2019) ##
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            *   `ActiveSupport::SafeBuffer` supports `Enumerator` methods.
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                *Shugo Maeda*
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            *   The Redis cache store fails gracefully when the server returns a "max number
         | 
| 19 | 
            +
                of clients reached" error.
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                *Brandon Medenwald*
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            *   Fixed that mutating a value returned by a memory cache store would
         | 
| 24 | 
            +
                unexpectedly change the cached value.
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                *Jonathan Hyman*
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            *   The default inflectors in `zeitwerk` mode support overrides:
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                ```ruby
         | 
| 31 | 
            +
                # config/initializers/zeitwerk.rb
         | 
| 32 | 
            +
                Rails.autoloaders.each do |autoloader|
         | 
| 33 | 
            +
                  autoloader.inflector.inflect(
         | 
| 34 | 
            +
                    "html_parser" => "HTMLParser",
         | 
| 35 | 
            +
                    "ssl_error"   => "SSLError"
         | 
| 36 | 
            +
                  )
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
                ```
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                That way, you can tweak how individual basenames are inflected without touching Active Support inflection rules, which are global. These inflectors fallback to `String#camelize`, so existing inflection rules are still taken into account for non-overridden basenames.
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                Please, check the [autoloading guide for `zeitwerk` mode](https://guides.rubyonrails.org/v6.0/autoloading_and_reloading_constants.html#customizing-inflections) if you prefer not to depend on `String#camelize` at all.
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                *Xavier Noria*
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            *   Improve `Range#===`, `Range#include?`, and `Range#cover?` to work with beginless (startless)
         | 
| 47 | 
            +
                and endless range targets.
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                *Allen Hsu*, *Andrew Hodgkinson*
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            *   Don't use `Process#clock_gettime(CLOCK_THREAD_CPUTIME_ID)` on Solaris.
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                *Iain Beeston*
         | 
| 54 | 
            +
             | 
| 55 | 
            +
             | 
| 56 | 
            +
            ## Rails 6.0.0 (August 16, 2019) ##
         | 
| 57 | 
            +
             | 
| 58 | 
            +
            *   Let `require_dependency` in `zeitwerk` mode look the autoload paths up for
         | 
| 59 | 
            +
                better backwards compatibility.
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                *Xavier Noria*
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            *   Let `require_dependency` in `zeitwerk` mode support arguments that respond
         | 
| 64 | 
            +
                to `to_path` for better backwards compatibility.
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                *Xavier Noria*
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            *   Make ActiveSupport::Logger Fiber-safe. Fixes #36752.
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                Use `Fiber.current.__id__` in `ActiveSupport::Logger#local_level=` in order
         | 
| 71 | 
            +
                to make log level local to Ruby Fibers in addition to Threads.
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                Example:
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                    logger = ActiveSupport::Logger.new(STDOUT)
         | 
| 76 | 
            +
                    logger.level = 1
         | 
| 77 | 
            +
                    p "Main is debug? #{logger.debug?}"
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                    Fiber.new {
         | 
| 80 | 
            +
                      logger.local_level = 0
         | 
| 81 | 
            +
                      p "Thread is debug? #{logger.debug?}"
         | 
| 82 | 
            +
                    }.resume
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                    p "Main is debug? #{logger.debug?}"
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                Before:
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                    Main is debug? false
         | 
| 89 | 
            +
                    Thread is debug? true
         | 
| 90 | 
            +
                    Main is debug? true
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                After:
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                    Main is debug? false
         | 
| 95 | 
            +
                    Thread is debug? true
         | 
| 96 | 
            +
                    Main is debug? false
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                *Alexander Varnin*
         | 
| 99 | 
            +
             | 
| 100 | 
            +
            *   Do not delegate missing `marshal_dump` and `_dump` methods via the
         | 
| 101 | 
            +
                `delegate_missing_to` extension. This avoids unintentionally adding instance
         | 
| 102 | 
            +
                variables when calling `Marshal.dump(object)`, should the delegation target of
         | 
| 103 | 
            +
                `object` be a method which would otherwise add them. Fixes #36522.
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                *Aaron Lipman*
         | 
| 106 | 
            +
             | 
| 107 | 
            +
             | 
| 108 | 
            +
            ## Rails 6.0.0.rc2 (July 22, 2019) ##
         | 
| 109 | 
            +
             | 
| 110 | 
            +
            *   `truncate` would return the original string if it was too short to be truncated
         | 
| 111 | 
            +
                and a frozen string if it were long enough to be truncated. Now truncate will
         | 
| 112 | 
            +
                consistently return an unfrozen string regardless. This behavior is consistent
         | 
| 113 | 
            +
                with `gsub` and `strip`.
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                Before:
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                    'foobar'.truncate(5).frozen?
         | 
| 118 | 
            +
                    # => true
         | 
| 119 | 
            +
                    'foobar'.truncate(6).frozen?
         | 
| 120 | 
            +
                    # => false
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                After:
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                    'foobar'.truncate(5).frozen?
         | 
| 125 | 
            +
                    # => false
         | 
| 126 | 
            +
                    'foobar'.truncate(6).frozen?
         | 
| 127 | 
            +
                    # => false
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                *Jordan Thomas*
         | 
| 130 | 
            +
             | 
| 131 | 
            +
             | 
| 132 | 
            +
            ## Rails 6.0.0.rc1 (April 24, 2019) ##
         | 
| 133 | 
            +
             | 
| 134 | 
            +
            *   Introduce `ActiveSupport::ActionableError`.
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                Actionable errors let's you dispatch actions from Rails' error pages. This
         | 
| 137 | 
            +
                can help you save time if you have a clear action for the resolution of
         | 
| 138 | 
            +
                common development errors.
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                The de-facto example are pending migrations. Every time pending migrations
         | 
| 141 | 
            +
                are found, a middleware raises an error. With actionable errors, you can
         | 
| 142 | 
            +
                run the migrations right from the error page. Other examples include Rails
         | 
| 143 | 
            +
                plugins that need to run a rake task to setup themselves. They can now
         | 
| 144 | 
            +
                raise actionable errors to run the setup straight from the error pages.
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                Here is how to define an actionable error:
         | 
| 147 | 
            +
             | 
| 148 | 
            +
                ```ruby
         | 
| 149 | 
            +
                class PendingMigrationError < MigrationError #:nodoc:
         | 
| 150 | 
            +
                  include ActiveSupport::ActionableError
         | 
| 151 | 
            +
             | 
| 152 | 
            +
                  action "Run pending migrations" do
         | 
| 153 | 
            +
                    ActiveRecord::Tasks::DatabaseTasks.migrate
         | 
| 154 | 
            +
                  end
         | 
| 155 | 
            +
                end
         | 
| 156 | 
            +
                ```
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                To make an error actionable, include the `ActiveSupport::ActionableError`
         | 
| 159 | 
            +
                module and invoke the `action` class macro to define the action. An action
         | 
| 160 | 
            +
                needs a name and a procedure to execute. The name is shown as the name of a
         | 
| 161 | 
            +
                button on the error pages. Once clicked, it will invoke the given
         | 
| 162 | 
            +
                procedure.
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                *Vipul A M*, *Yao Jie*, *Genadi Samokovarov*
         | 
| 165 | 
            +
             | 
| 166 | 
            +
            *   Preserve `html_safe?` status on `ActiveSupport::SafeBuffer#*`.
         | 
| 167 | 
            +
             | 
| 168 | 
            +
                Before:
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                    ("<br />".html_safe * 2).html_safe? #=> nil
         | 
| 171 | 
            +
             | 
| 172 | 
            +
                After:
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                    ("<br />".html_safe * 2).html_safe? #=> true
         | 
| 175 | 
            +
             | 
| 176 | 
            +
                *Ryo Nakamura*
         | 
| 177 | 
            +
             | 
| 178 | 
            +
            *   Calling test methods with `with_info_handler` method to allow minitest-hooks
         | 
| 179 | 
            +
                plugin to work.
         | 
| 180 | 
            +
             | 
| 181 | 
            +
                *Mauri Mustonen*
         | 
| 182 | 
            +
             | 
| 183 | 
            +
            *   The Zeitwerk compatibility interface for `ActiveSupport::Dependencies` no
         | 
| 184 | 
            +
                longer implements `autoloaded_constants` or `autoloaded?` (undocumented,
         | 
| 185 | 
            +
                anyway). Experience shows introspection does not have many use cases, and
         | 
| 186 | 
            +
                troubleshooting is done by logging. With this design trade-off we are able
         | 
| 187 | 
            +
                to use even less memory in all environments.
         | 
| 188 | 
            +
             | 
| 189 | 
            +
                *Xavier Noria*
         | 
| 190 | 
            +
             | 
| 191 | 
            +
            *   Depends on Zeitwerk 2, which stores less metadata if reloading is disabled
         | 
| 192 | 
            +
                and hence uses less memory when `config.cache_classes` is `true`, a standard
         | 
| 193 | 
            +
                setup in production.
         | 
| 194 | 
            +
             | 
| 195 | 
            +
                *Xavier Noria*
         | 
| 196 | 
            +
             | 
| 197 | 
            +
            *   In `:zeitwerk` mode, eager load directories in engines and applications only
         | 
| 198 | 
            +
                if present in their respective `config.eager_load_paths`.
         | 
| 199 | 
            +
             | 
| 200 | 
            +
                A common use case for this is adding `lib` to `config.autoload_paths`, but
         | 
| 201 | 
            +
                not to `config.eager_load_paths`. In that configuration, for example, files
         | 
| 202 | 
            +
                in the `lib` directory should not be eager loaded.
         | 
| 203 | 
            +
             | 
| 204 | 
            +
                *Xavier Noria*
         | 
| 205 | 
            +
             | 
| 206 | 
            +
            *   Fix bug in Range comparisons when comparing to an excluded-end Range
         | 
| 207 | 
            +
             | 
| 208 | 
            +
                Before:
         | 
| 209 | 
            +
             | 
| 210 | 
            +
                    (1..10).cover?(1...11) # => false
         | 
| 211 | 
            +
             | 
| 212 | 
            +
                After:
         | 
| 213 | 
            +
             | 
| 214 | 
            +
                    (1..10).cover?(1...11) # => true
         | 
| 215 | 
            +
             | 
| 216 | 
            +
                With the same change for `Range#include?` and `Range#===`.
         | 
| 217 | 
            +
             | 
| 218 | 
            +
                *Owen Stephens*
         | 
| 219 | 
            +
             | 
| 220 | 
            +
            *   Use weak references in descendants tracker to allow anonymous subclasses to
         | 
| 221 | 
            +
                be garbage collected.
         | 
| 222 | 
            +
             | 
| 223 | 
            +
                *Edgars Beigarts*
         | 
| 224 | 
            +
             | 
| 225 | 
            +
            *   Update `ActiveSupport::Notifications::Instrumenter#instrument` to make
         | 
| 226 | 
            +
                passing a block optional. This will let users use
         | 
| 227 | 
            +
                `ActiveSupport::Notifications` messaging features outside of
         | 
| 228 | 
            +
                instrumentation.
         | 
| 229 | 
            +
             | 
| 230 | 
            +
                *Ali Ibrahim*
         | 
| 231 | 
            +
             | 
| 232 | 
            +
            *   Fix `Time#advance` to work with dates before 1001-03-07
         | 
| 233 | 
            +
             | 
| 234 | 
            +
                Before:
         | 
| 235 | 
            +
             | 
| 236 | 
            +
                    Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-05 00:00:00 UTC
         | 
| 237 | 
            +
             | 
| 238 | 
            +
                After
         | 
| 239 | 
            +
             | 
| 240 | 
            +
                    Time.utc(1001, 3, 6).advance(years: -1) # => 1000-03-06 00:00:00 UTC
         | 
| 241 | 
            +
             | 
| 242 | 
            +
                Note that this doesn't affect `DateTime#advance` as that doesn't use a proleptic calendar.
         | 
| 243 | 
            +
             | 
| 244 | 
            +
                *Andrew White*
         | 
| 245 | 
            +
             | 
| 246 | 
            +
            *   In Zeitwerk mode, engines are now managed by the `main` autoloader. Engines may reference application constants, if the application is reloaded and we do not reload engines, they won't use the reloaded application code.
         | 
| 247 | 
            +
             | 
| 248 | 
            +
                *Xavier Noria*
         | 
| 249 | 
            +
             | 
| 250 | 
            +
            *   Add support for supplying `locale` to `transliterate` and `parameterize`.
         | 
| 251 | 
            +
             | 
| 252 | 
            +
                    I18n.backend.store_translations(:de, i18n: { transliterate: { rule: { "ü" => "ue" } } })
         | 
| 253 | 
            +
             | 
| 254 | 
            +
                    ActiveSupport::Inflector.transliterate("ü", locale: :de) # => "ue"
         | 
| 255 | 
            +
                    "Fünf autos".parameterize(locale: :de) # => "fuenf-autos"
         | 
| 256 | 
            +
                    ActiveSupport::Inflector.parameterize("Fünf autos", locale: :de) # => "fuenf-autos"
         | 
| 257 | 
            +
             | 
| 258 | 
            +
                *Kaan Ozkan*, *Sharang Dashputre*
         | 
| 259 | 
            +
             | 
| 260 | 
            +
            *   Allow `Array#excluding` and `Enumerable#excluding` to deal with a passed array gracefully.
         | 
| 261 | 
            +
             | 
| 262 | 
            +
                    [ 1, 2, 3, 4, 5 ].excluding([4, 5]) # => [ 1, 2, 3 ]
         | 
| 263 | 
            +
             | 
| 264 | 
            +
                *DHH*
         | 
| 265 | 
            +
             | 
| 266 | 
            +
            *   Renamed `Array#without` and `Enumerable#without` to `Array#excluding` and `Enumerable#excluding`, to create parity with
         | 
| 267 | 
            +
                `Array#including` and `Enumerable#including`. Retained the old names as aliases.
         | 
| 268 | 
            +
             | 
| 269 | 
            +
                *DHH*
         | 
| 270 | 
            +
             | 
| 271 | 
            +
            *   Added `Array#including` and `Enumerable#including` to conveniently enlarge a collection with more members using a method rather than an operator:
         | 
| 272 | 
            +
             | 
| 273 | 
            +
                    [ 1, 2, 3 ].including(4, 5) # => [ 1, 2, 3, 4, 5 ]
         | 
| 274 | 
            +
                    post.authors.including(Current.person) # => All the authors plus the current person!
         | 
| 275 | 
            +
             | 
| 276 | 
            +
                *DHH*
         | 
| 277 | 
            +
             | 
| 278 | 
            +
             | 
| 279 | 
            +
            ## Rails 6.0.0.beta3 (March 11, 2019) ##
         | 
| 280 | 
            +
             | 
| 281 | 
            +
            *   No changes.
         | 
| 282 | 
            +
             | 
| 283 | 
            +
             | 
| 1 284 | 
             
            ## Rails 6.0.0.beta2 (February 25, 2019) ##
         | 
| 2 285 |  | 
| 3 286 | 
             
            *   New autoloading based on [Zeitwerk](https://github.com/fxn/zeitwerk).
         | 
| @@ -26,6 +309,7 @@ | |
| 26 309 |  | 
| 27 310 | 
             
                *Guillermo Iguaran*
         | 
| 28 311 |  | 
| 312 | 
            +
             | 
| 29 313 | 
             
            ## Rails 6.0.0.beta1 (January 18, 2019) ##
         | 
| 30 314 |  | 
| 31 315 | 
             
            *   Remove deprecated `Module#reachable?` method.
         | 
| @@ -59,7 +343,7 @@ | |
| 59 343 |  | 
| 60 344 | 
             
                *Jan Habermann*, *Xavier Noria*
         | 
| 61 345 |  | 
| 62 | 
            -
            *   Deprecate `ActiveSupport::Multibyte::Unicode#pack_graphemes(array)` and ` | 
| 346 | 
            +
            *   Deprecate `ActiveSupport::Multibyte::Unicode#pack_graphemes(array)` and `ActiveSupport::Multibyte::Unicode#unpack_graphemes(string)`
         | 
| 63 347 | 
             
                in favor of `array.flatten.pack("U*")` and `string.scan(/\X/).map(&:codepoints)`, respectively.
         | 
| 64 348 |  | 
| 65 349 | 
             
                *Francesco Rodríguez*
         | 
| @@ -77,7 +361,7 @@ | |
| 77 361 |  | 
| 78 362 | 
             
                *Edouard Chin*
         | 
| 79 363 |  | 
| 80 | 
            -
            *   Deprecate `ActiveSupport::Multibyte::Unicode#normalize` and ` | 
| 364 | 
            +
            *   Deprecate `ActiveSupport::Multibyte::Unicode#normalize` and `ActiveSupport::Multibyte::Chars#normalize`
         | 
| 81 365 | 
             
                in favor of `String#unicode_normalize`
         | 
| 82 366 |  | 
| 83 367 | 
             
                *Francesco Rodríguez*
         | 
| @@ -233,7 +517,7 @@ | |
| 233 517 |  | 
| 234 518 | 
             
                *Kasper Timm Hansen*
         | 
| 235 519 |  | 
| 236 | 
            -
            *   Fix bug where `ActiveSupport:: | 
| 520 | 
            +
            *   Fix bug where `ActiveSupport::TimeZone.all` would fail when tzinfo data for
         | 
| 237 521 | 
             
                any timezone defined in `ActiveSupport::TimeZone::MAPPING` is missing.
         | 
| 238 522 |  | 
| 239 523 | 
             
                *Dominik Sander*
         | 
    
        data/README.rdoc
    CHANGED
    
    | @@ -5,6 +5,7 @@ extensions that were found useful for the Rails framework. These additions | |
| 5 5 | 
             
            reside in this package so they can be loaded as needed in Ruby projects
         | 
| 6 6 | 
             
            outside of Rails.
         | 
| 7 7 |  | 
| 8 | 
            +
            You can read more about the extensions in the {Active Support Core Extensions}[https://edgeguides.rubyonrails.org/active_support_core_extensions.html] guide.
         | 
| 8 9 |  | 
| 9 10 | 
             
            == Download and installation
         | 
| 10 11 |  | 
| @@ -28,7 +29,7 @@ Active Support is released under the MIT license: | |
| 28 29 |  | 
| 29 30 | 
             
            API documentation is at:
         | 
| 30 31 |  | 
| 31 | 
            -
            *  | 
| 32 | 
            +
            * https://api.rubyonrails.org
         | 
| 32 33 |  | 
| 33 34 | 
             
            Bug reports for the Ruby on Rails project can be filed here:
         | 
| 34 35 |  | 
    
        data/lib/active_support.rb
    CHANGED
    
    
| @@ -0,0 +1,48 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module ActiveSupport
         | 
| 4 | 
            +
              # Actionable errors let's you define actions to resolve an error.
         | 
| 5 | 
            +
              #
         | 
| 6 | 
            +
              # To make an error actionable, include the <tt>ActiveSupport::ActionableError</tt>
         | 
| 7 | 
            +
              # module and invoke the +action+ class macro to define the action. An action
         | 
| 8 | 
            +
              # needs a name and a block to execute.
         | 
| 9 | 
            +
              module ActionableError
         | 
| 10 | 
            +
                extend Concern
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                class NonActionable < StandardError; end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                included do
         | 
| 15 | 
            +
                  class_attribute :_actions, default: {}
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def self.actions(error) # :nodoc:
         | 
| 19 | 
            +
                  case error
         | 
| 20 | 
            +
                  when ActionableError, -> it { Class === it && it < ActionableError }
         | 
| 21 | 
            +
                    error._actions
         | 
| 22 | 
            +
                  else
         | 
| 23 | 
            +
                    {}
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def self.dispatch(error, name) # :nodoc:
         | 
| 28 | 
            +
                  actions(error).fetch(name).call
         | 
| 29 | 
            +
                rescue KeyError
         | 
| 30 | 
            +
                  raise NonActionable, "Cannot find action \"#{name}\""
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                module ClassMethods
         | 
| 34 | 
            +
                  # Defines an action that can resolve the error.
         | 
| 35 | 
            +
                  #
         | 
| 36 | 
            +
                  #   class PendingMigrationError < MigrationError
         | 
| 37 | 
            +
                  #     include ActiveSupport::ActionableError
         | 
| 38 | 
            +
                  #
         | 
| 39 | 
            +
                  #     action "Run pending migrations" do
         | 
| 40 | 
            +
                  #       ActiveRecord::Tasks::DatabaseTasks.migrate
         | 
| 41 | 
            +
                  #     end
         | 
| 42 | 
            +
                  #   end
         | 
| 43 | 
            +
                  def action(name, &block)
         | 
| 44 | 
            +
                    _actions[name] = block
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
            end
         | 
    
        data/lib/active_support/cache.rb
    CHANGED
    
    | @@ -492,7 +492,7 @@ module ActiveSupport | |
| 492 492 | 
             
                  #
         | 
| 493 493 | 
             
                  # Options are passed to the underlying cache implementation.
         | 
| 494 494 | 
             
                  #
         | 
| 495 | 
            -
                  #  | 
| 495 | 
            +
                  # Some implementations may not support this method.
         | 
| 496 496 | 
             
                  def delete_matched(matcher, options = nil)
         | 
| 497 497 | 
             
                    raise NotImplementedError.new("#{self.class.name} does not support delete_matched")
         | 
| 498 498 | 
             
                  end
         | 
| @@ -501,7 +501,7 @@ module ActiveSupport | |
| 501 501 | 
             
                  #
         | 
| 502 502 | 
             
                  # Options are passed to the underlying cache implementation.
         | 
| 503 503 | 
             
                  #
         | 
| 504 | 
            -
                  #  | 
| 504 | 
            +
                  # Some implementations may not support this method.
         | 
| 505 505 | 
             
                  def increment(name, amount = 1, options = nil)
         | 
| 506 506 | 
             
                    raise NotImplementedError.new("#{self.class.name} does not support increment")
         | 
| 507 507 | 
             
                  end
         | 
| @@ -510,7 +510,7 @@ module ActiveSupport | |
| 510 510 | 
             
                  #
         | 
| 511 511 | 
             
                  # Options are passed to the underlying cache implementation.
         | 
| 512 512 | 
             
                  #
         | 
| 513 | 
            -
                  #  | 
| 513 | 
            +
                  # Some implementations may not support this method.
         | 
| 514 514 | 
             
                  def decrement(name, amount = 1, options = nil)
         | 
| 515 515 | 
             
                    raise NotImplementedError.new("#{self.class.name} does not support decrement")
         | 
| 516 516 | 
             
                  end
         | 
| @@ -519,7 +519,7 @@ module ActiveSupport | |
| 519 519 | 
             
                  #
         | 
| 520 520 | 
             
                  # Options are passed to the underlying cache implementation.
         | 
| 521 521 | 
             
                  #
         | 
| 522 | 
            -
                  #  | 
| 522 | 
            +
                  # Some implementations may not support this method.
         | 
| 523 523 | 
             
                  def cleanup(options = nil)
         | 
| 524 524 | 
             
                    raise NotImplementedError.new("#{self.class.name} does not support cleanup")
         | 
| 525 525 | 
             
                  end
         | 
| @@ -529,7 +529,7 @@ module ActiveSupport | |
| 529 529 | 
             
                  #
         | 
| 530 530 | 
             
                  # The options hash is passed to the underlying cache implementation.
         | 
| 531 531 | 
             
                  #
         | 
| 532 | 
            -
                  #  | 
| 532 | 
            +
                  # Some implementations may not support this method.
         | 
| 533 533 | 
             
                  def clear(options = nil)
         | 
| 534 534 | 
             
                    raise NotImplementedError.new("#{self.class.name} does not support clear")
         | 
| 535 535 | 
             
                  end
         |