ice_cube 0.14.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5882c908ac2e56578482bda2b172c91edf4a55df
4
- data.tar.gz: f4ec09ff6db92240f0d3ed669ca6b8be495d2784
3
+ metadata.gz: 4da7e2dd818b7ab5f3c5dd023370bbc80f8e8ced
4
+ data.tar.gz: e131a536a09b9c2bda6373b8c1f76cc2b8857245
5
5
  SHA512:
6
- metadata.gz: 4e94d7e1c2a4a4745957bbe13bda1d05211af20bb04618852aad3d114c7ff24632a0588012d7ef5b6aeda3e268d93f060e98c5ad8cddb55f330d157758328e6a
7
- data.tar.gz: 5384b4f0700a8c185b3bc88d628ed82825f3115a71331cff0e0689f1446422277e1443f96a90c3c1d18e469ae1784e89c095d5f84041a5004eca66da39bf240b
6
+ metadata.gz: 0ea3d24d220d7683a46c74b7b63bb2ab9959de7e1b4d08dd96664593f99bf78402e0f27fc395a4e21e46ce7cdea01a7780b7c5948fc10299a671cfe8f1c4a8f9
7
+ data.tar.gz: ab2b07d2a5023c56a165b0cd3f8407f4c36816413efb005e1e31a8b82123cd4ba878a710b05832c2d521804d6dfb62fbd328199286b32e341e64f0e180fdd7ea
@@ -0,0 +1,178 @@
1
+ de:
2
+ ice_cube:
3
+ pieces_connector: ' / '
4
+ not: 'außer %{target}'
5
+ not_on: 'außer am %{target}'
6
+ date:
7
+ formats:
8
+ default: '%-d. %B %Y'
9
+ month_names:
10
+ -
11
+ - Januar
12
+ - Februar
13
+ - März
14
+ - April
15
+ - Mai
16
+ - Juni
17
+ - Juli
18
+ - August
19
+ - September
20
+ - Oktober
21
+ - November
22
+ - Dezember
23
+ day_names:
24
+ - Sonntag
25
+ - Montag
26
+ - Dienstag
27
+ - Mittwoch
28
+ - Donnerstag
29
+ - Freitag
30
+ - Samstag
31
+ times:
32
+ other: '%{count} mal'
33
+ one: '%{count} mal'
34
+ until: 'bis zum %{date}'
35
+ days_of_week: '%{segments} %{day}'
36
+ days_of_month:
37
+ one: '%{segments} Tag des Monats'
38
+ other: '%{segments} Tag des Monats'
39
+ days_of_year:
40
+ one: '%{segments} Tag des Jahres'
41
+ other: '%{segments} Tag des Jahres'
42
+ at_hours_of_the_day:
43
+ one: in der %{segments} Stunde des Tages
44
+ other: in der %{segments} Stunde des Tages
45
+ on_minutes_of_hour:
46
+ one: in der %{segments} Minute der Stunde
47
+ other: in der %{segments} Minute der Stunde
48
+ at_seconds_of_minute:
49
+ one: in der %{segments} Sekunde
50
+ other: in der %{segments} Sekunde
51
+ on_seconds_of_minute:
52
+ one: in der %{segments} Sekunde der Minute
53
+ other: in der %{segments} Sekunde der Minute
54
+ each_second:
55
+ one: Jede Sekunde
56
+ other: Alle %{count} Sekunden
57
+ each_minute:
58
+ one: Jede Minute
59
+ other: Alle %{count} Minuten
60
+ each_hour:
61
+ one: Stündlich
62
+ other: Alle %{count} Stunden
63
+ each_day:
64
+ one: Täglich
65
+ other: Alle %{count} Tage
66
+ each_week:
67
+ one: Wöchentlich
68
+ other: Alle %{count} Wochen
69
+ each_month:
70
+ one: Monatlich
71
+ other: Alle %{count} Monate
72
+ each_year:
73
+ one: Jährlich
74
+ other: Alle %{count} Jahre
75
+ 'on': am %{sentence}
76
+ in: 'im %{target}'
77
+ integer:
78
+ negative: '%{ordinal}. letzter'
79
+ literal_ordinals:
80
+ -1: letzten
81
+ -2: vorletzten
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: am Wochenende
92
+ on_weekdays: an Wochentagen
93
+ days_on:
94
+ - Sonntags
95
+ - Montags
96
+ - Dienstags
97
+ - Mittwochs
98
+ - Donnerstags
99
+ - Freitags
100
+ - Samstags
101
+ on_days: '%{days}'
102
+ array:
103
+ last_word_connector: ' und '
104
+ two_words_connector: ' und '
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
+ - So
121
+ - Mo
122
+ - Di
123
+ - Mi
124
+ - Do
125
+ - Fr
126
+ - Sa
127
+ abbr_month_names:
128
+ -
129
+ - Jan
130
+ - Feb
131
+ - Mär
132
+ - Apr
133
+ - Mai
134
+ - Jun
135
+ - Jul
136
+ - Aug
137
+ - Sep
138
+ - Okt
139
+ - Nov
140
+ - Dez
141
+ day_names:
142
+ - Sonntag
143
+ - Montag
144
+ - Dinstag
145
+ - Mittwoch
146
+ - Donnerstag
147
+ - Freitag
148
+ - Samstag
149
+ formats:
150
+ default: "%Y-%m-%d"
151
+ long: "%B %d, %Y"
152
+ short: "%b %d"
153
+ month_names:
154
+ -
155
+ - Januar
156
+ - Februar
157
+ - März
158
+ - April
159
+ - Mai
160
+ - Juni
161
+ - Juli
162
+ - August
163
+ - September
164
+ - Oktober
165
+ - November
166
+ - Dezember
167
+ order:
168
+ - :year
169
+ - :month
170
+ - :day
171
+
172
+ time:
173
+ am: am
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
@@ -0,0 +1,173 @@
1
+ fr:
2
+ ice_cube:
3
+ pieces_connector: ' / '
4
+ not: 'pas %{target}'
5
+ not_on: 'pas durant %{target}'
6
+ date:
7
+ formats:
8
+ default: '%d %B %Y'
9
+ month_names:
10
+ -
11
+ - janvier
12
+ - février
13
+ - mars
14
+ - avril
15
+ - mai
16
+ - juin
17
+ - juillet
18
+ - août
19
+ - septembre
20
+ - octobre
21
+ - novembre
22
+ - décembre
23
+ day_names:
24
+ - dimanche
25
+ - lundi
26
+ - mardi
27
+ - mercredi
28
+ - jeudi
29
+ - vendredi
30
+ - samedi
31
+ times:
32
+ other: '%{count} fois'
33
+ one: '%{count} fois'
34
+ until: "jusqu'au %{date}"
35
+ days_of_week: '%{segments} %{day}'
36
+ days_of_month:
37
+ other: '%{segments} jours du mois'
38
+ one: '%{segments} jours du mois'
39
+ days_of_year:
40
+ other: "%{segments} jours de l'année"
41
+ one: "%{segments} jours de l'année"
42
+ at_hours_of_the_day:
43
+ other: aux %{segments} heures de la journée
44
+ one: à %{segments}h
45
+ on_minutes_of_hour:
46
+ other: aux %{segments} minutes de l'heure
47
+ one: à la %{segments} minute de l'heure
48
+ at_seconds_of_minute:
49
+ other: aux %{segments} secondes
50
+ one: à la %{segments} seconde
51
+ on_seconds_of_minute:
52
+ other: aux %{segments} secondes de la minute
53
+ one: à la %{segments} seconde de la minute
54
+ each_second:
55
+ one: Toutes les secondes
56
+ other: Toutes les %{count} secondes
57
+ each_minute:
58
+ one: Toutes les minutes
59
+ other: Toutes les %{count} minutes
60
+ each_hour:
61
+ one: Toutes les heures
62
+ other: Toutes les %{count} heures
63
+ each_day:
64
+ one: Quotidien
65
+ other: Tous les %{count} jours
66
+ each_week:
67
+ one: Hebdomadaire
68
+ other: Toutes les %{count} semaines
69
+ each_month:
70
+ one: Mensuel
71
+ other: Tous les %{count} mois
72
+ each_year:
73
+ one: Annuel
74
+ other: Tous les %{count} ans
75
+ 'on': les %{sentence}
76
+ in: 'en %{target}'
77
+ integer:
78
+ negative: '%{ordinal} depuis la fin'
79
+ literal_ordinals:
80
+ -1: derniers
81
+ -2: avant-derniers
82
+ ordinal: '%{number}%{ordinal}'
83
+ ordinals:
84
+ default: '°'
85
+ 1: °
86
+ on_weekends: pendant les weekends
87
+ on_weekdays: pendant les jours ouvrés
88
+ days_on:
89
+ - dimanches
90
+ - lundis
91
+ - mardis
92
+ - mercredis
93
+ - jeudis
94
+ - vendredis
95
+ - samedis
96
+ on_days: les %{days}
97
+ array:
98
+ last_word_connector: ', et '
99
+ two_words_connector: ' et '
100
+ words_connector: ', '
101
+ string:
102
+ format:
103
+ day: '%{rest} %{current}'
104
+ day_of_week: '%{rest} %{current}'
105
+ day_of_month: '%{rest} %{current}'
106
+ day_of_year: '%{rest} %{current}'
107
+ hour_of_day: '%{rest} %{current}'
108
+ minute_of_hour: '%{rest} %{current}'
109
+ until: '%{rest} %{current}'
110
+ count: '%{rest} %{current}'
111
+ default: '%{rest} %{current}'
112
+
113
+ date:
114
+ abbr_day_names:
115
+ - Dim
116
+ - Lun
117
+ - Mar
118
+ - Mer
119
+ - Jeu
120
+ - Ven
121
+ - Sam
122
+ abbr_month_names:
123
+ -
124
+ - Jan
125
+ - Fév
126
+ - Mar
127
+ - Avr
128
+ - Mai
129
+ - Jun
130
+ - Jul
131
+ - Aou
132
+ - Sep
133
+ - Oct
134
+ - Nov
135
+ - Déc
136
+ day_names:
137
+ - dimanche
138
+ - lundi
139
+ - mardi
140
+ - mecredi
141
+ - jeudi
142
+ - vendredi
143
+ - samedi
144
+ formats:
145
+ default: "%d-%m-%Y"
146
+ long: "%d %B %Y"
147
+ short: "%d %b"
148
+ month_names:
149
+ -
150
+ - janvier
151
+ - février
152
+ - mars
153
+ - avril
154
+ - mai
155
+ - juin
156
+ - juillet
157
+ - août
158
+ - septembre
159
+ - octobre
160
+ - novembre
161
+ - décembre
162
+ order:
163
+ - :year
164
+ - :month
165
+ - :day
166
+
167
+ time:
168
+ am: am
169
+ formats:
170
+ default: "%a, %d %b %Y %H:%M:%S %z"
171
+ long: "%d %B %Y %H:%M"
172
+ short: "%d %b %H:%M"
173
+ pm: pm
@@ -0,0 +1,195 @@
1
+ ru:
2
+ ice_cube:
3
+ pieces_connector: ' / '
4
+ not: 'не %{target}'
5
+ not_on: 'не в %{target}'
6
+ date:
7
+ formats:
8
+ default: '%-d %B %Y'
9
+ month_names:
10
+ -
11
+ - январь
12
+ - февраль
13
+ - март
14
+ - апрель
15
+ - май
16
+ - июнь
17
+ - июль
18
+ - август
19
+ - сентябрь
20
+ - октябрь
21
+ - ноябрь
22
+ - декабрь
23
+ day_names:
24
+ - воскресенье
25
+ - понедельник
26
+ - вторник
27
+ - среда
28
+ - четверг
29
+ - пятница
30
+ - суббота
31
+ times:
32
+ other: '%{count} раза'
33
+ many: '%{count} раз'
34
+ few: '%{count} раза'
35
+ one: '%{count} раз'
36
+ until: 'до %{date}'
37
+ days_of_week: '%{segments} %{day}'
38
+ days_of_month:
39
+ other: '%{segments} день месяца'
40
+ many: '%{segments} день месяца'
41
+ few: '%{segments} день месяца'
42
+ one: '%{segments} день месяца'
43
+ days_of_year:
44
+ other: '%{segments} день года'
45
+ many: '%{segments} день года'
46
+ few: '%{segments} день года'
47
+ one: '%{segments} день года'
48
+ at_hours_of_the_day:
49
+ other: в %{segments} часы дня
50
+ many: в %{segments} часы дня
51
+ few: в %{segments} часы дня
52
+ one: в %{segments} час дня
53
+ on_minutes_of_hour:
54
+ other: в %{segments} минуты часа
55
+ many: в %{segments} минуты часа
56
+ few: в %{segments} минуты часа
57
+ one: в %{segments} минуту часа
58
+ on_seconds_of_minute:
59
+ other: на %{segments} секунде минуты
60
+ many: на %{segments} секунде минуты
61
+ few: на %{segments} секунде минуты
62
+ one: на %{segments} секунде минуты
63
+ each_second:
64
+ one: Ежесекундно
65
+ few: Каждые %{count} секунды
66
+ many: Каждые %{count} секунд
67
+ other: Каждые %{count} секунды
68
+ each_minute:
69
+ one: Ежеминутно
70
+ few: Каждые %{count} минуты
71
+ many: Каждые %{count} минут
72
+ other: Каждые %{count} минуты
73
+ each_hour:
74
+ one: Каждый час
75
+ few: Каждые %{count} часа
76
+ many: Каждые %{count} часов
77
+ other: Каждые %{count} часа
78
+ each_day:
79
+ one: Ежедневно
80
+ few: Каждые %{count} дня
81
+ many: Каждые %{count} дней
82
+ other: Каждые %{count} дня
83
+ each_week:
84
+ one: Еженедельно
85
+ few: Каждые %{count} недели
86
+ many: Каждые %{count} недель
87
+ other: Каждые %{count} недели
88
+ each_month:
89
+ one: Ежемесячно
90
+ few: Каждые %{count} месяца
91
+ many: Каждые %{count} месяцев
92
+ other: Каждые %{count} месяца
93
+ each_year:
94
+ one: Ежегодно
95
+ few: Каждые %{count} года
96
+ many: Каждые %{count} лет
97
+ other: Каждые %{count} года
98
+ 'on': в %{sentence}
99
+ in: 'через %{target}'
100
+ integer:
101
+ negative: '%{ordinal} с конца'
102
+ literal_ordinals:
103
+ -1: последний
104
+ -2: предпоследний
105
+ ordinal: '%{number}%{ordinal}'
106
+ ordinals:
107
+ default: ''
108
+ on_weekends: на выходных
109
+ on_weekdays: по будням
110
+ days_on:
111
+ - воскресеньям
112
+ - понедельникам
113
+ - вторникам
114
+ - средам
115
+ - четвергам
116
+ - пятницам
117
+ - субботам
118
+ on_days: по %{days}
119
+ array:
120
+ last_word_connector: ' и '
121
+ two_words_connector: ' и '
122
+ words_connector: ', '
123
+ string:
124
+ format:
125
+ day: '%{rest} %{current}'
126
+ day_of_week: '%{rest} %{current}'
127
+ day_of_month: '%{rest} %{current}'
128
+ day_of_year: '%{rest} %{current}'
129
+ hour_of_day: '%{rest} %{current}'
130
+ minute_of_hour: '%{rest} %{current}'
131
+ until: '%{rest} %{current}'
132
+ count: '%{rest} %{current}'
133
+ default: '%{rest} %{current}'
134
+
135
+ date:
136
+ abbr_day_names:
137
+ - Вс
138
+ - Пн
139
+ - Вт
140
+ - Ср
141
+ - Чт
142
+ - Пт
143
+ - Сб
144
+ abbr_month_names:
145
+ -
146
+ - Янв.
147
+ - Февр.
148
+ - Марта
149
+ - Апр.
150
+ - Мая
151
+ - Июня
152
+ - Июля
153
+ - Авг.
154
+ - Сент.
155
+ - Окт.
156
+ - Нояб.
157
+ - Дек.
158
+ day_names:
159
+ - Воскресенье
160
+ - Понедельник
161
+ - Вторник
162
+ - Среда
163
+ - Четверг
164
+ - Пятница
165
+ - Суббота
166
+ formats:
167
+ default: "%d.%m.%Y"
168
+ short: "%d %b"
169
+ long: "%d %B %Y"
170
+ month_names:
171
+ -
172
+ - Января
173
+ - Февраля
174
+ - Марта
175
+ - Апреля
176
+ - Мая
177
+ - Июня
178
+ - Июля
179
+ - Августа
180
+ - Сентября
181
+ - Октября
182
+ - Ноября
183
+ - Декабря
184
+ order:
185
+ - :day
186
+ - :month
187
+ - :year
188
+
189
+ time:
190
+ am: утра
191
+ formats:
192
+ default: "%a, %d %b %Y, %H:%M:%S %z"
193
+ short: "%d %b, %H:%M"
194
+ long: "%d %B %Y, %H:%M"
195
+ pm: вечера
@@ -0,0 +1,169 @@
1
+ sv:
2
+ ice_cube:
3
+ pieces_connector: ' / '
4
+ not: 'inte %{target}'
5
+ not_on: 'inte i %{target}'
6
+ date:
7
+ formats:
8
+ default: '%-d %B %Y'
9
+ month_names:
10
+ -
11
+ - januari
12
+ - februari
13
+ - mars
14
+ - april
15
+ - maj
16
+ - juni
17
+ - juli
18
+ - augusti
19
+ - september
20
+ - oktober
21
+ - november
22
+ - december
23
+ day_names:
24
+ - söndag
25
+ - måndag
26
+ - tisdag
27
+ - onsdag
28
+ - torsdag
29
+ - fredag
30
+ - lördag
31
+ times:
32
+ other: '%{count} gånger'
33
+ one: '%{count} gång'
34
+ until: 'tills %{date}'
35
+ days_of_week: '%{segments} %{day}'
36
+ days_of_month:
37
+ other: '%{segments} dagen i månaden'
38
+ one: '%{segments} dagen i månaden'
39
+ days_of_year:
40
+ other: '%{segments} dagen på året'
41
+ one: '%{segments} dagen på året'
42
+ at_hours_of_the_day:
43
+ other: i %{segments} timme på dygnet
44
+ one: i %{segments} timme på dygnet
45
+ on_minutes_of_hour:
46
+ other: i %{segments} minuter av timmen
47
+ one: i %{segments} minuten av timmen
48
+ on_seconds_of_minute:
49
+ other: på %{segments} sekunden av minuten
50
+ one: på %{segments} sekunden av minuten
51
+ each_second:
52
+ one: Varje sekund
53
+ other: Varje %{count} sekund
54
+ each_minute:
55
+ one: Varje minut
56
+ other: Varje %{count} minut
57
+ each_hour:
58
+ one: Varje timme
59
+ other: Varje %{count} timme
60
+ each_day:
61
+ one: Varje dag
62
+ other: Varje %{count} dag
63
+ each_week:
64
+ one: Varje vecka
65
+ other: Varje %{count} vecka
66
+ each_month:
67
+ one: Varje månad
68
+ other: Varje %{count} månad
69
+ each_year:
70
+ one: Varje år
71
+ other: Varje %{count} år
72
+ 'on': i %{sentence}
73
+ in: 'efter %{target}'
74
+ integer:
75
+ negative: '%{ordinal} från slutet'
76
+ literal_ordinals:
77
+ -1: sista
78
+ -2: nästsista
79
+ ordinal: '%{number}%{ordinal}'
80
+ ordinals:
81
+ default: ''
82
+ on_weekends: på helger
83
+ on_weekdays: på vardagar
84
+ days_on:
85
+ - söndagar
86
+ - måndagar
87
+ - tisdagar
88
+ - onsdagar
89
+ - torsdagar
90
+ - fredagar
91
+ - lördagar
92
+ on_days: på %{days}
93
+ array:
94
+ last_word_connector: ' och '
95
+ two_words_connector: ' och '
96
+ words_connector: ', '
97
+ string:
98
+ format:
99
+ day: '%{rest} %{current}'
100
+ day_of_week: '%{rest} %{current}'
101
+ day_of_month: '%{rest} %{current}'
102
+ day_of_year: '%{rest} %{current}'
103
+ hour_of_day: '%{rest} %{current}'
104
+ minute_of_hour: '%{rest} %{current}'
105
+ until: '%{rest} %{current}'
106
+ count: '%{rest} %{current}'
107
+ default: '%{rest} %{current}'
108
+
109
+ date:
110
+ abbr_day_names:
111
+ - Sön
112
+ - Mån
113
+ - Tis
114
+ - Ons
115
+ - Tor
116
+ - Fre
117
+ - Lör
118
+ abbr_month_names:
119
+ -
120
+ - Jan
121
+ - Feb
122
+ - Mar
123
+ - Apr
124
+ - Maj
125
+ - Jun
126
+ - Jul
127
+ - Aug
128
+ - Sep
129
+ - Okt
130
+ - Mov
131
+ - Dec
132
+ day_names:
133
+ - Söndag
134
+ - Måndag
135
+ - Tisdag
136
+ - Onsdag
137
+ - Torsdag
138
+ - Fredag
139
+ - Lördag
140
+ formats:
141
+ default: "%Y-%m-%d"
142
+ long: "%e %B %Y"
143
+ short: "%e %b"
144
+ month_names:
145
+ -
146
+ - Januari
147
+ - Februari
148
+ - Mars
149
+ - April
150
+ - Maj
151
+ - Juni
152
+ - Juli
153
+ - Augusti
154
+ - September
155
+ - Oktober
156
+ - November
157
+ - December
158
+ order:
159
+ - :day
160
+ - :month
161
+ - :year
162
+
163
+ time:
164
+ am: ''
165
+ formats:
166
+ default: "%a, %e %b %Y %H:%M:%S %z"
167
+ long: "%e %B %Y %H:%M"
168
+ short: "%e %b %H:%M"
169
+ pm: ''
@@ -24,14 +24,17 @@ module IceCube
24
24
  end
