class AnyGood
Constants
- GITHUB_URI_PATTERN
- T
Attributes
name[R]
Public Class Methods
meters()
click to toggle source
# File lib/any_good.rb, line 44 def self.meters @meters ||= [] end
metric(name, thresholds: nil, &block)
click to toggle source
# File lib/any_good.rb, line 48 def self.metric(name, thresholds: nil, &block) meters << Meter.new(name, thresholds, block) end
new(name)
click to toggle source
# File lib/any_good.rb, line 11 def initialize(name) @name = name @github_client = if (token = ENV['GITHUB_ACCESS_TOKEN']) Octokit::Client.new(access_token: token).tap { |client| client.user.login } else Octokit::Client.new end end
Public Instance Methods
fetch()
click to toggle source
# File lib/any_good.rb, line 23 def fetch gem_info = fetch_gem repo_id = detect_repo_id(*gem_info[:gem_info].values_at('source_code_uri', 'homepage_uri')) github_info = fetch_github(repo_id) @data = OpenStruct.new(gem_info.merge(github_info)) self end
report()
click to toggle source
# File lib/any_good.rb, line 33 def report puts description self.class.meters.each do |meter| puts meter.call(@data).format end self end
Private Instance Methods
description()
click to toggle source
# File lib/any_good.rb, line 85 def description "%{name} (GitHub %{repo})\n %{description}" % { name: @data.gem_info['name'], description: @data.gem_info['info'], repo: @data.repo&.[](:html_url) || '—' } end
detect_repo_id(*urls)
click to toggle source
# File lib/any_good.rb, line 119 def detect_repo_id(*urls) repo_url = urls.grep(GITHUB_URI_PATTERN).first or return nil Octokit::Repository.from_url(repo_url).slug end
fetch_gem()
click to toggle source
# File lib/any_good.rb, line 93 def fetch_gem { gem_info: Gems.info(name), gem_versions: Gems.versions(name), gem_rev_deps: Gems.reverse_dependencies(name) } rescue JSON::ParserError => e # Gems have no cleaner way to indicate gem does not exist :shrug: raise unless e.message.include?('This rubygem could not be found.') abort("Gem #{name} does not exist.") end
fetch_github(repo_id)
click to toggle source
# File lib/any_good.rb, line 105 def fetch_github(repo_id) return {} unless repo_id { repo: @github_client.repository(repo_id).to_h, open_issues: @github_client.issues(repo_id, state: 'open', per_page: 50).map(&:to_h), closed_issues: @github_client.issues(repo_id, state: 'closed', per_page: 50).map(&:to_h), last_commit: @github_client.commits(repo_id, per_page: 1).first.to_h # open_prs: @github_client.issues(repo_id, state: 'open').map(&:to_h) # closed_prs: @github_client.issues(repo_id, state: 'closed').map(&:to_h) } rescue Octokit::TooManyRequests abort('GitHub: too many requests. Try `GITHUB_ACCESS_TOKEN=<yourtoken> any_good <gem_name>` for higher limits.') end