Class: Chef::Provider::Package::Rubygems::AlternateGemEnvironment
Constant Summary
collapse
- JRUBY_PLATFORM =
/(:?universal|x86_64|x86)\-java\-[0-9\.]+/
GemEnvironment::DEFAULT_UNINSTALLER_OPTS
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
#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
313
314
315
|
# File 'lib/chef/provider/package/rubygems.rb', line 313
def initialize(gem_binary_location)
@gem_binary_location = gem_binary_location
end
|
Instance Attribute Details
#gem_binary_location ⇒ Object
Returns the value of attribute gem_binary_location.
311
312
313
|
# File 'lib/chef/provider/package/rubygems.rb', line 311
def gem_binary_location
@gem_binary_location
end
|
Class Method Details
.gempath_cache ⇒ Object
301
302
303
|
# File 'lib/chef/provider/package/rubygems.rb', line 301
def self.gempath_cache
@gempath_cache ||= {}
end
|
305
306
307
|
# File 'lib/chef/provider/package/rubygems.rb', line 305
def self.platform_cache
@platform_cache ||= {}
end
|
Instance Method Details
#candidate_version_from_remote(gem_dependency, *sources) ⇒ Object
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
|
# File 'lib/chef/provider/package/rubygems.rb', line 389
def candidate_version_from_remote(gem_dependency, *sources)
source_args = sources.compact.map { |s| "--source=#{s}" }.join(" ")
cmd = "#{@gem_binary_location} list #{gem_dependency.name} --remote --all #{source_args}"
result = shell_out!(cmd)
versions = []
result.stdout.each_line do |line|
next unless line.start_with?("#{gem_dependency.name} (")
version_string = line[/\((.*)\)/, 1]
next unless version_string
version_string.split(/,\s*/).each do |v|
version = Gem::Version.new(v.strip)
versions << version if gem_dependency.requirement.satisfied_by?(version)
rescue ArgumentError
end
end
versions.max
rescue Mixlib::ShellOut::ShellCommandFailed
with_gem_sources(*sources) do
with_gem_platforms(*gem_platforms) do
find_newest_remote_version(gem_dependency, *sources)
end
end
end
|
#gem_paths ⇒ Object
321
322
323
324
325
326
327
328
329
330
331
|
# File 'lib/chef/provider/package/rubygems.rb', line 321
def gem_paths
if self.class.gempath_cache.key?(@gem_binary_location)
self.class.gempath_cache[@gem_binary_location]
else
shell_style_paths = shell_out!("#{@gem_binary_location} env gempath").stdout
paths = shell_style_paths.split(::File::PATH_SEPARATOR).map(&:strip)
self.class.gempath_cache[@gem_binary_location] = paths
end
end
|
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.
367
368
369
370
371
372
373
374
375
376
377
378
|
# File 'lib/chef/provider/package/rubygems.rb', line 367
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
333
334
335
|
# File 'lib/chef/provider/package/rubygems.rb', line 333
def gem_source_index
@source_index ||= Gem::SourceIndex.from_gems_in(*gem_paths.map { |p| p + "/specifications" })
end
|
#gem_specification ⇒ Object
337
338
339
340
341
342
343
344
|
# File 'lib/chef/provider/package/rubygems.rb', line 337
def gem_specification
unless @specification
Gem::Specification.dirs = gem_paths
@specification = Gem::Specification
end
@specification
end
|
#gem_specification_record ⇒ Object
346
347
348
349
350
351
|
# File 'lib/chef/provider/package/rubygems.rb', line 346
def gem_specification_record
unless @specification_record
@specification_record = Gem::SpecificationRecord.new(gem_specification.dirs)
end
@specification_record
end
|
#rubygems_version ⇒ Object
317
318
319
|
# File 'lib/chef/provider/package/rubygems.rb', line 317
def rubygems_version
@rubygems_version ||= shell_out!("#{@gem_binary_location} --version").stdout.chomp
end
|
380
381
382
383
384
385
386
387
|
# File 'lib/chef/provider/package/rubygems.rb', line 380
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
|