In Files

  • rubygems/source.rb
  • rubygems/source/git.rb
  • rubygems/source/installed.rb
  • rubygems/source/local.rb
  • rubygems/source/lock.rb
  • rubygems/source/specific_file.rb
  • rubygems/source/vendor.rb
  • rubygems/specification.rb

Class/Module Index [+]

Quicksearch

Gem::Source

A Source knows how to list and fetch gems from a RubyGems marshal index.

There are other Source subclasses for installed gems, local gems, the bundler dependency API and so-forth.

Attributes

uri[R]

The URI this source will fetch gems from.

Public Class Methods

new(uri) click to toggle source

Creates a new Source which will use the index located at uri.

 
               # File rubygems/source.rb, line 28
def initialize(uri)
  unless uri.kind_of? URI
    uri = URI.parse(uri.to_s)
  end

  @uri = uri
  @api_uri = nil
end
            

Public Instance Methods

<=>(other) click to toggle source

Sources are ordered by installation preference.

 
               # File rubygems/source.rb, line 48
def <=>(other)
  case other
  when Gem::Source::Installed,
       Gem::Source::Local,
       Gem::Source::Lock,
       Gem::Source::SpecificFile,
       Gem::Source::Git,
       Gem::Source::Vendor then
    -1
  when Gem::Source then
    if !@uri
      return 0 unless other.uri
      return 1
    end

    return -1 if !other.uri

    @uri.to_s <=> other.uri.to_s
  else
    nil
  end
end
            
cache_dir(uri) click to toggle source

Returns the local directory to write uri to.

 
               # File rubygems/source.rb, line 100
def cache_dir(uri)
  # Correct for windows paths
  escaped_path = uri.path.sub(/^\/([a-z]):\//, '/\1-/')
  File.join Gem.spec_cache_dir, "#{uri.host}%#{uri.port}", File.dirname(escaped_path)
end
            
download(spec, dir=Dir.pwd) click to toggle source

Downloads spec and writes it to dir. See also Gem::RemoteFetcher#download.

 
               # File rubygems/source.rb, line 196
def download(spec, dir=Dir.pwd)
  fetcher = Gem::RemoteFetcher.fetcher
  fetcher.download spec, api_uri.to_s, dir
end
            
fetch_spec(name_tuple) click to toggle source

Fetches a specification for the given name_tuple.

 
               # File rubygems/source.rb, line 121
def fetch_spec name_tuple
  fetcher = Gem::RemoteFetcher.fetcher

  spec_file_name = name_tuple.spec_name

  uri = api_uri + "#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}"

  cache_dir = cache_dir uri

  local_spec = File.join cache_dir, spec_file_name

  if File.exist? local_spec then
    spec = Gem.read_binary local_spec
    spec = Marshal.load(spec) rescue nil
    return spec if spec
  end

  uri.path << '.rz'

  spec = fetcher.fetch_path uri
  spec = Gem.inflate spec

  if update_cache? then
    FileUtils.mkdir_p cache_dir

    open local_spec, 'wb' do |io|
      io.write spec
    end
  end

  # TODO: Investigate setting Gem::Specification#loaded_from to a URI
  Marshal.load spec
end
            
load_specs(type) click to toggle source

Loads type kind of specs fetching from +@uri+ if the on-disk cache is out of date.

type is one of the following:

:released => Return the list of all released specs :latest => Return the list of only the highest version of each gem :prerelease => Return the list of all prerelease only specs

 
               # File rubygems/source.rb, line 166
def load_specs(type)
  file       = FILES[type]
  fetcher    = Gem::RemoteFetcher.fetcher
  file_name  = "#{file}.#{Gem.marshal_version}"
  spec_path  = api_uri + "#{file_name}.gz"
  cache_dir  = cache_dir spec_path
  local_file = File.join(cache_dir, file_name)
  retried    = false

  FileUtils.mkdir_p cache_dir if update_cache?

  spec_dump = fetcher.cache_update_path spec_path, local_file, update_cache?

  begin
    Gem::NameTuple.from_list Marshal.load(spec_dump)
  rescue ArgumentError
    if update_cache? && !retried
      FileUtils.rm local_file
      retried = true
      retry
    else
      raise Gem::Exception.new("Invalid spec cache file in #{local_file}")
    end
  end
end
            
update_cache?() click to toggle source

Returns true when it is possible and safe to update the cache directory.

 
               # File rubygems/source.rb, line 109
def update_cache?
  @update_cache ||=
    begin
      File.stat(Gem.user_home).uid == Process.uid
    rescue Errno::ENOENT
      false
    end
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus