Module: Gem

Defined in:
lib/rubygems.rb,
lib/rubygems/defaults.rb,
lib/rubygems/gem_openssl.rb,
lib/rubygems/source_index.rb,
lib/rubygems/defaults/macruby.rb

Overview

:stopdoc:

Defined Under Namespace

Modules: Commands, DefaultUserInteraction, Ext, GemcutterUtilities, InstallUpdateOptions, LocalRemoteOptions, Package, RequirePathsBuilder, SSL, Security, Text, UserInteraction, VersionOption Classes: Builder, Command, CommandLineError, CommandManager, ConfigFile, ConsoleUI, Dependency, DependencyError, DependencyInstaller, DependencyList, DependencyRemovalException, DocManager, DocumentError, EndOfYAMLException, ErrorReason, Exception, FakeFetcher, FileOperations, FilePermissionError, Format, FormatException, GemNotFoundException, GemNotInHomeException, GemPathSearcher, GemRunner, Indexer, InstallError, Installer, InvalidSpecificationException, LoadError, OldFormat, OperationNotSupportedError, PackageTask, Platform, PlatformMismatch, RemoteError, RemoteFetcher, RemoteInstallationCancelled, RemoteInstallationSkipped, RemoteSourceException, Requirement, Server, SilentUI, SourceIndex, SourceInfoCache, SourceInfoCacheEntry, SpecFetcher, Specification, StreamUI, SystemExitException, Uninstaller, Validator, VerificationError, Version

Constant Summary

RubyGemsVersion =
VERSION = '1.4.2'
RbConfigPriorities =
EXEEXT RUBY_SO_NAME arch bindir datadir libdir ruby_install_name
  ruby_version rubylibprefix sitedir sitelibdir vendordir vendorlibdir
]
ConfigMap =

Configuration settings from ::RbConfig

Hash.new do |cm, key|
  cm[key] = RbConfig::CONFIG[key.to_s]
end
DIRECTORIES =
%w[cache doc gems specifications]
RubyGemsPackageVersion =
VERSION
WIN_PATTERNS =

An Array of Regexps that match windows ruby platforms.

[
  /bccwin/i,
  /cygwin/i,
  /djgpp/i,
  /mingw/i,
  /mswin/i,
  /wince/i,
]
MARSHAL_SPEC_DIR =

Location of Marshal quick gemspecs on remote repositories

"quick/Marshal.#{Gem.marshal_version}/"
YAML_SPEC_DIR =

Location of legacy YAML quick gemspecs on remote repositories

'quick/'
Cache =

Cache is an alias for SourceIndex to allow older YAMLized source index objects to load properly.

SourceIndex
@@source_index =
nil
@@win_platform =
nil

Class Attribute Summary (collapse)

Class Method Summary (collapse)

Class Attribute Details

+ (Object) loaded_specs (readonly)

Hash of loaded Gem::Specification keyed by name



1060
1061
1062
# File 'lib/rubygems.rb', line 1060

def loaded_specs
  @loaded_specs
end

+ (Object) post_install_hooks (readonly)

The list of hooks to be run before Gem::Install#install does any work



1065
1066
1067
# File 'lib/rubygems.rb', line 1065

def post_install_hooks
  @post_install_hooks
end

+ (Object) post_uninstall_hooks (readonly)

The list of hooks to be run before Gem::Uninstall#uninstall does any work



1071
1072
1073
# File 'lib/rubygems.rb', line 1071

def post_uninstall_hooks
  @post_uninstall_hooks
end

+ (Object) pre_install_hooks (readonly)

The list of hooks to be run after Gem::Install#install is finished



1076
1077
1078
# File 'lib/rubygems.rb', line 1076

def pre_install_hooks
  @pre_install_hooks
end

+ (Object) pre_uninstall_hooks (readonly)

The list of hooks to be run after Gem::Uninstall#uninstall is finished



1081
1082
1083
# File 'lib/rubygems.rb', line 1081

def pre_uninstall_hooks
  @pre_uninstall_hooks
end

+ (Object) ssl_available=(value) (writeonly)

Is SSL available?



26
27
28
# File 'lib/rubygems/gem_openssl.rb', line 26

def ssl_available=(value)
  @ssl_available = value
end

Class Method Details

+ (Object) activate(gem, *requirements)

