summaryrefslogtreecommitdiff
path: root/lib/gitlab/ci/cron_parser.rb
blob: a3cc350ef2204c49c7a11e99487d5ccb06d9737b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
module Gitlab
  module Ci
    class CronParser
      VALID_SYNTAX_SAMPLE_TIME_ZONE = 'UTC'.freeze
      VALID_SYNTAX_SAMPLE_CRON = '* * * * *'.freeze

      def initialize(cron, cron_timezone = 'UTC')
        @cron = cron
        @cron_timezone = cron_timezone
      end

      def next_time_from(time)
        @cron_line ||= try_parse_cron(@cron, @cron_timezone)
        @cron_line.next_time(time).in_time_zone(Time.zone) if @cron_line.present?
      end

      def cron_valid?
        try_parse_cron(@cron, VALID_SYNTAX_SAMPLE_TIME_ZONE).present?
      end

      def cron_timezone_valid?
        try_parse_cron(VALID_SYNTAX_SAMPLE_CRON, @cron_timezone).present?
      end

      private

      def try_parse_cron(cron, cron_timezone)
        Rufus::Scheduler.parse("#{cron} #{cron_timezone}")
      rescue
        # noop
      end
    end
  end
end