Skip to content

Instantly share code, notes, and snippets.

@nachocab
Created August 19, 2009 07:16
Show Gist options
  • Save nachocab/170224 to your computer and use it in GitHub Desktop.
Save nachocab/170224 to your computer and use it in GitHub Desktop.
# 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