montrose 0.1.1 → 0.2.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 +4 -4
- data/CHANGELOG.md +19 -0
- data/README.md +3 -5
- data/Rakefile +13 -4
- data/lib/montrose/chainable.rb +111 -43
- data/lib/montrose/clock.rb +3 -3
- data/lib/montrose/frequency.rb +1 -1
- data/lib/montrose/options.rb +16 -4
- data/lib/montrose/recurrence.rb +1 -1
- data/lib/montrose/refinements/array_concat.rb +11 -0
- data/lib/montrose/rule/hour_of_day.rb +1 -1
- data/lib/montrose/schedule.rb +10 -4
- data/lib/montrose/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72c7f27af8ab0e30ced7801cad42cf1243f9f79f
|
4
|
+
data.tar.gz: 228ad308e574dabefc4f5635e76dd878c8d105c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94736a08ae987f52cd24adace44ce7414604d375a0d5281c823426cbc7f9d205fd25dccdbbacd46533cca4dc9bd424395374191ce26b75e4e8897e2ddc35ff25
|
7
|
+
data.tar.gz: ae7a298bc0ed9830656c85ef8cbb74faaf8eb7d22f1ecd854dde5e7ce8d1eefc5a223e27b3d2ecbe683a1113c807a29df205cfeb3ddc324832af0b251a6470b4
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
### 0.2.0 - 2016-02-03
|
2
|
+
|
3
|
+
* enhancements
|
4
|
+
* extend `Montrose::Schedule` api for building and adding recurrences
|
5
|
+
* add more details to chainable docs
|
6
|
+
* merge default options at enumeration time for more consistent serialization
|
7
|
+
|
8
|
+
### 0.1.1 - 2016-25-01
|
9
|
+
|
10
|
+
* bug fixes
|
11
|
+
* add missing `require "forwardable"`
|
12
|
+
* enhancements
|
13
|
+
* add better `#inspect` methods in `Recurrence` and `Options`
|
14
|
+
* use refinement to refactor Options internal arg merging
|
15
|
+
* support ruby 2.3.0 in travis builds
|
16
|
+
|
17
|
+
### 0.1.0 - 2016-18-01
|
18
|
+
|
19
|
+
* initial release
|
data/README.md
CHANGED
@@ -155,6 +155,7 @@ Montrose::Recurrence.new(every: :minute, until: "9:00 PM")
|
|
155
155
|
|
156
156
|
# Daily
|
157
157
|
Montrose.daily
|
158
|
+
Montrose.every(:day)
|
158
159
|
Montrose::Recurrence.new(every: :day)
|
159
160
|
|
160
161
|
Montrose.every(9.days)
|
@@ -218,18 +219,15 @@ Montrose.daily(except: [Date.today, "2017-01-31"])
|
|
218
219
|
# Chaining
|
219
220
|
Montrose.weekly.starting(3.weeks.from_now).on(:friday)
|
220
221
|
Montrose.every(:day).at("4:05pm")
|
222
|
+
Montrose.yearly.between(Time.now..10.years.from_now)
|
221
223
|
|
222
224
|
# Enumerating events
|
223
225
|
r = Montrose.every(:month, mday: 31, until: "January 1, 2017")
|
224
226
|
r.each { |time| puts time.to_s }
|
225
227
|
r.take(10).to_a
|
226
228
|
|
227
|
-
# Merging rules
|
229
|
+
# Merging rules
|
228
230
|
r.merge(starts: "2017-01-01").each { |time| puts time.to_s }
|
229
|
-
r.merge(starts: "2017-01-01").each { |date| puts date.to_s }
|
230
|
-
r.merge(until: "2017-01-10").each { |date| puts date.to_s }
|
231
|
-
r.merge(through: "2017-01-10").each { |date| puts date.to_s }
|
232
|
-
r.merge(starts: "2017-01-05", until: "2017-01-10").each {|date| puts date.to_s }
|
233
231
|
|
234
232
|
# Using #events Enumerator
|
235
233
|
r.events # => #<Enumerator: ...>
|
data/Rakefile
CHANGED
@@ -4,10 +4,6 @@ require "rake/testtask"
|
|
4
4
|
require "rubocop/rake_task"
|
5
5
|
require "yard"
|
6
6
|
|
7
|
-
YARD::Rake::YardocTask.new do |t|
|
8
|
-
t.files = ["README.md", "lib/**/*.rb"]
|
9
|
-
end
|
10
|
-
|
11
7
|
Rake::TestTask.new(:spec) do |t|
|
12
8
|
t.libs << "spec"
|
13
9
|
t.libs << "lib"
|
@@ -19,3 +15,16 @@ task test: :spec
|
|
19
15
|
RuboCop::RakeTask.new
|
20
16
|
|
21
17
|
task default: [:spec, :rubocop]
|
18
|
+
|
19
|
+
namespace :doc do
|
20
|
+
desc "Generate docs and publish to gh-pages"
|
21
|
+
task :publish do
|
22
|
+
require "fileutils"
|
23
|
+
sh "yard doc"
|
24
|
+
sh "git checkout gh-pages"
|
25
|
+
sh "cp -R doc/* ."
|
26
|
+
sh "git commit -vam 'Update documentation'"
|
27
|
+
sh "git push origin gh-pages"
|
28
|
+
sh "git checkout -"
|
29
|
+
end
|
30
|
+
end
|
data/lib/montrose/chainable.rb
CHANGED
@@ -1,13 +1,19 @@
|
|
1
1
|
require "montrose/options"
|
2
|
+
require "montrose/refinements/array_concat"
|
2
3
|
|
3
4
|
module Montrose
|
4
5
|
module Chainable
|
6
|
+
using Montrose::Refinements::ArrayConcat
|
7
|
+
|
5
8
|
# Create a recurrence from the given frequency
|
6
|
-
# @example
|
7
9
|
#
|
10
|
+
# @param frequency [Symbol,String,Numeric] the recurrence frequency
|
11
|
+
# @param options [Hash] additional recurrence options
|
12
|
+
#
|
13
|
+
# @example
|
8
14
|
# Montrose.every(:hour)
|
9
|
-
# Montrose.every(:hour, interval: 2)
|
10
|
-
# Montrose.every(3.days, starts: 2.days.from_now)
|
15
|
+
# Montrose.every(:hour, interval: 2)
|
16
|
+
# Montrose.every(3.days, starts: 2.days.from_now)
|
11
17
|
# Montrose.every(1.year, until: 10.days.from_now)
|
12
18
|
#
|
13
19
|
def every(frequency, options = {})
|
@@ -16,8 +22,9 @@ module Montrose
|
|
16
22
|
|
17
23
|
# Create a minutely recurrence.
|
18
24
|
#
|
19
|
-
# @
|
25
|
+
# @param options [Hash] additional recurrence options
|
20
26
|
#
|
27
|
+
# @example
|
21
28
|
# Montrose.minutely
|
22
29
|
# Montrose.minutely(interval: 2) #=> every 2 minutes
|
23
30
|
# Montrose.minutely(starts: 3.days.from_now)
|
@@ -31,8 +38,9 @@ module Montrose
|
|
31
38
|
|
32
39
|
# Create a hourly recurrence.
|
33
40
|
#
|
34
|
-
# @
|
41
|
+
# @param options [Hash] additional recurrence options
|
35
42
|
#
|
43
|
+
# @example
|
36
44
|
# Montrose.hourly
|
37
45
|
# Montrose.hourly(interval: 2) #=> every 2 hours
|
38
46
|
# Montrose.hourly(starts: 3.days.from_now)
|
@@ -46,8 +54,9 @@ module Montrose
|
|
46
54
|
|
47
55
|
# Create a daily recurrence.
|
48
56
|
#
|
49
|
-
# @
|
57
|
+
# @param options [Hash] additional recurrence options
|
50
58
|
#
|
59
|
+
# @example
|
51
60
|
# Montrose.daily
|
52
61
|
# Montrose.daily(interval: 2) #=> every 2 days
|
53
62
|
# Montrose.daily(starts: 3.days.from_now)
|
@@ -61,6 +70,8 @@ module Montrose
|
|
61
70
|
|
62
71
|
# Create a weekly recurrence.
|
63
72
|
#
|
73
|
+
# @param options [Hash] additional recurrence options
|
74
|
+
#
|
64
75
|
# @example
|
65
76
|
# Montrose.weekly(on: 5) #=> 0 = sunday, 1 = monday, ...
|
66
77
|
# Montrose.weekly(on: :saturday)
|
@@ -74,14 +85,12 @@ module Montrose
|
|
74
85
|
|
75
86
|
# Create a monthly recurrence.
|
76
87
|
#
|
77
|
-
# @
|
78
|
-
# Montrose.monthly(mday: [2, 15]) # 2nd and 15th of the month
|
79
|
-
# Montrose.monthly(mday: -3) # third-to-last day of the month
|
80
|
-
# Montrose.monthly(mday: 10..15) # 10th through the 15th day of the month
|
81
|
-
#
|
82
|
-
# The <tt>:on</tt> option can be one of the following:
|
88
|
+
# @param options [Hash] additional recurrence options
|
83
89
|
#
|
84
|
-
#
|
90
|
+
# @example
|
91
|
+
# Montrose.monthly(mday: [2, 15]) # 2nd and 15th of the month
|
92
|
+
# Montrose.monthly(mday: -3) # third-to-last day of the month
|
93
|
+
# Montrose.monthly(mday: 10..15) # 10th through the 15th day of the month
|
85
94
|
#
|
86
95
|
def monthly(options = {})
|
87
96
|
branch options.merge(every: :month)
|
@@ -89,8 +98,9 @@ module Montrose
|
|
89
98
|
|
90
99
|
# Create a yearly recurrence.
|
91
100
|
#
|
92
|
-
# @
|
101
|
+
# @param options [Hash] additional recurrence options
|
93
102
|
#
|
103
|
+
# @example
|
94
104
|
# Montrose.yearly(on: [7, 14]) #=> every Jul 14
|
95
105
|
# Montrose.yearly(on: [7, 14], interval: 2) #=> every 2 years on Jul 14
|
96
106
|
# Montrose.yearly(on: [:jan, 14], interval: 2)
|
@@ -103,7 +113,10 @@ module Montrose
|
|
103
113
|
|
104
114
|
# Create a recurrence starting at given timestamp.
|
105
115
|
#
|
106
|
-
# @param [Time, Date]
|
116
|
+
# @param starts_at [Time, Date] start time of recurrence
|
117
|
+
#
|
118
|
+
# @example
|
119
|
+
# Montrose.daily.starting(Date.tomorrow)
|
107
120
|
#
|
108
121
|
def starting(starts_at)
|
109
122
|
merge(starts: starts_at)
|
@@ -111,7 +124,10 @@ module Montrose
|
|
111
124
|
|
112
125
|
# Create a recurrence ending at given timestamp.
|
113
126
|
#
|
114
|
-
# @param [Time, Date]
|
127
|
+
# @param ends_at [Time, Date] end time of recurrence
|
128
|
+
#
|
129
|
+
# @example
|
130
|
+
# Montrose.daily.ending(1.year.from_now)
|
115
131
|
#
|
116
132
|
def ending(ends_at)
|
117
133
|
merge(until: ends_at)
|
@@ -121,13 +137,20 @@ module Montrose
|
|
121
137
|
#
|
122
138
|
# @param [Range<Date>] date_range
|
123
139
|
#
|
140
|
+
# @example
|
141
|
+
# Montrose.weekly.between(Date.today..Date.new(2016, 3, 15))
|
142
|
+
#
|
124
143
|
def between(date_range)
|
125
144
|
merge(between: date_range)
|
126
145
|
end
|
127
146
|
|
128
147
|
# Create a recurrence through :on option
|
129
148
|
#
|
130
|
-
# @param [Hash,Symbol]
|
149
|
+
# @param day [Hash,Symbol] weekday or day of month as hash, e.g. { friday: 13 }
|
150
|
+
#
|
151
|
+
# @example
|
152
|
+
# Montrose.weekly.on(:friday)
|
153
|
+
# Montrose.monthly.on(friday: 13)
|
131
154
|
#
|
132
155
|
def on(day)
|
133
156
|
merge(on: day)
|
@@ -135,7 +158,11 @@ module Montrose
|
|
135
158
|
|
136
159
|
# Create a recurrence at given time
|
137
160
|
#
|
138
|
-
# @param [String,Time]
|
161
|
+
# @param time [String,Time] represents time of day
|
162
|
+
#
|
163
|
+
# @example
|
164
|
+
# Montrose.daily.at("12pm")
|
165
|
+
# Montrose.daily.at("9:37am")
|
139
166
|
#
|
140
167
|
def at(time)
|
141
168
|
merge(at: time)
|
@@ -143,69 +170,110 @@ module Montrose
|
|
143
170
|
|
144
171
|
# Create a recurrence for given days of month
|
145
172
|
#
|
146
|
-
# @param [Fixnum] days
|
173
|
+
# @param days [Fixnum] days of month, e.g. 1, 2, -1, ...
|
147
174
|
#
|
148
|
-
|
149
|
-
|
175
|
+
# @example
|
176
|
+
# Montrose.daily.day_of_month(1, -1)
|
177
|
+
# Montrose.daily.day_of_month([1, -1])
|
178
|
+
# Montrose.daily.day_of_month(2..8)
|
179
|
+
#
|
180
|
+
def day_of_month(days, *extras)
|
181
|
+
merge(mday: days.array_concat(extras))
|
150
182
|
end
|
151
183
|
alias mday day_of_month
|
152
184
|
|
153
185
|
# Create a recurrence for given days of week
|
154
186
|
#
|
155
|
-
# @param [Symbol]
|
187
|
+
# @param weekdays [Symbol] days of week, e.g. :sunday, :monday, ...
|
188
|
+
#
|
189
|
+
# @example
|
190
|
+
# Montrose.daily.day_of_week(:saturday)
|
191
|
+
# Montrose.daily.day_of_week(:monday, :tuesday)
|
192
|
+
# Montrose.daily.day_of_week(2..5)
|
156
193
|
#
|
157
|
-
def day_of_week(*
|
158
|
-
merge(day: weekdays)
|
194
|
+
def day_of_week(weekdays, *extras)
|
195
|
+
merge(day: weekdays.array_concat(extras))
|
159
196
|
end
|
160
197
|
alias day day_of_week
|
161
198
|
|
162
199
|
# Create a recurrence for given days of year
|
163
200
|
#
|
164
|
-
# @param [Fixnum] days
|
201
|
+
# @param days [Fixnum, Range, Array<Integer>] days of year, e.g., 1, 10, 100, ...
|
165
202
|
#
|
166
|
-
|
167
|
-
|
203
|
+
# @example
|
204
|
+
# Montrose.daily.day_of_year(1, 10, 100)
|
205
|
+
# Montrose.daily.day_of_year([1, 10, 100])
|
206
|
+
# Montrose.daily.day_of_year(20..50)
|
207
|
+
#
|
208
|
+
def day_of_year(days, *extras)
|
209
|
+
merge(yday: days.array_concat(extras))
|
168
210
|
end
|
169
211
|
alias yday day_of_year
|
170
212
|
|
171
213
|
# Create a recurrence for given hours of day
|
172
214
|
#
|
173
|
-
# @param [Fixnum, Range]
|
215
|
+
# @param hours [Fixnum, Range, Array<Integer>] hours of day, e.g. 1, 10, 100, ...
|
174
216
|
#
|
175
|
-
|
176
|
-
|
217
|
+
# @example
|
218
|
+
# Montrose.hourly.hour_of_day(9)
|
219
|
+
# Montrose.hourly.hour_of_day(15)
|
220
|
+
# Montrose.hourly.hour_of_day(6..10)
|
221
|
+
#
|
222
|
+
def hour_of_day(hours, *extras)
|
223
|
+
merge(hour: hours.array_concat(extras))
|
177
224
|
end
|
178
225
|
alias hour hour_of_day
|
179
226
|
|
180
227
|
# Create a recurrence for given months of year
|
181
228
|
#
|
182
|
-
# @param [Fixnum, Symbol] months
|
229
|
+
# @param months [Fixnum, Symbol] months of year, e.g., :january, :april, ...
|
230
|
+
#
|
231
|
+
# @example
|
232
|
+
# Montrose.monthly.month_of_year(9)
|
233
|
+
# Montrose.monthly.month_of_year([2, 5])
|
234
|
+
# Montrose.monthly.month_of_year(2..5)
|
183
235
|
#
|
184
|
-
def month_of_year(*
|
185
|
-
merge(month: months)
|
236
|
+
def month_of_year(months, *extras)
|
237
|
+
merge(month: months.array_concat(extras))
|
186
238
|
end
|
187
239
|
alias month month_of_year
|
188
240
|
|
241
|
+
# Create a recurrence for given weeks of year
|
242
|
+
#
|
243
|
+
# @param weeks [Fixnum] weeks of year, e.g., 1, 20, 50
|
244
|
+
#
|
245
|
+
# @example
|
246
|
+
# Montrose.weekly.week_of_year(9)
|
247
|
+
# Montrose.weekly.week_of_year([2, 5])
|
248
|
+
# Montrose.weekly.week_of_year(2..5)
|
249
|
+
#
|
250
|
+
def week_of_year(weeks, *extras)
|
251
|
+
merge(week: weeks.array_concat(extras))
|
252
|
+
end
|
253
|
+
|
189
254
|
# Create a recurrence that ends after given number
|
190
255
|
# of occurrences
|
191
256
|
#
|
192
|
-
# @param [Fixnum]
|
257
|
+
# @param total [Fixnum] repeat count
|
258
|
+
#
|
259
|
+
# @example
|
260
|
+
# Montrose.daily.total(10)
|
193
261
|
#
|
194
262
|
def total(total)
|
195
263
|
merge(total: total)
|
196
264
|
end
|
197
265
|
|
198
|
-
# Create a recurrence
|
266
|
+
# Create a new recurrence combining options of self
|
267
|
+
# and other. The value of entries with duplicate
|
268
|
+
# keys will be those of other
|
199
269
|
#
|
200
|
-
# @param [
|
270
|
+
# @param opts [Hash,Montrose::Recurrence] other options or recurrence
|
201
271
|
#
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
def merge(opts = {})
|
208
|
-
branch default_options.merge(opts)
|
272
|
+
# @example
|
273
|
+
# Montrose.daily.total(10)
|
274
|
+
#
|
275
|
+
def merge(other = {})
|
276
|
+
branch default_options.merge(other)
|
209
277
|
end
|
210
278
|
|
211
279
|
# @private
|
data/lib/montrose/clock.rb
CHANGED
@@ -3,7 +3,7 @@ require "montrose/errors"
|
|
3
3
|
module Montrose
|
4
4
|
class Clock
|
5
5
|
def initialize(opts = {})
|
6
|
-
@options = Montrose::Options.
|
6
|
+
@options = Montrose::Options.merge(opts)
|
7
7
|
@time = nil
|
8
8
|
@every = @options.fetch(:every) { fail ConfigurationError, "Required option :every not provided" }
|
9
9
|
@starts = @options.fetch(:starts)
|
@@ -44,13 +44,13 @@ module Montrose
|
|
44
44
|
# when options contain given unit as a key or as a value of
|
45
45
|
# the key :every in options
|
46
46
|
#
|
47
|
-
#
|
47
|
+
# options = { every: :day, hour: 8.12 }
|
48
48
|
# unit_step(:minute)
|
49
49
|
# => nil
|
50
50
|
# unit_step(:hour)
|
51
51
|
# => { hour: 1 }
|
52
52
|
#
|
53
|
-
#
|
53
|
+
# options = { every: :hour, interval: 6 }
|
54
54
|
# unit_step(:minute)
|
55
55
|
# => nil
|
56
56
|
# unit_step(:hour)
|
data/lib/montrose/frequency.rb
CHANGED
data/lib/montrose/options.rb
CHANGED
@@ -58,6 +58,18 @@ module Montrose
|
|
58
58
|
@default_starts
|
59
59
|
end
|
60
60
|
end
|
61
|
+
|
62
|
+
def merge(opts = {})
|
63
|
+
new(default_options).merge(opts)
|
64
|
+
end
|
65
|
+
|
66
|
+
def default_options
|
67
|
+
{
|
68
|
+
starts: default_starts,
|
69
|
+
until: default_until,
|
70
|
+
interval: 1
|
71
|
+
}
|
72
|
+
end
|
61
73
|
end
|
62
74
|
|
63
75
|
def_option :every
|
@@ -78,9 +90,9 @@ module Montrose
|
|
78
90
|
def initialize(opts = {})
|
79
91
|
defaults = {
|
80
92
|
every: self.class.default_every,
|
81
|
-
|
82
|
-
|
83
|
-
|
93
|
+
interval: nil,
|
94
|
+
starts: nil,
|
95
|
+
until: nil,
|
84
96
|
day: nil,
|
85
97
|
mday: nil,
|
86
98
|
yday: nil,
|
@@ -272,7 +284,7 @@ module Montrose
|
|
272
284
|
|
273
285
|
def assert_range_includes(range, item, absolute = false)
|
274
286
|
test = absolute ? item.abs : item
|
275
|
-
fail ConfigurationError, "Out of range" unless range.include?(test)
|
287
|
+
fail ConfigurationError, "Out of range: #{range.inspect} does not include #{test}" unless range.include?(test)
|
276
288
|
|
277
289
|
item
|
278
290
|
end
|
data/lib/montrose/recurrence.rb
CHANGED
data/lib/montrose/schedule.rb
CHANGED
@@ -2,6 +2,12 @@ module Montrose
|
|
2
2
|
class Schedule
|
3
3
|
attr_accessor :rules
|
4
4
|
|
5
|
+
def self.build
|
6
|
+
schedule = new
|
7
|
+
yield schedule if block_given?
|
8
|
+
schedule
|
9
|
+
end
|
10
|
+
|
5
11
|
def initialize
|
6
12
|
@rules = []
|
7
13
|
end
|
@@ -21,8 +27,7 @@ module Montrose
|
|
21
27
|
enums = @rules.map { |r| r.merge(opts).events }
|
22
28
|
Enumerator.new do |y|
|
23
29
|
loop do
|
24
|
-
|
25
|
-
enum = enums.min_by(&:peek) or break
|
30
|
+
enum = active_enums(enums).min_by(&:peek) or break
|
26
31
|
y << enum.next
|
27
32
|
end
|
28
33
|
end
|
@@ -31,10 +36,11 @@ module Montrose
|
|
31
36
|
private
|
32
37
|
|
33
38
|
def active_enums(enums)
|
34
|
-
enums.
|
39
|
+
enums.select do |e|
|
35
40
|
begin
|
36
|
-
|
41
|
+
e.peek
|
37
42
|
rescue StopIteration
|
43
|
+
false
|
38
44
|
end
|
39
45
|
end
|
40
46
|
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.
|
4
|
+
version: 0.2.0
|
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-
|
11
|
+
date: 2016-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -119,6 +119,7 @@ files:
|
|
119
119
|
- ".gitignore"
|
120
120
|
- ".rubocop.yml"
|
121
121
|
- ".travis.yml"
|
122
|
+
- CHANGELOG.md
|
122
123
|
- CODE_OF_CONDUCT.md
|
123
124
|
- Gemfile
|
124
125
|
- Guardfile
|
@@ -145,6 +146,7 @@ files:
|
|
145
146
|
- lib/montrose/frequency/yearly.rb
|
146
147
|
- lib/montrose/options.rb
|
147
148
|
- lib/montrose/recurrence.rb
|
149
|
+
- lib/montrose/refinements/array_concat.rb
|
148
150
|
- lib/montrose/rule.rb
|
149
151
|
- lib/montrose/rule/after.rb
|
150
152
|
- lib/montrose/rule/before.rb
|
@@ -184,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
186
|
version: '0'
|
185
187
|
requirements: []
|
186
188
|
rubyforge_project:
|
187
|
-
rubygems_version: 2.5.1
|
189
|
+
rubygems_version: 2.4.5.1
|
188
190
|
signing_key:
|
189
191
|
specification_version: 4
|
190
192
|
summary: Recurring events in Ruby
|