class Chef::Provider::Package::Rubygems::AlternateGemEnvironment
Constants
- JRUBY_PLATFORM
Attributes
gem_binary_location[R]
Public Class Methods
gempath_cache()
click to toggle source
# File lib/chef/provider/package/rubygems.rb, line 268 def self.gempath_cache @gempath_cache ||= {} end
new(gem_binary_location)
click to toggle source
# File lib/chef/provider/package/rubygems.rb, line 280 def initialize(gem_binary_location) @gem_binary_location = gem_binary_location end
platform_cache()
click to toggle source
# File lib/chef/provider/package/rubygems.rb, line 272 def self.platform_cache @platform_cache ||= {} end
Public Instance Methods
candidate_version_from_remote(gem_dependency, *sources)
click to toggle source
# File lib/chef/provider/package/rubygems.rb, line 345 def candidate_version_from_remote(gem_dependency, *sources) with_gem_sources(*sources) do with_gem_platforms(*gem_platforms) do find_newest_remote_version(gem_dependency, *sources) end end end
gem_paths()
click to toggle source
# File lib/chef/provider/package/rubygems.rb, line 284 def gem_paths if self.class.gempath_cache.key?(@gem_binary_location) self.class.gempath_cache[@gem_binary_location] else # shellout! is a fork/exec which won't work on windows shell_style_paths = shell_out!("#{@gem_binary_location} env gempath").stdout # on windows, the path separator is (usually? always?) semicolon paths = shell_style_paths.split(::File::PATH_SEPARATOR).map { |path| path.strip } self.class.gempath_cache[@gem_binary_location] = paths end end
gem_platforms()
click to toggle source
Attempt to detect the correct platform settings for the target gem environment.
In practice, this only makes a difference if different versions are available depending on platform, and only if the target gem environment has a radically different platform (i.e., jruby), so we just try to detect jruby and fall back to the current platforms (Gem.platforms) if we don't detect it.
Returns¶ ↑
- String|Gem::Platform
-
returns an array of Gem::Platform-compatible
objects, i.e., Strings that are valid for Gem::Platform or actual Gem::Platform objects.
# File lib/chef/provider/package/rubygems.rb, line 323 def gem_platforms if self.class.platform_cache.key?(@gem_binary_location) self.class.platform_cache[@gem_binary_location] else gem_environment = shell_out!("#{@gem_binary_location} env").stdout if jruby = gem_environment[JRUBY_PLATFORM] self.class.platform_cache[@gem_binary_location] = ['ruby', Gem::Platform.new(jruby)] else self.class.platform_cache[@gem_binary_location] = Gem.platforms end end end
gem_source_index()
click to toggle source
# File lib/chef/provider/package/rubygems.rb, line 296 def gem_source_index @source_index ||= Gem::SourceIndex.from_gems_in(*gem_paths.map { |p| p + '/specifications' }) end
gem_specification()
click to toggle source
# File lib/chef/provider/package/rubygems.rb, line 300 def gem_specification # Only once, dirs calls a reset unless @specification Gem::Specification.dirs = gem_paths @specification = Gem::Specification end @specification end
with_gem_platforms(*alt_gem_platforms) { || ... }
click to toggle source
# File lib/chef/provider/package/rubygems.rb, line 336 def with_gem_platforms(*alt_gem_platforms) alt_gem_platforms.flatten! original_gem_platforms = Gem.platforms Gem.platforms = alt_gem_platforms yield ensure Gem.platforms = original_gem_platforms end