25
25
 
26
26
  def self.rule_from_ical(ical)
27
- params = { validations: { } }
27
+ raise ArgumentError, 'empty ical rule' if ical.nil?
28
+
29
+ validations = {}
30
+ params = {validations: validations, interval: 1}
28
31
 
29
32
  ical.split(';').each do |rule|
30
33
  (name, value) = rule.split('=')
31
34
  value.strip!
32
35
  case name
33
36
  when 'FREQ'
34
- params[:freq] = value.downcase
37
+ params[:rule_type] = "IceCube::#{value[0]}#{value.downcase[1..-1]}Rule"
35
38
  when 'INTERVAL'
36
39
  params[:interval] = value.to_i
37
40
  when 'COUNT'
@@ -39,13 +42,13 @@ module IceCube
39
42
  when 'UNTIL'
40
43
  params[:until] = Time.parse(value).utc
41
44
  when 'WKST'
42
- params[:wkst] = TimeUtil.ical_day_to_symbol(value)
45
+ params[:week_start] = TimeUtil.ical_day_to_symbol(value)
43
46
  when 'BYSECOND'
44
- params[:validations][:second_of_minute] = value.split(',').collect(&:to_i)
47
+ validations[:second_of_minute] = value.split(',').map(&:to_i)
45
48
  when 'BYMINUTE'
46
- params[:validations][:minute_of_hour] = value.split(',').collect(&:to_i)
49
+ validations[:minute_of_hour] = value.split(',').map(&:to_i)
47
50
  when 'BYHOUR'
48
- params[:validations][:hour_of_day] = value.split(',').collect(&:to_i)
51
+ validations[:hour_of_day] = value.split(',').map(&:to_i)
49
52
  when 'BYDAY'
50
53
  dows = {}
51
54
  days = []
@@ -59,33 +62,21 @@ module IceCube
59
62
  days.push TimeUtil.sym_to_wday(day) if dows[day].nil?
60
63
  end
61
64
  end
62
- params[:validations][:day_of_week] = dows unless dows.empty?
63
- params[:validations][:day] = days unless days.empty?
65
+ validations[:day_of_week] = dows unless dows.empty?
66
+ validations[:day] = days unless days.empty?
64
67
  when 'BYMONTHDAY'
65
- params[:validations][:day_of_month] = value.split(',').collect(&:to_i)
68
+ validations[:day_of_month] = value.split(',').map(&:to_i)
66
69
  when 'BYMONTH'
67
- params[:validations][:month_of_year] = value.split(',').collect(&:to_i)
70
+ validations[:month_of_year] = value.split(',').map(&:to_i)
68
71
  when 'BYYEARDAY'
69
- params[:validations][:day_of_year] = value.split(',').collect(&:to_i)
72
+ validations[:day_of_year] = value.split(',').map(&:to_i)
70
73
  when 'BYSETPOS'
71
74
  else
72
- raise "Invalid or unsupported rrule command: #{name}"
75
+ validations[name] = nil # invalid type
73
76
  end
74
77
  end
75
78
 
76
- params[:interval] ||= 1
77
-
78
- # WKST only valid for weekly rules
79
- params.delete(:wkst) unless params[:freq] == 'weekly'
80
-
81
- rule = Rule.send(*params.values_at(:freq, :interval, :wkst).compact)
82
- rule.count(params[:count]) if params[:count]
83
- rule.until(params[:until]) if params[:until]
84
- params[:validations].each do |key, value|
85
- value.is_a?(Array) ? rule.send(key, *value) : rule.send(key, value)
86
- end
87
-
88
- rule
79
+ Rule.from_hash(params)
89
80
  end
90
81
  end
91
82
  end
@@ -4,6 +4,11 @@ module IceCube
4
4
 
5
5
  class Rule
6
6
 
7
+ INTERVAL_TYPES = [
8
+ :secondly, :minutely, :hourly,
9
+ :daily, :weekly, :monthly, :yearly
10
+ ]
11
+
7
12
  attr_reader :uses
8
13
 
9
14
  # Is this a terminating schedule?
@@ -46,21 +51,6 @@ module IceCube
46
51
  raise MethodNotImplemented, "Expected to be overridden by subclasses"
47
52
  end
48
53
 
49
- # Convert from a hash and create a rule
50
- def self.from_hash(original_hash)
51
- hash = IceCube::FlexibleHash.new original_hash
52
- return nil unless match = hash[:rule_type].match(/\:\:(.+?)Rule/)
53
- rule = IceCube::Rule.send(match[1].downcase.to_sym, hash[:interval] || 1)
54
- rule.interval(hash[:interval] || 1, TimeUtil.wday_to_sym(hash[:week_start] || 0)) if match[1] == "Weekly"
55
- rule.until(TimeUtil.deserialize_time(hash[:until])) if hash[:until]
56
- rule.count(hash[:count]) if hash[:count]
57
- hash[:validations] && hash[:validations].each do |key, value|
58
- key = key.to_sym unless key.is_a?(Symbol)
59
- value.is_a?(Array) ? rule.send(key, *value) : rule.send(key, value)
60
- end
61
- rule
62
- end
63
-
64
54
  # Reset the uses on the rule to 0
65
55
  def reset
66
56
  @uses = 0
@@ -78,6 +68,36 @@ module IceCube
78
68
  !@count.nil?
79
69
  end
80
70
 
71
+ class << self
72
+
73
+ # Convert from a hash and create a rule
74
+ def from_hash(original_hash)
75
+ hash = IceCube::FlexibleHash.new original_hash
76
+ return nil unless match = hash[:rule_type].match(/\:\:(.+?)Rule/)
77
+
78
+ interval_type = match[1].downcase.to_sym
79
+ raise ArgumentError, "Invalid rule frequency type: #{match[1]}" unless INTERVAL_TYPES.include?(interval_type)
80
+
81
+ rule = IceCube::Rule.send(interval_type, hash[:interval] || 1)
82
+ rule.interval(hash[:interval] || 1, TimeUtil.wday_to_sym(hash[:week_start] || 0)) if match[1] == "Weekly"
83
+ rule.until(TimeUtil.deserialize_time(hash[:until])) if hash[:until]
84
+ rule.count(hash[:count]) if hash[:count]
85
+ hash[:validations] && hash[:validations].each do |name, args|
86
+ apply_validation(rule, name, args)
87
+ end
88
+ rule
89
+ end
90
+
91
+ private
92
+
93
+ def apply_validation(rule, name, args)
94
+ name = name.to_sym
95
+ raise ArgumentError, "Invalid rule validation type: #{name}" unless ValidatedRule::VALIDATION_ORDER.include?(name)
96
+ args.is_a?(Array) ? rule.send(name, *args) : rule.send(name, args)
97
+ end
98
+
99
+ end
100
+
81
101
  # Convenience methods for creating Rules
82
102
  class << self
83
103
 
@@ -181,14 +181,14 @@ module IceCube
181
181
 
182
182
  # The previous occurrence from a given time
183
183
  def previous_occurrence(from)
184
- from = TimeUtil.match_zone(from, start_time) or raise ArgumentError, "Time required, got #{time.inspect}"
184
+ from = TimeUtil.match_zone(from, start_time) or raise ArgumentError, "Time required, got #{from.inspect}"
185
185
  return nil if from <= start_time
186
186
  enumerate_occurrences(start_time, from - 1).to_a.last
187
187
  end
188
188
 
189
189
  # The previous n occurrences before a given time
190
190
  def previous_occurrences(num, from)
191
- from = TimeUtil.match_zone(from, start_time) or raise ArgumentError, "Time required, got #{time.inspect}"
191
+ from = TimeUtil.match_zone(from, start_time) or raise ArgumentError, "Time required, got #{from.inspect}"
192
192
  return [] if from <= start_time
193
193
  a = enumerate_occurrences(start_time, from - 1).to_a
194
194
  a.size > num ? a[-1*num,a.size] : a
@@ -42,7 +42,7 @@ module IceCube
42
42
  end
43
43
 
44
44
  def self.match_zone(input_time, reference)
45
- return unless time = ensure_time(input_time)
45
+ return unless time = ensure_time(input_time, reference)
46
46
  time = if reference.respond_to? :time_zone
47
47
  time.in_time_zone(reference.time_zone)
48
48
  else
@@ -58,13 +58,21 @@ module IceCube
58
58
  end
59
59
 
60
60
  # Ensure that this is either nil, or a time
61
- def self.ensure_time(time, date_eod = false)
61
+ def self.ensure_time(time, reference = nil, date_eod = false)
62
62
  case time
63
63
  when DateTime
64
64
  warn "IceCube: DateTime support is deprecated (please use Time) at: #{ caller[2] }"
65
65
  Time.local(time.year, time.month, time.day, time.hour, time.min, time.sec)
66
66
  when Date
67
- date_eod ? end_of_date(time) : time.to_time
67
+ if date_eod
68
+ end_of_date(time, reference)
69
+ else
70
+ if reference
71
+ build_in_zone([time.year, time.month, time.day], reference)
72
+ else
73
+ time.to_time
74
+ end
75
+ end
68
76
  else
69
77
  time
70
78
  end
@@ -5,6 +5,8 @@ module IceCube
5
5
  module Validations::Day
6
6
 
7
7
  def day(*days)
8
+ days = days.flatten
9
+ return self if days.empty?
8
10
  days.flatten.each do |day|
9
11
  unless day.is_a?(Fixnum) || day.is_a?(Symbol)
10
12
  raise ArgumentError, "expecting Fixnum or Symbol value for day, got #{day.inspect}"
@@ -11,7 +11,6 @@ module IceCube
11
11
  deprecated_alias :until_date, :until_time
12
12
 
13
13
  def until(time)
14
- time = TimeUtil.ensure_time(time, true)
15
14
  @until = time
16
15
  replace_validations_for(:until, time.nil? ? nil : [Validation.new(time)])
17
16
  self
@@ -34,7 +33,8 @@ module IceCube
34
33
  end
35
34
 
36
35
  def validate(step_time, schedule)
37
- raise UntilExceeded if step_time > time
36
+ end_time = TimeUtil.ensure_time(time, schedule.start_time, true)
37
+ raise UntilExceeded if step_time > end_time
38
38
  end
39
39
 
40
40
  def build_s(builder)
@@ -1,5 +1,5 @@
1
1
  module IceCube
2
2
 
3
- VERSION = '0.14.0'
3
+ VERSION = '0.15.0'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ice_cube
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Crepezzi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-23 00:00:00.000000000 Z
11
+ date: 2017-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -38,48 +38,6 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 2.12.0
41
- - !ruby/object:Gem::Dependency
42
- name: activesupport
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: 3.0.0
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: 3.0.0
55
- - !ruby/object:Gem::Dependency
56
- name: tzinfo
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: i18n
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
41
  description: ice_cube is a recurring date library for Ruby. It allows for quick,
84
42
  programatic expansion of recurring date rules.
85
43
  email: john@crepezzi.com
@@ -87,9 +45,13 @@ executables: []
87
45
  extensions: []
88
46
  extra_rdoc_files: []
89
47
  files:
48
+ - config/locales/de.yml
90
49
  - config/locales/en.yml
91
50
  - config/locales/es.yml
51
+ - config/locales/fr.yml
92
52
  - config/locales/ja.yml
53
+ - config/locales/ru.yml
54
+ - config/locales/sv.yml
93
55
  - lib/ice_cube.rb
94
56
  - lib/ice_cube/builders/hash_builder.rb
95
57
  - lib/ice_cube/builders/ical_builder.rb
@@ -158,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
120
  version: '0'
159
121
  requirements: []
160
122
  rubyforge_project: ice-cube
161
- rubygems_version: 2.4.5
123
+ rubygems_version: 2.5.2
162
124
  signing_key:
163
125
  specification_version: 4
164
126
  summary: Ruby Date Recurrence Library