lib/repeatable/schedule.rb in repeatable-1.0.0 vs lib/repeatable/schedule.rb in repeatable-1.1.0
- old
+ new
@@ -1,53 +1,67 @@
+# typed: strict
module Repeatable
class Schedule
+ extend T::Sig
+
+ sig { params(arg: Object).void }
def initialize(arg)
case arg
when Repeatable::Expression::Base
- @expression = arg
+ @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
+ sig { params(start_date: Object, end_date: Object).returns(T::Array[::Date]) }
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
+ sig { params(start_date: Object, include_start: T::Boolean, limit: Integer).returns(T.nilable(::Date)) }
def next_occurrence(start_date = Date.today, include_start: false, limit: 36525)
date = Conversions::Date(start_date)
return date if include_start && include?(date)
- 1.step do |i|
+ result = T.let(nil, T.nilable(Date))
+ 1.step(limit) do |i|
date = date.next_day
- break date if include?(date)
- break if i == limit.to_i
+ if include?(date)
+ result = date
+ break
+ end
end
+ result
end
+ sig { params(date: Object).returns(T::Boolean) }
def include?(date = Date.today)
date = Conversions::Date(date)
expression.include?(date)
end
+ sig { returns(T::Hash[Symbol, T.any(Types::SymbolHash, T::Array[Types::SymbolHash])]) }
def to_h
expression.to_h
end
+ sig { params(other: Object).returns(T::Boolean) }
def ==(other)
other.is_a?(self.class) && expression == other.expression
end
protected
+ sig { returns(Expression::Base) }
attr_reader :expression
end
end