Sha256: 577ec11952b85b842d47bf519c7446ab16c37425eda1dda5a91e78e4165d3db3

Contents?: true

Size: 1.92 KB

Versions: 17

Compression:

Stored size: 1.92 KB

Contents

module Rubygems
  class Error < RuntimeError; end

  class Gem

    def initialize(name, options={})
      @name = name
      @include_prerelease = options.fetch(:prerelease, false)
    end

    attr_reader :name
    alias_method :to_s, :name

    delegate :cache_key,
             :request_releases_of,
             :to => "self.class"



    def self.request_releases_of(name)
      response = Houston.benchmark title: "GET rubygems.org" do
        Faraday.get("https://rubygems.org/api/v1/versions/#{name}.json")
      end
      raise Rubygems::Error, "Unexpected response from rubygems. Status: #{response.status}" unless response.status == 200

      MultiJson.load(response.body)
    rescue Faraday::Error::ConnectionFailed
      raise Rubygems::Error, "Unable to connect to rubygems.org: #{$!.message}"
    end

    def self.cache_key(name, date)
      "rubygems/#{name}/releases/#{date.strftime('%Y%m%d')}/json"
    end



    def releases
      fetch_releases_from_previous_cache_on_error do
        key = cache_key(name, Date.today)
        Rails.cache.fetch(key) { request_releases_of(name) }
      end
    end

    def versions
      @versions ||= begin
        versions = releases.map { |release| ::Gem::Version.new(release["number"]) }
        versions = versions.reject(&:prerelease?) unless @include_prerelease
        versions.sort.reverse
      end
    end



    def fetch_releases_from_previous_cache_on_error
      yield
    rescue Rubygems::Error
      Rails.logger.error "[rubygems] an error occurred fetching releases for '#{name}': #{$!}"
      Houston.report_exception $!

      # Have we cached releases any time in the last month?
      (1..30).each do |n|
        date = n.days.ago
        key = cache_key(name, date)
        if Rails.cache.exist?(key)
          Rails.logger.info "[rubygems] using releases of '#{name}' cached on #{date}"
          return Rails.cache.fetch(key)
        end
      end

      []
    end



  end
end

Version data entries

17 entries across 17 versions & 1 rubygems

Version Path
houston-core-0.8.0.pre app/models/rubygems/gem.rb
houston-core-0.7.0 app/models/rubygems/gem.rb
houston-core-0.7.0.beta4 app/models/rubygems/gem.rb
houston-core-0.7.0.beta3 app/models/rubygems/gem.rb
houston-core-0.7.0.beta2 app/models/rubygems/gem.rb
houston-core-0.7.0.beta app/models/rubygems/gem.rb
houston-core-0.6.3 app/models/rubygems/gem.rb
houston-core-0.6.2 app/models/rubygems/gem.rb
houston-core-0.6.1 app/models/rubygems/gem.rb
houston-core-0.6.0 app/models/rubygems/gem.rb
houston-core-0.5.6 app/models/rubygems/gem.rb
houston-core-0.5.5 app/models/rubygems/gem.rb
houston-core-0.5.4 app/models/rubygems/gem.rb
houston-core-0.5.3 app/models/rubygems/gem.rb
houston-core-0.5.2 app/models/rubygems/gem.rb
houston-core-0.5.1 app/models/rubygems/gem.rb
houston-core-0.5.0 app/models/rubygems/gem.rb