From: Simon Strandgaard Date: 2004-03-24T02:34:30+09:00 Subject: Re: rubygems working with non-gems libs? I have refined the gem-require hack a bit more. Place the 'gemrequirehack.rb' in rubys path. Add the following line to your tcshrc: setenv RUBYOPT "rgemrequirehack" The source-code is here: server> expand -t2 gemrequirehack.rb module Kernel alias old_require require def require(filename, version=nil) ok = nil begin ok = old_require(filename) if version $stderr.puts <<-MSG.gsub(/^\s*/, "") Hack which loads "rubygems" when Ruby starts up, has been supplied a version string (#{version}), however the required file (#{filename}) is not a rubygem, and thus doesn't take a version number. The version number has therefore been ignored. MSG end rescue LoadError => old_e begin old_require("rubygems") rescue LoadError $stderr.puts <<-MSG.gsub(/^\s*/, "") Hack which loads "rubygems" when Ruby starts up, failed to find "rubygems". You may want to either install "rubygems" or remove this hack from the RUBYOPT envvar. MSG raise old_e end begin ok = require_gem(filename, version || "> 0.0.0") rescue LoadError => gem_e raise gem_e #raise old_e end end ok end end # module Kernel server> There is a small testsuite here: server> expand -t2 test_gemrequirehack.rb # purpose: # exercise if rubygems require hack is working. # # depends on: # * rubygems # * progressbar = 0.0.3, shipped with rubygems require 'test/unit' require 'stringio' require 'gemrequirehack' class TestGemRequireHack < Test::Unit::TestCase def capture_stderr(&block) e = StringIO.new $stderr = e block.call return e.string ensure $stderr = STDERR end def test_loaderror e = assert_raise(LoadError) do require 'nonexisting' end assert_match(/not find RubyGem nonexisting/, e.message) end def test_1_old_require_normal ok = require 'observer' # is shipped with Ruby assert_equal(true, ok) # first time we load it ok = require 'observer' assert_equal(false, ok) # second time.. its already loaded end def test_2_old_require_version warning = capture_stderr do require 'observer', '> 6.6.6' # shipped with Ruby, but has no version end assert_match(/version number has therefore been ignored/, warning) end def test_1_gem_require_failed path = $:.clone $:.clear output = capture_stderr do e = assert_raise(LoadError) do require 'progressbar' # is shipped with rubygems end assert_match(/^No such file to load -- progressbar$/, e.message) end assert_match(/Hack/, output) ensure $:.concat(path) end def test_2_gem_require_version e = assert_raise(LoadError) do require 'progressbar', '>= 0.0.4' # 0.0.3 is shipped with rubygems end assert_match(/version error: progressbar\(0.0.3 not >= 0.0.4\)/, e.message) end def test_3_gem_require_normal ok = require 'progressbar' # is shipped with rubygems assert_equal(true, ok) # first time we load it ok = require 'progressbar' assert_equal(false, ok) # second time.. its already loaded end end if $0 == __FILE__ require 'test/unit/ui/console/testrunner' Test::Unit::UI::Console::TestRunner.run(TestGemRequireHack) end server> When running the testsuite it should output: server> ruby test_gemrequirehack.rb Loaded suite TestGemRequireHack Started ....... Finished in 0.085952 seconds. 6 tests, 12 assertions, 0 failures, 0 errors server> -- Simon Strandgaard