#!/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