/tools/Ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb
http://github.com/agross/netopenspace · Ruby · 66 lines · 33 code · 12 blank · 21 comment · 3 complexity · 2c29de8fea2d2dbbcfd85af10a25a148 MD5 · raw file
- #--
- # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
- # All rights reserved.
- # See LICENSE.txt for permissions.
- #++
- module Kernel
- if defined?(gem_original_require) then
- # Ruby ships with a custom_require, override its require
- remove_method :require
- else
- ##
- # The Kernel#require from before RubyGems was loaded.
- alias gem_original_require require
- private :gem_original_require
- end
- ##
- # When RubyGems is required, Kernel#require is replaced with our own which
- # is capable of loading gems on demand.
- #
- # When you call <tt>require 'x'</tt>, this is what happens:
- # * If the file can be loaded from the existing Ruby loadpath, it
- # is.
- # * Otherwise, installed gems are searched for a file that matches.
- # If it's found in gem 'y', that gem is activated (added to the
- # loadpath).
- #
- # The normal <tt>require</tt> functionality of returning false if
- # that file has already been loaded is preserved.
- def require path
- if Gem.unresolved_deps.empty? or Gem.loaded_path? path then
- gem_original_require path
- else
- spec = Gem.searcher.find_active path
- unless spec then
- found_specs = Gem.searcher.find_in_unresolved path
- unless found_specs.empty? then
- found_specs = [found_specs.last]
- else
- found_specs = Gem.searcher.find_in_unresolved_tree path
- end
- found_specs.each do |found_spec|
- Gem.activate_spec found_spec
- end
- end
- return gem_original_require path
- end
- rescue LoadError => load_error
- if load_error.message.end_with?(path) and Gem.try_activate(path) then
- return gem_original_require(path)
- end
- raise load_error
- end
- private :require
- end