montrose 0.2.1 → 0.2.2
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 +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +130 -18
- data/lib/montrose.rb +16 -0
- data/lib/montrose/chainable.rb +50 -7
- data/lib/montrose/recurrence.rb +13 -0
- data/lib/montrose/refinements/array_concat.rb +8 -0
- data/lib/montrose/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: edcfdb878952330a2fcc9a78db4f4e7780e643e3
|
4
|
+
data.tar.gz: 619002eee045e0d960de83d2bdf78078d7d74883
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7be4df5c22b3677978134b446d30c7e3bac3e33309d35f66253aea93ed62d5e60a17bf9b1a8eb8a3745260ef38dee9f74d7f057a0b2fa181f752e7a3183336b1
|
7
|
+
data.tar.gz: 5a1c3a19e2e5fc6a7b64c620be48926d9d257e33b3b2fde91b0588b3d1355052b0b016e011ec7cf396f2046a2e3005b10fab43de0cd648224b55b7b90383f1c4
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
### 0.2.2 - 2016-02-08
|
2
|
+
|
3
|
+
* bug fixes
|
4
|
+
* Handle `Hash` in `Montrose::Chainable` methods that support varargs
|
5
|
+
* enhancements
|
6
|
+
* Adds `Montrose.r` method for starting a new recurrence
|
7
|
+
* Adds `Chainable` alias methods including `#starts`, `#until`, `#repeat`
|
8
|
+
|
1
9
|
### 0.2.1 - 2016-02-03
|
2
10
|
|
3
11
|
* bug fixes
|
data/README.md
CHANGED
@@ -7,6 +7,8 @@
|
|
7
7
|
|
8
8
|
Montrose is an easy-to-use library for defining recurring events in Ruby. It uses a simple chaining system for building recurrences, inspired heavily by the design principles of [HTTP.rb](https://github.com/httprb/http) and rule definitions available in [Recurrence](https://github.com/fnando/recurrence).
|
9
9
|
|
10
|
+
[Introduction](https://rossta.net/blog/recurring-events-in-ruby.html)
|
11
|
+
|
10
12
|
## Installation
|
11
13
|
|
12
14
|
Add this line to your application's Gemfile:
|
@@ -28,6 +30,11 @@ Or install it yourself as:
|
|
28
30
|
```ruby
|
29
31
|
require "montrose"
|
30
32
|
|
33
|
+
# a new recurrence
|
34
|
+
Montrose.r
|
35
|
+
Montrose.recurrence
|
36
|
+
Montrose::Recurrence.new
|
37
|
+
|
31
38
|
# daily for 10 occurrences
|
32
39
|
Montrose.daily(total: 10)
|
33
40
|
|
@@ -144,36 +151,36 @@ Montrose.every(20.minutes, hour: 9..16)
|
|
144
151
|
|
145
152
|
# Minutely
|
146
153
|
Montrose.minutely
|
147
|
-
Montrose
|
154
|
+
Montrose.r(every: :minute)
|
148
155
|
|
149
156
|
Montrose.every(10.minutes)
|
150
|
-
Montrose
|
151
|
-
Montrose
|
157
|
+
Montrose.r(every: 10.minutes)
|
158
|
+
Montrose.r(every: :minute, interval: 10) # every 10 minutes
|
152
159
|
|
153
160
|
Montrose.minutely(until: "9:00 PM")
|
154
|
-
Montrose
|
161
|
+
Montrose.r(every: :minute, until: "9:00 PM")
|
155
162
|
|
156
163
|
# Daily
|
157
164
|
Montrose.daily
|
158
165
|
Montrose.every(:day)
|
159
|
-
Montrose
|
166
|
+
Montrose.r(every: :day)
|
160
167
|
|
161
168
|
Montrose.every(9.days)
|
162
|
-
Montrose
|
163
|
-
Montrose
|
169
|
+
Montrose.r(every: 9.days)
|
170
|
+
Montrose.r(every: :day, interval: 9)
|
164
171
|
|
165
172
|
Montrose.daily(at: "9:00 AM")
|
166
173
|
Montrose.every(:day, at: "9:00 AM")
|
167
|
-
Montrose
|
174
|
+
Montrose.r(every: :day, at: "9:00 AM")
|
168
175
|
|
169
176
|
Montrose.daily(total: 7)
|
170
177
|
Montrose.every(:day, total: 7)
|
171
|
-
Montrose
|
178
|
+
Montrose.r(every: :day, total: 7)
|
172
179
|
|
173
180
|
# Weekly
|
174
181
|
Montrose.weekly
|
175
182
|
Montrose.every(:week)
|
176
|
-
Montrose
|
183
|
+
Montrose.r(every: :week)
|
177
184
|
|
178
185
|
Montrose.every(:week, on: :monday)
|
179
186
|
Montrose.every(:week, on: [:monday, :wednesday, :friday])
|
@@ -184,7 +191,7 @@ Montrose.weekly(on: :thursday)
|
|
184
191
|
# Monthly by month day
|
185
192
|
Montrose.monthly(mday: 1) # first of the month
|
186
193
|
Montrose.every(:month, mday: 1)
|
187
|
-
Montrose
|
194
|
+
Montrose.r(every: :month, mday: 1)
|
188
195
|
|
189
196
|
Montrose.monthly(mday: [2, 15]) # 2nd and 15th of the month
|
190
197
|
Montrose.monthly(mday: -3) # third-to-last day of the month
|
@@ -193,7 +200,7 @@ Montrose.monthly(mday: 10..15) # 10th through the 15th day of the month
|
|
193
200
|
# Monthly by week day
|
194
201
|
Montrose.monthly(day: :friday, interval: 2) # every Friday every other month
|
195
202
|
Montrose.every(:month, day: :friday, interval: 2)
|
196
|
-
Montrose
|
203
|
+
Montrose.r(every: :month, day: :friday, interval: 2)
|
197
204
|
|
198
205
|
Montrose.monthly(day: { friday: [1] }) # 1st Friday of the month
|
199
206
|
Montrose.monthly(day: { Sunday: [1, -1] }) # first and last Sunday of the month
|
@@ -203,14 +210,14 @@ Montrose.monthly(mday: 7..13, day: :saturday) # first Saturday that follow the f
|
|
203
210
|
# Yearly
|
204
211
|
Montrose.yearly
|
205
212
|
Montrose.every(:year)
|
206
|
-
Montrose
|
213
|
+
Montrose.r(every: :year)
|
207
214
|
|
208
215
|
Montrose.yearly(month: [:june, :july]) # yearly in June and July
|
209
216
|
Montrose.yearly(month: 6..8, day: :thursday) # yearly in June, July, August on Thursday
|
210
217
|
Montrose.yearly(yday: [1, 100]) # yearly on the 1st and 100th day of year
|
211
218
|
|
212
|
-
Montrose
|
213
|
-
Montrose
|
219
|
+
Montrose.yearly(on: { january: 31 })
|
220
|
+
Montrose.r(every: :year, on: { 10 => 31 }, interval: 3)
|
214
221
|
|
215
222
|
# TODO: Remove a date in the series with :except date(s)
|
216
223
|
Montrose.daily(:day, except: "2017-01-31")
|
@@ -235,9 +242,11 @@ r.events.take(10).each { |date| puts date.to_s }
|
|
235
242
|
r.events.lazy.select { |time| time > 1.month.from_now }.take(3).each { |date| puts date.to_s }
|
236
243
|
```
|
237
244
|
|
238
|
-
##
|
245
|
+
## Why?
|
246
|
+
|
247
|
+
`Montrose` aims to provide a simple interface for specifying and enumerating recurring events as `Time` objects.
|
239
248
|
|
240
|
-
|
249
|
+
More specifically, this project intends to:
|
241
250
|
|
242
251
|
* embrace Ruby idioms
|
243
252
|
* support Ruby 2.1+
|
@@ -245,9 +254,112 @@ r.events.lazy.select { |time| time > 1.month.from_now }.take(3).each { |date| pu
|
|
245
254
|
* serialize to yaml, hash, and [ical](http://www.kanzaki.com/docs/ical/rrule.html#basic) formats
|
246
255
|
* be suitable for integration with persistence libraries
|
247
256
|
|
248
|
-
What `Montrose`
|
257
|
+
What `Montrose` doesn't do:
|
249
258
|
|
250
259
|
* support all calendaring use cases under the sun
|
260
|
+
* schedule recurring jobs for you. See instead [rufus-scheduler](https://github.com/jmettraux/rufus-scheduler), [sidetiq](https://github.com/tobiassvn/sidetiq), [whenever](https://github.com/javan/whenever)
|
261
|
+
|
262
|
+
## Concepts
|
263
|
+
|
264
|
+
Montrose allows you to easily create "recurrence" objects through chaining:
|
265
|
+
|
266
|
+
```ruby
|
267
|
+
# Every Monday at 10:30am
|
268
|
+
Montrose.weekly.on(:monday).at("10:30 am")
|
269
|
+
=> #<Montrose::Recurrence...>
|
270
|
+
```
|
271
|
+
|
272
|
+
Or the constructor hash-syntax:
|
273
|
+
|
274
|
+
```ruby
|
275
|
+
Montrose.r(every: :week, on: :monday, at: "10:30 am")
|
276
|
+
=> #<Montrose::Recurrence...>
|
277
|
+
```
|
278
|
+
|
279
|
+
A Montrose recurrence responds to `#events`, which returns an [`Enumerator`](/blog/what-is-enumerator.html) that can generate timestamps:
|
280
|
+
|
281
|
+
```ruby
|
282
|
+
r = Montrose.hourly
|
283
|
+
=> #<Montrose::Recurrence...>
|
284
|
+
|
285
|
+
r.events
|
286
|
+
=> #<Enumerator:...>
|
287
|
+
|
288
|
+
r.events.take(10)
|
289
|
+
=> [2016-02-03 18:26:08 -0500,
|
290
|
+
2016-02-03 19:26:08 -0500,
|
291
|
+
2016-02-03 20:26:08 -0500,
|
292
|
+
2016-02-03 21:26:08 -0500,
|
293
|
+
2016-02-03 22:26:08 -0500,
|
294
|
+
2016-02-03 23:26:08 -0500,
|
295
|
+
2016-02-04 00:26:08 -0500,
|
296
|
+
2016-02-04 01:26:08 -0500,
|
297
|
+
2016-02-04 02:26:08 -0500,
|
298
|
+
2016-02-04 03:26:08 -0500]
|
299
|
+
```
|
300
|
+
|
301
|
+
Montrose recurrences are themselves enumerable:
|
302
|
+
|
303
|
+
```ruby
|
304
|
+
# Every month starting a year from now on Friday the 13th for 5 occurrences
|
305
|
+
r = Montrose.monthly.starting(1.year.from_now).on(friday: 13).repeat(5)
|
306
|
+
|
307
|
+
r.map(&:to_date)
|
308
|
+
=> [Fri, 13 Oct 2017,
|
309
|
+
Fri, 13 Apr 2018,
|
310
|
+
Fri, 13 Jul 2018,
|
311
|
+
Fri, 13 Sep 2019,
|
312
|
+
Fri, 13 Dec 2019]
|
313
|
+
```
|
314
|
+
|
315
|
+
Each chained recurrence returns a new object so they can be composed and
|
316
|
+
merged:
|
317
|
+
|
318
|
+
```ruby
|
319
|
+
# Every week
|
320
|
+
r1 = Montrose.every(:week)
|
321
|
+
r2 = Montrose.on([:tuesday, :thursday])
|
322
|
+
r3 = Montrose.at("12 pm")
|
323
|
+
r4 = Montrose.total(4)
|
324
|
+
|
325
|
+
r1.merge(r2).merge(r3).merge(r4).to_a
|
326
|
+
=> [2016-02-04 12:00:00 -0500,
|
327
|
+
2016-02-09 12:00:00 -0500,
|
328
|
+
2016-02-11 12:00:00 -0500,
|
329
|
+
2016-02-16 12:00:00 -0500]
|
330
|
+
```
|
331
|
+
|
332
|
+
Conceptually, recurrences can represent an infinite sequence. When we say
|
333
|
+
simply "every day", there is no implied ending. It's therefore possible to
|
334
|
+
create a recurrence that can enumerate forever.
|
335
|
+
|
336
|
+
```ruby
|
337
|
+
# Every day starting now
|
338
|
+
r = Montrose.daily
|
339
|
+
|
340
|
+
# this expression will never complete, Ctrl-c!
|
341
|
+
r.map(&:to_date)
|
342
|
+
|
343
|
+
# so use your `Enumerable` methods wisely
|
344
|
+
r.lazy.map(&:to_date).select { |d| d.mday > 25 }.take(5).to_a
|
345
|
+
=> [Fri, 26 Feb 2016,
|
346
|
+
Sat, 27 Feb 2016,
|
347
|
+
Sun, 28 Feb 2016,
|
348
|
+
Mon, 29 Feb 2016,
|
349
|
+
Sat, 26 Mar 2016]
|
350
|
+
```
|
351
|
+
|
352
|
+
It's straightforward to convert a recurrence to a hash and back.
|
353
|
+
|
354
|
+
```ruby
|
355
|
+
opts = Montrose::Recurrence.new(every: 10.minutes).to_h
|
356
|
+
=> {:every=>:minute, :interval=>10}
|
357
|
+
|
358
|
+
Montrose::Recurrence.new(opts).take(3)
|
359
|
+
=> [2016-02-03 19:06:07 -0500,
|
360
|
+
2016-02-03 19:16:07 -0500,
|
361
|
+
2016-02-03 19:26:07 -0500]
|
362
|
+
```
|
251
363
|
|
252
364
|
## Inspiration
|
253
365
|
|
data/lib/montrose.rb
CHANGED
@@ -17,4 +17,20 @@ require "montrose/version"
|
|
17
17
|
|
18
18
|
module Montrose
|
19
19
|
extend Chainable
|
20
|
+
|
21
|
+
class << self
|
22
|
+
# Create a new recurrence from given options
|
23
|
+
# An alias to {Montrose::Recurrence.new}
|
24
|
+
#
|
25
|
+
# @param options [Hash] recurrence options
|
26
|
+
#
|
27
|
+
# @example
|
28
|
+
# Montrose.recurrence(every: :day)
|
29
|
+
# Montrose.r(every: :day)
|
30
|
+
#
|
31
|
+
# @return [Montrose::Recurrence]
|
32
|
+
#
|
33
|
+
alias recurrence branch
|
34
|
+
alias r branch
|
35
|
+
end
|
20
36
|
end
|
data/lib/montrose/chainable.rb
CHANGED
@@ -16,6 +16,8 @@ module Montrose
|
|
16
16
|
# Montrose.every(3.days, starts: 2.days.from_now)
|
17
17
|
# Montrose.every(1.year, until: 10.days.from_now)
|
18
18
|
#
|
19
|
+
# @return [Montrose::Recurrence]
|
20
|
+
#
|
19
21
|
def every(frequency, options = {})
|
20
22
|
branch options.merge(every: frequency)
|
21
23
|
end
|
@@ -32,6 +34,8 @@ module Montrose
|
|
32
34
|
# Montrose.minutely(total: 5)
|
33
35
|
# Montrose.minutely(except: Date.tomorrow)
|
34
36
|
#
|
37
|
+
# @return [Montrose::Recurrence]
|
38
|
+
#
|
35
39
|
def minutely(options = {})
|
36
40
|
branch options.merge(every: :minute)
|
37
41
|
end
|
@@ -48,6 +52,8 @@ module Montrose
|
|
48
52
|
# Montrose.hourly(total: 5)
|
49
53
|
# Montrose.hourly(except: Date.tomorrow)
|
50
54
|
#
|
55
|
+
# @return [Montrose::Recurrence]
|
56
|
+
#
|
51
57
|
def hourly(options = {})
|
52
58
|
branch options.merge(every: :hour)
|
53
59
|
end
|
@@ -64,6 +70,8 @@ module Montrose
|
|
64
70
|
# Montrose.daily(total: 5)
|
65
71
|
# Montrose.daily(except: Date.tomorrow)
|
66
72
|
#
|
73
|
+
# @return [Montrose::Recurrence]
|
74
|
+
#
|
67
75
|
def daily(options = {})
|
68
76
|
branch options.merge(every: :day)
|
69
77
|
end
|
@@ -79,6 +87,8 @@ module Montrose
|
|
79
87
|
# Montrose.weekly(on: :saturday, interval: 2)
|
80
88
|
# Montrose.weekly(on: :saturday, total: 5)
|
81
89
|
#
|
90
|
+
# @return [Montrose::Recurrence]
|
91
|
+
#
|
82
92
|
def weekly(options = {})
|
83
93
|
branch options.merge(every: :week)
|
84
94
|
end
|
@@ -92,6 +102,8 @@ module Montrose
|
|
92
102
|
# Montrose.monthly(mday: -3) # third-to-last day of the month
|
93
103
|
# Montrose.monthly(mday: 10..15) # 10th through the 15th day of the month
|
94
104
|
#
|
105
|
+
# @return [Montrose::Recurrence]
|
106
|
+
#
|
95
107
|
def monthly(options = {})
|
96
108
|
branch options.merge(every: :month)
|
97
109
|
end
|
@@ -107,6 +119,8 @@ module Montrose
|
|
107
119
|
# Montrose.yearly(on: [:january, 14], interval: 2)
|
108
120
|
# Montrose.yearly(on: [:january, 14], total: 5)
|
109
121
|
#
|
122
|
+
# @return [Montrose::Recurrence]
|
123
|
+
#
|
110
124
|
def yearly(options = {})
|
111
125
|
branch options.merge(every: :year)
|
112
126
|
end
|
@@ -118,9 +132,12 @@ module Montrose
|
|
118
132
|
# @example
|
119
133
|
# Montrose.daily.starting(Date.tomorrow)
|
120
134
|
#
|
121
|
-
|
135
|
+
# @return [Montrose::Recurrence]
|
136
|
+
#
|
137
|
+
def starts(starts_at)
|
122
138
|
merge(starts: starts_at)
|
123
139
|
end
|
140
|
+
alias starting starts
|
124
141
|
|
125
142
|
# Create a recurrence ending at given timestamp.
|
126
143
|
#
|
@@ -129,9 +146,12 @@ module Montrose
|
|
129
146
|
# @example
|
130
147
|
# Montrose.daily.ending(1.year.from_now)
|
131
148
|
#
|
132
|
-
|
149
|
+
# @return [Montrose::Recurrence]
|
150
|
+
#
|
151
|
+
def until(ends_at)
|
133
152
|
merge(until: ends_at)
|
134
153
|
end
|
154
|
+
alias ending until
|
135
155
|
|
136
156
|
# Create a recurrence occurring during date range.
|
137
157
|
#
|
@@ -140,6 +160,8 @@ module Montrose
|
|
140
160
|
# @example
|
141
161
|
# Montrose.weekly.between(Date.today..Date.new(2016, 3, 15))
|
142
162
|
#
|
163
|
+
# @return [Montrose::Recurrence]
|
164
|
+
#
|
143
165
|
def between(date_range)
|
144
166
|
merge(between: date_range)
|
145
167
|
end
|
@@ -152,6 +174,8 @@ module Montrose
|
|
152
174
|
# Montrose.weekly.on(:friday)
|
153
175
|
# Montrose.monthly.on(friday: 13)
|
154
176
|
#
|
177
|
+
# @return [Montrose::Recurrence]
|
178
|
+
#
|
155
179
|
def on(day)
|
156
180
|
merge(on: day)
|
157
181
|
end
|
@@ -164,6 +188,8 @@ module Montrose
|
|
164
188
|
# Montrose.daily.at("12pm")
|
165
189
|
# Montrose.daily.at("9:37am")
|
166
190
|
#
|
191
|
+
# @return [Montrose::Recurrence]
|
192
|
+
#
|
167
193
|
def at(time)
|
168
194
|
merge(at: time)
|
169
195
|
end
|
@@ -177,6 +203,8 @@ module Montrose
|
|
177
203
|
# Montrose.daily.day_of_month([1, -1])
|
178
204
|
# Montrose.daily.day_of_month(2..8)
|
179
205
|
#
|
206
|
+
# @return [Montrose::Recurrence]
|
207
|
+
#
|
180
208
|
def day_of_month(days, *extras)
|
181
209
|
merge(mday: days.array_concat(extras))
|
182
210
|
end
|
@@ -191,6 +219,8 @@ module Montrose
|
|
191
219
|
# Montrose.daily.day_of_week(:monday, :tuesday)
|
192
220
|
# Montrose.daily.day_of_week(2..5)
|
193
221
|
#
|
222
|
+
# @return [Montrose::Recurrence]
|
223
|
+
#
|
194
224
|
def day_of_week(weekdays, *extras)
|
195
225
|
merge(day: weekdays.array_concat(extras))
|
196
226
|
end
|
@@ -205,6 +235,8 @@ module Montrose
|
|
205
235
|
# Montrose.daily.day_of_year([1, 10, 100])
|
206
236
|
# Montrose.daily.day_of_year(20..50)
|
207
237
|
#
|
238
|
+
# @return [Montrose::Recurrence]
|
239
|
+
#
|
208
240
|
def day_of_year(days, *extras)
|
209
241
|
merge(yday: days.array_concat(extras))
|
210
242
|
end
|
@@ -219,6 +251,8 @@ module Montrose
|
|
219
251
|
# Montrose.hourly.hour_of_day(15)
|
220
252
|
# Montrose.hourly.hour_of_day(6..10)
|
221
253
|
#
|
254
|
+
# @return [Montrose::Recurrence]
|
255
|
+
#
|
222
256
|
def hour_of_day(hours, *extras)
|
223
257
|
merge(hour: hours.array_concat(extras))
|
224
258
|
end
|
@@ -233,6 +267,8 @@ module Montrose
|
|
233
267
|
# Montrose.monthly.month_of_year([2, 5])
|
234
268
|
# Montrose.monthly.month_of_year(2..5)
|
235
269
|
#
|
270
|
+
# @return [Montrose::Recurrence]
|
271
|
+
#
|
236
272
|
def month_of_year(months, *extras)
|
237
273
|
merge(month: months.array_concat(extras))
|
238
274
|
end
|
@@ -247,6 +283,8 @@ module Montrose
|
|
247
283
|
# Montrose.weekly.week_of_year([2, 5])
|
248
284
|
# Montrose.weekly.week_of_year(2..5)
|
249
285
|
#
|
286
|
+
# @return [Montrose::Recurrence]
|
287
|
+
#
|
250
288
|
def week_of_year(weeks, *extras)
|
251
289
|
merge(week: weeks.array_concat(extras))
|
252
290
|
end
|
@@ -259,31 +297,36 @@ module Montrose
|
|
259
297
|
# @example
|
260
298
|
# Montrose.daily.total(10)
|
261
299
|
#
|
300
|
+
# @return [Montrose::Recurrence]
|
301
|
+
#
|
262
302
|
def total(total)
|
263
303
|
merge(total: total)
|
264
304
|
end
|
305
|
+
alias repeat total
|
265
306
|
|
266
307
|
# Create a new recurrence combining options of self
|
267
308
|
# and other. The value of entries with duplicate
|
268
309
|
# keys will be those of other
|
269
310
|
#
|
270
|
-
# @param
|
311
|
+
# @param other [Hash,Montrose::Recurrence] other options or recurrence
|
271
312
|
#
|
272
313
|
# @example
|
273
314
|
# Montrose.daily.total(10)
|
274
315
|
#
|
316
|
+
# @return [Montrose::Recurrence]
|
317
|
+
#
|
275
318
|
def merge(other = {})
|
276
319
|
branch default_options.merge(other)
|
277
320
|
end
|
278
321
|
|
279
322
|
# @private
|
280
|
-
def
|
281
|
-
|
323
|
+
def branch(options)
|
324
|
+
Montrose::Recurrence.new(options)
|
282
325
|
end
|
283
326
|
|
284
327
|
# @private
|
285
|
-
def
|
286
|
-
Montrose::
|
328
|
+
def default_options
|
329
|
+
@default_options ||= Montrose::Options.new
|
287
330
|
end
|
288
331
|
end
|
289
332
|
end
|
data/lib/montrose/recurrence.rb
CHANGED
@@ -36,6 +36,14 @@ module Montrose
|
|
36
36
|
@default_options = Montrose::Options.new(opts)
|
37
37
|
end
|
38
38
|
|
39
|
+
# Returns an enumerator for iterating over
|
40
|
+
# timestamps in the recurrence
|
41
|
+
#
|
42
|
+
# @example
|
43
|
+
# recurrence.events
|
44
|
+
#
|
45
|
+
# @return [Enumerator] a enumerator of recurrence timestamps
|
46
|
+
#
|
39
47
|
def events
|
40
48
|
event_enum
|
41
49
|
end
|
@@ -44,6 +52,11 @@ module Montrose
|
|
44
52
|
events.each(&block)
|
45
53
|
end
|
46
54
|
|
55
|
+
# Returns a hash of the options used to create
|
56
|
+
# the recurrence
|
57
|
+
#
|
58
|
+
# @return [Hash] hash of recurrence options
|
59
|
+
#
|
47
60
|
def to_hash
|
48
61
|
default_options.to_hash
|
49
62
|
end
|
data/lib/montrose/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: montrose
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ross Kaffenberger
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -186,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
186
186
|
version: '0'
|
187
187
|
requirements: []
|
188
188
|
rubyforge_project:
|
189
|
-
rubygems_version: 2.
|
189
|
+
rubygems_version: 2.5.1
|
190
190
|
signing_key:
|
191
191
|
specification_version: 4
|
192
192
|
summary: Recurring events in Ruby
|