|
#! /usr/bin/env ruby |
|
# frozen_string_literal: true |
|
|
|
require "bundler/inline" |
|
|
|
PRINT_COUNTS = true |
|
|
|
gemfile(true) do |
|
gem "activesupport" |
|
gem "json" |
|
gem "yaml" |
|
end |
|
|
|
require "json" |
|
require "yaml" |
|
require "date" |
|
require "open-uri" |
|
require "active_support" |
|
|
|
# downloads[version][arch] = download_count |
|
def new_downloads_hash |
|
Hash.new do |h, version| |
|
h[version] = Hash.new do |h, arch| |
|
h[arch] = 0 |
|
end |
|
end |
|
end |
|
|
|
downloads = new_downloads_hash |
|
pre_111 = new_downloads_hash |
|
|
|
date_first = {} |
|
|
|
def print_int(int) |
|
ActiveSupport::NumberHelper.number_to_delimited(int) |
|
end |
|
|
|
def print_archs_table(archs) |
|
archs.sort_by { |arch, count| -count } |
|
.reject { |arch, _| arch == "total" } |
|
.each do |arch, count| |
|
arch = arch.split("-")[0..1].join("-") |
|
if PRINT_COUNTS |
|
printf("- %-14s %11s (%.2f%%)\n", arch + ":", print_int(count), 100.0 * count / archs["total"]) |
|
else |
|
printf("- %-14s %.2f%%\n", arch + ":", 100.0 * count / archs["total"]) |
|
end |
|
end |
|
end |
|
|
|
versions = JSON.parse(URI.open("https://rubygems.org/api/v1/versions/nokogiri.json").read) |
|
|
|
versions.each do |gem_version| |
|
version = Gem::Version.new(gem_version["number"]) |
|
next if version.prerelease? |
|
|
|
maj_min = Gem::Version.new(version.segments[0..1].join(".")) |
|
downloads[maj_min][gem_version["platform"]] += gem_version["downloads_count"] |
|
downloads[maj_min]["total"] += gem_version["downloads_count"] |
|
date = Date.parse(gem_version["built_at"]) |
|
if date_first[maj_min].nil? || date_first[maj_min] > date |
|
date_first[maj_min] = date |
|
end |
|
|
|
key = if maj_min < Gem::Version.new("1.6") |
|
"< 1.6" |
|
elsif maj_min < Gem::Version.new("1.11") |
|
"1.6 < 1.11" |
|
else |
|
nil |
|
end |
|
if key |
|
pre_111[key][gem_version["platform"]] += gem_version["downloads_count"] |
|
pre_111[key]["total"] += gem_version["downloads_count"] |
|
end |
|
end |
|
|
|
downloads.sort_by { |maj_min, archs| maj_min }.each do |maj_min, archs| |
|
if PRINT_COUNTS |
|
printf("# v%-13s %11s / %s\n", maj_min, print_int(archs["total"]), date_first[maj_min]) |
|
else |
|
printf("# v%-13s %s\n", maj_min, date_first[maj_min]) |
|
end |
|
print_archs_table(archs) |
|
puts |
|
end |
|
|
|
pre_111.each do |version, archs| |
|
if PRINT_COUNTS |
|
printf("# %-13s %11s\n", version, print_int(archs["total"])) |
|
else |
|
printf("# %-13s\n", version) |
|
end |
|
print_archs_table(archs) |
|
puts |
|
end |