Extended maintenance of Ruby 1.9.3 ended on February 23, 2015. Read more

In Files

  • rubygems/test_utilities.rb

Class/Module Index [+]

Quicksearch

Gem::FakeFetcher

A fake Gem::RemoteFetcher for use in tests or to avoid real live HTTP requests when testing code that uses RubyGems.

Example:

@fetcher = Gem::FakeFetcher.new
@fetcher.data['http://gems.example.com/yaml'] = source_index.to_yaml
Gem::RemoteFetcher.fetcher = @fetcher

# invoke RubyGems code

paths = @fetcher.paths
assert_equal 'http://gems.example.com/yaml', paths.shift
assert paths.empty?, paths.join(', ')

See RubyGems’ tests for more examples of FakeFetcher.

Attributes

data[R]
last_request[R]
paths[RW]

Public Class Methods

new() click to toggle source
 
               # File rubygems/test_utilities.rb, line 29
def initialize
  @data = {}
  @paths = []
end
            

Public Instance Methods

download(spec, source_uri, install_dir = Gem.dir) click to toggle source
 
               # File rubygems/test_utilities.rb, line 99
def download spec, source_uri, install_dir = Gem.dir
  name = File.basename spec.cache_file
  path = File.join install_dir, "cache", name

  Gem.ensure_gem_subdirectories install_dir

  if source_uri =~ /^http/ then
    File.open(path, "wb") do |f|
      f.write fetch_path(File.join(source_uri, "gems", name))
    end
  else
    FileUtils.cp source_uri, path
  end

  path
end
            
download_to_cache(dependency) click to toggle source
 
               # File rubygems/test_utilities.rb, line 116
def download_to_cache dependency
  found = Gem::SpecFetcher.fetcher.fetch dependency, true, true,
                                         dependency.prerelease?

  return if found.empty?

  spec, source_uri = found.first

  download spec, source_uri
end
            
fetch_path(path, mtime = nil) click to toggle source
 
               # File rubygems/test_utilities.rb, line 46
def fetch_path path, mtime = nil
  data = find_data(path)

  if data.respond_to?(:call) then
    data.call
  else
    if path.to_s =~ /gz$/ and not data.nil? and not data.empty? then
      data = Gem.gunzip data
    end

    data
  end
end
            
fetch_size(path) click to toggle source
 
               # File rubygems/test_utilities.rb, line 84
def fetch_size(path)
  path = path.to_s
  @paths << path

  raise ArgumentError, 'need full URI' unless path =~ %r'^http://'

  unless @data.key? path then
    raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", path)
  end

  data = @data[path]

  data.respond_to?(:call) ? data.call : data.length
end
            
find_data(path) click to toggle source
 
               # File rubygems/test_utilities.rb, line 34
def find_data(path)
  path = path.to_s
  @paths << path
  raise ArgumentError, 'need full URI' unless path =~ %r'^https?://'

  unless @data.key? path then
    raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", path)
  end

  @data[path]
end
            
open_uri_or_path(path) click to toggle source

Thanks, FakeWeb!

 
               # File rubygems/test_utilities.rb, line 61
def open_uri_or_path(path)
  data = find_data(path)
  body, code, msg = data

  response = Net::HTTPResponse.send(:response_class, code.to_s).new("1.0", code.to_s, msg)
  response.instance_variable_set(:@body, body)
  response.instance_variable_set(:@read, true)
  response
end
            
request(uri, request_class, last_modified = nil) click to toggle source
 
               # File rubygems/test_utilities.rb, line 71
def request(uri, request_class, last_modified = nil)
  data = find_data(uri)
  body, code, msg = data

  @last_request = request_class.new uri.request_uri
  yield @last_request if block_given?

  response = Net::HTTPResponse.send(:response_class, code.to_s).new("1.0", code.to_s, msg)
  response.instance_variable_set(:@body, body)
  response.instance_variable_set(:@read, true)
  response
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.