class Repeatable::Schedule

Attributes

expression[R]

Public Class Methods

new(arg) click to toggle source
# File lib/repeatable/schedule.rb, line 8
def initialize(arg)
  case arg
  when Repeatable::Expression::Base
    @expression = T.let(arg, Expression::Base)
  when Hash
    @expression = Parser.call(arg)
  else
    fail(ParseError, "Can't build a Repeatable::Schedule from #{arg.class}")
  end
end

Public Instance Methods

==(other) click to toggle source
# File lib/repeatable/schedule.rb, line 64
def ==(other)
  other.is_a?(self.class) && expression == other.expression
end
deconstruct_keys(_keys) click to toggle source
# File lib/repeatable/schedule.rb, line 59
def deconstruct_keys(_keys)
  to_h
end
include?(date = Date.today) click to toggle source
# File lib/repeatable/schedule.rb, line 48
def include?(date = Date.today)
  date = Conversions::Date(date)
  expression.include?(date)
end
next_occurrence(start_date = Date.today, include_start: false, limit: 36525) click to toggle source
# File lib/repeatable/schedule.rb, line 30
def next_occurrence(start_date = Date.today, include_start: false, limit: 36525)
  date = Conversions::Date(start_date)

  return date if include_start && include?(date)

  result = T.let(nil, T.nilable(Date))
  1.step(limit) do |i|
    date = date.next_day

    if include?(date)
      result = date
      break
    end
  end
  result
end
occurrences(start_date, end_date) click to toggle source
# File lib/repeatable/schedule.rb, line 20
def occurrences(start_date, end_date)
  start_date = Conversions::Date(start_date)
  end_date = Conversions::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
to_h() click to toggle source
# File lib/repeatable/schedule.rb, line 54
def to_h
  expression.to_h
end