Skip to content

Instantly share code, notes, and snippets.

@ayufan
Last active July 3, 2019 11:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ayufan/701e81fa2c8875ad02fc731e4c547916 to your computer and use it in GitHub Desktop.
Save ayufan/701e81fa2c8875ad02fc731e4c547916 to your computer and use it in GitHub Desktop.
Simple Ruby script to gather metrics from GitHub Releases
#!/usr/bin/env ruby
require 'bundler/inline'
gemfile true do
source 'http://rubygems.org'
gem 'table_print'
end
require 'json'
require 'open-uri'
OWNER_REPOS = [
'ayufan-rock64/android-7.1',
'ayufan-rock64/chromiumos-build',
'ayufan-rock64/linux-build',
'ayufan-rock64/linux-kernel',
'ayufan-rock64/linux-mainline-kernel',
'ayufan-rock64/linux-u-boot',
'ayufan-rock64/linux-package',
]
class BytesFormatter
def format(value)
units = %W(B KiB MiB GiB TiB)
size, unit = units.reduce(value.to_f) do |(fsize, _), utype|
fsize > 1024 ? [fsize / 1024, utype] : (break [fsize, utype])
end
"#{size > 9 || size.modulo(1) < 0.01 ? '%d' : '%.2f'} %s" % [size, unit]
end
end
def get_assets_page(owner_repo, page = 1)
$stderr.puts "Downloading #{owner_repo}\##{page}..."
releases = open("https://api.github.com/repos/#{owner_repo}/releases?page=#{page}").read
releases = JSON.parse(releases)
releases.map do |release|
release['assets'].map do |asset|
OpenStruct.new(
id: asset['id'],
repo: owner_repo,
tag: release['tag_name'],
name: asset['name'],
size: asset['size'],
downloads: asset['download_count'],
transfer: asset['size'] * asset['download_count']
)
end
end.flatten
end
def get_all_assets(owner_repo)
all_assets = (1..100).each_with_object([]) do |page, all_assets|
assets = get_assets_page(owner_repo, page)
break all_assets if assets.empty?
all_assets << assets
end.flatten
OpenStruct.new(
repo: owner_repo,
assets: all_assets,
downloads: all_assets.map(&:downloads).sum,
transfer: all_assets.map(&:transfer).sum
)
end
def most_popular_assets(all_releases)
all_releases
.map(&:assets).flatten
.sort_by(&:downloads).map(&:to_h)
.reverse.take(20)
end
def releases_summary_with_total(all_releases)
total_downloads = all_releases.sum(&:downloads)
total_transfer = all_releases.sum(&:transfer)
all_releases + [
OpenStruct.new(
repo: "TOTAL",
downloads: total_downloads,
transfer: total_transfer
)
]
end
all_releases = OWNER_REPOS.map do |owner_repo|
get_all_assets(owner_repo)
end
tp.set(:max_width, 100)
puts
puts "Repositories:"
tp releases_summary_with_total(all_releases), :repo, :downloads, { transfer: { formatters: [BytesFormatter.new] } }
puts
puts "Most popular:"
tp most_popular_assets(all_releases), :repo, :tag, :name, :downloads,
{ size: { formatters: [BytesFormatter.new] } },
{ transfer: { formatters: [BytesFormatter.new] } }
@ayufan
Copy link
Author

ayufan commented Jul 3, 2019

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment