ice_cube 0.14.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
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