ice_cube 0.16.2 → 0.16.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +5 -5
  2. data/config/locales/de.yml +1 -1
  3. data/config/locales/fr.yml +2 -2
  4. data/config/locales/it.yml +179 -0
  5. data/config/locales/nl.yml +133 -0
  6. data/config/locales/sv.yml +1 -1
  7. data/lib/ice_cube/i18n.rb +11 -12
  8. data/lib/ice_cube/input_alignment.rb +89 -0
  9. data/lib/ice_cube/null_i18n.rb +12 -6
  10. data/lib/ice_cube/occurrence.rb +25 -23
  11. data/lib/ice_cube/parsers/ical_parser.rb +8 -5
  12. data/lib/ice_cube/rule.rb +4 -11
  13. data/lib/ice_cube/rules/daily_rule.rb +9 -0
  14. data/lib/ice_cube/rules/hourly_rule.rb +9 -0
  15. data/lib/ice_cube/rules/minutely_rule.rb +9 -0
  16. data/lib/ice_cube/rules/monthly_rule.rb +9 -0
  17. data/lib/ice_cube/rules/secondly_rule.rb +9 -0
  18. data/lib/ice_cube/rules/weekly_rule.rb +10 -1
  19. data/lib/ice_cube/rules/yearly_rule.rb +9 -0
  20. data/lib/ice_cube/schedule.rb +10 -9
  21. data/lib/ice_cube/single_occurrence_rule.rb +4 -0
  22. data/lib/ice_cube/time_util.rb +26 -16
  23. data/lib/ice_cube/validated_rule.rb +10 -19
  24. data/lib/ice_cube/validations/count.rb +1 -2
  25. data/lib/ice_cube/validations/daily_interval.rb +5 -1
  26. data/lib/ice_cube/validations/day.rb +6 -2
  27. data/lib/ice_cube/validations/day_of_month.rb +5 -0
  28. data/lib/ice_cube/validations/hour_of_day.rb +23 -0
  29. data/lib/ice_cube/validations/hourly_interval.rb +2 -0
  30. data/lib/ice_cube/validations/minute_of_hour.rb +16 -0
  31. data/lib/ice_cube/validations/minutely_interval.rb +2 -0
  32. data/lib/ice_cube/validations/month_of_year.rb +5 -0
  33. data/lib/ice_cube/validations/monthly_interval.rb +4 -1
  34. data/lib/ice_cube/validations/schedule_lock.rb +4 -0
  35. data/lib/ice_cube/validations/second_of_minute.rb +19 -3
  36. data/lib/ice_cube/validations/secondly_interval.rb +2 -0
  37. data/lib/ice_cube/validations/until.rb +1 -2
  38. data/lib/ice_cube/validations/weekly_interval.rb +0 -2
  39. data/lib/ice_cube/version.rb +1 -1
  40. data/lib/ice_cube.rb +1 -3
  41. data/spec/spec_helper.rb +32 -9
  42. metadata +9 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 51dd94d70b0d51847c678abf736d395ddbee5e2e
4
- data.tar.gz: 2b69372e7e4e67487347cab5a8a773da40a87e91
2
+ SHA256:
3
+ metadata.gz: 6f736ccbe2ce60c734d37420278729ecf69b8fb9a31716aff0c2ca22df02020e
4
+ data.tar.gz: abda4a9eaad18bf0ff1f7a57056542dcffdc210fab6ba7634d0977893bb6decd
5
5
  SHA512:
6
- metadata.gz: d20e08c68105003f8a6c3f192c679d185c07e43681543844f890d00947d94d6c42d5e82a350e83cab506c74183bbd42eef2cb8d5deeab8f7979a819884221dff
7
- data.tar.gz: f1ab8c1b534dd70e185da9b272a973202cb071f29bd90cb2a31fa7d83d1b3f0e61c321d3d402e79e0059cf698374a0465dc954218de77afe0ac459cc0f990f47
6
+ metadata.gz: 474281dcabc90c8a25b5789b5a49dac347afbc89b7d1b31accb5d07fa4f8c1a5a8c440669b61733f49a24d5b7dae4ff5add7cf2e39831ca198dbbc3b524c9749
7
+ data.tar.gz: 00d8c976dc6b6513f3a6e3170ed0f7022fc7ea04bdb2d592dfb7ac7d29b2744d07bd4c21006f822f58ba05e4dfeb312c9dc97d35f521f69fefef485b9b06c8bb
@@ -141,7 +141,7 @@ de:
141
141
  day_names:
142
142
  - Sonntag
143
143
  - Montag
144
- - Dinstag
144
+ - Dienstag
145
145
  - Mittwoch
146
146
  - Donnerstag
147
147
  - Freitag
@@ -137,7 +137,7 @@ fr:
137
137
  - dimanche
138
138
  - lundi
139
139
  - mardi
140
- - mecredi
140
+ - mercredi
141
141
  - jeudi
142
142
  - vendredi
143
143
  - samedi
@@ -170,4 +170,4 @@ fr:
170
170
  default: "%a, %d %b %Y %H:%M:%S %z"
171
171
  long: "%d %B %Y %H:%M"
172
172
  short: "%d %b %H:%M"
173
- pm: pm
173
+ pm: pm
@@ -0,0 +1,179 @@
1
+ it:
2
+ ice_cube:
3
+ pieces_connector: ' / '
4
+ not: 'tranne %{target}'
5
+ not_on: 'tranne %{target}'
6
+ date:
7
+ formats:
8
+ default: '%-d. %B %Y'
9
+ month_names:
10
+ -
11
+ - gennaio
12
+ - febbraio
13
+ - marzo
14
+ - aprile
15
+ - maggio
16
+ - giugno
17
+ - luglio
18
+ - agosto
19
+ - settembre
20
+ - ottobre
21
+ - novembre
22
+ - dicembre
23
+ day_names:
24
+ - domenica
25
+ - lunedì
26
+ - martedì
27
+ - mercoledì
28
+ - giovedì
29
+ - venerdì
30
+ - sabato
31
+ times:
32
+ other: '%{count} volte'
33
+ one: '%{count} volta'
34
+ until: 'fino al %{date}'
35
+ days_of_week: '%{segments} %{day}'
36
+ days_of_month:
37
+ one: '%{segments} giorno del mese'
38
+ other: '%{segments} giorni del mese'
39
+ days_of_year:
40
+ one: "%{segments} giorno dell'anno"
41
+ other: "%{segments} giorni dell'anno"
42
+ at_hours_of_the_day:
43
+ one: alla %{segments} ora del giorno
44
+ other: alla %{segments} ora del giorno
45
+ on_minutes_of_hour:
46
+ one: al %{segments} minuto dell'ora
47
+ other: al %{segments} minuto dell'ora
48
+ at_seconds_of_minute:
49
+ one: al %{segments} secondo
50
+ other: al %{segments} secondo
51
+ on_seconds_of_minute:
52
+ one: al %{segments} secondo del minuto
53
+ other: al %{segments} secondo del minuto
54
+ each_second:
55
+ one: ogni secondo
56
+ other: Ogni %{count} secondi
57
+ each_minute:
58
+ one: Ogni minuto
59
+ other: Ogni %{count} minuti
60
+ each_hour:
61
+ one: Ogni ora
62
+ other: Ogni %{count} ore
63
+ each_day:
64
+ one: Ogni giorno
65
+ other: Ogni %{count} giorni
66
+ each_week:
67
+ one: Ogni settimana
68
+ other: Ogni %{count} settimane
69
+ each_month:
70
+ one: Ogni mese
71
+ other: Ogni %{count} mesi
72
+ each_year:
73
+ one: Ogni anno
74
+ other: Ogni %{count} anni
75
+ 'on': il %{sentence}
76
+ in: 'a %{target}'
77
+ integer:
78
+ negative: '%{ordinal}. e ultimo'
79
+ literal_ordinals:
80
+ -1: ultimo
81
+ -2: penultimo
82
+ ordinal: '%{number}%{ordinal}'
83
+ ordinals:
84
+ default: '.'
85
+ # 1: st
86
+ # 2: nd
87
+ # 3: rd
88
+ # 11: th
89
+ # 12: th
90
+ # 13: th
91
+ on_weekends: nel fine settimana
92
+ on_weekdays: nei giorni feriali
93
+ days_on:
94
+ - di domenica
95
+ - di lunedì
96
+ - di martedì
97
+ - di mercoledì
98
+ - di giovedì
99
+ - di venerdì
100
+ - di sabato
101
+ on_days: '%{days}'
102
+ array:
103
+ last_word_connector: ' e '
104
+ two_words_connector: ' e '
105
+ words_connector: ', '
106
+ string:
107
+ format:
108
+ day: '%{rest} %{current}'
109
+ day_of_week: '%{rest} %{current}'
110
+ day_of_month: '%{rest} %{current}'
111
+ day_of_year: '%{rest} %{current}'
112
+ hour_of_day: '%{rest} %{current}'
113
+ minute_of_hour: '%{rest} %{current}'
114
+ until: '%{rest} %{current}'
115
+ count: '%{rest} %{current}'
116
+ default: '%{rest} %{current}'
117
+
118
+ date:
119
+ abbr_day_names:
120
+ - dom
121
+ - lun
122
+ - mar
123
+ - mer
124
+ - gio
125
+ - ven
126
+ - sab
127
+ abbr_month_names:
128
+ -
129
+ - gen
130
+ - feb
131
+ - mar
132
+ - apr
133
+ - mag
134
+ - giu
135
+ - lug
136
+ - ago
137
+ - set
138
+ - ott
139
+ - nov
140
+ - dic
141
+ day_names:
142
+ - domenica
143
+ - lunedì
144
+ - martedì
145
+ - mercoledì
146
+ - giovedì
147
+ - venerdì
148
+ - sabato
149
+ formats:
150
+ default: "%d/%m/%Y"
151
+ long: "%d %B %Y"
152
+ short: "%d %b"
153
+ month_names:
154
+ -
155
+ - gennaio
156
+ - febbraio
157
+ - marzo
158
+ - aprile
159
+ - maggio
160
+ - giugno
161
+ - luglio
162
+ - agosto
163
+ - settembre
164
+ - ottobre
165
+ - novembre
166
+ - dicembre
167
+ order:
168
+ - :day
169
+ - :month
170
+ - :year
171
+
172
+ time:
173
+ am: alle
174
+ formats:
175
+ default: "%a, %d %b %Y %H:%M:%S %z"
176
+ long: "%B %d, %Y %H:%M"
177
+ short: "%d %b %H:%M"
178
+ pm: pm
179
+
@@ -0,0 +1,133 @@
1
+ nl:
2
+ ice_cube:
3
+ pieces_connector: ' / '
4
+ not: 'niet %{target}'
5
+ not_on: 'niet op %{target}'
6
+ date:
7
+ formats:
8
+ default: '%-d %B %Y'
9
+ times:
10
+ other: '%{count} keer'
11
+ one: '%{count} keer'
12
+ until: 'tot %{date}'
13
+ days_of_week: '%{segments} %{day}'
14
+ days_of_month:
15
+ other: '%{segments} dagen van de maand'
16
+ one: '%{segments} dag van de maand'
17
+ days_of_year:
18
+ other: '%{segments} dagen van het jaar'
19
+ one: '%{segments} dag van het jaar'
20
+ at_hours_of_the_day:
21
+ other: op de %{segments} uren van de dag
22
+ one: op het %{segments} uur
23
+ on_minutes_of_hour:
24
+ other: op de %{segments} minuten van het uur
25
+ one: om de %{segments} minuut van het uur
26
+ at_seconds_of_minute:
27
+ other: op de %{segments} seconden
28
+ one: op de %{segments} seconde
29
+ on_seconds_of_minute:
30
+ other: op de %{segments} seconden van de minuut
31
+ one: op de %{segments} seconde van de minuut
32
+ each_second:
33
+ one: Elke seconde
34
+ other: Elke %{count} seconden
35
+ each_minute:
36
+ one: Elke minuut
37
+ other: Elke %{count} minuten
38
+ each_hour:
39
+ one: Elk uur
40
+ other: Elke %{count} uren
41
+ each_day:
42
+ one: Dagelijks
43
+ other: Elke %{count} dagen
44
+ each_week:
45
+ one: Wekelijks
46
+ other: Elke %{count} weken
47
+ each_month:
48
+ one: Maandelijks
49
+ other: Elke %{count} maanden
50
+ each_year:
51
+ one: Jaarlijks
52
+ other: Elke %{count} jaren
53
+ 'on': op de %{sentence}
54
+ in: 'in %{target}'
55
+ integer:
56
+ negative: '%{ordinal} laatste'
57
+ literal_ordinals:
58
+ -1: laatste
59
+ -2: voorlaatste
60
+ ordinal: '%{number}%{ordinal}'
61
+ ordinals:
62
+ default: e
63
+ on_weekends: in het weekend
64
+ on_weekdays: op weekdagen
65
+ days_on:
66
+ - zondagen
67
+ - maandagen
68
+ - dinsdagen
69
+ - woensdagen
70
+ - donderdagen
71
+ - vrijdagen
72
+ - zaterdagen
73
+ on_days: op %{days}
74
+ array:
75
+ last_word_connector: ' en '
76
+ two_words_connector: ' en '
77
+ words_connector: ', '
78
+ string:
79
+ format:
80
+ day: '%{rest} %{current}'
81
+ day_of_week: '%{rest} %{current}'
82
+ day_of_month: '%{rest} %{current}'
83
+ day_of_year: '%{rest} %{current}'
84
+ hour_of_day: '%{rest} %{current}'
85
+ minute_of_hour: '%{rest} %{current}'
86
+ until: '%{rest} %{current}'
87
+ count: '%{rest} %{current}'
88
+ default: '%{rest} %{current}'
89
+ date:
90
+ abbr_day_names:
91
+ - zo
92
+ - ma
93
+ - di
94
+ - wo
95
+ - do
96
+ - vr
97
+ - za
98
+ abbr_month_names:
99
+ -
100
+ - jan
101
+ - feb
102
+ - mrt
103
+ - apr
104
+ - mei
105
+ - jun
106
+ - jul
107
+ - aug
108
+ - sep
109
+ - okt
110
+ - nov
111
+ - dec
112
+ day_names:
113
+ - zondag
114
+ - maandag
115
+ - dinsdag
116
+ - woensdag
117
+ - donderdag
118
+ - vrijdag
119
+ - zaterdag
120
+ month_names:
121
+ -
122
+ - januari
123
+ - februari
124
+ - maart
125
+ - april
126
+ - mei
127
+ - juni
128
+ - juli
129
+ - augustus
130
+ - september
131
+ - oktober
132
+ - november
133
+ - december
@@ -127,7 +127,7 @@ sv:
127
127
  - Aug
128
128
  - Sep
129
129
  - Okt
130
- - Mov
130
+ - Nov
131
131
  - Dec
132
132
  day_names:
133
133
  - Söndag
data/lib/ice_cube/i18n.rb CHANGED
@@ -1,24 +1,23 @@
1
+ require 'ice_cube/null_i18n'
2
+
1
3
  module IceCube
2
4
  module I18n
3
- def self.t(*args)
4
- backend.t(*args)
5
- end
6
5
 
7
- def self.l(*args)
8
- backend.l(*args)
6
+ LOCALES_PATH = File.expand_path(File.join('..', '..', '..', 'config', 'locales'), __FILE__)
7
+
8
+ class << self
9
+ delegate :t, :l, to: :backend
9
10
  end
10
11
 
11
12
  def self.backend
12
- @backend
13
+ @backend ||= detect_backend!
13
14
  end
14
15
 
15
16
  def self.detect_backend!
16
- require 'i18n'
17
- ::I18n.load_path += Dir[File.expand_path('../../../config/locales/*{rb,yml}', __FILE__)]
18
- @backend = ::I18n
19
- rescue LoadError
20
- require 'ice_cube/null_i18n'
21
- @backend = NullI18n
17
+ ::I18n.load_path += Dir[File.join(LOCALES_PATH, '*.yml')]
18
+ ::I18n
19
+ rescue NameError
20
+ NullI18n
22
21
  end
23
22
  end
24
23
  end
@@ -0,0 +1,89 @@
1
+ module IceCube
2
+ class InputAlignment
3
+
4
+ def initialize(rule, value, rule_part)
5
+ @rule = rule
6
+ @value = value
7
+ @rule_part = rule_part
8
+ end
9
+
10
+ attr_reader :rule, :value, :rule_part
11
+
12
+ def verify(freq, options={}, &block)
13
+ @rule.validations[:interval] or return
14
+
15
+ case @rule
16
+ when DailyRule
17
+ verify_wday_alignment(freq, &block)
18
+ when MonthlyRule
19
+ verify_month_alignment(freq, &block)
20
+ else
21
+ verify_freq_alignment(freq, &block)
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def interval_validation
28
+ @interval_validation ||= @rule.validations[:interval].first
29
+ end
30
+
31
+ def interval_value
32
+ @interval_value ||= (rule_part == :interval) ? value : interval_validation.interval
33
+ end
34
+
35
+ def fixed_validations
36
+ @fixed_validations ||= @rule.validations.values.flatten.select { |v|
37
+ interval_type = (v.type == :wday ? :day : v.type)
38
+ v.class < Validations::FixedValue &&
39
+ interval_type == rule.base_interval_validation.type
40
+ }
41
+ end
42
+
43
+ def verify_freq_alignment(freq)
44
+ interval_validation.type == freq or return
45
+ (last_validation = fixed_validations.min_by(&:value)) or return
46
+
47
+ alignment = (value - last_validation.value) % interval_validation.interval
48
+ return if alignment.zero?
49
+
50
+ validation_values = fixed_validations.map(&:value).join(', ')
51
+ if rule_part == :interval
52
+ message = "interval(#{value}) " \
53
+ "must be a multiple of " \
54
+ "intervals in #{last_validation.key}(#{validation_values})"
55
+ else
56
+ message = "intervals in #{last_validation.key}(#{validation_values}, #{value}) " \
57
+ "must be multiples of " \
58
+ "interval(#{interval_validation.interval})"
59
+ end
60
+
61
+ yield ArgumentError.new(message)
62
+ end
63
+
64
+ def verify_month_alignment(_freq)
65
+ return if interval_value == 1 || (interval_value % 12).zero?
66
+ return if fixed_validations.empty?
67
+
68
+ message = "month_of_year can only be used with interval(1) or multiples of interval(12)"
69
+
70
+ yield ArgumentError.new(message)
71
+ end
72
+
73
+ def verify_wday_alignment(freq)
74
+ return if interval_value == 1
75
+
76
+ if freq == :wday
77
+ return if (interval_value % 7).zero?
78
+ return if Array(@rule.validations[:day]).empty?
79
+ message = "day can only be used with multiples of interval(7)"
80
+ else
81
+ (fixed_validation = fixed_validations.first) or return
82
+ message = "#{fixed_validation.key} can only be used with interval(1)"
83
+ end
84
+
85
+ yield ArgumentError.new(message)
86
+ end
87
+
88
+ end
89
+ end
@@ -7,13 +7,19 @@ module IceCube
7
7
 
8
8
  base = base[options[:count] == 1 ? "one" : "other"] if options[:count]
9
9
 
10
- if base.is_a?(Hash)
11
- return base.each_with_object({}) do |(key, value), hash|
12
- hash[key.is_a?(String) ? key.to_sym : key] = value
10
+ case base
11
+ when Hash
12
+ base.each_with_object({}) do |(k, v), hash|
13
+ hash[k.is_a?(String) ? k.to_sym : k] = v
13
14
  end
15
+ when Array
16
+ base.each_with_index.each_with_object({}) do |(v, k), hash|
17
+ hash[k] = v
18
+ end
19
+ else
20
+ return base unless base.include?('%{')
21
+ base % options
14
22
  end
15
-
16
- options.reduce(base) { |result, (find, replace)| result.gsub("%{#{find}}", "#{replace}") }
17
23
  end
18
24
 
19
25
  def self.l(date_or_time, options = {})
@@ -22,7 +28,7 @@ module IceCube
22
28
  end
23
29
 
24
30
  def self.config
25
- @config ||= YAML.load(File.read(File.join(File.dirname(__FILE__), '..', '..', 'config', 'locales', 'en.yml')))['en']
31
+ @config ||= YAML.load_file(File.join(IceCube::I18n::LOCALES_PATH, 'en.yml'))['en']
26
32
  end
27
33
  end
28
34
  end
@@ -1,4 +1,3 @@
1
- require 'forwardable'
2
1
  require 'delegate'
3
2
 
4
3
  module IceCube
@@ -20,18 +19,16 @@ module IceCube
20
19
  # Time.now - Occurrence.new(start_time) # => 3600
21
20
  #
22
21
  class Occurrence < SimpleDelegator
22
+ include Comparable
23
23
 
24
24
  # Report class name as 'Time' to thwart type checking.
25
25
  def self.name
26
26
  'Time'
27
27
  end
28
28
 
29
- # Optimize for common methods to avoid method_missing
30
- extend Forwardable
31
- def_delegators :start_time, :to_i, :<=>, :==
32
- def_delegators :to_range, :cover?, :include?, :each, :first, :last
33
-
34
29
  attr_reader :start_time, :end_time
30
+ alias first start_time
31
+ alias last end_time
35
32
 
36
33
  def initialize(start_time, end_time=nil)
37
34
  @start_time = start_time
@@ -39,29 +36,34 @@ module IceCube
39
36
  __setobj__ @start_time
40
37
  end
41
38
 
39
+ def to_i
40
+ @start_time.to_i
41
+ end
42
+
43
+ def <=>(other)
44
+ @start_time <=> other
45
+ end
46
+
42
47
  def is_a?(klass)
43
48
  klass == ::Time || super
44
49
  end
45
50
  alias_method :kind_of?, :is_a?
46
51
 
47
- def intersects? other
48
- if other.is_a?(Occurrence) || other.is_a?(Range)
49
- lower_bound_1 = first + 1
50
- upper_bound_1 = last # exclude end
51
- lower_bound_2 = other.first + 1
52
- upper_bound_2 = other.last + 1
53
- if (lower_bound_2 <=> upper_bound_2) > 0
54
- false
55
- elsif (lower_bound_1 <=> upper_bound_1) > 0
56
- false
57
- else
58
- (upper_bound_1 <=> lower_bound_2) >= 0 and
59
- (upper_bound_2 <=> lower_bound_1) >= 0
60
- end
61
- else
62
- cover? other
63
- end
52
+ def intersects?(other)
53
+ return cover?(other) unless other.is_a?(Occurrence) || other.is_a?(Range)
54
+
55
+ this_start = first + 1
56
+ this_end = last # exclude end boundary
57
+ other_start = other.first + 1
58
+ other_end = other.last + 1
59
+
60
+ !(this_end < other_start || this_start > other_end)
61
+ end
62
+
63
+ def cover?(other)
64
+ to_range.cover?(other)
64
65
  end
66
+ alias_method :include?, :cover?
65
67
 
66
68
  def comparable_time
67
69
  start_time
