Sha256: 9a6dfeef30d741961439f9680e23d68d34a12682b5596eb65b1cd28ef399d1c1

Contents?: true

Size: 1.12 KB

Versions: 1

Compression:

Stored size: 1.12 KB

Contents

require 'active_support/core_ext/string/inflections'

module Repeatable
  class Schedule
    def initialize(arg)
      case arg
      when Repeatable::Expression::Base
        @expression = arg
      when Hash
        @expression = Parser.call(arg)
      else
        fail(ParseError, "Can't build a Repeatable::Schedule from #{arg.class}")
      end
    end

    def occurrences(start_date, end_date)
      start_date = Date(start_date)
      end_date = Date(end_date)

      fail(ArgumentError, 'end_date must be equal to or after start_date') if end_date < start_date

      (start_date..end_date).select { |date| include?(date) }
    end

    def next_occurrence(start_date = Date.today, include_start: false, limit: 36525)
      date = Date(start_date)

      return date if include_start && include?(date)

      1.step do |i|
        date = date.next_day

        break date if include?(date)
        break if i == limit.to_i
      end
    end

    def include?(date = Date.today)
      date = Date(date)
      expression.include?(date)
    end

    def to_h
      expression.to_h
    end

    private

    attr_reader :expression
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
repeatable-0.3.0 lib/repeatable/schedule.rb