Module: Gem

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

Overview

:stopdoc:

Constant Summary

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.loaded_specsObject (readonly)

Hash of loaded Gem::Specification keyed by name



989
990
991
# File 'lib/rubygems.rb', line 989

def loaded_specs
  @loaded_specs
end

.post_install_hooksObject (readonly)

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



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

def post_install_hooks
  @post_install_hooks
end

.post_uninstall_hooksObject (readonly)

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



1000
1001
1002
# File 'lib/rubygems.rb', line 1000

def post_uninstall_hooks
  @post_uninstall_hooks
end

.pre_install_hooksObject (readonly)

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



1005
1006
1007
# File 'lib/rubygems.rb', line 1005

def pre_install_hooks
  @pre_install_hooks
end

.pre_uninstall_hooksObject (readonly)

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



1010
1011
1012
# File 'lib/rubygems.rb', line 1010

def pre_uninstall_hooks
  @pre_uninstall_hooks
end

.ssl_available=(value) ⇒ Object (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

.activate(gem, *version_requirements) ⇒ Object

Activates an installed gem matching gem. The gem must satisfy version_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.



200
201
202
203
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
# File 'lib/rubygems.rb', line 200

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

  sources = options[:sources] || []

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

  unless gem.respond_to?(:name) and
         gem.respond_to?(:requirement) then
    gem = Gem::Dependency.new(gem, version_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.version_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

.all_load_pathsObject

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



282
283
284
285
286
287
288
289
290
291
292
# File 'lib/rubygems.rb', line 282

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

.all_partials(gemdir) ⇒ Object

Return all the partial paths in gemdir.



297
298
299
# File 'lib/rubygems.rb', line 297

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

.available?(gem, *requirements) ⇒ Boolean

See if a given gem is available.

Returns:

  • (Boolean)


306
307
308
309
310
311
312
313
314
315
# File 'lib/rubygems.rb', line 306

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

.bin_path(name, exec_name = nil, *version_requirements) ⇒ Object

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. version_requirements allows you to specify specific gem versions.

Raises:

  • (Gem::GemNotFoundException)


323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
# File 'lib/rubygems.rb', line 323

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

  raise Gem::GemNotFoundException,
        "can't find gem #{name} (#{version_requirements})" unless spec

  exec_name ||= spec.default_executable

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

  unless spec.executables.include? exec_name
    msg = "can't find executable #{exec_name} for #{spec.full_name}"
    raise Gem::Exception, msg
  end

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

.binary_modeObject

The mode needed to read a file as straight binary.



349
350
351
# File 'lib/rubygems.rb', line 349

def self.binary_mode
  'rb'
end

.bindir(install_dir = Gem.dir) ⇒ Object

The path where gem executables are to be installed.



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

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

.clear_pathsObject

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.



367
368
369
370
371
372
373
374
375
376
377
# File 'lib/rubygems.rb', line 367

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

  @@source_index = nil

  MUTEX.synchronize do
    @searcher = nil
  end
end

.config_fileObject

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



382
383
384
# File 'lib/rubygems.rb', line 382

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

.configurationObject

The standard configuration object for gems.



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

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

.configuration=(config) ⇒ Object

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



397
398
399
# File 'lib/rubygems.rb', line 397

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

.datadir(gem_name) ⇒ Object

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



405
406
407
408
409
# File 'lib/rubygems.rb', line 405

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

.default_bindirObject

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

.default_dirObject

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

.default_exec_formatObject

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

.default_pathObject

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

.default_sourcesObject

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

.default_system_source_cache_dirObject

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

.default_user_source_cache_dirObject

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

.deflate(data) ⇒ Object

A Zlib::Deflate.deflate wrapper



414
415
416
417
# File 'lib/rubygems.rb', line 414

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

.dirObject

The path where gems are to be installed.



422
423
424
425
426
# File 'lib/rubygems.rb', line 422

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

.each_load_path(partials) ⇒ Object

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



432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
# File 'lib/rubygems.rb', line 432

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

.ensure_gem_subdirectories(gemdir) ⇒ Object

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.



455
456
457
458
459
460
461
462
# File 'lib/rubygems.rb', line 455

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

.ensure_ssl_availableObject

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

.find_files(path) ⇒ Object

Returns a list of paths matching file 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

find_files search $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.



475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
# File 'lib/rubygems.rb', line 475

def self.find_files(path)
  load_path_files = $LOAD_PATH.map do |load_path|
    files = Dir["#{File.expand_path path, load_path}#{Gem.suffix_pattern}"]

    files.select do |load_path_file|
      File.file? load_path_file.untaint
    end
  end.flatten

  specs = searcher.find_all path

  specs_files = specs.map do |spec|
    searcher.matching_files spec, path
  end.flatten

  (load_path_files + specs_files).flatten.uniq
end

.find_homeObject

Finds the user's home directory.



496
497
498
499
500
501
502
503
504
# File 'lib/rubygems.rb', line 496

def self.find_home
  File.expand_path "~"
rescue
  if File::ALT_SEPARATOR then
    "C:/"
  else
    "/"
  end
end

.gunzip(data) ⇒ Object

Zlib::GzipReader wrapper that unzips data.



511
512
513
514
515
516
517
# File 'lib/rubygems.rb', line 511

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

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

.gzip(data) ⇒ Object

Zlib::GzipWriter wrapper that zips data.



522
523
524
525
526
527
528
529
530
# File 'lib/rubygems.rb', line 522

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

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

  zipped.string
end

.inflate(data) ⇒ Object

A Zlib::Inflate#inflate wrapper



535
536
537
538
# File 'lib/rubygems.rb', line 535

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

.latest_load_pathsObject

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



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

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

.latest_partials(gemdir) ⇒ Object

Return only the latest partial paths in the given gemdir.



559
560
561
562
563
564
565
566
567
568
569
570
571
572
# File 'lib/rubygems.rb', line 559

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

.load_path_insert_indexObject

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.



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

def self.load_path_insert_index
  $LOAD_PATH.index { |p| p.instance_variable_defined? :@gem_prelude_index }
end

.load_pluginsObject

Find all 'rubygems_plugin' files and load them



965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
# File 'lib/rubygems.rb', line 965

def self.load_plugins
  plugins = Gem.find_files 'rubygems_plugin'

  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

.location_of_callerObject

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



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

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

  [file, lineno]
end

.marshal_versionObject

The version of the Marshal format for your Ruby.



607
608
609
# File 'lib/rubygems.rb', line 607

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

.pathObject

Array of paths to search for Gems.



614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
# File 'lib/rubygems.rb', line 614

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

.platformsObject

Array of platforms this RubyGems supports.



640
641
642
643
644
645
646
# File 'lib/rubygems.rb', line 640

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

.platforms=(platforms) ⇒ Object

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



633
634
635
# File 'lib/rubygems.rb', line 633

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

.post_install(&hook) ⇒ Object

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



652
653
654
# File 'lib/rubygems.rb', line 652

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

.post_uninstall(&hook) ⇒ Object

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



661
662
663
# File 'lib/rubygems.rb', line 661

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

.pre_install(&hook) ⇒ Object

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



669
670
671
# File 'lib/rubygems.rb', line 669

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

.pre_uninstall(&hook) ⇒ Object

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



678
679
680
# File 'lib/rubygems.rb', line 678

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

.prefixObject

The directory prefix this RubyGems was installed at.



685
686
687
688
689
690
691
692
693
694
695
696
# File 'lib/rubygems.rb', line 685

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

.promote_load_path(gem_name, over_name) ⇒ Object

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)


703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
# File 'lib/rubygems.rb', line 703

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

.read_binary(path) ⇒ Object

Safely read a file in binary mode on all platforms.



739
740
741
# File 'lib/rubygems.rb', line 739

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

.refreshObject

Refresh source_index from disk and clear searcher.



728
729
730
731
732
733
734
# File 'lib/rubygems.rb', line 728

def self.refresh
  source_index.refresh!

  MUTEX.synchronize do
    @searcher = nil
  end
end

.remove_prelude_pathsObject



587
588
589
590
591
# File 'lib/rubygems.rb', line 587

def self.remove_prelude_paths
  Gem::QuickLoader::GemLoadPaths.each do |path|
    $LOAD_PATH.delete(path)
  end
end

.report_activate_error(gem) ⇒ Object

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.



748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
# File 'lib/rubygems.rb', line 748

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.version_requirement = gem.requirement
  raise error
end

.required_location(gemname, libfile, *requirements) ⇒ Object

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



771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
# File 'lib/rubygems.rb', line 771

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

.rubyObject

The path to the running Ruby interpreter.



790
791
792
793
794
795
796
797
798
799
800
801
# File 'lib/rubygems.rb', line 790

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

.ruby_engineObject

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

.ruby_versionObject

A Gem::Version for the currently running ruby.



806
807
808
809
810
811
812
813
814
815
816
817
# File 'lib/rubygems.rb', line 806

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

.searcherObject

The GemPathSearcher object used to search for matching installed gems.



822
823
824
825
826
# File 'lib/rubygems.rb', line 822

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

.set_home(home) ⇒ Object

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



831
832
833
834
# File 'lib/rubygems.rb', line 831

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

.set_paths(gpaths) ⇒ Object

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



841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
# File 'lib/rubygems.rb', line 841

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

.source_indexObject Also known as: cache

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



865
866
867
# File 'lib/rubygems.rb', line 865

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

.sourcesObject

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.



874
875
876
877
878
879
880
881
882
883
884
885
# File 'lib/rubygems.rb', line 874

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

  @sources
end

.sources=(new_sources) ⇒ Object

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



891
892
893
# File 'lib/rubygems.rb', line 891

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

.ssl_available?Boolean

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

.suffix_patternObject

Glob pattern for require-able path suffixes.



898
899
900
# File 'lib/rubygems.rb', line 898

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

.suffixesObject

Suffixes for require-able paths.



905
906
907
# File 'lib/rubygems.rb', line 905

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

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

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



913
914
915
916
917
918
919
920
921
922
923
# File 'lib/rubygems.rb', line 913

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

.try_activate(path) ⇒ Object



1115
1116
1117
1118
1119
1120
1121
# File 'lib/rubygems.rb', line 1115

def try_activate(path)
  spec = Gem.searcher.find(path)
  return false unless spec

  Gem.activate(spec.name, "= #{spec.version}")
  return true
end

.uiObject

Lazily loads DefaultUserInteraction and returns the default UI.



928
929
930
931
932
# File 'lib/rubygems.rb', line 928

def self.ui
  require 'rubygems/user_interaction'

  Gem::DefaultUserInteraction.ui
end

.use_paths(home, paths = []) ⇒ Object

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



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

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

.user_dirObject

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

.user_homeObject

The home directory for the user.



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

def self.user_home
  @user_home ||= find_home
end

.win_platform?Boolean

Is this a windows platform?

Returns:

  • (Boolean)


954
955
956
957
958
959
960
# File 'lib/rubygems.rb', line 954

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

  @@win_platform
end