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

Attributes inherited from Set

#remote

Instance Method Summary collapse

Methods inherited from Set

#remote?

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
36
37
# File 'lib/rubygems/resolver/api_set.rb', line 27

def initialize dep_uri = 'https://rubygems.org/api/v1/dependencies'
  super()

  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.



43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/rubygems/resolver/api_set.rb', line 43

def find_all req
  res = []

  return res unless @remote

  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.



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/rubygems/resolver/api_set.rb', line 61

def prefetch reqs
  return unless @remote
  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:



85
86
87
88
89
90
91
92
93
94
# File 'lib/rubygems/resolver/api_set.rb', line 85

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.



99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/rubygems/resolver/api_set.rb', line 99

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