module GitHop

Constants

VERSION

Private Class Methods

build_query_2014(gh_user, end_date) click to toggle source
# File lib/githop.rb, line 12
  def self.build_query_2014(gh_user, end_date)
    month = end_date.strftime('%Y%m')
    end_date = end_date.strftime('%Y-%m-%d')

    query = <<END
SELECT type, repository_owner, repository_name, created_at, payload_url, payload_desc, payload_ref,
payload_ref_type
FROM ([githubarchive:month.#{month}])
WHERE actor = '#{gh_user}' AND
(created_at LIKE '#{end_date}%')
ORDER BY created_at;
END
    query
  end
build_query_2015(gh_user, end_date) click to toggle source
# File lib/githop.rb, line 27
  def self.build_query_2015(gh_user, end_date)
    start_date = (end_date - 1.day).strftime('%Y-%m-%d')
    end_date = end_date.strftime('%Y-%m-%d')

    query = <<END
SELECT type, repo.name, created_at,
  JSON_EXTRACT(payload, '$.action') as event,
FROM (TABLE_DATE_RANGE([githubarchive:day.events_],
  TIMESTAMP('#{start_date}'),
  TIMESTAMP('#{end_date}')
))
WHERE actor.login = '#{gh_user}' ORDER BY created_at;
END
    query
  end
client_options(config) click to toggle source
# File lib/githop.rb, line 43
def self.client_options(config)
  opts = {}
  opts['client_id']     = config['bigquery']['client_id']
  opts['service_email'] = config['bigquery']['service_email']
  opts['key']           = config['bigquery']['keyfile']
  opts['project_id']    = config['bigquery']['project_id']
  opts
end
hop(config, user = nil, date = 1.year.ago) click to toggle source
# File lib/githop.rb, line 52
def self.hop(config, user = nil, date = 1.year.ago)
  bq = BigQuery::Client.new(client_options(config))
  query = build_query_2014(user || config['github_user'], date)
  result = bq.query(query)

  # File.open('bigquery-sample.marshal', 'w') { |to_file| Marshal.dump(result, to_file) }
  # exit(0)
  # result = File.open('bigquery-sample.marshal', 'r') { |from_file| Marshal.load(from_file) }

  result
end
labels() click to toggle source
# File lib/githop.rb, line 64
def self.labels
  {
    'CommitCommentEvent' => 'commented a commit on the repo',
    'CreateEvent' => 'created the',
    'DeleteEvent' => 'deleted the',
    'ForkEvent' => 'forked the repo',
    'IssueCommentEvent' => 'commented an issue on',
    'IssuesEvent' => 'created an issue on',
    'MemberEvent' => 'was added to the repo',
    'PullRequestEvent' => 'created a PR on',
    'PullRequestReviewCommentEvent' => 'commented on a PR on the repo',
    'PushEvent' => 'pushed commits to',
    'ReleaseEvent' => 'published a new release of',
    'WatchEvent' => 'watched the repo'
  }
end
pretty_print(result, user = nil) click to toggle source
# File lib/githop.rb, line 81
def self.pretty_print(result, user = nil)
  pushed_repos = []

  result['rows'].map { |row| row['f'] }.map do |event|
    type, owner, repo, created_at = event[0]['v'], event[1]['v'], event[2]['v'], event[3]['v']
    _, _, ref, ref_type = event[4]['v'], event[5]['v'], event[6]['v'], event[7]['v']

    # Filter some not so interesting events
    next if %w(CommitCommentEvent IssueCommentEvent IssuesEvent MemberEvent PullRequestReviewCommentEvent WatchEvent).include?(type)

    action = labels[type]
    fail "Unsupported event type #{type}" if action.nil?
    target = "#{owner}/#{repo}"

    if type == 'CreateEvent'
      action += " #{ref_type}"
      action += " #{ref} on" if ref_type != 'repository'
    end

    if type == 'DeleteEvent'
      action += " #{ref_type} #{ref} on"
    end

    if type == 'PushEvent'
      next if pushed_repos.include?(target)
      pushed_repos << target
    end

    "At #{created_at}, #{user || 'you'} #{action} #{target}"
  end.compact
end