In Files

  • rubygems/source.rb
  • rubygems/source_local.rb
  • rubygems/source_specific_file.rb

Class/Module Index [+]

Quicksearch

Gem::Source

Constants

FILES

Attributes

uri[R]

Public Class Methods

new(uri) click to toggle source
 
               # File rubygems/source.rb, line 11
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
 
               # File rubygems/source.rb, line 27
def <=>(other)
  if !@uri
    return 0 unless other.uri
    return -1
  end

  return 1 if !other.uri

  @uri.to_s <=> other.uri.to_s
end
            
==(other) click to toggle source
 
               # File rubygems/source.rb, line 40
def ==(other)
  case other
  when self.class
    @uri == other.uri
  else
    false
  end
end
            
Also aliased as: eql?
api_uri() click to toggle source
 
               # File rubygems/source.rb, line 22
def api_uri
  require 'rubygems/remote_fetcher'
  @api_uri ||= Gem::RemoteFetcher.fetcher.api_endpoint uri
end
            
cache_dir(uri) click to toggle source

Returns the local directory to write uri to.

 
               # File rubygems/source.rb, line 58
def cache_dir(uri)
  # Correct for windows paths
  escaped_path = uri.path.sub(/^\/([a-z]):\//i, '/\1-/')
  root = File.join Gem.user_home, '.gem', 'specs'
  File.join root, "#{uri.host}%#{uri.port}", File.dirname(escaped_path)
end
            
download(spec, dir=Dir.pwd) click to toggle source
 
               # File rubygems/source.rb, line 145
def download(spec, dir=Dir.pwd)
  fetcher = Gem::RemoteFetcher.fetcher
  fetcher.download spec, @uri.to_s, dir
end
            
eql?(other) click to toggle source
Alias for: ==
fetch_spec(name) click to toggle source
 
               # File rubygems/source.rb, line 74
def fetch_spec(name)
  fetcher = Gem::RemoteFetcher.fetcher

  spec_file_name = name.spec_name

  uri = @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
            
hash() click to toggle source
 
               # File rubygems/source.rb, line 51
def hash
  @uri.hash
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 119
def load_specs(type)
  file       = FILES[type]
  fetcher    = Gem::RemoteFetcher.fetcher
  file_name  = "#{file}.#{Gem.marshal_version}"
  spec_path  = @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
 
               # File rubygems/source.rb, line 65
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