rrule 0.3.1 → 0.4.3

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.
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: []