Skip to content

Commit

Permalink
refactor: extract Runner class to avoid issue class variables
Browse files Browse the repository at this point in the history
  • Loading branch information
markokajzer committed Feb 11, 2024
1 parent 12b7d02 commit 800783c
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 57 deletions.
53 changes: 2 additions & 51 deletions lib/code_review_leaderboard.rb
Original file line number Diff line number Diff line change
@@ -1,14 +1,6 @@
require_relative "code_review_leaderboard/version"

require_relative "async/wait_all_throttled"

require "code_review_leaderboard/config"
require "code_review_leaderboard/formatter"
require "code_review_leaderboard/organization"
require "code_review_leaderboard/pulls"
require "code_review_leaderboard/repository"
require "code_review_leaderboard/reviews"
require "code_review_leaderboard/spinner"
require_relative "code_review_leaderboard/runner"

module CodeReviewLeaderboard
extend self
Expand All @@ -20,46 +12,5 @@ def initialize!
raise ConfigurationError, "Repository or owner is required" if Config.repositories.empty? && Config.organization.blank?
end

def start
puts Formatter.new(reviews).to_table
end

private

def repositories
@@repositories ||= if Config.repositories.present?
Config.repositories.map { Repository.new(name: _1) }
else
Spinner.start do
Spinner.status = "Fetching repos for #{Config.organization}..."
Organization.new(name: Config.organization).repos
.tap { Spinner.status = "Found #{_1.size} repositories." }
end
end
end
alias_method :load_repositories, :repositories

def pulls
# Load before we enter the next spinner so we do not end up nesting them
load_repositories

@@pulls ||= Spinner.start do
Spinner.status = "Fetching pull requests..."

WaitAllThrottled(repositories) { _1.pulls }
.tap { Spinner.status = "Found #{_1.size} pull requests." }
end
end
alias_method :load_pulls, :pulls

def reviews
load_pulls

@@reviews ||= Spinner.start do
Spinner.status = "Fetching reviews..."

WaitAllThrottled(pulls) { Reviews.for(pull: _1) }
.tap { Spinner.status = "Found #{_1.size} reviews.\n" }
end
end
delegate :start, to: Runner
end
62 changes: 62 additions & 0 deletions lib/code_review_leaderboard/runner.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
require "async/wait_all_throttled"

require_relative "config"
require_relative "formatter"
require_relative "organization"
require_relative "pulls"
require_relative "repository"
require_relative "reviews"
require_relative "spinner"

module CodeReviewLeaderboard
class Runner
class << self
def start
new.start
end
end

def start
puts Formatter.new(reviews).to_table
end

private

def repositories
@repositories ||= if Config.repositories.present?
Config.repositories.map { Repository.new(name: _1) }
else
Spinner.start do
Spinner.status = "Fetching repos for #{Config.organization}..."
Organization.new(name: Config.organization).repos
.tap { Spinner.status = "Found #{_1.size} repositories." }
end
end
end
alias_method :load_repositories, :repositories

def pulls
# Load before we enter the next spinner so we do not end up nesting them
load_repositories

@pulls ||= Spinner.start do
Spinner.status = "Fetching pull requests..."

WaitAllThrottled(repositories) { _1.pulls }
.tap { Spinner.status = "Found #{_1.size} pull requests." }
end
end
alias_method :load_pulls, :pulls

def reviews
load_pulls

@reviews ||= Spinner.start do
Spinner.status = "Fetching reviews..."

WaitAllThrottled(pulls) { Reviews.for(pull: _1) }
.tap { Spinner.status = "Found #{_1.size} reviews.\n" }
end
end
end
end
6 changes: 0 additions & 6 deletions spec/code_review_leaderboard_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,6 @@
CodeReviewLeaderboard::Config.access_token = "token"
end

after do
described_class.class_variables.each do |variable|
described_class.class_variable_set(variable, nil)
end
end

context "with repository" do
let(:repository) { CodeReviewLeaderboard::Repository.new(name: "rails/rails") }

Expand Down

0 comments on commit 800783c

Please sign in to comment.