iCal integration does not work for indefinitely recurring events

Environment

Discourse Version: 3.4.0.beta1-dev

Plugin Commit: 0.5.9 efb044d

Steps to Reproduce

Use Google Calendar to create a recurring event (weekly on Wednesday, perhaps)
Follow Events documentation to integrate it into Events
Sync — look at Log. Nothing.

Alternatively, set up your event to have a definite number of events
Integrate
Sync — look at Log. Good to go!

Example

https://i.imgur.com/sMKcN6T.png

Image of log before and after deleting all instances of indefinitely recurring events.

Logs

Message (43 copies reported)

Job exception: All recurrence rules must specify .until or .count to use `all_occurrences’

Backtrace

/var/www/discourse/plugins/discourse-events/gems/3.3.3/gems/ice_cube-0.16.4/lib/ice_cube/schedule.rb:481:in require_terminating_rules' /var/www/discourse/plugins/discourse-events/gems/3.3.3/gems/ice_cube-0.16.4/lib/ice_cube/schedule.rb:155:in all_occurrences’
/var/www/discourse/plugins/discourse-events/gems/3.3.3/gems/icalendar-recurrence-1.1.3/lib/icalendar/recurrence/schedule.rb:44:in all_occurrences' /var/www/discourse/plugins/discourse-events/gems/3.3.3/gems/omnievent-icalendar-0.1.0.pre5/lib/omnievent/strategies/icalendar.rb:150:in extract_occurences’
/var/www/discourse/plugins/discourse-events/gems/3.3.3/gems/omnievent-icalendar-0.1.0.pre5/lib/omnievent/strategies/icalendar.rb:124:in block in expand_recurrences' /var/www/discourse/plugins/discourse-events/gems/3.3.3/gems/omnievent-icalendar-0.1.0.pre5/lib/omnievent/strategies/icalendar.rb:119:in each’
/var/www/discourse/plugins/discourse-events/gems/3.3.3/gems/omnievent-icalendar-0.1.0.pre5/lib/omnievent/strategies/icalendar.rb:119:in expand_recurrences' /var/www/discourse/plugins/discourse-events/gems/3.3.3/gems/omnievent-icalendar-0.1.0.pre5/lib/omnievent/strategies/icalendar.rb:37:in raw_events’
/var/www/discourse/plugins/discourse-events/gems/3.3.3/gems/omnievent-0.1.0.pre3/lib/omnievent/strategy.rb:162:in list_events' /var/www/discourse/plugins/discourse-events/gems/3.3.3/gems/omnievent-0.1.0.pre3/lib/omnievent/strategy.rb:144:in request’
/var/www/discourse/plugins/discourse-events/gems/3.3.3/gems/omnievent-0.1.0.pre3/lib/omnievent.rb:62:in list_events' /var/www/discourse/plugins/discourse-events/lib/discourse_events/import_manager.rb:21:in import’
/var/www/discourse/plugins/discourse-events/lib/discourse_events/import_manager.rb:75:in import' /var/www/discourse/plugins/discourse-events/lib/discourse_events/import_manager.rb:81:in import_source’
/var/www/discourse/plugins/discourse-events/app/jobs/discourse_events/regular/import_source.rb:6:in execute' /var/www/discourse/app/jobs/base.rb:307:in block (2 levels) in perform’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in with_connection' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in with_connection’
/var/www/discourse/app/jobs/base.rb:294:in block in perform' /var/www/discourse/app/jobs/base.rb:290:in each’
/var/www/discourse/app/jobs/base.rb:290:in perform' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:202:in execute_job’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:170:in block (2 levels) in process' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:177:in block in invoke’
/var/www/discourse/lib/sidekiq/pausable.rb:132:in call' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:179:in block in invoke’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:182:in invoke' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:169:in block in process’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:136:in block (6 levels) in dispatch' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_retry.rb:113:in local’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:135:in block (5 levels) in dispatch' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq.rb:44:in block in module:Sidekiq
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:131:in block (4 levels) in dispatch' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:263:in stats’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:126:in block (3 levels) in dispatch' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_logger.rb:13:in call’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:125:in block (2 levels) in dispatch' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_retry.rb:80:in global’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:124:in block in dispatch' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_logger.rb:39:in prepare’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:123:in dispatch' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:168:in process’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:78:in process_one' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:68:in run’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/component.rb:8:in watchdog' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/component.rb:17:in block in safe_thread’

It is pretty understandable that the plugin struggles with an infinite number of future events! But it really needs to be able to, as most users tend to put in open-ended recurrences and worry about that side of things later.

Therefore, I’ve made this an issue as it is really a bug.

Of interest, what do you have this setting on?

(forgive the misspelling of ‘separate’!)