@@ -4,15 +4,18 @@ module IceCube
4
4
  data = {}
5
5
  ical_string.each_line do |line|
6
6
  (property, value) = line.split(':')
7
- (property, tzid) = property.split(';')
7
+ (property, _tzid) = property.split(';')
8
8
  case property
9
9
  when 'DTSTART'
10
- data[:start_time] = Time.parse(value)
10
+ data[:start_time] = TimeUtil.deserialize_time(value)
11
11
  when 'DTEND'
12
- data[:end_time] = Time.parse(value)
12
+ data[:end_time] = TimeUtil.deserialize_time(value)
13
+ when 'RDATE'
14
+ data[:rtimes] ||= []
15
+ data[:rtimes] += value.split(',').map { |v| TimeUtil.deserialize_time(v) }
13
16
  when 'EXDATE'
14
17
  data[:extimes] ||= []
15
- data[:extimes] += value.split(',').map{|v| Time.parse(v)}
18
+ data[:extimes] += value.split(',').map { |v| TimeUtil.deserialize_time(v) }
16
19
  when 'DURATION'
17
20
  data[:duration] # FIXME
18
21
  when 'RRULE'
@@ -41,7 +44,7 @@ module IceCube
41
44
  when 'COUNT'
42
45
  params[:count] = value.to_i
43
46
  when 'UNTIL'
44
- params[:until] = Time.parse(value).utc
47
+ params[:until] = TimeUtil.deserialize_time(value).utc
45
48
  when 'WKST'
46
49
  params[:week_start] = TimeUtil.ical_day_to_symbol(value)
47
50
  when 'BYSECOND'
data/lib/ice_cube/rule.rb CHANGED
@@ -19,11 +19,9 @@ module IceCube
19
19
  until_time || occurrence_count
20
20
  end
21
21
 
22
- def ==(rule)
23
- if rule.is_a? Rule
24
- hash = to_hash
25
- hash && hash == rule.to_hash
26
- end
22
+ def ==(other)
23
+ return false unless other.is_a? Rule
24
+ hash == other.hash
27
25
  end
28
26
 
29
27
  def hash
@@ -31,7 +29,7 @@ module IceCube
31
29
  end
32
30
 
33
31
  def to_ical
34
- raise MethodNotImplemented, "Expected to be overrridden by subclasses"
32
+ raise MethodNotImplemented, "Expected to be overridden by subclasses"
35
33
  end
36
34
 
37
35
  # Convert from ical string and create a rule
@@ -60,11 +58,6 @@ module IceCube
60
58
  next_time(time, schedule, time).to_i == time.to_i
61
59
  end
62
60
 
63
- # Whether this rule requires a full run
64
- def full_required?
65
- !@count.nil?
66
- end
67
-
68
61
  class << self
69
62
 
70
63
  # Convert from a hash and create a rule
@@ -2,6 +2,15 @@ module IceCube
2
2
 
3
3
  class DailyRule < ValidatedRule
4
4
 
5
+ include Validations::HourOfDay
6
+ include Validations::MinuteOfHour
7
+ include Validations::SecondOfMinute
8
+ include Validations::DayOfMonth
9
+ include Validations::DayOfWeek
10
+ include Validations::Day
11
+ include Validations::MonthOfYear
12
+ # include Validations::DayOfYear # n/a
13
+
5
14
  include Validations::DailyInterval
6
15
 
7
16
  def initialize(interval = 1)
@@ -2,6 +2,15 @@ module IceCube
2
2
 
3
3
  class HourlyRule < ValidatedRule
4
4
 
5
+ include Validations::HourOfDay
6
+ include Validations::MinuteOfHour
7
+ include Validations::SecondOfMinute
8
+ include Validations::DayOfMonth
9
+ include Validations::DayOfWeek
10
+ include Validations::Day
11
+ include Validations::MonthOfYear
12
+ include Validations::DayOfYear
13
+
5
14
  include Validations::HourlyInterval
6
15
 
7
16
  def initialize(interval = 1)