Created
August 19, 2009 07:16
-
-
Save nachocab/170224 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Activate a gem (i.e. add it to the Ruby load path). The gem | |
# must satisfy all the specified version constraints. If | |
# +autorequire+ is true, then automatically require the specified | |
# autorequire file in the gem spec. | |
# | |
# Returns true if the gem is loaded by this call, false if it is | |
# already loaded, or an exception otherwise. | |
# | |
def activate(gem, autorequire, *version_requirements) | |
unless version_requirements.size > 0 | |
version_requirements = [">= 0.0.0"] | |
end | |
unless gem.respond_to?(:name) && gem.respond_to?(:version_requirements) | |
gem = Gem::Dependency.new(gem, version_requirements) | |
end | |
matches = Gem.source_index.find_name(gem.name, gem.version_requirements) | |
report_activate_error(gem) if matches.empty? | |
if @loaded_specs[gem.name] | |
# This gem is already loaded. If the currently loaded gem is | |
# not in the list of candidate gems, then we have a version | |
# conflict. | |
existing_spec = @loaded_specs[gem.name] | |
if ! matches.any? { |spec| spec.version == existing_spec.version } | |
fail Gem::Exception, "can't activate #{gem}, already activated #{existing_spec.full_name}]" | |
end | |
return false | |
end | |
# new load | |
spec = matches.last | |
if spec.loaded? | |
return false unless autorequire | |
result = spec.autorequire ? require(spec.autorequire) : false | |
return result || false | |
end | |
spec.loaded = true | |
@loaded_specs[spec.name] = spec | |
# Load dependent gems first | |
spec.dependencies.each do |dep_gem| | |
activate(dep_gem, autorequire) | |
end | |
# bin directory must come before library directories | |
spec.require_paths.unshift spec.bindir if spec.bindir | |
require_paths = spec.require_paths.map do |path| | |
File.join spec.full_gem_path, path | |
end | |
sitelibdir = Config::CONFIG['sitelibdir'] | |
# gem directories must come after -I and ENV['RUBYLIB'] | |
$:.insert($:.index(sitelibdir), *require_paths) | |
# Now autorequire | |
if autorequire && spec.autorequire then # DEPRECATED | |
Array(spec.autorequire).each do |a_lib| | |
require a_lib | |
end | |
end | |
return true | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment