Just use module because there's nothing to save, feedback:

https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/6084#note_14992064
This commit is contained in:
Lin Jen-Shin 2016-09-06 19:14:28 +08:00
parent b92c75ab98
commit 3a68c98973
2 changed files with 14 additions and 18 deletions

View File

@ -2,7 +2,7 @@ module Gitlab
module Ci
# # Introduction - total running time
#
# The problem this class is trying to solve is finding the total running
# The problem this module is trying to solve is finding the total running
# time amongst all the jobs, excluding retries and pending (queue) time.
# We could reduce this problem down to finding the union of periods.
#
@ -76,7 +76,9 @@ module Gitlab
# (4 - 1) + (7 - 6) => 4
#
# That is 4 is the answer in the example.
class PipelineDuration
module PipelineDuration
extend self
PeriodStruct = Struct.new(:first, :last)
class Period < PeriodStruct
def duration
@ -84,33 +86,27 @@ module Gitlab
end
end
def self.from_pipeline(pipeline)
def from_pipeline(pipeline)
status = %w[success failed running canceled]
builds = pipeline.builds.latest.where(status: status)
from_builds(builds, :started_at, :finished_at).duration
from_builds(builds, :started_at, :finished_at)
end
def self.from_builds(builds, from, to, now = Time.now)
def from_builds(builds, from, to, now = Time.now)
periods = builds.map do |b|
Period.new(b.public_send(from) || now, b.public_send(to) || now)
end
new(periods)
from_periods(periods)
end
attr_reader :duration
def initialize(periods)
process(periods.sort_by(&:first))
def from_periods(periods)
process_duration(process_periods(periods.sort_by(&:first)))
end
private
def process(periods)
@duration = process_duration(process_periods(periods))
end
def process_periods(periods)
return periods if periods.empty?

View File

@ -1,11 +1,11 @@
require 'spec_helper'
describe Gitlab::Ci::PipelineDuration do
let(:calculator) { create_calculator(data) }
let(:calculated_duration) { calculate(data) }
shared_examples 'calculating duration' do
it do
expect(calculator.duration).to eq(duration)
expect(calculated_duration).to eq(duration)
end
end
@ -105,11 +105,11 @@ describe Gitlab::Ci::PipelineDuration do
it_behaves_like 'calculating duration'
end
def create_calculator(data)
def calculate(data)
periods = data.shuffle.map do |(first, last)|
Gitlab::Ci::PipelineDuration::Period.new(first, last)
end
Gitlab::Ci::PipelineDuration.new(periods)
Gitlab::Ci::PipelineDuration.from_periods(periods)
end
end