class GemData

Constants

MAX_THREADS

Attributes

gem_name[R]

Public Class Methods

new(gem_name) click to toggle source
# File lib/gem_velocity/gem_data.rb, line 10
def initialize(gem_name)
  @gem_name = gem_name
end

Public Instance Methods

fetch_downloads_metadata(version, start_time, end_time, cache_hash) click to toggle source
# File lib/gem_velocity/gem_data.rb, line 37
def fetch_downloads_metadata(version, start_time, end_time, cache_hash)
  key = key_for(version, start_time, end_time)
  data_received = Gems.downloads(gem_name, version, start_time, end_time)
  @mutex1.synchronize do
    # shared hash
    cache_hash[key] ||= data_received
  end
end
key_for(v,s,e) click to toggle source
# File lib/gem_velocity/gem_data.rb, line 76
def key_for(v,s,e)
  "#{v}-#{time_format_str_small(s)}-#{time_format_str_small(e)}"
end
parallel_fetch_for(versions) click to toggle source
# File lib/gem_velocity/gem_data.rb, line 16
def parallel_fetch_for(versions)
  @mutex1 = Mutex.new
  @cached_downloads_metatada ||= {}
  smallest_version = versions.map{|v| ComparableVersion.new(v)}.sort.first.str
  start_t = time_built(smallest_version)
  end_t = Time.now
  puts "fetching #{versions.size} download data requests"
  threads = []

  versions.map do |v|
    active_threads = threads.select{ |t| t.alive? }
    if active_threads.size > MAX_THREADS
      sleep 1 # busy wait thread pool
      redo
    else
      threads << Thread.new { fetch_downloads_metadata(v,start_t,end_t,@cached_downloads_metatada) }
    end
  end
  threads.map(&:join)
end
prefetched_downloads_metadata(version, start_time, end_time) click to toggle source
# File lib/gem_velocity/gem_data.rb, line 46
def prefetched_downloads_metadata(version, start_time, end_time)
  key = key_for(version, start_time, end_time)
  @cached_downloads_metatada[key]
end
time_built(v) click to toggle source
# File lib/gem_velocity/gem_data.rb, line 61
def time_built(v)
  versions_built_at[v]
end
total_for_version(version) click to toggle source
# File lib/gem_velocity/gem_data.rb, line 80
def total_for_version(version)
  @total_for_version ||= {}
  key = "#{version}"
  return @total_for_version[key] if @total_for_version[key]
  @total_for_version[key] ||= Gems.total_downloads(gem_name, version)
end
versions() click to toggle source
# File lib/gem_velocity/gem_data.rb, line 51
def versions
  versions_metadata.map{|v| v["number"]}
end
versions_built_at() click to toggle source
# File lib/gem_velocity/gem_data.rb, line 55
def versions_built_at
  h = {}
  versions_metadata.map{|v| h.merge!(v["number"] => v["built_at"] )}
  h
end
versions_metadata() click to toggle source
# File lib/gem_velocity/gem_data.rb, line 65
def versions_metadata
  @versions_metadata ||= Gems.versions(gem_name)
  # it should be a hash
  if @versions_metadata.is_a?(String)
    if @versions_metadata.match(/This rubygem could not be found/)
      raise(NoSuchGem, "This rubygem #{gem_name} could not be found")
    end
  end
  @versions_metadata
end