Activates an installed gem matching gem. The gem must satisfy requirements.

Returns true if the gem is activated, false if it is already loaded, or an exception otherwise.

Gem#activate adds the library paths in gem to $LOAD_PATH. Before a Gem is activated its required Gems are activated. If the version information is omitted, the highest version Gem of the supplied name is loaded. If a Gem is not found that meets the version requirements or a required Gem is not found, a Gem::LoadError is raised.

More information on version requirements can be found in the Gem::Requirement and Gem::Version documentation.



204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
# File 'lib/rubygems.rb', line 204

def self.activate(gem, *requirements)
  if requirements.last.is_a?(Hash)
    options = requirements.pop
  else
    options = {}
  end

  sources = options[:sources] || []

  if requirements.empty? then
    requirements = Gem::Requirement.default
  end

  unless gem.respond_to?(:name) and
         gem.respond_to?(:requirement) then
    gem = Gem::Dependency.new(gem, requirements)
  end

  matches = Gem.source_index.find_name(gem.name, gem.requirement)
  report_activate_error(gem) if matches.empty?

  if @loaded_specs[gem.name] then
    # 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]

    unless matches.any? { |spec| spec.version == existing_spec.version } then
       sources_message = sources.map { |spec| spec.full_name }
       stack_message = @loaded_stacks[gem.name].map { |spec| spec.full_name }

       msg = "can't activate #{gem} for #{sources_message.inspect}, "
       msg << "already activated #{existing_spec.full_name} for "
       msg << "#{stack_message.inspect}"

       e = Gem::LoadError.new msg
       e.name = gem.name
       e.requirement = gem.requirement

       raise e
    end

    return false
  end

  # new load
  spec = matches.last
  return false if spec.loaded?

  spec.loaded = true
  @loaded_specs[spec.name] = spec
  @loaded_stacks[spec.name] = sources.dup

  # Load dependent gems first
  spec.runtime_dependencies.each do |dep_gem|
    activate dep_gem, :sources => [spec, *sources]
  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

  # gem directories must come after -I and ENV['RUBYLIB']
  insert_index = load_path_insert_index

  if insert_index then
    # gem directories must come after -I and ENV['RUBYLIB']
    $LOAD_PATH.insert(insert_index, *require_paths)
  else
    # we are probably testing in core, -I and RUBYLIB don't apply
    $LOAD_PATH.unshift(*require_paths)
  end

  return true
end

+ (Object) all_load_paths

An Array of all possible load paths for all versions of all gems in the Gem installation.



286
287
288
289
290
291
292
293
294
295
296
# File 'lib/rubygems.rb', line 286

def self.all_load_paths
  result = []

  Gem.path.each do |gemdir|
    each_load_path all_partials(gemdir) do |load_path|
      result << load_path
    end
  end

  result
end

+ (Object) all_partials(gemdir)

Return all the partial paths in gemdir.



301
302
303
# File 'lib/rubygems.rb', line 301

def self.all_partials(gemdir)
  Dir[File.join(gemdir, 'gems/*')]
end

+ (Boolean) available?(gem, *requirements)

See if a given gem is available.

Returns:

  • (Boolean)


310
311
312
313
314
315
316
317
318
319
# File 'lib/rubygems.rb', line 310

def self.available?(gem, *requirements)
  requirements = Gem::Requirement.default if requirements.empty?

  unless gem.respond_to?(:name) and
         gem.respond_to?(:requirement) then
    gem = Gem::Dependency.new gem, requirements
  end

  !Gem.source_index.search(gem).empty?
end

+ (Object) bin_path(name, exec_name = nil, *requirements)

Find the full path to the executable for gem name. If the exec_name is not given, the gem's default_executable is chosen, otherwise the specified executable's path is returned. requirements allows you to specify specific gem versions.



327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
# File 'lib/rubygems.rb', line 327

def self.bin_path(name, exec_name = nil, *requirements)
  requirements = Gem::Requirement.default if
    requirements.empty?
  specs = Gem.source_index.find_name(name, requirements)

  raise Gem::GemNotFoundException,
        "can't find gem #{name} (#{requirements})" if specs.empty?

  specs = specs.find_all do |spec|
    spec.executables.include?(exec_name)
  end if exec_name

  unless spec = specs.last
    msg = "can't find gem #{name} (#{requirements}) with executable #{exec_name}"
    raise Gem::GemNotFoundException, msg
  end

  exec_name ||= spec.default_executable

  unless exec_name
    msg = "no default executable for #{spec.full_name} and none given"
    raise Gem::Exception, msg
  end

  File.join(spec.full_gem_path, spec.bindir, exec_name)
