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