diff --git a/lib/rrule/humanizer.rb b/lib/rrule/humanizer.rb index a1bf244..88b579e 100644 --- a/lib/rrule/humanizer.rb +++ b/lib/rrule/humanizer.rb @@ -48,7 +48,7 @@ def to_s raise 'Implement Until' if until_option if count_option - add 'for' + add 'for' unless subdaily? add count_option add plural?(count_option) ? 'times' : 'time' end @@ -89,6 +89,25 @@ def plural?(num) num.to_i % 100 != 1 end + def subdaily? + %w[HOURLY MINUTELY SECONDLY].include?(freq_option) + end + + def hourly + add interval_option if interval_option != 1 + add plural?(interval_option) ? 'hours' : 'hour' + end + + def minutely + add interval_option if interval_option != 1 + add plural?(interval_option) ? 'minutes' : 'minute' + end + + def secondly + add interval_option if interval_option != 1 + add plural?(interval_option) ? 'seconds' : 'second' + end + def daily add interval_option if interval_option != 1 diff --git a/spec/rule_spec.rb b/spec/rule_spec.rb index 3bcddb6..d3c0d77 100644 --- a/spec/rule_spec.rb +++ b/spec/rule_spec.rb @@ -2824,6 +2824,60 @@ it { expect(rrule.humanize).to eq 'every month on the 14th and 15th' } end + + context 'every hour' do + let(:rule) { 'FREQ=HOURLY;INTERVAL=1' } + + it { expect(rrule.humanize).to eq 'every hour' } + end + + context 'every 2 hours' do + let(:rule) { 'FREQ=HOURLY;INTERVAL=2' } + + it { expect(rrule.humanize).to eq 'every 2 hours' } + end + + context 'every 2 hours 5 times' do + let(:rule) { 'FREQ=HOURLY;INTERVAL=2;COUNT=5' } + + it { expect(rrule.humanize).to eq 'every 2 hours 5 times' } + end + + context 'every minute' do + let(:rule) { 'FREQ=MINUTELY;INTERVAL=1' } + + it { expect(rrule.humanize).to eq 'every minute' } + end + + context 'every 30 minutes' do + let(:rule) { 'FREQ=MINUTELY;INTERVAL=30' } + + it { expect(rrule.humanize).to eq 'every 30 minutes' } + end + + context 'every 15 minutes 10 times' do + let(:rule) { 'FREQ=MINUTELY;INTERVAL=15;COUNT=10' } + + it { expect(rrule.humanize).to eq 'every 15 minutes 10 times' } + end + + context 'every second' do + let(:rule) { 'FREQ=SECONDLY;INTERVAL=1' } + + it { expect(rrule.humanize).to eq 'every second' } + end + + context 'every 30 seconds' do + let(:rule) { 'FREQ=SECONDLY;INTERVAL=30' } + + it { expect(rrule.humanize).to eq 'every 30 seconds' } + end + + context 'every hour 1 time' do + let(:rule) { 'FREQ=HOURLY;INTERVAL=1;COUNT=1' } + + it { expect(rrule.humanize).to eq 'every hour 1 time' } + end end describe '#is_finite?' do