end

+ (Object) binary_mode

The mode needed to read a file as straight binary.



357
358
359
# File 'lib/rubygems.rb', line 357

def self.binary_mode
  'rb'
end

+ (Object) bindir(install_dir = Gem.dir)

The path where gem executables are to be installed.



364
365
366
367
368
# File 'lib/rubygems.rb', line 364

def self.bindir(install_dir=Gem.dir)
  return File.join(install_dir, 'bin') unless
    install_dir.to_s == Gem.default_dir
  Gem.default_bindir
end

+ (Object) clear_paths

Reset the dir and path values. The next time dir or path is requested, the values will be calculated from scratch. This is mainly used by the unit tests to provide test isolation.



375
376
377
378
379
380
381
382
383
# File 'lib/rubygems.rb', line 375

def self.clear_paths
  @gem_home = nil
  @gem_path = nil
  @user_home = nil

  @@source_index = nil

  @searcher = nil
end

+ (Object) config_file

The path to standard location of the user's .gemrc file.



388
389
390
# File 'lib/rubygems.rb', line 388

def self.config_file
  File.join Gem.user_home, '.gemrc'
end

+ (Object) configuration

The standard configuration object for gems.



395
396
397
# File 'lib/rubygems.rb', line 395

def self.configuration
  @configuration ||= Gem::ConfigFile.new []
end

+ (Object) configuration=(config)

Use the given configuration object (which implements the ConfigFile protocol) as the standard configuration object.



403
404
405
# File 'lib/rubygems.rb', line 403

def self.configuration=(config)
  @configuration = config
end

+ (Object) datadir(gem_name)

The path the the data directory specified by the gem name. If the package is not available as a gem, return nil.



411
412
413
414
415
# File 'lib/rubygems.rb', line 411

def self.datadir(gem_name)
  spec = @loaded_specs[gem_name]
  return nil if spec.nil?
  File.join(spec.full_gem_path, 'data', gem_name)
end

+ (Object) default_bindir

The default directory for binaries



67
68
69
70
71
72
73
# File 'lib/rubygems/defaults.rb', line 67

def self.default_bindir
  if defined? RUBY_FRAMEWORK_VERSION then # mac framework support
    '/usr/bin'
  else # generic install
    ConfigMap[:bindir]
  end
end

+ (Object) default_dir

Default home directory path to be used if an alternate value is not specified in the environment



19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/rubygems/defaults.rb', line 19

def self.default_dir
  if defined? RUBY_FRAMEWORK_VERSION then
    File.join File.dirname(ConfigMap[:sitedir]), 'Gems',
              ConfigMap[:ruby_version]
  elsif ConfigMap[:rubylibprefix] then
    File.join(ConfigMap[:rubylibprefix], 'gems',
              ConfigMap[:ruby_version])
  else
    File.join(ConfigMap[:libdir], ruby_engine, 'gems',
              ConfigMap[:ruby_version])
  end
end

+ (Object) default_exec_format

Deduce Ruby's --program-prefix and --program-suffix from its install name



53
54
55
56
57
58
59
60
61
62
# File 'lib/rubygems/defaults.rb', line 53

def self.default_exec_format
  exec_format = ConfigMap[:ruby_install_name].sub('ruby', '%s') rescue '%s'

  unless exec_format =~ /%s/ then
    raise Gem::Exception,
      "[BUG] invalid exec_format #{exec_format.inspect}, no %s"
  end

  exec_format
end

+ (Object) default_path

Default gem load path



42
43
44
45
46
47
48
# File 'lib/rubygems/defaults.rb', line 42

def self.default_path
  if File.exist? Gem.user_home then
    [user_dir, default_dir]
  else
    [default_dir]
  end
end

+ (Object) default_sources

An Array of the default sources that come with RubyGems



11
12
13
# File 'lib/rubygems/defaults.rb', line 11

