Add ChroniDurationAttribute concern

This commit is contained in:
Tomasz Maczukin 2018-02-21 01:09:59 +01:00
parent 3c23cefae0
commit a4ea9a93db
No known key found for this signature in database
GPG Key ID: 7E9EB2E4B0F625CD
3 changed files with 56 additions and 0 deletions

View File

@ -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.

View File

@ -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

View File

@ -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