1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
require_relative '../../puppet/util'
module Puppet::Util::RubyGems
# Base/factory class for rubygems source. These classes introspec into
# rubygems to in order to list where the rubygems system will look for files
# to load.
class Source
class << self
# @api private
def has_rubygems?
# Gems are not actually available when Bundler is loaded, even
# though the Gem constant is defined. This is because Bundler
# loads in rubygems, but then removes the custom require that
# rubygems installs. So when Bundler is around we have to act
# as though rubygems is not, e.g. we shouldn't be able to load
# a gem that Bundler doesn't want us to see.
defined? ::Gem and not defined? ::Bundler
end
# @api private
def source
if has_rubygems?
Gems18Source
else
NoGemsSource
end
end
def new(*args)
object = source.allocate
object.send(:initialize, *args)
object
end
end
end
# For RubyGems >= 1.8.0
# @api private
class Gems18Source < Source
def directories
# `require 'mygem'` will consider and potentially load
# prerelease gems, so we need to match that behavior.
#
# Just load the stub which points to the gem path, and
# delay loading the full specification until if/when the
# gem is required.
Gem::Specification.stubs.collect do |spec|
File.join(spec.full_gem_path, 'lib')
end
end
def clear_paths
Gem.clear_paths
end
end
# @api private
class NoGemsSource < Source
def directories
[]
end
def clear_paths; end
end
end
|