rrule 0.3.1 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +28 -0
  4. data/.travis.yml +26 -1
  5. data/Appraisals +23 -0
  6. data/CHANGELOG.md +15 -0
  7. data/Gemfile +9 -0
  8. data/Rakefile +9 -3
  9. data/gemfiles/activesupport_2.3_LTS.gemfile +16 -0
  10. data/gemfiles/activesupport_3.gemfile +16 -0
  11. data/gemfiles/activesupport_4.gemfile +15 -0
  12. data/gemfiles/activesupport_5.gemfile +15 -0
  13. data/gemfiles/activesupport_6.gemfile +15 -0
  14. data/lib/rrule.rb +5 -0
  15. data/lib/rrule/context.rb +9 -7
  16. data/lib/rrule/filters/by_month.rb +2 -0
  17. data/lib/rrule/filters/by_month_day.rb +2 -0
  18. data/lib/rrule/filters/by_week_day.rb +5 -3
  19. data/lib/rrule/filters/by_week_number.rb +2 -0
  20. data/lib/rrule/filters/by_year_day.rb +3 -1
  21. data/lib/rrule/frequencies/daily.rb +2 -0
  22. data/lib/rrule/frequencies/frequency.rb +7 -13
  23. data/lib/rrule/frequencies/monthly.rb +2 -0
  24. data/lib/rrule/frequencies/simple_weekly.rb +14 -1
  25. data/lib/rrule/frequencies/weekly.rb +2 -0
  26. data/lib/rrule/frequencies/yearly.rb +2 -0
  27. data/lib/rrule/generators/all_occurrences.rb +4 -19
  28. data/lib/rrule/generators/by_set_position.rb +6 -15
  29. data/lib/rrule/generators/generator.rb +38 -0
  30. data/lib/rrule/rule.rb +52 -44
  31. data/lib/rrule/version.rb +5 -0
  32. data/lib/rrule/weekday.rb +4 -2
  33. data/rrule.gemspec +18 -11
  34. data/scripts/benchmark.rb +3 -1
  35. metadata +36 -50
  36. data/spec/context_spec.rb +0 -261
  37. data/spec/filters/by_month_day_spec.rb +0 -35
  38. data/spec/filters/by_month_spec.rb +0 -35
  39. data/spec/filters/by_week_day_spec.rb +0 -35
  40. data/spec/filters/by_week_number_spec.rb +0 -41
  41. data/spec/filters/by_year_day_spec.rb +0 -35
  42. data/spec/frequencies/daily_spec.rb +0 -62
  43. data/spec/frequencies/monthly_spec.rb +0 -63
  44. data/spec/frequencies/simple_weekly_spec.rb +0 -30
  45. data/spec/frequencies/weekly_spec.rb +0 -92
  46. data/spec/frequencies/yearly_spec.rb +0 -54
  47. data/spec/generators/all_occurrences_spec.rb +0 -44
  48. data/spec/generators/by_set_position_spec.rb +0 -39
  49. data/spec/rule_spec.rb +0 -2077
  50. data/spec/spec_helper.rb +0 -23
  51. data/spec/weekday_spec.rb +0 -34
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RRule
2
4
  class Monthly < Frequency
3
5
  def possible_days
@@ -1,9 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RRule
2
4
  class SimpleWeekly < Frequency
3
5
  def next_occurrences
6
+ correct_current_date_if_needed
4
7
  this_occurrence = current_date
5
8
  @current_date += context.options[:interval].weeks
6
- [this_occurrence]
9
+ generator.process_timeset(this_occurrence, timeset)
10
+ end
11
+
12
+ def correct_current_date_if_needed
13
+ target_wday = if context.options[:byweekday].present?
14
+ context.options[:byweekday].first.index
15
+ else
16
+ context.dtstart.wday
17
+ end
18
+
19
+ @current_date += 1.day while @current_date.wday != target_wday
7
20
  end
8
21
  end
9
22
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RRule
2
4
  class Weekly < Frequency
3
5
  def possible_days
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RRule
2
4
  class Yearly < Frequency
3
5
  def possible_days
@@ -1,25 +1,10 @@
1
- module RRule
2
- class AllOccurrences
3
- attr_reader :context
4
-
5
- def initialize(context)
6
- @context = context
7
- end
1
+ # frozen_string_literal: true
8
2
 
3
+ module RRule
4
+ class AllOccurrences < Generator
9
5
  def combine_dates_and_times(dayset, timeset)
10
6
  dayset.compact.map { |i| context.first_day_of_year + i }.flat_map do |date|
11
- timeset.map do |time|
12
- Time.use_zone(context.tz) do
13
- Time.zone.local(
14
- date.year,
15
- date.month,
16
- date.day,
17
- time[:hour],
18
- time[:minute],
19
- time[:second]
20
- )
21
- end
22
- end
7
+ process_timeset(date, timeset)
23
8
  end
24
9
  end
25
10
  end
@@ -1,26 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RRule
2
- class BySetPosition
3
- attr_reader :by_set_positions, :context
4
+ class BySetPosition < Generator
5
+ attr_reader :by_set_positions
4
6
 
5
7
  def initialize(by_set_positions, context)
6
8
  @by_set_positions = by_set_positions
7
- @context = context
9
+ super(context)
8
10
  end
9
11
 
10
12
  def combine_dates_and_times(dayset, timeset)
11
13
  valid_dates(dayset).flat_map do |date|
12
- timeset.map do |time|
13
- Time.use_zone(context.tz) do
14
- Time.zone.local(
15
- date.year,
16
- date.month,
17
- date.day,
18
- time[:hour],
19
- time[:minute],
20
- time[:second]
21
- )
22
- end
23
- end
14
+ process_timeset(date, timeset)
24
15
  end
25
16
  end
26
17
 
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RRule
4
+ class Generator
5
+ attr_reader :context
6
+
7
+ def initialize(context)
8
+ @context = context
9
+ end
10
+
11
+ def process_timeset(date, timeset)
12
+ return [date] if timeset.blank?
13
+
14
+ timeset.map do |time|
15
+ hour_sets = (
16
+ Array.wrap(time[:hour]).sort.map do |hour|
17
+ Array.wrap(time[:minute]).sort.map do |minute|
18
+ Array.wrap(time[:second]).sort.map{ |second| [hour, minute, second]}
19
+ end
20
+ end
21
+ ).flatten(2)
22
+
23
+ Time.use_zone(context.tz) do
24
+ hour_sets.map do |hour, minute, second|
25
+ Time.zone.local(
26
+ date.year,
27
+ date.month,
28
+ date.day,
29
+ hour,
30
+ minute,
31
+ second
32
+ )
33
+ end
34
+ end
35
+ end.flatten
36
+ end
37
+ end
38
+ end
data/lib/rrule/rule.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RRule
2
4
  class Rule
3
5
  include Enumerable
@@ -5,10 +7,11 @@ module RRule
5
7
  attr_reader :dtstart, :tz, :exdate
6
8
 
7
9
  def initialize(rrule, dtstart: Time.now, tzid: 'UTC', exdate: [], max_year: nil)
8
- @dtstart = floor_to_seconds(dtstart).in_time_zone(tzid)
9
10
  @tz = tzid
11
+ @dtstart = dtstart.is_a?(Date) ? dtstart : floor_to_seconds_in_timezone(dtstart)
10
12
  @exdate = exdate
11
13
  @options = parse_options(rrule)
14
+ @frequency_type = Frequency.for_options(options)
12
15
  @max_year = max_year || 9999
13
16
  @max_date = DateTime.new(@max_year)
14
17
  end
@@ -18,54 +21,47 @@ module RRule
18
21
  end
19
22
 
20
23
  def between(start_date, end_date, limit: nil)
21
- floored_start_date = floor_to_seconds(start_date)
22
- floored_end_date = floor_to_seconds(end_date)
23
- all_until(end_date: floored_end_date, limit: limit).reject { |instance| instance < floored_start_date }
24
+ floored_start_date = floor_to_seconds_in_timezone(start_date)
25
+ floored_end_date = floor_to_seconds_in_timezone(end_date)
26
+ all_until(start_date: floored_start_date, end_date: floored_end_date, limit: limit).reject { |instance| instance < floored_start_date }
24
27
  end
25
28
 
26
- def each
27
- return enum_for(:each) unless block_given?
29
+ def each(floor_date: nil)
30
+ # If we have a COUNT or INTERVAL option, we have to start at dtstart, because those are relative to dtstart
31
+ floor_date = dtstart if count_or_interval_present? || floor_date.nil? || dtstart > floor_date
28
32
 
33
+ return enum_for(:each, floor_date: floor_date) unless block_given?
29
34
  context = Context.new(options, dtstart, tz)
30
- context.rebuild(dtstart.year, dtstart.month)
35
+ context.rebuild(floor_date.year, floor_date.month)
31
36
 
32
37
  timeset = options[:timeset]
33
38
  count = options[:count]
34
39
 
35
40
  filters = []
36
- if options[:bymonth]
37
- filters.push(ByMonth.new(options[:bymonth], context))
38
- end
41
+ filters.push(ByMonth.new(options[:bymonth], context)) if options[:bymonth]
39
42
 
40
- if options[:byweekno]
41
- filters.push(ByWeekNumber.new(options[:byweekno], context))
42
- end
43
+ filters.push(ByWeekNumber.new(options[:byweekno], context)) if options[:byweekno]
43
44
 
44
- if options[:byweekday]
45
- filters.push(ByWeekDay.new(options[:byweekday], context))
46
- end
45
+ filters.push(ByWeekDay.new(options[:byweekday], context)) if options[:byweekday]
47
46
 
48
- if options[:byyearday]
49
- filters.push(ByYearDay.new(options[:byyearday], context))
50
- end
47
+ filters.push(ByYearDay.new(options[:byyearday], context)) if options[:byyearday]
51
48
 
52
- if options[:bymonthday]
53
- filters.push(ByMonthDay.new(options[:bymonthday], context))
54
- end
49
+ filters.push(ByMonthDay.new(options[:bymonthday], context)) if options[:bymonthday]
55
50
 
56
- if options[:bysetpos]
57
- generator = BySetPosition.new(options[:bysetpos], context)
51
+ generator = if options[:bysetpos]
52
+ BySetPosition.new(options[:bysetpos], context)
58
53
  else
59
- generator = AllOccurrences.new(context)
54
+ AllOccurrences.new(context)
60
55
  end
61
56
 
62
- frequency = Frequency.for_options(options).new(context, filters, generator, timeset)
57
+ frequency = Frequency.for_options(options).new(context, filters, generator, timeset, start_date: floor_date)
63
58
 
64
59
  loop do
65
60
  return if frequency.current_date.year > max_year
66
61
 
67
62
  frequency.next_occurrences.each do |this_result|
68
63
  next if this_result < dtstart
64
+ next if floor_date.present? && this_result < floor_date
69
65
  return if options[:until] && this_result > options[:until]
70
66
  return if count && (count -= 1) < 0
71
67
  yield this_result unless exdate.include?(this_result)
@@ -79,21 +75,21 @@ module RRule
79
75
 
80
76
  private
81
77
 
82
- attr_reader :options, :max_year, :max_date
78
+ attr_reader :options, :max_year, :max_date, :frequency_type
83
79
 
84
- def floor_to_seconds(date)
80
+ def floor_to_seconds_in_timezone(date)
85
81
  # This removes all sub-second and floors it to the second level.
86
82
  # Sub-second level calculations breaks a lot of assumptions in this
87
83
  # library and rounding it may also cause unexpected inequalities.
88
- Time.at(date.to_i)
84
+ Time.at(date.to_i).in_time_zone(tz)
89
85
  end
90
86
 
91
87
  def enumerator
92
88
  @enumerator ||= to_enum
93
89
  end
94
90
 
95
- def all_until(end_date: max_date, limit: nil)
96
- limit ? take(limit) : take_while { |date| date <= end_date }
91
+ def all_until(start_date: nil, end_date: max_date, limit: nil)
92
+ limit ? take(limit) : each(floor_date: start_date).take_while { |date| date <= end_date }
97
93
  end
98
94
 
99
95
  def parse_options(rule)
@@ -110,22 +106,30 @@ module RRule
110
106
  i = begin
111
107
  Integer(value)
112
108
  rescue ArgumentError
113
- raise InvalidRRule, "COUNT must be a non-negative integer"
109
+ raise InvalidRRule, 'COUNT must be a non-negative integer'
114
110
  end
115
- raise InvalidRRule, "COUNT must be a non-negative integer" if i < 0
111
+ raise InvalidRRule, 'COUNT must be a non-negative integer' if i < 0
116
112
  options[:count] = i
117
113
  when 'UNTIL'
118
- options[:until] = Time.parse(value)
114
+ # The value of the UNTIL rule part MUST have the same
115
+ # value type as the "DTSTART" property.
116
+ options[:until] = @dtstart.is_a?(Date) ? Date.parse(value) : Time.parse(value)
119
117
  when 'INTERVAL'
120
118
  i = Integer(value) rescue 0
121
- raise InvalidRRule, "INTERVAL must be a positive integer" unless i > 0
119
+ raise InvalidRRule, 'INTERVAL must be a positive integer' unless i > 0
122
120
  options[:interval] = i
121
+ when 'BYHOUR'
122
+ options[:byhour] = value.split(',').compact.map(&:to_i)
123
+ when 'BYMINUTE'
124
+ options[:byminute] = value.split(',').compact.map(&:to_i)
125
+ when 'BYSECOND'
126
+ options[:bysecond] = value.split(',').compact.map(&:to_i)
123
127
  when 'BYDAY'
124
128
  options[:byweekday] = value.split(',').map { |day| Weekday.parse(day) }
125
129
  when 'BYSETPOS'
126
130
  options[:bysetpos] = value.split(',').map(&:to_i)
127
131
  when 'WKST'
128
- options[:wkst] = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'].index(value)
132
+ options[:wkst] = RRule::WEEKDAYS.index(value)
129
133
  when 'BYMONTH'
130
134
  options[:bymonth] = value.split(',').compact.map(&:to_i)
131
135
  when 'BYMONTHDAY'
@@ -137,12 +141,10 @@ module RRule
137
141
  end
138
142
  end
139
143
 
140
- if !(options[:byweekno] || options[:byyearday] || options[:bymonthday] || options[:byweekday])
144
+ unless options[:byweekno] || options[:byyearday] || options[:bymonthday] || options[:byweekday]
141
145
  case options[:freq]
142
146
  when 'YEARLY'
143
- unless options[:bymonth]
144
- options[:bymonth] = [dtstart.month]
145
- end
147
+ options[:bymonth] = [dtstart.month] unless options[:bymonth]
146
148
  options[:bymonthday] = [dtstart.day]
147
149
  when 'MONTHLY'
148
150
  options[:bymonthday] = [dtstart.day]
@@ -152,13 +154,19 @@ module RRule
152
154
  end
153
155
  end
154
156
 
155
- unless options[:byweekday].nil?
156
- options[:byweekday], options[:bynweekday] = options[:byweekday].partition { |wday| wday.ordinal.nil? }
157
- end
157
+ options[:byweekday], options[:bynweekday] = options[:byweekday].partition { |wday| wday.ordinal.nil? } unless options[:byweekday].nil?
158
158
 
159
- options[:timeset] = [{ hour: dtstart.hour, minute: dtstart.min, second: dtstart.sec }]
159
+ # The BYSECOND, BYMINUTE and BYHOUR rule parts MUST NOT be specified
160
+ # when the associated "DTSTART" property has a DATE value type.
161
+ # These rule parts MUST be ignored in RECUR value that violate the
162
+ # above requirement
163
+ options[:timeset] = [{ hour: (options[:byhour].presence || dtstart.hour), minute: (options[:byminute].presence || dtstart.min), second: (options[:bysecond].presence || dtstart.sec) }] unless dtstart.is_a?(Date)
160
164
 
161
165
  options
162
166
  end
167
+
168
+ def count_or_interval_present?
169
+ options[:count].present? || (options[:interval].present? && options[:interval] > 1)
170
+ end
163
171
  end
164
172
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RRule
4
+ VERSION = '0.4.3'
5
+ end
data/lib/rrule/weekday.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RRule
2
4
  class Weekday
3
5
  attr_reader :index, :ordinal
@@ -8,8 +10,8 @@ module RRule
8
10
  end
9
11
 
10
12
  def self.parse(weekday)
11
- match = /([+-]?\d)?([A-Z]{2})/.match(weekday)
12
- index = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'].index(match[2])
13
+ match = /([+-]?\d+)?([A-Z]{2})/.match(weekday)
14
+ index = RRule::WEEKDAYS.index(match[2])
13
15
  ordinal = match[1] ? match[1].to_i : nil
14
16
  new(index, ordinal)
15
17
  end
data/rrule.gemspec CHANGED
@@ -1,20 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'rrule/version'
6
+
1
7
  Gem::Specification.new do |s|
2
8
  s.name = 'rrule'
3
- s.version = '0.3.1'
4
- s.date = '2018-04-24'
9
+ s.version = RRule::VERSION
5
10
  s.summary = 'RRule expansion'
6
11
  s.description = 'A gem for expanding dates according to the RRule specification'
7
12
  s.authors = ['Ryan Mitchell']
8
13
  s.email = 'rmitchell@squareup.com'
9
- s.files = `git ls-files`.split($/)
10
- s.test_files = s.files.grep(%r{^(test|spec|features)/})
14
+ s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
11
15
  s.require_paths = ['lib']
12
- s.homepage = 'http://rubygems.org/gems/rrule'
16
+ s.homepage = 'https://rubygems.org/gems/rrule'
17
+ s.metadata = {
18
+ 'homepage' => 'https://rubygems.org/gems/rrule',
19
+ 'source_code_uri' => 'https://github.com/square/ruby-rrule',
20
+ 'bug_tracker_uri' => 'https://github.com/square/ruby-rrule/issues',
21
+ 'changelog_uri' => 'https://github.com/square/ruby-rrule/blob/master/CHANGELOG.md'
22
+ }
13
23
 
14
- # Since Ruby 1.9.2, Time implementation uses a signed 63 bit integer, Bignum
15
- # or Rational. This enables Time to finally work with years after 2038 which
16
- # is critical for this library.
17
- s.required_ruby_version = '>= 1.9.2'
18
- s.add_runtime_dependency 'activesupport', '>= 4.1'
19
- s.add_development_dependency 'rspec', '~> 3.4'
24
+ s.required_ruby_version = '>= 2.6.0'
25
+ s.add_runtime_dependency 'activesupport', '>= 2.3', '< 7'
26
+ s.add_development_dependency 'appraisal'
20
27
  end
data/scripts/benchmark.rb CHANGED
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '../lib/'))
2
4
  require 'rrule'
3
- include Benchmark
5
+ require 'benchmark'
4
6
 
5
7
  rules_to_benchmark = ['FREQ=WEEKLY', 'FREQ=WEEKLY;BYDAY=WE']
6
8
  rrule_version = '0.3.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rrule
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Mitchell
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-24 00:00:00.000000000 Z
11
+ date: 2021-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,28 +16,34 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4.1'
19
+ version: '2.3'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '7'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: '4.1'
29
+ version: '2.3'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '7'
27
33
  - !ruby/object:Gem::Dependency
28
- name: rspec
34
+ name: appraisal
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - "~>"
37
+ - - ">="
32
38
  - !ruby/object:Gem::Version
33
- version: '3.4'
39
+ version: '0'
34
40
  type: :development
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
- - - "~>"
44
+ - - ">="
39
45
  - !ruby/object:Gem::Version
40
- version: '3.4'
46
+ version: '0'
41
47
  description: A gem for expanding dates according to the RRule specification
42
48
  email: rmitchell@squareup.com
43
49
  executables: []
@@ -45,13 +51,20 @@ extensions: []
45
51
  extra_rdoc_files: []
46
52
  files:
47
53
  - ".gitignore"
54
+ - ".rubocop.yml"
48
55
  - ".travis.yml"
56
+ - Appraisals
49
57
  - CHANGELOG.md
50
58
  - CONTRIBUTING.md
51
59
  - Gemfile
52
60
  - LICENSE.txt
53
61
  - README.md
54
62
  - Rakefile
63
+ - gemfiles/activesupport_2.3_LTS.gemfile
64
+ - gemfiles/activesupport_3.gemfile
65
+ - gemfiles/activesupport_4.gemfile
66
+ - gemfiles/activesupport_5.gemfile
67
+ - gemfiles/activesupport_6.gemfile
55
68
  - lib/rrule.rb
56
69
  - lib/rrule/context.rb
57
70
  - lib/rrule/filters/by_month.rb
@@ -67,31 +80,21 @@ files:
67
80
  - lib/rrule/frequencies/yearly.rb
68
81
  - lib/rrule/generators/all_occurrences.rb
69
82
  - lib/rrule/generators/by_set_position.rb
83
+ - lib/rrule/generators/generator.rb
70
84
  - lib/rrule/rule.rb
85
+ - lib/rrule/version.rb
71
86
  - lib/rrule/weekday.rb
72
87
  - rrule.gemspec
73
88
  - scripts/benchmark.rb
74
89
  - scripts/history.txt
75
- - spec/context_spec.rb
76
- - spec/filters/by_month_day_spec.rb
77
- - spec/filters/by_month_spec.rb
78
- - spec/filters/by_week_day_spec.rb
79
- - spec/filters/by_week_number_spec.rb
80
- - spec/filters/by_year_day_spec.rb
81
- - spec/frequencies/daily_spec.rb
82
- - spec/frequencies/monthly_spec.rb
83
- - spec/frequencies/simple_weekly_spec.rb
84
- - spec/frequencies/weekly_spec.rb
85
- - spec/frequencies/yearly_spec.rb
86
- - spec/generators/all_occurrences_spec.rb
87
- - spec/generators/by_set_position_spec.rb
88
- - spec/rule_spec.rb
89
- - spec/spec_helper.rb
90
- - spec/weekday_spec.rb
91
- homepage: http://rubygems.org/gems/rrule
90
+ homepage: https://rubygems.org/gems/rrule
92
91
  licenses: []
93
- metadata: {}
94
- post_install_message:
92
+ metadata:
93
+ homepage: https://rubygems.org/gems/rrule
94
+ source_code_uri: https://github.com/square/ruby-rrule
95
+ bug_tracker_uri: https://github.com/square/ruby-rrule/issues
96
+ changelog_uri: https://github.com/square/ruby-rrule/blob/master/CHANGELOG.md
97
+ post_install_message:
95
98
  rdoc_options: []
96
99
  require_paths:
97
100
  - lib
@@ -99,32 +102,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
99
102
  requirements:
100
103
  - - ">="
101
104
  - !ruby/object:Gem::Version
102
- version: 1.9.2
105
+ version: 2.6.0
103
106
  required_rubygems_version: !ruby/object:Gem::Requirement
104
107
  requirements:
105
108
  - - ">="
106
109
  - !ruby/object:Gem::Version
107
110
  version: '0'
108
111
  requirements: []
109
- rubyforge_project:
110
- rubygems_version: 2.5.2
111
- signing_key:
112
+ rubygems_version: 3.1.4
113
+ signing_key:
112
114
  specification_version: 4
113
115
  summary: RRule expansion
114
- test_files:
115
- - spec/context_spec.rb
116
- - spec/filters/by_month_day_spec.rb
117
- - spec/filters/by_month_spec.rb
118
- - spec/filters/by_week_day_spec.rb
119
- - spec/filters/by_week_number_spec.rb
120
- - spec/filters/by_year_day_spec.rb
121
- - spec/frequencies/daily_spec.rb
122
- - spec/frequencies/monthly_spec.rb
123
- - spec/frequencies/simple_weekly_spec.rb
124
- - spec/frequencies/weekly_spec.rb
125
- - spec/frequencies/yearly_spec.rb
126
- - spec/generators/all_occurrences_spec.rb
127
- - spec/generators/by_set_position_spec.rb
128
- - spec/rule_spec.rb
129
- - spec/spec_helper.rb
130
- - spec/weekday_spec.rb
116
+ test_files: []