DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’»

DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’» is a community of 967,911 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

Create account Log in
Cover image for Are you the next (Ruby) Thanos?
Davide Santangelo
Davide Santangelo

Posted on

Are you the next (Ruby) Thanos?

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!

Top comments (2)

Collapse
 
amit_savani profile image
Amit Patel

It should have some weightage on if gem is maintained or not, probably based on recent pr or commits.

Collapse
 
daviducolo profile image
Davide Santangelo Author

Of course! Thanks for the feedback. Obviously as explained it is a script written in a short time that does not take into account various factors, but thanks I'll keep it in mind.

Google Cloud Superstar

Use your favorite Google Cloud APIs with MongoDB Atlas to build a highly-scalable modern application for your entry in the DEV x MongoDB Atlas Hackathon 2022.

β†’ Get Started