Class: Chef::Provider::Package::Rubygems::AlternateGemEnvironment
- Inherits:
-
GemEnvironment
- Object
- GemEnvironment
- Chef::Provider::Package::Rubygems::AlternateGemEnvironment
- Includes:
- Mixin::ShellOut
- Defined in:
- lib/chef/provider/package/rubygems.rb
Constant Summary collapse
- JRUBY_PLATFORM =
/(:?universal|x86_64|x86)\-java\-[0-9\.]+/.freeze
Constants inherited from GemEnvironment
GemEnvironment::DEFAULT_UNINSTALLER_OPTS
Instance Attribute Summary collapse
-
#gem_binary_location ⇒ Object
readonly
Returns the value of attribute gem_binary_location.
Class Method Summary collapse
Instance Method Summary collapse
- #candidate_version_from_remote(gem_dependency, *sources) ⇒ Object
- #gem_paths ⇒ Object
-
#gem_platforms ⇒ Object
Attempt to detect the correct platform settings for the target gem environment.
- #gem_source_index ⇒ Object
- #gem_specification ⇒ Object
-
#initialize(gem_binary_location) ⇒ AlternateGemEnvironment
constructor
A new instance of AlternateGemEnvironment.
- #rubygems_version ⇒ Object
- #with_gem_platforms(*alt_gem_platforms) ⇒ Object
Methods inherited from GemEnvironment
#candidate_version_from_file, #dependency_installer, #find_newest_remote_version, #install, #installed_versions, #spec_from_file, #uninstall, #uninstaller, #with_correct_verbosity, #with_gem_sources
Constructor Details
#initialize(gem_binary_location) ⇒ AlternateGemEnvironment
Returns a new instance of AlternateGemEnvironment.
300 301 302 |
# File 'lib/chef/provider/package/rubygems.rb', line 300 def initialize(gem_binary_location) @gem_binary_location = gem_binary_location end |
Instance Attribute Details
#gem_binary_location ⇒ Object (readonly)
Returns the value of attribute gem_binary_location.
298 299 300 |
# File 'lib/chef/provider/package/rubygems.rb', line 298 def gem_binary_location @gem_binary_location end |
Class Method Details
.gempath_cache ⇒ Object
288 289 290 |
# File 'lib/chef/provider/package/rubygems.rb', line 288 def self.gempath_cache @gempath_cache ||= {} end |
.platform_cache ⇒ Object
292 293 294 |
# File 'lib/chef/provider/package/rubygems.rb', line 292 def self.platform_cache @platform_cache ||= {} end |
Instance Method Details
#candidate_version_from_remote(gem_dependency, *sources) ⇒ Object
369 370 371 372 373 374 375 |
# File 'lib/chef/provider/package/rubygems.rb', line 369 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 ⇒ Object
308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/chef/provider/package/rubygems.rb', line 308 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(&:strip) self.class.gempath_cache[@gem_binary_location] = paths end end |
#gem_platforms ⇒ Object
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.
347 348 349 350 351 352 353 354 355 356 357 358 |
# File 'lib/chef/provider/package/rubygems.rb', line 347 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 self.class.platform_cache[@gem_binary_location] = if jruby = gem_environment[JRUBY_PLATFORM] ["ruby", Gem::Platform.new(jruby)] else Gem.platforms end end end |
#gem_source_index ⇒ Object
320 321 322 |
# File 'lib/chef/provider/package/rubygems.rb', line 320 def gem_source_index @source_index ||= Gem::SourceIndex.from_gems_in(*gem_paths.map { |p| p + "/specifications" }) end |
#gem_specification ⇒ Object
324 325 326 327 328 329 330 331 |
# File 'lib/chef/provider/package/rubygems.rb', line 324 def gem_specification # Only once, dirs calls a reset unless @specification Gem::Specification.dirs = gem_paths @specification = Gem::Specification end @specification end |
#rubygems_version ⇒ Object
304 305 306 |
# File 'lib/chef/provider/package/rubygems.rb', line 304 def rubygems_version @rubygems_version ||= shell_out!("#{@gem_binary_location} --version").stdout.chomp end |
#with_gem_platforms(*alt_gem_platforms) ⇒ Object
360 361 362 363 364 365 366 367 |
# File 'lib/chef/provider/package/rubygems.rb', line 360 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 |