class Gem::Source

def fetch_spec name_tuple

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