From a4ea9a93db98461479dcb8e1d7b8425a77018f1e Mon Sep 17 00:00:00 2001 From: Tomasz Maczukin Date: Wed, 21 Feb 2018 01:09:59 +0100 Subject: [PATCH] Add ChroniDurationAttribute concern --- app/models/ci/runner.rb | 3 ++ .../concerns/chronic_duration_attribute.rb | 25 +++++++++++++++++ .../chronic_duration_attribute_spec.rb | 28 +++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 app/models/concerns/chronic_duration_attribute.rb create mode 100644 spec/models/concerns/chronic_duration_attribute_spec.rb diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb index be15fb0f729..cf91ed3c9dc 100644 --- a/app/models/ci/runner.rb +++ b/app/models/ci/runner.rb @@ -3,6 +3,7 @@ module Ci extend Gitlab::Ci::Model include Gitlab::SQL::Pattern include RedisCacheable + include ChronicDurationAttribute RUNNER_QUEUE_EXPIRY_TIME = 60.minutes ONLINE_CONTACT_TIMEOUT = 1.hour @@ -51,6 +52,8 @@ module Ci cached_attr_reader :version, :revision, :platform, :architecture, :contacted_at, :ip_address + chronic_duration_attribute :job_upper_timeout_user_readable, :job_upper_timeout + # Searches for runners matching the given query. # # This method uses ILIKE on PostgreSQL and LIKE on MySQL. diff --git a/app/models/concerns/chronic_duration_attribute.rb b/app/models/concerns/chronic_duration_attribute.rb new file mode 100644 index 00000000000..2bf33174640 --- /dev/null +++ b/app/models/concerns/chronic_duration_attribute.rb @@ -0,0 +1,25 @@ +module ChronicDurationAttribute + extend ActiveSupport::Concern + + class_methods do + def chronic_duration_attribute(virtual_attribute, source_attribute) + chronic_duration_attribute_reader(virtual_attribute, source_attribute) + chronic_duration_attribute_writer(virtual_attribute, source_attribute) + end + + def chronic_duration_attribute_reader(virtual_attribute, source_attribute) + define_method(virtual_attribute) do + value = self.send(source_attribute) # rubocop:disable GitlabSecurity/PublicSend + ChronicDuration.output(value, format: :short) unless value.nil? + end + end + + def chronic_duration_attribute_writer(virtual_attribute, source_attribute) + define_method("#{virtual_attribute}=") do |value| + new_value = ChronicDuration.parse(value).to_i + self.send("#{source_attribute}=", new_value) # rubocop:disable GitlabSecurity/PublicSend + new_value + end + end + end +end diff --git a/spec/models/concerns/chronic_duration_attribute_spec.rb b/spec/models/concerns/chronic_duration_attribute_spec.rb new file mode 100644 index 00000000000..1a352537aaf --- /dev/null +++ b/spec/models/concerns/chronic_duration_attribute_spec.rb @@ -0,0 +1,28 @@ +require 'spec_helper' + +shared_examples 'ChronicDurationAttribute' do + describe 'dynamically defined methods' do + it { expect(subject.class).to be_public_method_defined(virtual_field) } + it { expect(subject.class).to be_public_method_defined("#{virtual_field}=") } + + it 'parses chronic duration input' do + subject.send("#{virtual_field}=", "10m") + + expect(subject.send(source_field)).to eq(600) + end + + it 'outputs chronic duration formated value' do + subject.send("#{source_field}=", 120) + + expect(subject.send(virtual_field)).to eq('2m') + end + end +end + +describe 'ChronicDurationAttribute' do + let(:source_field) { :maximum_job_timeout } + let(:virtual_field) { :maximum_job_timeout_user_readable } + subject { Ci::Runner.new } + + it_behaves_like 'ChronicDurationAttribute' +end