summaryrefslogtreecommitdiff
path: root/github_score.rb
diff options
context:
space:
mode:
Diffstat (limited to 'github_score.rb')
-rw-r--r--github_score.rb90
1 files changed, 90 insertions, 0 deletions
diff --git a/github_score.rb b/github_score.rb
new file mode 100644
index 0000000..c7e8ff5
--- /dev/null
+++ b/github_score.rb
@@ -0,0 +1,90 @@
+#!/usr/bin/env ruby
+
+require 'net/http'
+require 'uri'
+require 'json'
+require 'rspec/autorun'
+
+class GithubScore
+ def initialize(handle)
+ @handle = handle
+ end
+
+ def score
+ events = get_events
+ get_score(events)
+ end
+
+ def build_url
+ "https://api.github.com/users/#{@handle}/events/public"
+ end
+
+ def get_events
+ begin
+ response = get_user_events
+ response_body = JSON.parse(response.body)
+ if response_body.is_a? Array
+ return response_body
+ elsif response_body.key?("message")
+ raise Exception.new response_body["message"]
+ else
+ raise Exception.new "Unknown error"
+ end
+ rescue Exception => e
+ puts "Request failed with #{e.message}"
+ rescue Timeout::Error => e
+ puts "Request timed out"
+ end
+ end
+
+ def get_score(events)
+ grouped = events.group_by{|h| h["type"]}.values
+ score = grouped.map { |g|
+ event_type = g.first["type"].strip
+ event_score = scoring_params[event_type] || 1
+ event_score * g.count
+ }.sum
+ score
+ end
+
+ def get_user_events
+ uri = URI.parse(build_url)
+ response = Net::HTTP.get_response(uri)
+ response
+ end
+
+ def scoring_params
+ scoring_params = {
+ "IssuesEvent" => 1,
+ "IssueCommentEvent" => 2,
+ "PushEvent" => 3,
+ "PullRequestReviewCommentEvent" => 4,
+ "WatchEvent" => 5,
+ "CreateEvent" => 6
+ }
+ end
+end
+
+
+RSpec.describe GithubScore do
+ describe "#score" do
+ context "when ?" do
+ subject(:github_score) { GithubScore.new("tenderlove") }
+
+ before do
+ response = Net::HTTPResponse.new(1, 2, 3)
+ response.instance_variable_set(:@read, true)
+ response.body = [
+ {type: 'PushEvent'},
+ {type: 'IssuesEvent'},
+ ].to_json
+ end
+
+ it 'computes a score' do
+ allow(github_score).to receive(:get_user_events).and_return(response)
+
+ expect(github_score.score).to eq(13)
+ end
+ end
+ end
+end