From 3a68c98973c2c17e0c6e57184c4b2605a2dd274e Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Tue, 6 Sep 2016 19:14:28 +0800 Subject: [PATCH] Just use module because there's nothing to save, feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/6084#note_14992064 --- lib/gitlab/ci/pipeline_duration.rb | 24 ++++++++------------ spec/lib/gitlab/ci/pipeline_duration_spec.rb | 8 +++---- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/lib/gitlab/ci/pipeline_duration.rb b/lib/gitlab/ci/pipeline_duration.rb index 9fe4996fc09..0333807263f 100644 --- a/lib/gitlab/ci/pipeline_duration.rb +++ b/lib/gitlab/ci/pipeline_duration.rb @@ -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? diff --git a/spec/lib/gitlab/ci/pipeline_duration_spec.rb b/spec/lib/gitlab/ci/pipeline_duration_spec.rb index a160c0a6e39..580af97bea7 100644 --- a/spec/lib/gitlab/ci/pipeline_duration_spec.rb +++ b/spec/lib/gitlab/ci/pipeline_duration_spec.rb @@ -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