diff options
| author | mo khan <mo@mokhan.ca> | 2021-12-21 09:17:42 -0700 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2021-12-21 09:17:42 -0700 |
| commit | 10dbb59c52dc5d99a88d14fec0330d00139245f2 (patch) | |
| tree | de38025e934b970661228760dfdf1077df2205b2 /github_score.rb | |
initial commit
Diffstat (limited to 'github_score.rb')
| -rw-r--r-- | github_score.rb | 90 |
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 |
