Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package rubygem-activesupport-8.0 for openSUSE:Factory checked in at 2025-08-22 17:49:24 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rubygem-activesupport-8.0 (Old) and /work/SRC/openSUSE:Factory/.rubygem-activesupport-8.0.new.29662 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-activesupport-8.0" Fri Aug 22 17:49:24 2025 rev:4 rq:1300935 version:8.0.2.1 Changes: -------- --- /work/SRC/openSUSE:Factory/rubygem-activesupport-8.0/rubygem-activesupport-8.0.changes 2025-01-21 21:10:29.731028681 +0100 +++ /work/SRC/openSUSE:Factory/.rubygem-activesupport-8.0.new.29662/rubygem-activesupport-8.0.changes 2025-08-22 17:50:59.075900827 +0200 @@ -1,0 +2,6 @@ +Thu Aug 14 00:25:21 UTC 2025 - Marcus Rueckert <mrueck...@suse.de> + +- Update to version 8.0.2.1: + https://rubyonrails.org/2025/8/13/Rails-Versions-8-0-2-1-7-2-2-2-and-7-1-5-2-have-been-released + +------------------------------------------------------------------- Old: ---- activesupport-8.0.1.gem New: ---- activesupport-8.0.2.1.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rubygem-activesupport-8.0.spec ++++++ --- /var/tmp/diff_new_pack.gfSNWf/_old 2025-08-22 17:50:59.495918331 +0200 +++ /var/tmp/diff_new_pack.gfSNWf/_new 2025-08-22 17:50:59.499918497 +0200 @@ -1,7 +1,7 @@ # # spec file for package rubygem-activesupport-8.0 # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2025 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -24,7 +24,7 @@ # Name: rubygem-activesupport-8.0 -Version: 8.0.1 +Version: 8.0.2.1 Release: 0 %define mod_name activesupport %define mod_full_name %{mod_name}-%{version} ++++++ activesupport-8.0.1.gem -> activesupport-8.0.2.1.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/CHANGELOG.md new/CHANGELOG.md --- old/CHANGELOG.md 2024-12-13 21:02:34.000000000 +0100 +++ new/CHANGELOG.md 1980-01-02 01:00:00.000000000 +0100 @@ -1,3 +1,106 @@ +## Rails 8.0.2.1 (August 13, 2025) ## + +* No changes. + + +## Rails 8.0.2 (March 12, 2025) ## + +* No changes. + + +## Rails 8.0.2 (March 12, 2025) ## + +* Fix setting `to_time_preserves_timezone` from `new_framework_defaults_8_0.rb`. + + *fatkodima* + +* Fix Active Support Cache `fetch_multi` when local store is active. + + `fetch_multi` now properly yield to the provided block for missing entries + that have been recorded as such in the local store. + + *Jean Boussier* + +* Fix execution wrapping to report all exceptions, including `Exception`. + + If a more serious error like `SystemStackError` or `NoMemoryError` happens, + the error reporter should be able to report these kinds of exceptions. + + *Gannon McGibbon* + +* Fix `RedisCacheStore` and `MemCacheStore` to also handle connection pool related errors. + + These errors are rescued and reported to `Rails.error`. + + *Jean Boussier* + +* Fix `ActiveSupport::Cache#read_multi` to respect version expiry when using local cache. + + *zzak* + +* Fix `ActiveSupport::MessageVerifier` and `ActiveSupport::MessageEncryptor` configuration of `on_rotation` callback. + + ```ruby + verifier.rotate(old_secret).on_rotation { ... } + ``` + + Now both work as documented. + + *Jean Boussier* + +* Fix `ActiveSupport::MessageVerifier` to always be able to verify both URL-safe and URL-unsafe payloads. + + This is to allow transitioning seemlessly from either configuration without immediately invalidating + all previously generated signed messages. + + *Jean Boussier*, *Florent Beaurain*, *Ali Sepehri* + +* Fix `cache.fetch` to honor the provided expiry when `:race_condition_ttl` is used. + + ```ruby + cache.fetch("key", expires_in: 1.hour, race_condition_ttl: 5.second) do + "something" + end + ``` + + In the above example, the final cache entry would have a 10 seconds TTL instead + of the requested 1 hour. + + *Dhia* + +* Better handle procs with splat arguments in `set_callback`. + + *Radamés Roriz* + +* Fix `String#mb_chars` to not mutate the receiver. + + Previously it would call `force_encoding` on the receiver, + now it dups the receiver first. + + *Jean Boussier* + +* Improve `ErrorSubscriber` to also mark error causes as reported. + + This avoid some cases of errors being reported twice, notably in views because of how + errors are wrapped in `ActionView::Template::Error`. + + *Jean Boussier* + +* Fix `Module#module_parent_name` to return the correct name after the module has been named. + + When called on an anonymous module, the return value wouldn't change after the module was given a name + later by being assigned to a constant. + + ```ruby + mod = Module.new + mod.module_parent_name # => "Object" + MyModule::Something = mod + mod.module_parent_name # => "MyModule" + ``` + + *Jean Boussier* + + ## Rails 8.0.1 (December 13, 2024) ## * Fix a bug in `ERB::Util.tokenize` that causes incorrect tokenization when ERB tags are preceeded by multibyte characters. Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/backtrace_cleaner.rb new/lib/active_support/backtrace_cleaner.rb --- old/lib/active_support/backtrace_cleaner.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/backtrace_cleaner.rb 1980-01-02 01:00:00.000000000 +0100 @@ -79,7 +79,7 @@ # # # Will turn "/my/rails/root/app/models/person.rb" into "app/models/person.rb" # root = "#{Rails.root}/" - # backtrace_cleaner.add_filter { |line| line.start_with?(root) ? line.from(root.size) : line } + # backtrace_cleaner.add_filter { |line| line.delete_prefix(root) } def add_filter(&block) @filters << block end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/broadcast_logger.rb new/lib/active_support/broadcast_logger.rb --- old/lib/active_support/broadcast_logger.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/broadcast_logger.rb 1980-01-02 01:00:00.000000000 +0100 @@ -163,57 +163,57 @@ dispatch { |logger| logger.close } end - # +True+ if the log level allows entries with severity Logger::DEBUG to be written - # to at least one broadcast. +False+ otherwise. + # True if the log level allows entries with severity +Logger::DEBUG+ to be written + # to at least one broadcast. False otherwise. def debug? @broadcasts.any? { |logger| logger.debug? } end - # Sets the log level to Logger::DEBUG for the whole broadcast. + # Sets the log level to +Logger::DEBUG+ for the whole broadcast. def debug! dispatch { |logger| logger.debug! } end - # +True+ if the log level allows entries with severity Logger::INFO to be written - # to at least one broadcast. +False+ otherwise. + # True if the log level allows entries with severity +Logger::INFO+ to be written + # to at least one broadcast. False otherwise. def info? @broadcasts.any? { |logger| logger.info? } end - # Sets the log level to Logger::INFO for the whole broadcast. + # Sets the log level to +Logger::INFO+ for the whole broadcast. def info! dispatch { |logger| logger.info! } end - # +True+ if the log level allows entries with severity Logger::WARN to be written - # to at least one broadcast. +False+ otherwise. + # True if the log level allows entries with severity +Logger::WARN+ to be written + # to at least one broadcast. False otherwise. def warn? @broadcasts.any? { |logger| logger.warn? } end - # Sets the log level to Logger::WARN for the whole broadcast. + # Sets the log level to +Logger::WARN+ for the whole broadcast. def warn! dispatch { |logger| logger.warn! } end - # +True+ if the log level allows entries with severity Logger::ERROR to be written - # to at least one broadcast. +False+ otherwise. + # True if the log level allows entries with severity +Logger::ERROR+ to be written + # to at least one broadcast. False otherwise. def error? @broadcasts.any? { |logger| logger.error? } end - # Sets the log level to Logger::ERROR for the whole broadcast. + # Sets the log level to +Logger::ERROR+ for the whole broadcast. def error! dispatch { |logger| logger.error! } end - # +True+ if the log level allows entries with severity Logger::FATAL to be written - # to at least one broadcast. +False+ otherwise. + # True if the log level allows entries with severity +Logger::FATAL+ to be written + # to at least one broadcast. False otherwise. def fatal? @broadcasts.any? { |logger| logger.fatal? } end - # Sets the log level to Logger::FATAL for the whole broadcast. + # Sets the log level to +Logger::FATAL+ for the whole broadcast. def fatal! dispatch { |logger| logger.fatal! } end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/cache/file_store.rb new/lib/active_support/cache/file_store.rb --- old/lib/active_support/cache/file_store.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/cache/file_store.rb 1980-01-02 01:00:00.000000000 +0100 @@ -57,7 +57,7 @@ # cache.write("baz", 5) # cache.increment("baz") # => 6 # - def increment(name, amount = 1, options = nil) + def increment(name, amount = 1, **options) options = merged_options(options) key = normalize_key(name, options) @@ -77,7 +77,7 @@ # cache.write("baz", 5) # cache.decrement("baz") # => 4 # - def decrement(name, amount = 1, options = nil) + def decrement(name, amount = 1, **options) options = merged_options(options) key = normalize_key(name, options) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/cache/mem_cache_store.rb new/lib/active_support/cache/mem_cache_store.rb --- old/lib/active_support/cache/mem_cache_store.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/cache/mem_cache_store.rb 1980-01-02 01:00:00.000000000 +0100 @@ -276,7 +276,7 @@ def rescue_error_with(fallback) yield - rescue Dalli::DalliError => error + rescue Dalli::DalliError, ConnectionPool::Error, ConnectionPool::TimeoutError => error logger.error("DalliError (#{error}): #{error.message}") if logger ActiveSupport.error_reporter&.report( error, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/cache/memory_store.rb new/lib/active_support/cache/memory_store.rb --- old/lib/active_support/cache/memory_store.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/cache/memory_store.rb 1980-01-02 01:00:00.000000000 +0100 @@ -146,9 +146,9 @@ # cache.write("baz", 5) # cache.increment("baz") # => 6 # - def increment(name, amount = 1, options = nil) + def increment(name, amount = 1, **options) instrument(:increment, name, amount: amount) do - modify_value(name, amount, options) + modify_value(name, amount, **options) end end @@ -163,9 +163,9 @@ # cache.write("baz", 5) # cache.decrement("baz") # => 4 # - def decrement(name, amount = 1, options = nil) + def decrement(name, amount = 1, **options) instrument(:decrement, name, amount: amount) do - modify_value(name, -amount, options) + modify_value(name, -amount, **options) end end @@ -238,7 +238,7 @@ # Modifies the amount of an integer value that is stored in the cache. # If the key is not found it is created and set to +amount+. - def modify_value(name, amount, options) + def modify_value(name, amount, **options) options = merged_options(options) key = normalize_key(name, options) version = normalize_version(name, options) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/cache/null_store.rb new/lib/active_support/cache/null_store.rb --- old/lib/active_support/cache/null_store.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/cache/null_store.rb 1980-01-02 01:00:00.000000000 +0100 @@ -25,10 +25,10 @@ def cleanup(options = nil) end - def increment(name, amount = 1, options = nil) + def increment(name, amount = 1, **options) end - def decrement(name, amount = 1, options = nil) + def decrement(name, amount = 1, **options) end def delete_matched(matcher, options = nil) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/cache/redis_cache_store.rb new/lib/active_support/cache/redis_cache_store.rb --- old/lib/active_support/cache/redis_cache_store.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/cache/redis_cache_store.rb 1980-01-02 01:00:00.000000000 +0100 @@ -483,7 +483,7 @@ def failsafe(method, returning: nil) yield - rescue ::Redis::BaseError => error + rescue ::Redis::BaseError, ConnectionPool::Error, ConnectionPool::TimeoutError => error @error_handler&.call(method: method, exception: error, returning: returning) returning end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/cache/strategy/local_cache.rb new/lib/active_support/cache/strategy/local_cache.rb --- old/lib/active_support/cache/strategy/local_cache.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/cache/strategy/local_cache.rb 1980-01-02 01:00:00.000000000 +0100 @@ -94,28 +94,54 @@ super end - def increment(name, amount = 1, options = nil) # :nodoc: + def increment(name, amount = 1, **options) # :nodoc: return super unless local_cache value = bypass_local_cache { super } - if options - write_cache_value(name, value, raw: true, **options) - else - write_cache_value(name, value, raw: true) - end + write_cache_value(name, value, raw: true, **options) value end - def decrement(name, amount = 1, options = nil) # :nodoc: + def decrement(name, amount = 1, **options) # :nodoc: return super unless local_cache value = bypass_local_cache { super } - if options - write_cache_value(name, value, raw: true, **options) - else - write_cache_value(name, value, raw: true) - end + write_cache_value(name, value, raw: true, **options) value end + def fetch_multi(*names, &block) # :nodoc: + return super if local_cache.nil? || names.empty? + + options = names.extract_options! + options = merged_options(options) + + keys_to_names = names.index_by { |name| normalize_key(name, options) } + + local_entries = local_cache.read_multi_entries(keys_to_names.keys) + results = local_entries.each_with_object({}) do |(key, value), result| + # If we recorded a miss in the local cache, `#fetch_multi` will forward + # that key to the real store, and the entry will be replaced + # local_cache.delete_entry(key) + next if value.nil? + + entry = deserialize_entry(value, **options) + + normalized_key = keys_to_names[key] + if entry.nil? + result[normalized_key] = nil + elsif entry.expired? || entry.mismatched?(normalize_version(normalized_key, options)) + local_cache.delete_entry(key) + else + result[normalized_key] = entry.value + end + end + + if results.size < names.size + results.merge!(super(*(names - results.keys), options, &block)) + end + + results + end + private def read_serialized_entry(key, raw: false, **options) if cache = local_cache @@ -137,17 +163,27 @@ keys_to_names = names.index_by { |name| normalize_key(name, options) } local_entries = local_cache.read_multi_entries(keys_to_names.keys) - local_entries.transform_keys! { |key| keys_to_names[key] } - local_entries.transform_values! do |payload| - deserialize_entry(payload, **options)&.value + + results = local_entries.each_with_object({}) do |(key, value), result| + next if value.nil? # recorded cache miss + + entry = deserialize_entry(value, **options) + + normalized_key = keys_to_names[key] + if entry.nil? + result[normalized_key] = nil + elsif entry.expired? || entry.mismatched?(normalize_version(normalized_key, options)) + local_cache.delete_entry(key) + else + result[normalized_key] = entry.value + end end - missed_names = names - local_entries.keys - if missed_names.any? - local_entries.merge!(super(missed_names, **options)) - else - local_entries + if results.size < names.size + results.merge!(super(names - results.keys, **options)) end + + results end def write_serialized_entry(key, payload, **) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/cache.rb new/lib/active_support/cache.rb --- old/lib/active_support/cache.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/cache.rb 1980-01-02 01:00:00.000000000 +0100 @@ -386,7 +386,7 @@ # process can try to generate a new value after the extended time window # has elapsed. # - # # Set all values to expire after one minute. + # # Set all values to expire after one second. # cache = ActiveSupport::Cache::MemoryStore.new(expires_in: 1) # # cache.write("foo", "original value") @@ -1035,8 +1035,7 @@ # When an entry has a positive :race_condition_ttl defined, put the stale entry back into the cache # for a brief period while the entry is being recalculated. entry.expires_at = Time.now.to_f + race_ttl - options[:expires_in] = race_ttl * 2 - write_entry(key, entry, **options) + write_entry(key, entry, **options, expires_in: race_ttl * 2) else delete_entry(key, **options) end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/callbacks.rb new/lib/active_support/callbacks.rb --- old/lib/active_support/callbacks.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/callbacks.rb 1980-01-02 01:00:00.000000000 +0100 @@ -498,9 +498,10 @@ when Conditionals::Value ProcCall.new(filter) when ::Proc - if filter.arity > 1 + case filter.arity + when 2 InstanceExec2.new(filter) - elsif filter.arity > 0 + when 1, -2 InstanceExec1.new(filter) else InstanceExec0.new(filter) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/core_ext/enumerable.rb new/lib/active_support/core_ext/enumerable.rb --- old/lib/active_support/core_ext/enumerable.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/core_ext/enumerable.rb 1980-01-02 01:00:00.000000000 +0100 @@ -203,7 +203,7 @@ end # Returns the sole item in the enumerable. If there are no items, or more - # than one item, raises +Enumerable::SoleItemExpectedError+. + # than one item, raises Enumerable::SoleItemExpectedError. # # ["x"].sole # => "x" # Set.new.sole # => Enumerable::SoleItemExpectedError: no item found diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/core_ext/hash/deep_merge.rb new/lib/active_support/core_ext/hash/deep_merge.rb --- old/lib/active_support/core_ext/hash/deep_merge.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/core_ext/hash/deep_merge.rb 1980-01-02 01:00:00.000000000 +0100 @@ -36,6 +36,7 @@ #-- # Implemented by ActiveSupport::DeepMergeable#deep_merge!. + ## def deep_merge?(other) # :nodoc: other.is_a?(Hash) end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/core_ext/module/introspection.rb new/lib/active_support/core_ext/module/introspection.rb --- old/lib/active_support/core_ext/module/introspection.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/core_ext/module/introspection.rb 1980-01-02 01:00:00.000000000 +0100 @@ -10,6 +10,9 @@ if defined?(@parent_name) @parent_name else + name = self.name + return if name.nil? + parent_name = name =~ /::[^:]+\z/ ? -$` : nil @parent_name = parent_name unless frozen? parent_name diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/current_attributes.rb new/lib/active_support/current_attributes.rb --- old/lib/active_support/current_attributes.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/current_attributes.rb 1980-01-02 01:00:00.000000000 +0100 @@ -187,7 +187,7 @@ super return if name == :initialize return unless public_method_defined?(name) - return if respond_to?(name, true) + return if singleton_class.method_defined?(name) || singleton_class.private_method_defined?(name) Delegation.generate(singleton_class, [name], to: :instance, as: self, nilable: false) end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/error_reporter.rb new/lib/active_support/error_reporter.rb --- old/lib/active_support/error_reporter.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/error_reporter.rb 1980-01-02 01:00:00.000000000 +0100 @@ -207,6 +207,12 @@ # # Rails.error.report(error) # + # The +error+ argument must be an instance of Exception. + # + # Rails.error.report(Exception.new("Something went wrong")) + # + # Otherwise you can use #unexpected to report an error which does accept a + # string argument. def report(error, handled: true, severity: handled ? :warning : :error, context: {}, source: DEFAULT_SOURCE) return if error.instance_variable_defined?(:@__rails_error_reported) ensure_backtrace(error) @@ -232,8 +238,11 @@ end end - unless error.frozen? - error.instance_variable_set(:@__rails_error_reported, true) + while error + unless error.frozen? + error.instance_variable_set(:@__rails_error_reported, true) + end + error = error.cause end nil diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/execution_wrapper.rb new/lib/active_support/execution_wrapper.rb --- old/lib/active_support/execution_wrapper.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/execution_wrapper.rb 1980-01-02 01:00:00.000000000 +0100 @@ -89,7 +89,7 @@ instance = run! begin yield - rescue => error + rescue Exception => error error_reporter&.report(error, handled: false, source: source) raise ensure diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/gem_version.rb new/lib/active_support/gem_version.rb --- old/lib/active_support/gem_version.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/gem_version.rb 1980-01-02 01:00:00.000000000 +0100 @@ -9,8 +9,8 @@ module VERSION MAJOR = 8 MINOR = 0 - TINY = 1 - PRE = nil + TINY = 2 + PRE = "1" STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".") end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/json/encoding.rb new/lib/active_support/json/encoding.rb --- old/lib/active_support/json/encoding.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/json/encoding.rb 1980-01-02 01:00:00.000000000 +0100 @@ -13,12 +13,30 @@ end module JSON - # Dumps objects in JSON (JavaScript Object Notation). - # See http://www.json.org for more info. - # - # ActiveSupport::JSON.encode({ team: 'rails', players: '36' }) - # # => "{\"team\":\"rails\",\"players\":\"36\"}" class << self + # Dumps objects in JSON (JavaScript Object Notation). + # See http://www.json.org for more info. + # + # ActiveSupport::JSON.encode({ team: 'rails', players: '36' }) + # # => "{\"team\":\"rails\",\"players\":\"36\"}" + # + # Generates JSON that is safe to include in JavaScript as it escapes + # U+2028 (Line Separator) and U+2029 (Paragraph Separator): + # + # ActiveSupport::JSON.encode({ key: "\u2028" }) + # # => "{\"key\":\"\\u2028\"}" + # + # By default, it also generates JSON that is safe to include in HTML, as + # it escapes <tt><</tt>, <tt>></tt>, and <tt>&</tt>: + # + # ActiveSupport::JSON.encode({ key: "<>&" }) + # # => "{\"key\":\"\\u003c\\u003e\\u0026\"}" + # + # This can be changed with the +escape_html_entities+ option, or the + # global escape_html_entities_in_json configuration option. + # + # ActiveSupport::JSON.encode({ key: "<>&" }, escape_html_entities: false) + # # => "{\"key\":\"<>&\"}" def encode(value, options = nil) Encoding.json_encoder.new(options).encode(value) end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/message_encryptors.rb new/lib/active_support/message_encryptors.rb --- old/lib/active_support/message_encryptors.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/message_encryptors.rb 1980-01-02 01:00:00.000000000 +0100 @@ -28,8 +28,8 @@ # <tt>transitional = false</tt>. ## - # :method: initialize - # :call-seq: initialize(&secret_generator) + # :singleton-method: new + # :call-seq: new(&secret_generator) # # Initializes a new instance. +secret_generator+ must accept a salt and a # +secret_length+ kwarg, and return a suitable secret (string) or secrets diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/message_verifier.rb new/lib/active_support/message_verifier.rb --- old/lib/active_support/message_verifier.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/message_verifier.rb 1980-01-02 01:00:00.000000000 +0100 @@ -154,6 +154,8 @@ # not URL-safe. In other words, they can contain "+" and "/". If you want to # generate URL-safe strings (in compliance with "Base 64 Encoding with URL # and Filename Safe Alphabet" in RFC 4648), you can pass +true+. + # Note that MessageVerifier will always accept both URL-safe and URL-unsafe + # encoded messages, to allow a smooth transition between the two settings. # # [+:force_legacy_metadata_serializer+] # Whether to use the legacy metadata serializer, which serializes the @@ -318,6 +320,13 @@ end private + def decode(encoded, url_safe: @url_safe) + catch :invalid_message_format do + return super + end + super(encoded, url_safe: !url_safe) + end + def sign_encoded(encoded) digest = generate_digest(encoded) encoded << SEPARATOR << digest diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/message_verifiers.rb new/lib/active_support/message_verifiers.rb --- old/lib/active_support/message_verifiers.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/message_verifiers.rb 1980-01-02 01:00:00.000000000 +0100 @@ -28,8 +28,8 @@ # <tt>transitional = false</tt>. ## - # :method: initialize - # :call-seq: initialize(&secret_generator) + # :singleton-method: new + # :call-seq: new(&secret_generator) # # Initializes a new instance. +secret_generator+ must accept a salt, and # return a suitable secret (string). +secret_generator+ may also accept @@ -59,7 +59,9 @@ ## # :method: rotate - # :call-seq: rotate(**options) + # :call-seq: + # rotate(**options) + # rotate(&block) # # Adds +options+ to the list of option sets. Messages will be signed using # the first set in the list. When verifying, however, each set will be diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/messages/rotator.rb new/lib/active_support/messages/rotator.rb --- old/lib/active_support/messages/rotator.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/messages/rotator.rb 1980-01-02 01:00:00.000000000 +0100 @@ -15,6 +15,11 @@ fall_back_to build_rotation(*args, **options) end + def on_rotation(&on_rotation) + @on_rotation = on_rotation + self + end + def fall_back_to(fallback) @rotations << fallback self diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/multibyte/chars.rb new/lib/active_support/multibyte/chars.rb --- old/lib/active_support/multibyte/chars.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/multibyte/chars.rb 1980-01-02 01:00:00.000000000 +0100 @@ -55,7 +55,10 @@ # Creates a new Chars instance by wrapping _string_. def initialize(string) @wrapped_string = string - @wrapped_string.force_encoding(Encoding::UTF_8) unless @wrapped_string.frozen? + if string.encoding != Encoding::UTF_8 + @wrapped_string = @wrapped_string.dup + @wrapped_string.force_encoding(Encoding::UTF_8) + end end # Forward all undefined methods to the wrapped string. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/railtie.rb new/lib/active_support/railtie.rb --- old/lib/active_support/railtie.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/railtie.rb 1980-01-02 01:00:00.000000000 +0100 @@ -97,7 +97,9 @@ end initializer "active_support.to_time_preserves_timezone" do |app| - ActiveSupport.to_time_preserves_timezone = app.config.active_support.to_time_preserves_timezone + config.after_initialize do + ActiveSupport.to_time_preserves_timezone = app.config.active_support.to_time_preserves_timezone + end end # Sets the default week start diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/active_support/testing/strict_warnings.rb new/lib/active_support/testing/strict_warnings.rb --- old/lib/active_support/testing/strict_warnings.rb 2024-12-13 21:02:34.000000000 +0100 +++ new/lib/active_support/testing/strict_warnings.rb 1970-01-01 01:00:00.000000000 +0100 @@ -1,43 +0,0 @@ -# frozen_string_literal: true - -$VERBOSE = true -Warning[:deprecated] = true - -module ActiveSupport - module RaiseWarnings # :nodoc: - class WarningError < StandardError; end - - PROJECT_ROOT = File.expand_path("../../../../", __dir__) - ALLOWED_WARNINGS = Regexp.union( - /circular require considered harmful.*delayed_job/, # Bug in delayed job. - - # Expected non-verbose warning emitted by Rails. - /Ignoring .*\.yml because it has expired/, - /Failed to validate the schema cache because/, - - # TODO: We need to decide what to do with this. - /Status code :unprocessable_entity is deprecated/, - ) - - SUPPRESSED_WARNINGS = Regexp.union( - # TODO: remove if https://github.com/mikel/mail/pull/1557 or similar fix - %r{/lib/mail/parsers/.*statement not reached}, - %r{/lib/mail/parsers/.*assigned but unused variable - disp_type_s}, - %r{/lib/mail/parsers/.*assigned but unused variable - testEof} - ) - - def warn(message, ...) - return if SUPPRESSED_WARNINGS.match?(message) - - super - - return unless message.include?(PROJECT_ROOT) - return if ALLOWED_WARNINGS.match?(message) - return unless ENV["RAILS_STRICT_WARNINGS"] || ENV["BUILDKITE"] - - raise WarningError.new(message) - end - end -end - -Warning.singleton_class.prepend(ActiveSupport::RaiseWarnings) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 2024-12-13 21:02:34.000000000 +0100 +++ new/metadata 1980-01-02 01:00:00.000000000 +0100 @@ -1,14 +1,13 @@ --- !ruby/object:Gem::Specification name: activesupport version: !ruby/object:Gem::Version - version: 8.0.1 + version: 8.0.2.1 platform: ruby authors: - David Heinemeier Hansson -autorequire: bindir: bin cert_chain: [] -date: 2024-12-13 00:00:00.000000000 Z +date: 1980-01-02 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: i18n @@ -475,7 +474,6 @@ - lib/active_support/testing/parallelize_executor.rb - lib/active_support/testing/setup_and_teardown.rb - lib/active_support/testing/stream.rb -- lib/active_support/testing/strict_warnings.rb - lib/active_support/testing/tagged_logging.rb - lib/active_support/testing/tests_without_assertions.rb - lib/active_support/testing/time_helpers.rb @@ -495,12 +493,11 @@ - MIT metadata: bug_tracker_uri: https://github.com/rails/rails/issues - changelog_uri: https://github.com/rails/rails/blob/v8.0.1/activesupport/CHANGELOG.md - documentation_uri: https://api.rubyonrails.org/v8.0.1/ + changelog_uri: https://github.com/rails/rails/blob/v8.0.2.1/activesupport/CHANGELOG.md + documentation_uri: https://api.rubyonrails.org/v8.0.2.1/ mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk - source_code_uri: https://github.com/rails/rails/tree/v8.0.1/activesupport + source_code_uri: https://github.com/rails/rails/tree/v8.0.2.1/activesupport rubygems_mfa_required: 'true' -post_install_message: rdoc_options: - "--encoding" - UTF-8 @@ -517,8 +514,7 @@ - !ruby/object:Gem::Version version: '0' requirements: [] -rubygems_version: 3.5.22 -signing_key: +rubygems_version: 3.6.9 specification_version: 4 summary: A toolkit of support libraries and Ruby core extensions extracted from the Rails framework.