diff options
Diffstat (limited to 'lib/rubygems/dependency_resolver/api_set.rb')
-rw-r--r-- | lib/rubygems/dependency_resolver/api_set.rb | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/lib/rubygems/dependency_resolver/api_set.rb b/lib/rubygems/dependency_resolver/api_set.rb new file mode 100644 index 0000000000..469c005a09 --- /dev/null +++ b/lib/rubygems/dependency_resolver/api_set.rb @@ -0,0 +1,65 @@ +## +# The global rubygems pool, available via the rubygems.org API. +# Returns instances of APISpecification. + +class Gem::DependencyResolver::APISet + + def initialize + @data = Hash.new { |h,k| h[k] = [] } + @dep_uri = URI 'https://rubygems.org/api/v1/dependencies' + end + + ## + # Return an array of APISpecification objects matching + # DependencyRequest +req+. + + def find_all req + res = [] + + versions(req.name).each do |ver| + if req.dependency.match? req.name, ver[:number] + res << Gem::DependencyResolver::APISpecification.new(self, ver) + end + end + + res + end + + ## + # A hint run by the resolver to allow the Set to fetch + # data for DependencyRequests +reqs+. + + def prefetch reqs + names = reqs.map { |r| r.dependency.name } + needed = names.find_all { |d| !@data.key?(d) } + + return if needed.empty? + + uri = @dep_uri + "?gems=#{needed.sort.join ','}" + str = Gem::RemoteFetcher.fetcher.fetch_path uri + + Marshal.load(str).each do |ver| + @data[ver[:name]] << ver + end + end + + ## + # Return data for all versions of the gem +name+. + + def versions name + 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 + +end + |