Class: Gem::Resolver::APISet

Inherits:
Set
  • Object
show all
Defined in:
lib/rubygems/resolver/api_set.rb

Overview

The global rubygems pool, available via the rubygems.org API. Returns instances of APISpecification.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dep_uri = 'https://rubygems.org/api/v1/dependencies') ⇒ APISet

Creates a new APISet that will retrieve gems from uri using the RubyGems API URL dep_uri which is described at guides.rubygems.org/rubygems-org-api



27
28
29
30
31
32
33
34
35
# File 'lib/rubygems/resolver/api_set.rb', line 27

def initialize dep_uri = 'https://rubygems.org/api/v1/dependencies'
  dep_uri = URI dep_uri unless URI === dep_uri # for ruby 1.8

  @dep_uri = dep_uri
  @uri     = dep_uri + '../../..'

  @data   = Hash.new { |h,k| h[k] = [] }
  @source = Gem::Source.new @uri
end

Instance Attribute Details

#dep_uriObject (readonly)

The URI for the dependency API this APISet uses.



10
11
12
# File 'lib/rubygems/resolver/api_set.rb', line 10

def dep_uri
  @dep_uri
end

#sourceObject (readonly)

The Gem::Source that gems are fetched from



15
16
17
# File 'lib/rubygems/resolver/api_set.rb', line 15

def source
  @source
end

#uriObject (readonly)

The corresponding place to fetch gems.



20
21
22
# File 'lib/rubygems/resolver/api_set.rb', line 20

def uri
  @uri
end

Instance Method Details

#find_all(req) ⇒ Object

Return an array of APISpecification objects matching DependencyRequest req.



41
42
43
44
45
46
47
48
49
50
51
# File 'lib/rubygems/resolver/api_set.rb', line 41

def find_all req
  res = []

  versions(req.name).each do |ver|
    if req.dependency.match? req.name, ver[:number]
      res << Gem::Resolver::APISpecification.new(self, ver)
    end
  end

  res
end

#prefetch(reqs) ⇒ Object

A hint run by the resolver to allow the Set to fetch data for DependencyRequests reqs.



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/rubygems/resolver/api_set.rb', line 57

def prefetch reqs
  names = reqs.map { |r| r.dependency.name }
  needed = names - @data.keys

  return if needed.empty?

  uri = @dep_uri + "?gems=#{needed.sort.join ','}"
  str = Gem::RemoteFetcher.fetcher.fetch_path uri

  loaded = []

  Marshal.load(str).each do |ver|
    name = ver[:name]

    @data[name] << ver
    loaded << name
  end

  (needed - loaded).each do |missing|
    @data[missing] = []
  end
end

#pretty_print(q) ⇒ Object

:nodoc:



80
81
82
83
84
85
86
87
88
89
# File 'lib/rubygems/resolver/api_set.rb', line 80

def pretty_print q # :nodoc:
  q.group 2, '[APISet', ']' do
    q.breakable
    q.text "URI: #{@dep_uri}"

    q.breakable
    q.text 'gem names:'
    q.pp @data.keys
  end
end

#versions(name) ⇒ Object

Return data for all versions of the gem name.



94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/rubygems/resolver/api_set.rb', line 94

def versions name # :nodoc:
  if @data.key?(name)
    return @data[name]
  end

  uri = @dep_uri + "?gems=#{name}"
  str = Gem::RemoteFetcher.fetcher.fetch_path uri

  Marshal.load(str).each do |ver|
    @data[ver[:name]] << ver
  end

  @data[name]
end