Class: Rubygems::Gem
- Inherits:
-
Object
- Object
- Rubygems::Gem
- Defined in:
- app/models/rubygems/gem.rb
Instance Attribute Summary collapse
-
#name ⇒ Object
(also: #to_s)
readonly
Returns the value of attribute name.
Class Method Summary collapse
Instance Method Summary collapse
- #fetch_releases_from_previous_cache_on_error ⇒ Object
-
#initialize(name, options = {}) ⇒ Gem
constructor
A new instance of Gem.
- #releases ⇒ Object
- #versions ⇒ Object
Constructor Details
#initialize(name, options = {}) ⇒ Gem
Returns a new instance of Gem.
6 7 8 9 |
# File 'app/models/rubygems/gem.rb', line 6 def initialize(name, ={}) @name = name @include_prerelease = .fetch(:prerelease, false) end |
Instance Attribute Details
#name ⇒ Object (readonly) Also known as: to_s
Returns the value of attribute name.
11 12 13 |
# File 'app/models/rubygems/gem.rb', line 11 def name @name end |
Class Method Details
.cache_key(name, date) ⇒ Object
31 32 33 |
# File 'app/models/rubygems/gem.rb', line 31 def self.cache_key(name, date) "rubygems/#{name}/releases/#{date.strftime('%Y%m%d')}/json" end |
.request_releases_of(name) ⇒ Object
20 21 22 23 24 25 26 27 28 29 |
# File 'app/models/rubygems/gem.rb', line 20 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: #{$!.}" end |
Instance Method Details
#fetch_releases_from_previous_cache_on_error ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'app/models/rubygems/gem.rb', line 54 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 |
#releases ⇒ Object
37 38 39 40 41 42 |
# File 'app/models/rubygems/gem.rb', line 37 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 |
#versions ⇒ Object
44 45 46 47 48 49 50 |
# File 'app/models/rubygems/gem.rb', line 44 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 |