class Gemstash::Dependencies::Fetcher

Public Class Methods

new(gems, scope, http_client, db_model) click to toggle source
# File lib/gemstash/dependencies.rb, line 32
def initialize(gems, scope, http_client, db_model)
  @gems = Set.new(gems)
  @scope = scope
  @http_client = http_client
  @db_model = db_model
  @dependencies = []
end

Public Instance Methods

fetch() click to toggle source
# File lib/gemstash/dependencies.rb, line 40
def fetch
  fetch_from_cache
  fetch_from_database
  fetch_from_web
  cache_missing
  @dependencies
end

Private Instance Methods

cache_missing() click to toggle source
# File lib/gemstash/dependencies.rb, line 90
def cache_missing
  @gems.each do |gem|
    gemstash_env.cache.set_dependency(@scope, gem, [])
  end
end
done?() click to toggle source
# File lib/gemstash/dependencies.rb, line 50
def done?
  @gems.empty?
end
fetch_from_cache() click to toggle source
# File lib/gemstash/dependencies.rb, line 54
def fetch_from_cache
  gemstash_env.cache.dependencies(@scope, @gems) do |gem, value|
    @gems.delete(gem)
    @dependencies += value
  end
end
fetch_from_database() click to toggle source
# File lib/gemstash/dependencies.rb, line 61
def fetch_from_database
  return if done?
  return unless @db_model

  log.info "Querying dependencies: #{@gems.to_a.join(", ")}"

  @db_model.fetch(@gems) do |gem, value|
    @gems.delete(gem)
    gemstash_env.cache.set_dependency(@scope, gem, value)
    @dependencies += value
  end
end
fetch_from_web() click to toggle source
# File lib/gemstash/dependencies.rb, line 74
def fetch_from_web
  return if done?
  return unless @http_client

  log.info "Fetching dependencies: #{@gems.to_a.join(", ")}"
  gems_param = @gems.map {|gem| CGI.escape(gem) }.join(",")
  fetched = @http_client.get("api/v1/dependencies?gems=#{gems_param}")
  fetched = Marshal.load(fetched).group_by {|r| r[:name] }

  fetched.each do |gem, result|
    @gems.delete(gem)
    gemstash_env.cache.set_dependency(@scope, gem, result)
    @dependencies += result
  end
end