def self.default_sources
  %w[http://rubygems.org/]
end

+ (Object) default_system_source_cache_dir

The default system-wide source info cache directory



78
79
80
# File 'lib/rubygems/defaults.rb', line 78

def self.default_system_source_cache_dir
  File.join Gem.dir, 'source_cache'
end

+ (Object) default_user_source_cache_dir

The default user-specific source info cache directory



85
86
87
# File 'lib/rubygems/defaults.rb', line 85

def self.default_user_source_cache_dir
  File.join Gem.user_home, '.gem', 'source_cache'
end

+ (Object) deflate(data)

A Zlib::Deflate.deflate wrapper



420
421
422
423
# File 'lib/rubygems.rb', line 420

def self.deflate(data)
  require 'zlib'
  Zlib::Deflate.deflate data
end

+ (Object) dir

The path where gems are to be installed.



428
429
430
431
432
# File 'lib/rubygems.rb', line 428

def self.dir
  @gem_home ||= nil
  set_home(ENV['GEM_HOME'] || Gem.configuration.home || default_dir) unless @gem_home
  @gem_home
end

+ (Object) each_load_path(partials)

Expand each partial gem path with each of the required paths specified in the Gem spec. Each expanded path is yielded.



438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
# File 'lib/rubygems.rb', line 438

def self.each_load_path(partials)
  partials.each do |gp|
    base = File.basename(gp)
    specfn = File.join(dir, "specifications", base + ".gemspec")
    if File.exist?(specfn)
      spec = eval(File.read(specfn))
      spec.require_paths.each do |rp|
        yield(File.join(gp, rp))
      end
    else
      filename = File.join(gp, 'lib')
      yield(filename) if File.exist?(filename)
    end
  end
end

+ (Object) ensure_gem_subdirectories(gemdir)

Quietly ensure the named Gem directory contains all the proper subdirectories. If we can't create a directory due to a permission problem, then we will silently continue.



461
462
463
464
465
466
467
468
# File 'lib/rubygems.rb', line 461

def self.ensure_gem_subdirectories(gemdir)
  require 'fileutils'

  Gem::DIRECTORIES.each do |filename|
    fn = File.join gemdir, filename
    FileUtils.mkdir_p fn rescue nil unless File.exist? fn
  end
end

+ (Object) ensure_ssl_available

Ensure that SSL is available. Throw an exception if it is not.



31
32
33
34
35
# File 'lib/rubygems/gem_openssl.rb', line 31

def ensure_ssl_available
  unless ssl_available?
    raise Gem::Exception, "SSL is not installed on this system"
  end
end

+ (Object) find_files(glob, check_load_path = true)

Returns a list of paths matching glob that can be used by a gem to pick up features from other gems. For example:

Gem.find_files('rdoc/discover').each do |path| load path end

if check_load_path is true (the default), then find_files also searches $LOAD_PATH for files as well as gems.

Note that find_files will return all files even if they are from different versions of the same gem.



482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
# File 'lib/rubygems.rb', line 482

def self.find_files(glob, check_load_path=true)
  files = []

  if check_load_path
    $LOAD_PATH.each do |load_path|
      globbed = Dir["#{File.expand_path glob, load_path}#{Gem.suffix_pattern}"]

      globbed.each do |load_path_file|
        files << load_path_file if File.file?(load_path_file.untaint)
      end
    end
  end

  specs = searcher.find_all glob

  specs.each do |spec|
    files.concat searcher.matching_files(spec, glob)
  end

  # $LOAD_PATH might contain duplicate entries or reference
  # the spec dirs directly, so we prune.
  files.uniq! if check_load_path

  return files
end

+ (Object) find_home

Finds the user's home directory. -- Some comments from the ruby-talk list regarding finding the home directory:

I have HOME, USERPROFILE and HOMEDRIVE + HOMEPATH. Ruby seems
to be depending on HOME in those code samples. I propose that
it should fallback to USERPROFILE and HOMEDRIVE + HOMEPATH (at
least on Win32).


519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
# File 'lib/rubygems.rb', line 519

def self.find_home
  unless RUBY_VERSION > '1.9' then
    ['HOME', 'USERPROFILE'].each do |homekey|
      return File.expand_path(ENV[homekey]) if ENV[homekey]
    end

    if ENV['HOMEDRIVE'] && ENV['HOMEPATH'] then
      return File.expand_path("#{ENV['HOMEDRIVE']}#{ENV['HOMEPATH']}")
    end
  end

  File.expand_path "~"
rescue
  if File::ALT_SEPARATOR then
    drive = ENV['HOMEDRIVE'] || ENV['SystemDrive']
    File.join(drive.to_s, '/')
  else
    "/"
  end
end

+ (Object) gunzip(data)

Zlib::GzipReader wrapper that unzips data.



545
546
547
548
549
550
551
# File 'lib/rubygems.rb', line 545

def self.gunzip(data)
  require 'stringio'
  require 'zlib'
  data = StringIO.new data

  Zlib::GzipReader.new(data).read
end

+ (Object) gzip(data)

Zlib::GzipWriter wrapper that zips data.



556
557
558
559
560
561
562
563
564
# File 'lib/rubygems.rb', line 556

def self.gzip(data)
  require 'stringio'
  require 'zlib'
  zipped = StringIO.new

  Zlib::GzipWriter.wrap zipped do |io| io.write data end

  zipped.string
end

+ (Object) host

Get the default RubyGems API host. This is normally https://rubygems.org.



578
579
580
# File 'lib/rubygems.rb', line 578

def self.host
  @host ||= "https://rubygems.org"
end

+ (Object) host=(host)

Set the default RubyGems API host.



584
585
586
# File 'lib/rubygems.rb', line 584

def self.host= host
  @host = host
end

+ (Object) inflate(data)

A Zlib::Inflate#inflate wrapper



569
570
571
572
# File 'lib/rubygems.rb', line 569

def self.inflate(data)
  require 'zlib'
  Zlib::Inflate.inflate data
end

+ (Object) latest_load_paths

Return a list of all possible load paths for the latest version for all gems in the Gem installation.



592
593
594
595
596
597
598
599
600
601
602
# File 'lib/rubygems.rb', line 592

def self.latest_load_paths
  result = []

  Gem.path.each do |gemdir|
    each_load_path(latest_partials(gemdir)) do |load_path|
      result << load_path
    end
  end

  result
end

+ (Object) latest_partials(gemdir)

Return only the latest partial paths in the given gemdir.



607
608
609
610
611
612
613
614
615
616
617
618
619
620
# File 'lib/rubygems.rb', line 607

def self.latest_partials(gemdir)
  latest = {}
  all_partials(gemdir).each do |gp|
    base = File.basename(gp)
    if base =~ /(.*)-((\d+\.)*\d+)/ then
      name, version = $1, $2
      ver = Gem::Version.new(version)
      if latest[name].nil? || ver > latest[name][0]
        latest[name] = [ver, gp]
      end
    end
  end
  latest.collect { |k,v| v[1] }
end

+ (Object) load_env_plugins

Find all 'rubygems_plugin' files in $LOAD_PATH and load them



1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
# File 'lib/rubygems.rb', line 1040

def self.load_env_plugins
  path = "rubygems_plugin"

  files = []
  $LOAD_PATH.each do |load_path|
    globbed = Dir["#{File.expand_path path, load_path}#{Gem.suffix_pattern}"]

    globbed.each do |load_path_file|
      files << load_path_file if File.file?(load_path_file.untaint)
    end
  end

  load_plugin_files files
end

+ (Object) load_path_insert_index

The index to insert activated gem paths into the $LOAD_PATH.

Defaults to the site lib directory unless gem_prelude.rb has loaded paths, then it inserts the activated gem's paths before the gem_prelude.rb paths so you can override the gem_prelude.rb default $LOAD_PATH paths.



631
632
633
634
635
636
637
638
639
640
641
642
643
# File 'lib/rubygems.rb', line 631

def self.load_path_insert_index
  index = $LOAD_PATH.index ConfigMap[:sitelibdir]

  $LOAD_PATH.each_with_index do |path, i|
    if path.instance_variables.include?(:@gem_prelude_index) or
      path.instance_variables.include?('@gem_prelude_index') then
      index = i
      break
    end
  end

  index
end

+ (Object) load_plugin_files(plugins)

Load plugins as ruby files



1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
# File 'lib/rubygems.rb', line 1013

def self.load_plugin_files(plugins)
  plugins.each do |plugin|

    # Skip older versions of the GemCutter plugin: Its commands are in
    # RubyGems proper now.

    next if plugin =~ /gemcutter-0\.[0-3]/

    begin
      load plugin
    rescue ::Exception => e
      details = "#{plugin.inspect}: #{e.message} (#{e.class})"
      warn "Error loading RubyGems plugin #{details}"
    end
  end
end

+ (Object) load_plugins

Find all 'rubygems_plugin' files in installed gems and load them



1033
1034
1035
# File 'lib/rubygems.rb', line 1033

def self.load_plugins
  load_plugin_files find_files('rubygems_plugin', false)
end

+ (Object) location_of_caller

The file name and line number of the caller of the caller of this method.



648
649
650
651
652
653
654
# File 'lib/rubygems.rb', line 648

def self.location_of_caller
  caller[1] =~ /(.*?):(\d+).*?$/i
  file = $1
  lineno = $2.to_i

  [file, lineno]
end

+ (Object) marshal_version

The version of the Marshal format for your Ruby.



659
660
661
# File 'lib/rubygems.rb', line 659

def self.marshal_version
  "#{Marshal::MAJOR_VERSION}.#{Marshal::MINOR_VERSION}"
end

+ (Object) path

Array of paths to search for Gems.



666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
# File 'lib/rubygems.rb', line 666

def self.path
  @gem_path ||= nil

  unless @gem_path then
    paths = [ENV['GEM_PATH'] || Gem.configuration.path || default_path]

    if defined?(APPLE_GEM_HOME) and not ENV['GEM_PATH'] then
      paths << APPLE_GEM_HOME
    end

    set_paths paths.compact.join(File::PATH_SEPARATOR)
  end

  @gem_path
end

+ (Object) platforms

Array of platforms this RubyGems supports.



692
693
694
695
696
697
698
# File 'lib/rubygems.rb', line 692

def self.platforms
  @platforms ||= []
  if @platforms.empty?
    @platforms = [Gem::Platform::RUBY, Gem::Platform.local]
  end
  @platforms
end

+ (Object) platforms=(platforms)

Set array of platforms this RubyGems supports (primarily for testing).



685
686
687
# File 'lib/rubygems.rb', line 685

def self.platforms=(platforms)
  @platforms = platforms
end

+ (Object) post_install(&hook)

Adds a post-install hook that will be passed an Gem::Installer instance when Gem::Installer#install is called



704
705
706
# File 'lib/rubygems.rb', line 704

def self.post_install(&hook)
  @post_install_hooks << hook
end

+ (Object) post_uninstall(&hook)

Adds a post-uninstall hook that will be passed a Gem::Uninstaller instance and the spec that was uninstalled when Gem::Uninstaller#uninstall is called



713
714
715
# File 'lib/rubygems.rb', line 713

def self.post_uninstall(&hook)
  @post_uninstall_hooks << hook
end

+ (Object) pre_install(&hook)

Adds a pre-install hook that will be passed an Gem::Installer instance when Gem::Installer#install is called



721
722
723
# File 'lib/rubygems.rb', line 721

def self.pre_install(&hook)
  @pre_install_hooks << hook
end

+ (Object) pre_uninstall(&hook)

Adds a pre-uninstall hook that will be passed an Gem::Uninstaller instance and the spec that will be uninstalled when Gem::Uninstaller#uninstall is called



730
731
732
# File 'lib/rubygems.rb', line 730

def self.pre_uninstall(&hook)
  @pre_uninstall_hooks << hook
end

+ (Object) prefix

The directory prefix this RubyGems was installed at.



737
738
739
740
741
742
743
744
745
746
747
748
# File 'lib/rubygems.rb', line 737

def self.prefix
  dir = File.dirname File.expand_path(__FILE__)
  prefix = File.dirname dir

  if prefix == File.expand_path(ConfigMap[:sitelibdir]) or
     prefix == File.expand_path(ConfigMap[:libdir]) or
     'lib' != File.basename(dir) then
    nil
  else
    prefix
  end
end

+ (Object) promote_load_path(gem_name, over_name)

Promotes the load paths of the gem_name over the load paths of over_name. Useful for allowing one gem to override features in another using #find_files.

Raises:

  • (ArgumentError)


755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
# File 'lib/rubygems.rb', line 755

def self.promote_load_path(gem_name, over_name)
  gem = Gem.loaded_specs[gem_name]
  over = Gem.loaded_specs[over_name]

  raise ArgumentError, "gem #{gem_name} is not activated" if gem.nil?
  raise ArgumentError, "gem #{over_name} is not activated" if over.nil?

  last_gem_path = File.join gem.full_gem_path, gem.require_paths.last

  over_paths = over.require_paths.map do |path|
    File.join over.full_gem_path, path
  end

  over_paths.each do |path|
    $LOAD_PATH.delete path
  end

  gem = $LOAD_PATH.index(last_gem_path) + 1

  $LOAD_PATH.insert(gem, *over_paths)
end

+ (Object) read_binary(path)

Safely read a file in binary mode on all platforms.



789
790
791
# File 'lib/rubygems.rb', line 789

def self.read_binary(path)
  File.open path, binary_mode do |f| f.read end
end

+ (Object) refresh

Refresh source_index from disk and clear searcher.



780
781
782
783
784
# File 'lib/rubygems.rb', line 780

def self.refresh
  source_index.refresh!

  @searcher = nil
end

+ (Object) report_activate_error(gem)

Report a load error during activation. The message of load error depends on whether it was a version mismatch or if there are not gems of any version by the requested name.



798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
# File 'lib/rubygems.rb', line 798

def self.report_activate_error(gem)
  matches = Gem.source_index.find_name(gem.name)

  if matches.empty? then
    error = Gem::LoadError.new(
        "Could not find RubyGem #{gem.name} (#{gem.requirement})\n")
  else
    error = Gem::LoadError.new(
        "RubyGem version error: " +
        "#{gem.name}(#{matches.first.version} not #{gem.requirement})\n")
  end

  error.name = gem.name
  error.requirement = gem.requirement
  raise error
end

+ (Object) required_location(gemname, libfile, *requirements)

Full path to libfile in gemname. Searches for the latest gem unless requirements is given.



821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
# File 'lib/rubygems.rb', line 821

def self.required_location(gemname, libfile, *requirements)
  requirements = Gem::Requirement.default if requirements.empty?

  matches = Gem.source_index.find_name gemname, requirements

  return nil if matches.empty?

  spec = matches.last
  spec.require_paths.each do |path|
    result = File.join spec.full_gem_path, path, libfile
    return result if File.exist? result
  end

  nil
end

+ (Object) ruby

The path to the running Ruby interpreter.



840
841
842
843
844
845
846
847
848
849
850
851
# File 'lib/rubygems.rb', line 840

def self.ruby
  if @ruby.nil? then
    @ruby = File.join(ConfigMap[:bindir],
                      ConfigMap[:ruby_install_name])
    @ruby << ConfigMap[:EXEEXT]

    # escape string in case path to ruby executable contain spaces.
    @ruby.sub!(/.*\s.*/m, '"\&"')
  end

  @ruby
end

+ (Object) ruby_engine

A wrapper around RUBY_ENGINE const that may not be defined



92
93
94
95
96
97
98
# File 'lib/rubygems/defaults.rb', line 92

def self.ruby_engine
  if defined? RUBY_ENGINE then
    RUBY_ENGINE
  else
    'ruby'
  end
end

+ (Object) ruby_version

A Gem::Version for the currently running ruby.



856
857
858
859
860
861
862
863
864
865
866
867
# File 'lib/rubygems.rb', line 856

def self.ruby_version
  return @ruby_version if defined? @ruby_version
  version = RUBY_VERSION.dup

  if defined?(RUBY_PATCHLEVEL) && RUBY_PATCHLEVEL != -1 then
    version << ".#{RUBY_PATCHLEVEL}"
  elsif defined?(RUBY_REVISION) then
    version << ".dev.#{RUBY_REVISION}"
  end

  @ruby_version = Gem::Version.new version
end

+ (Object) searcher

The GemPathSearcher object used to search for matching installed gems.



872
873
874
# File 'lib/rubygems.rb', line 872

def self.searcher
  @searcher ||= Gem::GemPathSearcher.new
end

+ (Object) set_home(home)

Set the Gem home directory (as reported by Gem.dir).



879
880
881
882
# File 'lib/rubygems.rb', line 879

def self.set_home(home)
  home = home.gsub File::ALT_SEPARATOR, File::SEPARATOR if File::ALT_SEPARATOR
  @gem_home = home
end

+ (Object) set_paths(gpaths)

Set the Gem search path (as reported by Gem.path).



889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
# File 'lib/rubygems.rb', line 889

def self.set_paths(gpaths)
  if gpaths
    @gem_path = gpaths.split(File::PATH_SEPARATOR)

    if File::ALT_SEPARATOR then
      @gem_path.map! do |path|
        path.gsub File::ALT_SEPARATOR, File::SEPARATOR
      end
    end

    @gem_path << Gem.dir
  else
    # TODO: should this be Gem.default_path instead?
    @gem_path = [Gem.dir]
  end

  @gem_path.uniq!
end

+ (Object) source_index Also known as: cache

Returns the Gem::SourceIndex of specifications that are in the Gem.path



913
914
915
# File 'lib/rubygems.rb', line 913

def self.source_index
  @@source_index ||= SourceIndex.from_installed_gems
end

+ (Object) sources

Returns an Array of sources to fetch remote gems from. If the sources list is empty, attempts to load the "sources" gem, then uses default_sources if it is not installed.



922
923
924
925
926
927
928
929
930
931
932
933
# File 'lib/rubygems.rb', line 922

def self.sources
  if @sources.empty? then
    begin
      gem 'sources', '> 0.0.1'
      require 'sources'
    rescue LoadError
      @sources = default_sources
    end
  end

  @sources
end

+ (Object) sources=(new_sources)

Need to be able to set the sources without calling Gem.sources.replace since that would cause an infinite loop.



939
940
941
# File 'lib/rubygems.rb', line 939

def self.sources=(new_sources)
  @sources = new_sources
end

+ (Boolean) ssl_available?

Is SSL (used by the signing commands) available on this platform?

Returns:

  • (Boolean)


19
20
21
# File 'lib/rubygems/gem_openssl.rb', line 19

def ssl_available?
  @ssl_available
end

+ (Object) suffix_pattern

Glob pattern for require-able path suffixes.



946
947
948
# File 'lib/rubygems.rb', line 946

def self.suffix_pattern
  @suffix_pattern ||= "{#{suffixes.join(',')}}"
end

+ (Object) suffixes

Suffixes for require-able paths.



953
954
955
# File 'lib/rubygems.rb', line 953

def self.suffixes
  ['', '.rb', '.rbw', '.so', '.bundle', '.dll', '.sl', '.jar']
end

+ (Object) time(msg, width = 0, display = Gem.configuration.verbose)

Prints the amount of time the supplied block takes to run using the debug UI output.



961
962
963
964
965
966
967
968
969
970
971
# File 'lib/rubygems.rb', line 961

def self.time(msg, width = 0, display = Gem.configuration.verbose)
  now = Time.now

  value = yield

  elapsed = Time.now - now

  ui.say "%2$*1$s: %3$3.3fs" % [-width, msg, elapsed] if display

  value
end

+ (Object) ui

Lazily loads DefaultUserInteraction and returns the default UI.



976
977
978
979
980
# File 'lib/rubygems.rb', line 976

def self.ui
  require 'rubygems/user_interaction'

  Gem::DefaultUserInteraction.ui
end

+ (Object) use_paths(home, paths = [])

Use the home and paths values for Gem.dir and Gem.path. Used mainly by the unit tests to provide environment isolation.



986
987
988
989
990
# File 'lib/rubygems.rb', line 986

def self.use_paths(home, paths=[])
  clear_paths
  set_home(home) if home
  set_paths(paths.join(File::PATH_SEPARATOR)) if paths
end

+ (Object) user_dir

Path for gems in the user's home directory



35
36
37
# File 'lib/rubygems/defaults.rb', line 35

def self.user_dir
  File.join Gem.user_home, '.gem', ruby_engine, ConfigMap[:ruby_version]
end

+ (Object) user_home

The home directory for the user.



995
996
997
# File 'lib/rubygems.rb', line 995

def self.user_home
  @user_home ||= find_home
end

+ (Boolean) win_platform?

Is this a windows platform?

Returns:

  • (Boolean)


1002
1003
1004
1005
1006
1007
1008
# File 'lib/rubygems.rb', line 1002

def self.win_platform?
  if @@win_platform.nil? then
    @@win_platform = !!WIN_PATTERNS.find { |r| RUBY_PLATFORM =~ r }
  end

  @@win_platform
end