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:
parent
b92c75ab98
commit
3a68c98973
|
@ -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?
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue