From bb216b8758f4d4db0674b2ca0f31e58fbdd6201f Mon Sep 17 00:00:00 2001 From: Marc-Andre Lafortune Date: Mon, 21 Dec 2020 00:02:26 -0500 Subject: [PATCH] Raise informative error on SortedSet access --- lib/set.rb | 2 + lib/set/sorted_set.rb | 6 +++ .../fake_sorted_set_gem/sorted_set.rb | 3 ++ test/test_sorted_set.rb | 45 +++++++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 lib/set/sorted_set.rb create mode 100644 test/fixtures/fake_sorted_set_gem/sorted_set.rb create mode 100644 test/test_sorted_set.rb diff --git a/lib/set.rb b/lib/set.rb index 2c9257d..2bd2a0f 100644 --- a/lib/set.rb +++ b/lib/set.rb @@ -690,3 +690,5 @@ def to_set(klass = Set, *args, &block) klass.new(self, *args, &block) end end + +autoload :SortedSet, "#{__dir__}/set/sorted_set" diff --git a/lib/set/sorted_set.rb b/lib/set/sorted_set.rb new file mode 100644 index 0000000..e4e01ba --- /dev/null +++ b/lib/set/sorted_set.rb @@ -0,0 +1,6 @@ +begin + require 'sorted_set' +rescue ::LoadError + raise "The `SortedSet` class has been extracted from the `set` library." \ + "You must use the `sorted_set` gem or other alternatives." +end diff --git a/test/fixtures/fake_sorted_set_gem/sorted_set.rb b/test/fixtures/fake_sorted_set_gem/sorted_set.rb new file mode 100644 index 0000000..02c9721 --- /dev/null +++ b/test/fixtures/fake_sorted_set_gem/sorted_set.rb @@ -0,0 +1,3 @@ +class SortedSet + # ... +end diff --git a/test/test_sorted_set.rb b/test/test_sorted_set.rb new file mode 100644 index 0000000..1ac6ee9 --- /dev/null +++ b/test/test_sorted_set.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: false +require 'test/unit' +require 'set' + +class TC_SortedSet < Test::Unit::TestCase + def base_dir + "#{__dir__}/../lib" + end + + def assert_runs(ruby, options: nil) + options = ['-I', base_dir, *options] + r = system(RbConfig.ruby, *options, '-e', ruby) + assert(r) + end + + def test_error + assert_runs <<~RUBY + require "set" + + r = begin + puts SortedSet.new + rescue Exception => e + e.message + end + raise r unless r.match? /has been extracted/ + RUBY + end + + def test_ok_with_gem + assert_runs <<~RUBY, options: ['-I', "#{__dir__}/fixtures/fake_sorted_set_gem"] + require "set" + + var = SortedSet.new.to_s + RUBY + end + + def test_ok_require + assert_runs <<~RUBY, options: ['-I', "#{__dir__}/fixtures/fake_sorted_set_gem"] + require "set" + require "sorted_set" + + var = SortedSet.new.to_s + RUBY + end +end