Are you the next (Ruby) Thanos?

Davide Santangelo - May 12 '20 - - Dev Community

for fun, I asked myself:

Is there a way to know who is the best Ruby gem maker on the planet? Who is entitled to the title of "Gemminator"?

so I decided to write a Ruby script to take some information and get a score.

Score

The score GS ( Gemminator Score ) is defined by the sum of two values. The RGS (RubyGems Score) and GHS (GitHub Score).

RGS

sum(downloads) + (1.0 - 1.0/count(gems))
Enter fullscreen mode Exit fullscreen mode

GHS

sum(stars + forks) + (1.0 - 1.0/count(repositories))
Enter fullscreen mode Exit fullscreen mode

GS

GS = RGS + GHS 
Enter fullscreen mode Exit fullscreen mode

OK! Let's start writing some code!

Gems

for data collection I use two gems that are:

Gems - Ruby wrapper for the RubyGems.org API https://rubygems.org
Octokit - Ruby toolkit for the GitHub API http://octokit.github.io/octokit.rb/

Script

you need a GitHub personal access token to avoid rate limit. A personal access token is a token you have generated (https://github.com/settings/tokens) that can be used to access the GitHub API.

  require 'octokit'
  require 'gems'

  downloads_count = 0
  stars_count = 0
  forks_count = 0

  client = Octokit::Client.new(access_token: ARGV[1])
  gems = Gems.gems(ARGV[0])

  downloads = gems.map do |gem| 
    gem['downloads']
  end
Enter fullscreen mode Exit fullscreen mode

fetch counters

downloads_count = downloads.sum

gems.select! do |gem| 
  gem['homepage_uri'].to_s.start_with? 'https://github.com'
end

github_repos = gems.map do |gem|
  client.repo(gem['homepage_uri'].split("/").last(2).join("/")) rescue nil
end.compact

github_repos.map do |repo|
  stars_count += repo.stargazers_count
  forks_count += repo.forks
end

Enter fullscreen mode Exit fullscreen mode

get results

rgs = downloads_count + (1.0 - 1.0 / gems.size)
ghs = stars_count + forks_count + (1.0 - 1.0 / github_repos.size)

gs = rgs + ghs
Enter fullscreen mode Exit fullscreen mode

Examples

ruby gemminator.rb <rubygem_username> <github_access_token>
Enter fullscreen mode Exit fullscreen mode

https://rubygems.org/profiles/davidesantangelo

➜ ruby gemminator.rb davidesantangelo <token>
110751.675
Enter fullscreen mode Exit fullscreen mode

https://rubygems.org/profiles/ankane

➜ ruby gemminator.rb ankane <token>
43355989.97872341
Enter fullscreen mode Exit fullscreen mode

https://rubygems.org/profiles/sferik

➜ ruby gemminator.rb sferik <token>
1519272118.937439
Enter fullscreen mode Exit fullscreen mode

Note

of course, it is a basic demo script without the management of all the exceptions/optimizations that can be found.

If you liked this post follow me on Twitter!

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player