From 1da7737f8970000fc7bd592c19aa6c647d49c347 Mon Sep 17 00:00:00 2001 From: mo khan Date: Tue, 21 Dec 2021 10:04:34 -0700 Subject: refactor: move files to lib/spec/bin --- lib/shogun.rb | 5 +++++ lib/shogun/github_score.rb | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 lib/shogun.rb create mode 100644 lib/shogun/github_score.rb (limited to 'lib') diff --git a/lib/shogun.rb b/lib/shogun.rb new file mode 100644 index 0000000..818e0a5 --- /dev/null +++ b/lib/shogun.rb @@ -0,0 +1,5 @@ +require "net/http" +require "uri" +require "json" + +require "shogun/github_score" diff --git a/lib/shogun/github_score.rb b/lib/shogun/github_score.rb new file mode 100644 index 0000000..48947a0 --- /dev/null +++ b/lib/shogun/github_score.rb @@ -0,0 +1,51 @@ +module Shogun + class UserNotFound < ArgumentError + end + + class GithubScore + DEFAULT_POINTS = { + "IssuesEvent" => 1, + "IssueCommentEvent" => 2, + "PushEvent" => 3, + "PullRequestReviewCommentEvent" => 4, + "WatchEvent" => 5, + "CreateEvent" => 6 + }.freeze + + def initialize(handle, points: DEFAULT_POINTS) + @handle = handle + @points = points + end + + def score + calculate_score_for(events) + end + + private + + attr_reader :points, :handle + + def build_url + "https://api.github.com/users/#{handle}/events/public" + end + + def events + response = Net::HTTP.get_response(URI.parse(build_url)) + raise UserNotFound.new(handle) if response.code == "404" + + JSON.parse(response.body) + end + + def calculate_score_for(events) + grouped = events.group_by { |h| h["type"] }.values + score = grouped.map { |g| + event_type = g.first["type"].strip + event_score = points[event_type] || 1 + event_score * g.count + }.sum + score + end + end + + +end -- cgit v1.2.3