class Gemat::Fetcher

Attributes

gems[RW]

Public Class Methods

new(dsl) click to toggle source
# File lib/fetcher.rb, line 7
def initialize(dsl)
  @dsl = dsl
  @gems = []
end

Public Instance Methods

run() click to toggle source
# File lib/fetcher.rb, line 12
def run
  pb = ProgressBar.create(total: @dsl.dependencies.length)
  @dsl.dependencies.each_with_index do |dependency, idx|
    pb.increment

    response = fetch_rubygems(dependency)
    next unless response

    create_gem(response, idx)
    sleep 0.2
  end
end

Private Instance Methods

create_gem(rubygems, idx) click to toggle source
# File lib/fetcher.rb, line 27
def create_gem(rubygems, idx)
  gem = Gem.new(rubygems)
  gem.github = fetch_github(gem)
  gem.index = idx
  @gems << gem
end
fetch(uri) click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/fetcher.rb, line 46
def fetch(uri)
  failed = []
  client = HTTPClient.new
  request = client.get(uri)
  begin
    response = JSON.parse(request.body)
  rescue JSON::ParserError
    failed << gem.name
    return
  end

  print "#{failed.join(',')}: failed fetcing info." unless failed.empty?
  response
end
fetch_github(gem, uri = nil) click to toggle source
# File lib/fetcher.rb, line 38
def fetch_github(gem, uri = nil)
  uri ||= gem.repo_uri.gsub(/github.com/, 'api.github.com/repos')
  response = fetch(uri)
  response = fetch_github(gem, response['url']) if response['message'] == 'Moved Permanently'
  response
end
fetch_rubygems(gem) click to toggle source
# File lib/fetcher.rb, line 34
def fetch_rubygems(gem)
  fetch(rubygems_api(gem.name))
end
rubygems_api(name) click to toggle source

rubocop:enable Metrics/MethodLength

# File lib/fetcher.rb, line 62
def rubygems_api(name)
  "https://rubygems.org/api/v1/gems/#{name}.json"
end