Skip to content
Snippets Groups Projects
Commit f713c6cc authored by Stan Hu's avatar Stan Hu
Browse files

Merge branch '264198-can-t-set-never-as-an-environment-auto_stop_in-value-2' into 'master'

Refactor `ExpireInParser` to `DurationParser`

See merge request !90718
parents 13b9865f b0e77117
No related branches found
No related tags found
1 merge request!90718Refactor `ExpireInParser` to `DurationParser`
Pipeline #572702222 passed with warnings
Pipeline: GitLab

#572714399

    ......@@ -322,7 +322,7 @@ def expire_in
    def expire_in=(value)
    self.expire_at =
    if value
    ::Gitlab::Ci::Build::Artifacts::ExpireInParser.new(value).seconds_from_now
    ::Gitlab::Ci::Build::DurationParser.new(value).seconds_from_now
    end
    end
    ......
    # frozen_string_literal: true
    module Gitlab
    module Ci
    module Build
    module Artifacts
    class ExpireInParser
    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
    end
    # 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
    ......@@ -42,7 +42,7 @@ class Artifacts < ::Gitlab::Config::Entry::Node
    inclusion: { in: %w[on_success on_failure always],
    message: 'should be on_success, on_failure ' \
    'or always' }
    validates :expire_in, duration: { parser: ::Gitlab::Ci::Build::Artifacts::ExpireInParser }
    validates :expire_in, duration: { parser: ::Gitlab::Ci::Build::DurationParser }
    end
    end
    ......
    ......@@ -2,7 +2,7 @@
    require 'spec_helper'
    RSpec.describe Gitlab::Ci::Build::Artifacts::ExpireInParser do
    RSpec.describe Gitlab::Ci::Build::DurationParser do
    describe '.validate_duration', :request_store do
    subject { described_class.validate_duration(value) }
    ......
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment