Sha256: 5efcf4e56642a1cec3395b5c51acf6a738d5ec3790369b00d7dda1ca07fdd1bd

Contents?: true

Size: 1.86 KB

Versions: 8

Compression:

Stored size: 1.86 KB

Contents

# frozen_string_literal: true

require "montrose/errors"
require "montrose/options"

module Montrose
  # Abstract class for special recurrence rule required
  # in all instances of Recurrence. Frequency describes
  # the base recurrence interval.
  #
  class Frequency
    include Montrose::Rule

    FREQUENCY_TERMS = {
      "second" => "Secondly",
      "minute" => "Minutely",
      "hour" => "Hourly",
      "day" => "Daily",
      "week" => "Weekly",
      "month" => "Monthly",
      "year" => "Yearly"
    }.freeze

    FREQUENCY_KEYS = FREQUENCY_TERMS.keys.freeze

    attr_reader :time, :starts

    # Factory method for instantiating the appropriate Frequency
    # subclass.
    #
    def self.from_options(opts)
      frequency = opts.fetch(:every) { fail ConfigurationError, "Please specify the :every option" }
      class_name = FREQUENCY_TERMS.fetch(frequency.to_s) do
        fail "Don't know how to enumerate every: #{frequency}"
      end

      Montrose::Frequency.const_get(class_name).new(opts)
    end

    # @private
    def self.assert(frequency)
      FREQUENCY_TERMS.key?(frequency.to_s) or fail ConfigurationError,
        "Don't know how to enumerate every: #{frequency}"

      frequency.to_sym
    end

    def initialize(opts = {})
      opts = Montrose::Options.merge(opts)
      @time = nil
      @starts = opts.fetch(:start_time)
      @interval = opts.fetch(:interval)
    end

    def matches_interval?(time_diff)
      (time_diff % @interval).zero?
    end

    def to_cron
      raise "abstract"
    end

    protected

    def interval_str
      @interval != 1 ? "*/#{@interval}" : "*"
    end
  end
end

require "montrose/frequency/daily"
require "montrose/frequency/hourly"
require "montrose/frequency/minutely"
require "montrose/frequency/monthly"
require "montrose/frequency/secondly"
require "montrose/frequency/weekly"
require "montrose/frequency/yearly"

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
montrose-0.11.2 lib/montrose/frequency.rb
montrose-0.11.1 lib/montrose/frequency.rb
montrose-0.11.0 lib/montrose/frequency.rb
montrose-0.10.1 lib/montrose/frequency.rb
montrose-0.10.0 lib/montrose/frequency.rb
montrose-0.9.0 lib/montrose/frequency.rb
montrose-0.8.2 lib/montrose/frequency.rb
montrose-0.8.1 lib/montrose/frequency.rb