rossta / montrose

Recurring events library for Ruby. Enumerable recurrence objects and convenient chainable interface.
https://rossta.net/montrose/
MIT License
842 stars 52 forks source link

Infinite loop when passing ActiveSupport::TimeWithZone as at: attribute #166

Open tomchipchase opened 8 months ago

tomchipchase commented 8 months ago

The following example code causes an infinite loop and a stack level too deep error:

Montrose.weekly(
  on: [:sunday], 
  between: Date.new(2024, 1, 1)..Date.new(2024, 1, 7), 
  at: Time.zone.parse("2000-01-01 21:00")
)

It looks like the problem is here: https://github.com/rossta/montrose/blob/main/lib/montrose/options.rb#L278

A TimeWithZone passed to Array is split into its constituent parts:

Array(Time.zone.parse("2000-01-01 21:00"))
=> [0, 0, 21, 1, 1, 2000, 6, 1, false, "UTC"]

Whereas with a DateTime, for example, we would get:

Array(DateTime.parse("2000-01-01 21:00"))                                                                    
=> [Sat, 01 Jan 2000 21:00:00 +0000]

(We're obviously able to work around this by converting the TimeWithZone to another object before passing it to montrose).

rossta commented 3 months ago

Thank you for the report. I haven’t had the chance to look into this yet. PRs are welcome!