From 2bf5bbd22fc589c83b5ca5813cdb33d64cf782a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ondruch?= Date: Thu, 16 Apr 2020 14:14:09 +0200 Subject: [PATCH 1/2] Ruby 2.7 compatibility. Resolves: rhbz#1799093 --- ...terlockAwareMonitor-work-in-Ruby-2.7.patch | 54 +++++++++++++++++++ rubygem-activesupport.spec | 20 +++++-- 2 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 rubygem-activesupport-6.1.0-Make-LoadInterlockAwareMonitor-work-in-Ruby-2.7.patch diff --git a/rubygem-activesupport-6.1.0-Make-LoadInterlockAwareMonitor-work-in-Ruby-2.7.patch b/rubygem-activesupport-6.1.0-Make-LoadInterlockAwareMonitor-work-in-Ruby-2.7.patch new file mode 100644 index 0000000..216921a --- /dev/null +++ b/rubygem-activesupport-6.1.0-Make-LoadInterlockAwareMonitor-work-in-Ruby-2.7.patch @@ -0,0 +1,54 @@ +From 4f4f8a705a8e713bceee8cacca52e9bce22e28dc Mon Sep 17 00:00:00 2001 +From: "yuuji.yaginuma" +Date: Wed, 18 Dec 2019 19:00:29 +0900 +Subject: [PATCH] Make `LoadInterlockAwareMonitor` work in Ruby 2.7 + +Currently `LoadInterlockAwareMonitorTest` does not pass with Ruby 2.7 [1]. +This is due to the refactoring of the `monitor` done in Ruby 2.7 [2]. + +With this refactoring, the behavior of the method has changed from the +expected behavior in `LoadInterlockAwareMonitor`. + +This patch also overwrites `synchronize` so that +`LoadInterlockAwareMonitor` works as expected. + +[1]: https://buildkite.com/rails/rails/builds/65877#eec47af5-7595-47cb-97c0-30c589716176/996-2743 +[2]: https://bugs.ruby-lang.org/issues/16255 +--- + .../load_interlock_aware_monitor.rb | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/activesupport/lib/active_support/concurrency/load_interlock_aware_monitor.rb b/activesupport/lib/active_support/concurrency/load_interlock_aware_monitor.rb +index a8455c00483f..480c34c64017 100644 +--- a/activesupport/lib/active_support/concurrency/load_interlock_aware_monitor.rb ++++ b/activesupport/lib/active_support/concurrency/load_interlock_aware_monitor.rb +@@ -7,11 +7,29 @@ module Concurrency + # A monitor that will permit dependency loading while blocked waiting for + # the lock. + class LoadInterlockAwareMonitor < Monitor ++ EXCEPTION_NEVER = { Exception => :never }.freeze ++ EXCEPTION_IMMEDIATE = { Exception => :immediate }.freeze ++ private_constant :EXCEPTION_NEVER, :EXCEPTION_IMMEDIATE ++ + # Enters an exclusive section, but allows dependency loading while blocked + def mon_enter + mon_try_enter || + ActiveSupport::Dependencies.interlock.permit_concurrent_loads { super } + end ++ ++ def synchronize ++ Thread.handle_interrupt(EXCEPTION_NEVER) do ++ mon_enter ++ ++ begin ++ Thread.handle_interrupt(EXCEPTION_IMMEDIATE) do ++ yield ++ end ++ ensure ++ mon_exit ++ end ++ end ++ end + end + end + end diff --git a/rubygem-activesupport.spec b/rubygem-activesupport.spec index 60d9866..47483ca 100644 --- a/rubygem-activesupport.spec +++ b/rubygem-activesupport.spec @@ -3,7 +3,7 @@ Name: rubygem-%{gem_name} Epoch: 1 Version: 5.2.3 -Release: 3%{?dist} +Release: 4%{?dist} Summary: A support libraries and Ruby core extensions extracted from the Rails framework License: MIT URL: http://rubyonrails.org @@ -15,6 +15,9 @@ Source0: https://rubygems.org/gems/%{gem_name}-%{version}.gem # cd rails/activesupport/ # git checkout v5.2.3 && tar czvf activesupport-5.2.3-tests.tgz test/ Source1: %{gem_name}-%{version}-tests.tgz +# Make `LoadInterlockAwareMonitor` work in Ruby 2.7 +# https://github.com/rails/rails/pull/38069 +Patch0: rubygem-activesupport-6.1.0-Make-LoadInterlockAwareMonitor-work-in-Ruby-2.7.patch # ruby package has just soft dependency on rubygem({bigdecimal,json}), while # ActiveSupport always requires them. @@ -54,7 +57,9 @@ BuildArch: noarch Documentation for %{name}. %prep -%setup -q -n %{gem_name}-%{version} +%setup -q -n %{gem_name}-%{version} -b 1 + +%patch0 -p2 %build gem build ../%{gem_name}-%{version}.gemspec @@ -69,7 +74,7 @@ cp -a .%{gem_dir}/* \ %check pushd .%{gem_instdir} # Move the tests into place -tar xzvf %{SOURCE1} +cp -a %{_builddir}/test test # These tests are really unstable, but they seems to be passing upstream :/ for f in \ @@ -83,6 +88,11 @@ done # https://github.com/rails/rails/issues/25682 sed -i '/def test_iso8601_output_and_reparsing$/,/^ end$/ s/^/#/' test/core_ext/duration_test.rb +# Workaround TransformValuesTest#test_default_procs_do_not_persist_*_mapping +# test failures due to bug in Ruby 2.7.{0,1}. +# https://bugs.ruby-lang.org/issues/16498 +sed -i '/assert_nil mapped\[:b\]/ s/^/#/' test/core_ext/hash/transform_values_test.rb + memcached & mPID=$! sleep 1 @@ -103,6 +113,10 @@ popd %doc %{gem_instdir}/README.rdoc %changelog +* Thu Apr 16 2020 Vít Ondruch - 1:5.2.3-4 +- Ruby 2.7 compatibility. + Resolves: rhbz#1799093 + * Thu Jan 30 2020 Fedora Release Engineering - 1:5.2.3-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild From 098739b2dd5fa57c007c8937b522d64b486d9945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ondruch?= Date: Fri, 17 Apr 2020 11:59:43 +0200 Subject: [PATCH 2/2] Remove unused patch. --- ...t-6.0.0.beta1-Ruby-2.6-Range-support.patch | 136 ------------------ 1 file changed, 136 deletions(-) delete mode 100644 rubygem-activesupport-6.0.0.beta1-Ruby-2.6-Range-support.patch diff --git a/rubygem-activesupport-6.0.0.beta1-Ruby-2.6-Range-support.patch b/rubygem-activesupport-6.0.0.beta1-Ruby-2.6-Range-support.patch deleted file mode 100644 index 2f022a6..0000000 --- a/rubygem-activesupport-6.0.0.beta1-Ruby-2.6-Range-support.patch +++ /dev/null @@ -1,136 +0,0 @@ -From 0fcb921a65e615c301450d7820b03473acd53898 Mon Sep 17 00:00:00 2001 -From: utilum -Date: Sun, 20 May 2018 21:22:03 +0200 -Subject: [PATCH] Allow Range#=== and Range#cover? on Range - -ruby/ruby@989e07c features switching `Range#===` to use internal `r_cover_p` -instead of rubyland `include?`. This breaks expected behavior of -`ActiveSupport::CoreExt::Range` documented since at least 8b67a02. - -This patch adds overrides on `Range#cover?` and `Range#===` and places all -three in a single module, `CompareWithRange`. - -*Requiring core_ext/range/include_range now causes a deprecation warnning* ---- - .../lib/active_support/core_ext/range.rb | 2 +- - .../core_ext/range/compare_range.rb | 61 +++++++++++++++++++ - .../core_ext/range/include_range.rb | 28 ++------- - 3 files changed, 68 insertions(+), 23 deletions(-) - create mode 100644 activesupport/lib/active_support/core_ext/range/compare_range.rb - -diff --git a/activesupport/lib/active_support/core_ext/range.rb b/activesupport/lib/active_support/core_ext/range.rb -index 4074e91d17d7..78814fd18961 100644 ---- a/activesupport/lib/active_support/core_ext/range.rb -+++ b/activesupport/lib/active_support/core_ext/range.rb -@@ -1,7 +1,7 @@ - # frozen_string_literal: true - - require "active_support/core_ext/range/conversions" --require "active_support/core_ext/range/include_range" -+require "active_support/core_ext/range/compare_range" - require "active_support/core_ext/range/include_time_with_zone" - require "active_support/core_ext/range/overlaps" - require "active_support/core_ext/range/each" -diff --git a/activesupport/lib/active_support/core_ext/range/compare_range.rb b/activesupport/lib/active_support/core_ext/range/compare_range.rb -new file mode 100644 -index 000000000000..704041f6de88 ---- /dev/null -+++ b/activesupport/lib/active_support/core_ext/range/compare_range.rb -@@ -0,0 +1,61 @@ -+# frozen_string_literal: true -+ -+module ActiveSupport -+ module CompareWithRange #:nodoc: -+ # Extends the default Range#=== to support range comparisons. -+ # (1..5) === (1..5) # => true -+ # (1..5) === (2..3) # => true -+ # (1..5) === (2..6) # => false -+ # -+ # The native Range#=== behavior is untouched. -+ # ('a'..'f') === ('c') # => true -+ # (5..9) === (11) # => false -+ def ===(value) -+ if value.is_a?(::Range) -+ # 1...10 includes 1..9 but it does not include 1..10. -+ operator = exclude_end? && !value.exclude_end? ? :< : :<= -+ super(value.first) && value.last.send(operator, last) -+ else -+ super -+ end -+ end -+ -+ # Extends the default Range#include? to support range comparisons. -+ # (1..5).include?(1..5) # => true -+ # (1..5).include?(2..3) # => true -+ # (1..5).include?(2..6) # => false -+ # -+ # The native Range#include? behavior is untouched. -+ # ('a'..'f').include?('c') # => true -+ # (5..9).include?(11) # => false -+ def include?(value) -+ if value.is_a?(::Range) -+ # 1...10 includes 1..9 but it does not include 1..10. -+ operator = exclude_end? && !value.exclude_end? ? :< : :<= -+ super(value.first) && value.last.send(operator, last) -+ else -+ super -+ end -+ end -+ -+ # Extends the default Range#cover? to support range comparisons. -+ # (1..5).cover?(1..5) # => true -+ # (1..5).cover?(2..3) # => true -+ # (1..5).cover?(2..6) # => false -+ # -+ # The native Range#cover? behavior is untouched. -+ # ('a'..'f').cover?('c') # => true -+ # (5..9).cover?(11) # => false -+ def cover?(value) -+ if value.is_a?(::Range) -+ # 1...10 covers 1..9 but it does not cover 1..10. -+ operator = exclude_end? && !value.exclude_end? ? :< : :<= -+ super(value.first) && value.last.send(operator, last) -+ else -+ super -+ end -+ end -+ end -+end -+ -+Range.prepend(ActiveSupport::CompareWithRange) -diff --git a/activesupport/lib/active_support/core_ext/range/include_range.rb b/activesupport/lib/active_support/core_ext/range/include_range.rb -index 7ba1011921ba..2da2c587a31f 100644 ---- a/activesupport/lib/active_support/core_ext/range/include_range.rb -+++ b/activesupport/lib/active_support/core_ext/range/include_range.rb -@@ -1,25 +1,9 @@ - # frozen_string_literal: true - --module ActiveSupport -- module IncludeWithRange #:nodoc: -- # Extends the default Range#include? to support range comparisons. -- # (1..5).include?(1..5) # => true -- # (1..5).include?(2..3) # => true -- # (1..5).include?(2..6) # => false -- # -- # The native Range#include? behavior is untouched. -- # ('a'..'f').include?('c') # => true -- # (5..9).include?(11) # => false -- def include?(value) -- if value.is_a?(::Range) -- # 1...10 includes 1..9 but it does not include 1..10. -- operator = exclude_end? && !value.exclude_end? ? :< : :<= -- super(value.first) && value.last.send(operator, last) -- else -- super -- end -- end -- end --end -+require "active_support/deprecation" - --Range.prepend(ActiveSupport::IncludeWithRange) -+ActiveSupport::Deprecation.warn "You have required `active_support/core_ext/range/include_range`. " \ -+"This file will be removed in Rails 6.1. You should require `active_support/core_ext/range/compare_range` " \ -+ "instead." -+ -+require "active_support/core_ext/range/compare_range"