From 10dbb59c52dc5d99a88d14fec0330d00139245f2 Mon Sep 17 00:00:00 2001 From: mo khan Date: Tue, 21 Dec 2021 09:17:42 -0700 Subject: initial commit --- github_score.rb | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 github_score.rb 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 -- cgit v1.2.3