58 lines
1 KiB
Ruby
58 lines
1 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Gitlab
|
||
|
module Ci
|
||
|
module Build
|
||
|
class DurationParser
|
||
|
def self.validate_duration(value)
|
||
|
new(value).validate_duration
|
||
|
end
|
||
|
|
||
|
def initialize(value)
|
||
|
@value = value
|
||
|
end
|
||
|
|
||
|
def validate_duration
|
||
|
return true if never?
|
||
|
|
||
|
cached_parse
|
||
|
end
|
||
|
|
||
|
def seconds_from_now
|
||
|
parse&.seconds&.from_now
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
attr_reader :value
|
||
|
|
||
|
def cached_parse
|
||
|
return validation_cache[value] if validation_cache.key?(value)
|
||
|
|
||
|
validation_cache[value] = safe_parse
|
||
|
end
|
||
|
|
||
|
def safe_parse
|
||
|
parse
|
||
|
rescue ChronicDuration::DurationParseError
|
||
|
false
|
||
|
end
|
||
|
|
||
|
def parse
|
||
|
return if never?
|
||
|
|
||
|
ChronicDuration.parse(value)
|
||
|
end
|
||
|
|
||
|
def validation_cache
|
||
|
Gitlab::SafeRequestStore[:ci_expire_in_parser_cache] ||= {}
|
||
|
end
|
||
|
|
||
|
def never?
|
||
|
value.to_s.casecmp('never') == 0
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|