recurrence 0.1.5 → 1.0.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.
data/.gitignore CHANGED
@@ -1,2 +1,3 @@
1
1
  *.gem
2
- .bundle
2
+ .bundle
3
+ html
data/Gemfile CHANGED
@@ -1,6 +1,3 @@
1
1
  source :rubygems
2
2
 
3
- gem "rake"
4
- gem "rspec", "2.0.0.beta.22"
5
- gem "activesupport", :require => "active_support/all"
6
- gem "i18n"
3
+ gemspec
data/Gemfile.lock CHANGED
@@ -1,26 +1,42 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ recurrence (0.1.5)
5
+ activesupport (>= 3.0.0)
6
+
1
7
  GEM
2
8
  remote: http://rubygems.org/
3
9
  specs:
4
- activesupport (3.0.0)
10
+ activesupport (3.0.2)
11
+ archive-tar-minitar (0.5.2)
12
+ columnize (0.3.2)
5
13
  diff-lcs (1.1.2)
6
- i18n (0.4.1)
7
- rake (0.8.7)
8
- rspec (2.0.0.beta.22)
9
- rspec-core (= 2.0.0.beta.22)
10
- rspec-expectations (= 2.0.0.beta.22)
11
- rspec-mocks (= 2.0.0.beta.22)
12
- rspec-core (2.0.0.beta.22)
13
- rspec-expectations (2.0.0.beta.22)
14
- diff-lcs (>= 1.1.2)
15
- rspec-mocks (2.0.0.beta.22)
16
- rspec-core (= 2.0.0.beta.22)
17
- rspec-expectations (= 2.0.0.beta.22)
14
+ linecache19 (0.5.11)
15
+ ruby_core_source (>= 0.1.4)
16
+ rspec (2.1.0)
17
+ rspec-core (~> 2.1.0)
18
+ rspec-expectations (~> 2.1.0)
19
+ rspec-mocks (~> 2.1.0)
20
+ rspec-core (2.1.0)
21
+ rspec-expectations (2.1.0)
22
+ diff-lcs (~> 1.1.2)
23
+ rspec-mocks (2.1.0)
24
+ ruby-debug-base19 (0.11.24)
25
+ columnize (>= 0.3.1)
26
+ linecache19 (>= 0.5.11)
27
+ ruby_core_source (>= 0.1.4)
28
+ ruby-debug19 (0.11.6)
29
+ columnize (>= 0.3.1)
30
+ linecache19 (>= 0.5.11)
31
+ ruby-debug-base19 (>= 0.11.19)
32
+ ruby_core_source (0.1.4)
33
+ archive-tar-minitar (>= 0.5.2)
18
34
 
19
35
  PLATFORMS
20
36
  ruby
21
37
 
22
38
  DEPENDENCIES
23
- activesupport
24
- i18n
25
- rake
26
- rspec (= 2.0.0.beta.22)
39
+ activesupport (>= 3.0.0)
40
+ recurrence!
41
+ rspec (>= 2.0.0)
42
+ ruby-debug19
data/History.txt CHANGED
@@ -64,4 +64,11 @@
64
64
  == 0.1.5 2010-11-03
65
65
 
66
66
  * Recurrence.default_starts_date is now configurable; pass in a String or block
67
- * Add #options reader so we'll be able to use Recurrence with ActiveRecord.composed_of
67
+ * Add Recurrence#options reader so we'll be able to use Recurrence with ActiveRecord.composed_of
68
+
69
+ == 1.0.0 2010-11-16
70
+
71
+ * Recurrence#each returns an enumerator when no block is given
72
+ * Recurrence now includes Enumerable
73
+ * The public API is now documented
74
+ * Remove support for Rails plugin
data/README.rdoc ADDED
@@ -0,0 +1,124 @@
1
+ = Recurrence
2
+
3
+ A simple library to handle recurring events.
4
+
5
+ == Installation
6
+
7
+ gem install recurrence
8
+
9
+ == Usage
10
+
11
+ require "rubygems"
12
+ require "recurrence"
13
+
14
+ # Daily
15
+ r = Recurrence.new(:every => :day)
16
+ r = Recurrence.new(:every => :day, :interval => 9)
17
+ r = Recurrence.daily(options = {})
18
+
19
+ # Weekly
20
+ r = Recurrence.new(:every => :week, :on => 5)
21
+ r = Recurrence.new(:every => :week, :on => :monday)
22
+ r = Recurrence.new(:every => :week, :on => [:monday, :friday])
23
+ r = Recurrence.new(:every => :week, :on => [:monday, :wednesday, :friday])
24
+ r = Recurrence.new(:every => :week, :on => :friday, :interval => 2)
25
+ r = Recurrence.weekly(:on => :thursday)
26
+
27
+ # Monthly by month day
28
+ r = Recurrence.new(:every => :month, :on => 15)
29
+ r = Recurrence.new(:every => :month, :on => 31)
30
+ r = Recurrence.new(:every => :month, :on => 7, :interval => 2)
31
+ r = Recurrence.new(:every => :month, :on => 7, :interval => :monthly)
32
+ r = Recurrence.new(:every => :month, :on => 7, :interval => :bimonthly)
33
+ r = Recurrence.monthly(:on => 31)
34
+
35
+ # Monthly by week day
36
+ r = Recurrence.new(:every => :month, :on => :first, :weekday => :sunday)
37
+ r = Recurrence.new(:every => :month, :on => :third, :weekday => :monday)
38
+ r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday)
39
+ r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday, :interval => 2)
40
+ r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday, :interval => :quarterly)
41
+ r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday, :interval => :semesterly)
42
+
43
+ # Yearly
44
+ r = Recurrence.new(:every => :year, :on => [7, 4]) # => [month, day]
45
+ r = Recurrence.new(:every => :year, :on => [10, 31], :interval => 3)
46
+ r = Recurrence.new(:every => :year, :on => [:jan, 31])
47
+ r = Recurrence.new(:every => :year, :on => [:january, 31])
48
+ r = Recurrence.yearly(:on => [:january, 31])
49
+
50
+ # Limit recurrence
51
+ # :starts defaults to Date.today
52
+ # :until defaults to 2037-12-31
53
+ r = Recurrence.new(:every => :day, :starts => Date.today)
54
+ r = Recurrence.new(:every => :day, :until => '2010-01-31')
55
+ r = Recurrence.new(:every => :day, :starts => Date.today, :until => '2010-01-31')
56
+
57
+ # Getting an array with all events
58
+ r.events.each {|date| puts date.to_s } # => Memoized array
59
+ r.events!.each {|date| puts date.to_s } # => reset items cache and re-execute it
60
+ r.events(:starts => '2009-01-01').each {|date| puts date.to_s }
61
+ r.events(:until => '2009-01-10').each {|date| puts date.to_s }
62
+ r.events(:starts => '2009-01-05', :until => '2009-01-10').each {|date| puts date.to_s }
63
+
64
+ # Iterating events
65
+ r.each { |date| puts date.to_s } # => Use items method
66
+ r.each! { |date| puts date.to_s } # => Use items! method
67
+
68
+ # Check if a date is included
69
+ r.include?(Date.today) # => true or false
70
+ r.include?('2008-09-21')
71
+
72
+ # Get next available date
73
+ r.next # => Keep the original date object
74
+ r.next! # => Change the internal date object to the next available date
75
+
76
+ == Troubleshooting
77
+
78
+ If you're having problems because already have a class/module called Recurrence that is conflicting with this gem, you can require the namespace and create a class that inherits from <tt>SimplesIdeias::Recurrence</tt>.
79
+
80
+ require "recurrence/namespace"
81
+
82
+ class RecurrentEvent < SimplesIdeias::Recurrence
83
+ end
84
+
85
+ r = RecurrentEvent.new(:every => :day)
86
+
87
+ If you're using Rails/Bundler or something like that, remember to override the <tt>:require</tt> option.
88
+
89
+ # Gemfile
90
+ source :rubygems
91
+
92
+ gem "recurrence", :require => "recurrence/namespace"
93
+
94
+ == Maintainer
95
+
96
+ * Nando Vieira (http://nandovieira.com.br)
97
+
98
+ == Contributors
99
+
100
+ * José Valim (http://plataformatec.com.br)
101
+ * Maxim Chernyak (http://mediumexposure.com)
102
+
103
+ == License
104
+
105
+ (The MIT License)
106
+
107
+ Permission is hereby granted, free of charge, to any person obtaining
108
+ a copy of this software and associated documentation files (the
109
+ 'Software'), to deal in the Software without restriction, including
110
+ without limitation the rights to use, copy, modify, merge, publish,
111
+ distribute, sublicense, and/or sell copies of the Software, and to
112
+ permit persons to whom the Software is furnished to do so, subject to
113
+ the following conditions:
114
+
115
+ The above copyright notice and this permission notice shall be
116
+ included in all copies or substantial portions of the Software.
117
+
118
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
119
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
120
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
121
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
122
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
123
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
124
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -3,3 +3,9 @@ Bundler::GemHelper.install_tasks
3
3
 
4
4
  require "rspec/core/rake_task"
5
5
  RSpec::Core::RakeTask.new
6
+
7
+ require "rake/rdoctask"
8
+ Rake::RDocTask.new do |rd|
9
+ rd.main = "README.rdoc"
10
+ rd.rdoc_files.include("README.rdoc", "lib/**/*.rb", "History.txt", "License.txt")
11
+ end
data/lib/recurrence.rb CHANGED
@@ -1,4 +1,22 @@
1
1
  require "recurrence/namespace"
2
2
 
3
+ # The default namespace. If you already have Recurrence constant set on your codebase,
4
+ # you can inherit from SimplesIdeias::Recurrence and have your own namespace.
5
+ #
6
+ # require "recurrence/namespace"
7
+ #
8
+ # class RecurrentEvent < SimplesIdeias::Recurrence
9
+ # end
10
+ #
11
+ # r = RecurrentEvent.new(:every => :day)
12
+ #
13
+ # Remember require <tt>recurrence/namespace</tt> instead of just <tt>recurrence</tt>.
14
+ # If you’re using Rails/Bundler or something like that, remember to override the
15
+ # <tt>:require</tt> option.
16
+ #
17
+ # # Gemfile
18
+ # source :rubygems
19
+ # gem "recurrence", :require => "recurrence/namespace"
20
+ #
3
21
  class Recurrence < SimplesIdeias::Recurrence
4
22
  end
@@ -1,6 +1,6 @@
1
1
  module SimplesIdeias
2
2
  class Recurrence
3
- module Event
3
+ module Event # :nodoc: all
4
4
  autoload :Base, "recurrence/event/base"
5
5
  autoload :Daily, "recurrence/event/daily"
6
6
  autoload :Monthly, "recurrence/event/monthly"
@@ -1,6 +1,6 @@
1
1
  module SimplesIdeias
2
2
  class Recurrence
3
- module Event
3
+ module Event # :nodoc: all
4
4
  class Base
5
5
  CARDINALS = %w(first second third fourth fifth)
6
6
  DAYS = %w(sunday monday tuesday wednesday thursday friday saturday)
@@ -8,7 +8,7 @@ module SimplesIdeias
8
8
  attr_accessor :start_date
9
9
 
10
10
  def initialize(options={})
11
- every, options = nil, every if every.is_a?(Hash)
11
+ every, options = nil, every if every.kind_of?(Hash)
12
12
 
13
13
  @options = options
14
14
  @date = options[:starts]
@@ -59,7 +59,7 @@ module SimplesIdeias
59
59
 
60
60
  # Common validation for inherited classes.
61
61
  #
62
- def valid_month_day?(day) #:nodoc:
62
+ def valid_month_day?(day)
63
63
  raise ArgumentError, "invalid day #{day}" unless (1..31).include?(day)
64
64
  end
65
65
 
@@ -1,7 +1,7 @@
1
1
  module SimplesIdeias
2
2
  class Recurrence
3
3
  module Event
4
- class Daily < Base
4
+ class Daily < Base # :nodoc: all
5
5
  protected
6
6
  def next_in_recurrence
7
7
  date = @date.to_date
@@ -1,11 +1,11 @@
1
1
  module SimplesIdeias
2
2
  class Recurrence
3
3
  module Event
4
- class Monthly < Base
4
+ class Monthly < Base # :nodoc: all
5
5
  INTERVALS = {
6
- :monthly => 1,
7
- :bimonthly => 2,
8
- :quarterly => 3,
6
+ :monthly => 1,
7
+ :bimonthly => 2,
8
+ :quarterly => 3,
9
9
  :semesterly => 6
10
10
  }
11
11
 
@@ -28,7 +28,7 @@ module SimplesIdeias
28
28
  valid_month_day?(@options[:on])
29
29
  end
30
30
 
31
- if @options[:interval].is_a?(Symbol)
31
+ if @options[:interval].kind_of?(Symbol)
32
32
  valid_interval?(@options[:interval])
33
33
  @options[:interval] = INTERVALS[@options[:interval]]
34
34
  end
@@ -88,15 +88,15 @@ module SimplesIdeias
88
88
  end
89
89
 
90
90
  private
91
- def valid_cardinal?(cardinal) #:nodoc:
91
+ def valid_cardinal?(cardinal)
92
92
  raise ArgumentError, "invalid cardinal #{cardinal}" unless CARDINALS.include?(cardinal.to_s)
93
93
  end
94
94
 
95
- def valid_interval?(interval) #:nodoc:
95
+ def valid_interval?(interval)
96
96
  raise ArgumentError, "invalid cardinal #{interval}" unless INTERVALS.key?(interval)
97
97
  end
98
98
 
99
- def valid_week?(week) #:nodoc:
99
+ def valid_week?(week)
100
100
  raise ArgumentError, "invalid week #{week}" unless (1..5).include?(week)
101
101
  end
102
102
  end
@@ -1,7 +1,7 @@
1
1
  module SimplesIdeias
2
2
  class Recurrence
3
3
  module Event
4
- class Weekly < Base
4
+ class Weekly < Base # :nodoc: all
5
5
  protected
6
6
  def validate
7
7
  @options[:on] = Array.wrap(@options[:on]).inject([]) do |days, value|
@@ -1,7 +1,7 @@
1
1
  module SimplesIdeias
2
2
  class Recurrence
3
3
  module Event
4
- class Yearly < Base
4
+ class Yearly < Base # :nodoc: all
5
5
  MONTHS = {
6
6
  "jan" => 1, "january" => 1,
7
7
  "feb" => 2, "february" => 2,
@@ -48,11 +48,11 @@ module SimplesIdeias
48
48
  end
49
49
 
50
50
  private
51
- def valid_month?(month) #:nodoc:
51
+ def valid_month?(month)
52
52
  raise ArgumentError, "invalid month #{month}" unless (1..12).include?(month)
53
53
  end
54
54
 
55
- def valid_month_name?(month) #:nodoc:
55
+ def valid_month_name?(month)
56
56
  raise ArgumentError, "invalid month #{month}" unless MONTHS.keys.include?(month.to_s)
57
57
  end
58
58
  end
@@ -1,94 +1,167 @@
1
1
  require "date"
2
2
  require "active_support/all"
3
+ require "enumerator"
3
4
 
4
5
  module SimplesIdeias
5
6
  class Recurrence
6
- autoload :Event, "recurrence/event"
7
- autoload :Version, "recurrence/version"
7
+ autoload :Event, "recurrence/event"
8
+ autoload :Version, "recurrence/version"
8
9
 
10
+ include Enumerable
11
+
12
+ # This is the available frequency options accepted by
13
+ # <tt>:every</tt> option.
9
14
  FREQUENCY = %w(day week month year)
10
15
 
11
16
  attr_reader :event, :options
12
17
 
18
+ # Return the default starting date.
19
+ #
20
+ # Recurrence.default_starts_date
21
+ # #=> <Date>
22
+ #
13
23
  def self.default_starts_date
14
- if @default_starts_date
15
- if @default_starts_date.is_a?(String)
16
- eval(@default_starts_date)
17
- else
18
- @default_starts_date.call
19
- end
24
+ case @default_starts_date
25
+ when String
26
+ eval(@default_starts_date)
27
+ when Proc
28
+ @default_starts_date.call
20
29
  else
21
30
  Date.today
22
31
  end
23
32
  end
24
33
 
34
+ # Set the default starting date globally.
35
+ # Can be a proc or a string.
36
+ #
37
+ # Recurrence.default_starts_date = proc { Date.today }
38
+ # Recurrence.default_starts_date = "Date.today"
39
+ #
25
40
  def self.default_starts_date=(date)
26
- unless date.respond_to?(:call) || date.is_a?(String) || date == nil
41
+ unless date.respond_to?(:call) || date.kind_of?(String) || date == nil
27
42
  raise ArgumentError, 'default_starts_date must be a proc or an evaluatable string such as "Date.current"'
28
43
  end
29
44
 
30
45
  @default_starts_date = date
31
46
  end
32
47
 
48
+ # Return the default ending date. Defaults to 2037-12-31.
49
+ #
50
+ # Recurrence.default_until_date
51
+ #
33
52
  def self.default_until_date
34
53
  @default_until_date ||= Date.new(2037, 12, 31)
35
54
  end
36
55
 
56
+ # Set the default ending date globally.
57
+ # Can be a date or a string recognized by Date#parse.
58
+ #
59
+ # Recurrence.default_until_date = "2012-12-31"
60
+ # Recurrence.default_until_date = Date.tomorrow
61
+ #
37
62
  def self.default_until_date=(date)
38
- @default_until_date = if date.is_a?(String)
39
- Date.parse(date)
40
- else
41
- date
42
- end
63
+ @default_until_date = as_date(date)
43
64
  end
44
65
 
66
+ # Create a daily recurrence.
67
+ #
68
+ # Recurrence.daily
69
+ # Recurrence.daily(:interval => 2) #=> every 2 days
70
+ # Recurrence.daily(:starts => 3.days.from_now)
71
+ # Recurrence.daily(:until => 10.days.from_now)
72
+ #
45
73
  def self.daily(options = {})
46
74
  options[:every] = :day
47
75
  new(options)
48
76
  end
49
77
 
78
+ # Create a weekly recurrence.
79
+ #
80
+ # Recurrence.weekly(:on => 5) #=> 0 = sunday, 1 = monday, ...
81
+ # Recurrence.weekly(:on => :saturday)
82
+ # Recurrence.weekly(:on => [sunday, :saturday])
83
+ # Recurrence.weekly(:on => :saturday, :interval => 2)
84
+ #
50
85
  def self.weekly(options = {})
51
86
  options[:every] = :week
52
87
  new(options)
53
88
  end
54
89
 
90
+ # Create a monthly recurrence.
91
+ #
92
+ # Recurrence.monthly(:on => 15) #=> every 15th day
93
+ # Recurrence.monthly(:on => :first, :weekday => :sunday)
94
+ # Recurrence.monthly(:on => :second, :weekday => :sunday)
95
+ # Recurrence.monthly(:on => :third, :weekday => :sunday)
96
+ # Recurrence.monthly(:on => :fourth, :weekday => :sunday)
97
+ # Recurrence.monthly(:on => :fifth, :weekday => :sunday)
98
+ # Recurrence.monthly(:on => :last, :weekday => :sunday)
99
+ # Recurrence.monthly(:on => 15, :interval => 2)
100
+ # Recurrence.monthly(:on => 15, :interval => :monthly)
101
+ # Recurrence.monthly(:on => 15, :interval => :bimonthly)
102
+ # Recurrence.monthly(:on => 15, :interval => :quarterly)
103
+ # Recurrence.monthly(:on => 15, :interval => :semesterly)
104
+ #
55
105
  def self.monthly(options = {})
56
106
  options[:every] = :month
57
107
  new(options)
58
108
  end
59
109
 
110
+ # Create a yearly recurrence.
111
+ #
112
+ # Recurrence.yearly(:on => [7, 14]) #=> every Jul 14
113
+ # Recurrence.yearly(:on => [7, 14], :interval => 2) #=> every 2 years on Jul 14
114
+ # Recurrence.yearly(:on => [:jan, 14], :interval => 2)
115
+ # Recurrence.yearly(:on => [:january, 14], :interval => 2)
116
+ #
60
117
  def self.yearly(options = {})
61
118
  options[:every] = :year
62
119
  new(options)
63
120
  end
64
121
 
122
+ # Initialize a recurrence object. All options from shortcut methods
123
+ # (Recurrence.daily, Recurrence.monthly, and so on) and requires the <tt>:every</tt> option to
124
+ # be one of these options: <tt>:day</tt>, <tt>:week</tt>, <tt>:month</tt>, or <tt>:year</tt>.
125
+ #
126
+ # Recurrence.new(:every => :day)
127
+ # Recurrence.new(:every => :week, :on => :sunday)
128
+ # Recurrence.new(:every => :month, :on => 14)
129
+ # Recurrence.new(:every => :year, :on => [:jan, 14])
130
+ #
65
131
  def initialize(options)
66
132
  raise ArgumentError, ":every option is required" unless options.key?(:every)
67
133
  raise ArgumentError, "invalid :every option" unless FREQUENCY.include?(options[:every].to_s)
68
134
 
69
- @options = options.dup
70
- @normalized_options = initialize_dates(options)
135
+ @options = options
136
+ @normalized_options = initialize_dates(options.dup)
71
137
  @normalized_options[:interval] ||= 1
72
138
 
73
139
  @event = case @normalized_options[:every].to_sym
74
140
  when :day
75
- Recurrence::Event::Daily.new(@normalized_options)
141
+ Event::Daily.new(@normalized_options)
76
142
  when :week
77
- Recurrence::Event::Weekly.new(@normalized_options)
143
+ Event::Weekly.new(@normalized_options)
78
144
  when :month
79
- Recurrence::Event::Monthly.new(@normalized_options)
145
+ Event::Monthly.new(@normalized_options)
80
146
  when :year
81
- Recurrence::Event::Yearly.new(@normalized_options)
147
+ Event::Yearly.new(@normalized_options)
82
148
  end
83
149
  end
84
150
 
151
+ # Reset the recurrence cache, returning to the first available date.
85
152
  def reset!
86
153
  @event.reset!
87
154
  @events = nil
88
155
  end
89
156
 
157
+ # Check if a given date can be retrieve from the current recurrence options.
158
+ #
159
+ # r = Recurrence.weekly(:on => :sunday)
160
+ # r.include?("2010-11-16")
161
+ # #=> false, because "2010-11-16" is monday
162
+ #
90
163
  def include?(required_date)
91
- required_date = Date.parse(required_date) if required_date.is_a?(String)
164
+ required_date = as_date(required_date)
92
165
 
93
166
  if required_date < @normalized_options[:starts] || required_date > @normalized_options[:until]
94
167
  false
@@ -98,20 +171,48 @@ module SimplesIdeias
98
171
  end
99
172
  end
100
173
 
101
- return false
174
+ false
102
175
  end
103
176
 
177
+ # Return the next date in recurrence, without changing the internal date object.
178
+ #
179
+ # r = Recurrence.weekly(:on => :sunday, :starts => "2010-11-15")
180
+ # r.next #=> Sun, 21 Nov 2010
181
+ # r.next #=> Sun, 21 Nov 2010
182
+ #
104
183
  def next
105
184
  @event.next
106
185
  end
107
186
 
187
+ # Return the next date in recurrence, and changes the internal date object.
188
+ #
189
+ # r = Recurrence.weekly(:on => :sunday, :starts => "2010-11-15")
190
+ # r.next! #=> Sun, 21 Nov 2010
191
+ # r.next! #=> Sun, 28 Nov 2010
192
+ #
108
193
  def next!
109
194
  @event.next!
110
195
  end
111
196
 
197
+ # Return an array with all dates within a given recurrence, caching the result.
198
+ #
199
+ # r = Recurrence.daily(:starts => "2010-11-15", :until => "2010-11-20")
200
+ # r.events
201
+ #
202
+ # The return will be
203
+ #
204
+ # [
205
+ # [0] Mon, 15 Nov 2010,
206
+ # [1] Tue, 16 Nov 2010,
207
+ # [2] Wed, 17 Nov 2010,
208
+ # [3] Thu, 18 Nov 2010,
209
+ # [4] Fri, 19 Nov 2010,
210
+ # [5] Sat, 20 Nov 2010
211
+ # ]
212
+ #
112
213
  def events(options={})
113
- options[:starts] = Date.parse(options[:starts]) if options[:starts].is_a?(String)
114
- options[:until] = Date.parse(options[:until]) if options[:until].is_a?(String)
214
+ options[:starts] = as_date(options[:starts])
215
+ options[:until] = as_date(options[:until])
115
216
 
116
217
  reset! if options[:starts] || options[:until]
117
218
 
@@ -134,26 +235,44 @@ module SimplesIdeias
134
235
  end
135
236
  end
136
237
 
238
+ # Works like SimplesIdeias::Recurrence::Namespace#events, but removes the cache first.
137
239
  def events!(options={})
138
240
  reset!
139
241
  events(options)
140
242
  end
141
243
 
244
+ # Iterate in all events between <tt>:starts</tt> and <tt>:until</tt> options.
245
+ #
246
+ # r = Recurrence.daily(:starts => "2010-11-15", :until => "2010-11-17")
247
+ # r.each do |date|
248
+ # puts date
249
+ # end
250
+ #
251
+ # This will print
252
+ #
253
+ # Sun, 15 Nov 2010
254
+ # Sun, 16 Nov 2010
255
+ # Sun, 17 Nov 2010
256
+ #
257
+ # When called without a block, it will return a Enumerator.
258
+ #
259
+ # r.each
260
+ # #=> #<Enumerator: [Mon, 15 Nov 2010, Tue, 16 Nov 2010, Wed, 17 Nov 2010]:each>
261
+ #
262
+ def each(&block)
263
+ events.each(&block)
264
+ end
265
+
266
+ # Works like SimplesIdeias::Recurrence::Namespace#each, but removes the cache first.
142
267
  def each!(&block)
143
268
  reset!
144
269
  each(&block)
145
270
  end
146
271
 
147
- def each(&block)
148
- events.each do |item|
149
- yield item
150
- end
151
- end
152
-
153
272
  private
154
- def initialize_dates(options) #:nodoc:
273
+ def initialize_dates(options) # :nodoc:
155
274
  [:starts, :until].each do |name|
156
- options[name] = Date.parse(options[name]) if options[name].is_a?(String)
275
+ options[name] = as_date(options[name])
157
276
  end
158
277
 
159
278
  options[:starts] ||= self.class.default_starts_date
@@ -161,5 +280,14 @@ module SimplesIdeias
161
280
 
162
281
  options
163
282
  end
283
+
284
+ def as_date(date) # :nodoc:
285
+ case date
286
+ when String
287
+ Date.parse(date)
288
+ else
289
+ date
290
+ end
291
+ end
164
292
  end
165
293
  end
@@ -1,9 +1,9 @@
1
1
  module SimplesIdeias
2
2
  class Recurrence
3
3
  module Version
4
- MAJOR = 0
5
- MINOR = 1
6
- PATCH = 5
4
+ MAJOR = 1
5
+ MINOR = 0
6
+ PATCH = 0
7
7
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
8
8
  end
9
9
  end
data/recurrence.gemspec CHANGED
@@ -20,5 +20,6 @@ Gem::Specification.new do |s|
20
20
  s.require_paths = ["lib"]
21
21
 
22
22
  s.add_dependency "activesupport"
23
- s.add_development_dependency "rspec-rails", ">= 2.0.0"
23
+ s.add_development_dependency "rspec", ">= 2.0.0"
24
+ s.add_development_dependency "ruby-debug19"
24
25
  end
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe "recurrence" do
3
+ describe Recurrence do
4
4
  it "should require :every option" do
5
5
  expect { recurrence({}) }.to raise_error(ArgumentError)
6
6
  end
@@ -13,58 +13,76 @@ describe "recurrence" do
13
13
  expect { recurrence(:every => :day, :interval => 0) }.to raise_error(ArgumentError)
14
14
  end
15
15
 
16
+ it "should return an enumerator when Recurrence#each is called without a block" do
17
+ recurrence(:every => :day).each.should be_instance_of(Enumerator)
18
+ end
19
+
20
+ it "should return an enumerator when Recurrence#each! is called without a block" do
21
+ recurrence(:every => :day).each!.should be_instance_of(Enumerator)
22
+ end
23
+
16
24
  Recurrence::Event::Monthly::INTERVALS.each do |interval|
17
25
  it "should accept valid :interval symbol for monthly recurrence (#{interval[0]})" do
18
- expect { recurrence(:every => :month, :on => 10, :interval => interval[0]) }.to_not raise_error(ArgumentError)
26
+ expect {
27
+ recurrence(:every => :month, :on => 10, :interval => interval[0])
28
+ }.to_not raise_error(ArgumentError)
19
29
  end
20
30
  end
21
31
 
22
32
  Recurrence::Event::Yearly::MONTHS.each do |month_name, month_number|
23
33
  it "should accept month as symbol for yearly recurrence (#{month_name})" do
24
- expect { recurrence(:every => :year, :on => [month_name, 10]) }.to_not raise_error(ArgumentError)
34
+ expect {
35
+ recurrence(:every => :year, :on => [month_name, 10])
36
+ }.to_not raise_error(ArgumentError)
25
37
  end
26
38
  end
27
39
 
28
40
  it "should require month to be a valid symbol for yearly recurrence" do
29
- expect { recurrence(:every => :year, :on => [:invalid, 10]) }.to raise_error(ArgumentError)
41
+ expect {
42
+ recurrence(:every => :year, :on => [:invalid, 10])
43
+ }.to raise_error(ArgumentError)
30
44
  end
31
45
 
32
46
  it "should require :interval to be a valid symbol for monthly recurrence" do
33
- expect { recurrence(:every => :month, :on => 10, :interval => :invalid) }.to raise_error(ArgumentError)
47
+ expect {
48
+ recurrence(:every => :month, :on => 10, :interval => :invalid)
49
+ }.to raise_error(ArgumentError)
34
50
  end
35
51
 
36
- describe '.default_starts_date' do
37
- it 'should return Date.today by default' do
52
+ describe ".default_starts_date" do
53
+ it "should return Date.today by default" do
38
54
  Recurrence.default_starts_date.should == Date.today
39
55
  end
40
56
 
41
- it 'should require only strings and procs' do
42
- expect { Recurrence.default_starts_date = Date.tomorrow }.to raise_error(ArgumentError)
57
+ it "should require only strings and procs" do
58
+ expect {
59
+ Recurrence.default_starts_date = Date.tomorrow
60
+ }.to raise_error(ArgumentError)
43
61
  end
44
62
 
45
- context 'when .default_starts_date is reassigned to "Date.tomorrow" string' do
46
- before { Recurrence.default_starts_date = 'Date.tomorrow' }
63
+ context "when .default_starts_date is reassigned to 'Date.tomorrow' string" do
64
+ before { Recurrence.default_starts_date = "Date.tomorrow" }
47
65
  after { Recurrence.default_starts_date = nil }
48
66
 
49
- it 'should return Date.tomorrow' do
67
+ it "should return Date.tomorrow" do
50
68
  Recurrence.default_starts_date.should == Date.tomorrow
51
69
  end
52
70
 
53
- it 'should have effect on generated events' do
71
+ it "should have effect on generated events" do
54
72
  r = Recurrence.new(:every => :day, :until => 3.days.from_now.to_date)
55
73
  r.events.first.should == Date.tomorrow
56
74
  end
57
75
  end
58
76
 
59
- context 'when .default_starts_date is reassigned to lambda { Date.tomorrow } proc' do
77
+ context "when .default_starts_date is reassigned to lambda { Date.tomorrow } proc" do
60
78
  before { Recurrence.default_starts_date = lambda { Date.tomorrow } }
61
79
  after { Recurrence.default_starts_date = nil }
62
80
 
63
- it 'should return Date.tomorrow' do
81
+ it "should return Date.tomorrow" do
64
82
  Recurrence.default_starts_date.should == Date.tomorrow
65
83
  end
66
84
 
67
- it 'should have effect on generated events' do
85
+ it "should have effect on generated events" do
68
86
  r = Recurrence.new(:every => :day, :until => 3.days.from_now.to_date)
69
87
  r.events.first.should == Date.tomorrow
70
88
  end
@@ -106,7 +124,12 @@ describe "recurrence" do
106
124
  end
107
125
 
108
126
  it "should have a lacking day if the interval does not match the last day" do
109
- @recurrence = recurrence(:every => :day, :starts => "2008-03-19", :until => "2008-04-25", :interval => 2)
127
+ @recurrence = recurrence(
128
+ :every => :day,
129
+ :starts => "2008-03-19",
130
+ :until => "2008-04-25",
131
+ :interval => 2
132
+ )
110
133
  @recurrence.events[-1].to_s.should == "2008-04-24"
111
134
  end
112
135
  end
@@ -140,7 +163,12 @@ describe "recurrence" do
140
163
  starts = Date.parse("2008-02-29")
141
164
  ends = Date.parse("2008-03-14")
142
165
 
143
- @recurrence = recurrence(:every => :week, :on => :friday, :starts => starts, :until => ends.to_date)
166
+ @recurrence = recurrence(
167
+ :every => :week,
168
+ :on => :friday,
169
+ :starts => starts,
170
+ :until => ends.to_date
171
+ )
144
172
  @recurrence.events[0].to_s.should == "2008-02-29"
145
173
  @recurrence.events[1].to_s.should == "2008-03-07"
146
174
  @recurrence.events[-1].to_s.should == ends.to_s
@@ -148,7 +176,13 @@ describe "recurrence" do
148
176
 
149
177
  it "should use interval" do
150
178
  starts = Date.parse("2008-09-21")
151
- @recurrence = recurrence(:every => :week, :on => starts.wday, :interval => 2, :starts => starts, :until => "2009-01-01")
179
+ @recurrence = recurrence(
180
+ :every => :week,
181
+ :on => starts.wday,
182
+ :interval => 2,
183
+ :starts => starts,
184
+ :until => "2009-01-01"
185
+ )
152
186
  @recurrence.events[0].to_s.should == "2008-09-21"
153
187
  @recurrence.events[1].to_s.should == "2008-10-05"
154
188
  @recurrence.events[2].to_s.should == "2008-10-19"
@@ -160,7 +194,13 @@ describe "recurrence" do
160
194
 
161
195
  it "should occur several times per week" do
162
196
  starts = Date.parse("2008-09-21") #=> sunday
163
- @recurrence = recurrence(:every => :week, :on => [ :saturday, :sunday ], :interval => 2, :starts => starts, :until => "2009-01-01")
197
+ @recurrence = recurrence(
198
+ :every => :week,
199
+ :on => [:saturday, :sunday],
200
+ :interval => 2,
201
+ :starts => starts,
202
+ :until => "2009-01-01"
203
+ )
164
204
  @recurrence.events[0].to_s.should == "2008-09-21"
165
205
  @recurrence.events[1].to_s.should == "2008-09-27"
166
206
  @recurrence.events[2].to_s.should == "2008-10-05"
@@ -171,7 +211,12 @@ describe "recurrence" do
171
211
  @recurrence.events[7].to_s.should == "2008-11-08"
172
212
 
173
213
  starts = Date.parse("2008-09-21") #=> sunday
174
- @recurrence = recurrence(:every => :week, :on => [ :monday, :wednesday, :friday ], :starts => starts, :until => "2009-01-01")
214
+ @recurrence = recurrence(
215
+ :every => :week,
216
+ :on => [:monday, :wednesday, :friday],
217
+ :starts => starts,
218
+ :until => "2009-01-01"
219
+ )
175
220
  @recurrence.events[0].to_s.should == "2008-09-22"
176
221
  @recurrence.events[1].to_s.should == "2008-09-24"
177
222
  @recurrence.events[2].to_s.should == "2008-09-26"
@@ -182,7 +227,12 @@ describe "recurrence" do
182
227
 
183
228
  it "should run until next available saturday" do
184
229
  starts = Date.parse("2008-09-21") # => sunday
185
- @recurrence = recurrence(:every => :week, :on => :saturday, :starts => starts, :until => "2009-01-01")
230
+ @recurrence = recurrence(
231
+ :every => :week,
232
+ :on => :saturday,
233
+ :starts => starts,
234
+ :until => "2009-01-01"
235
+ )
186
236
  @recurrence.events[0].to_s.should == "2008-09-27"
187
237
  end
188
238
  end
@@ -211,7 +261,12 @@ describe "recurrence" do
211
261
  starts = Date.parse("2008-06-07")
212
262
  ends = Date.parse("2008-11-07")
213
263
 
214
- @recurrence = recurrence(:every => :month, :on => starts.day, :starts => starts, :until => ends)
264
+ @recurrence = recurrence(
265
+ :every => :month,
266
+ :on => starts.day,
267
+ :starts => starts,
268
+ :until => ends
269
+ )
215
270
  @recurrence.events[0].to_s.should == "2008-06-07"
216
271
  @recurrence.events[-1].to_s.should == "2008-11-07"
217
272
  end
@@ -219,13 +274,24 @@ describe "recurrence" do
219
274
  it "should run until next available 27th" do
220
275
  starts = Date.parse("2008-09-28")
221
276
 
222
- @recurrence = recurrence(:every => :month, :on => 27, :starts => starts, :until => "2009-01-01")
277
+ @recurrence = recurrence(
278
+ :every => :month,
279
+ :on => 27,
280
+ :starts => starts,
281
+ :until => "2009-01-01"
282
+ )
223
283
  @recurrence.events[0].to_s.should == "2008-10-27"
224
284
  end
225
285
 
226
286
  it "should use interval" do
227
287
  starts = Date.parse("2008-01-31")
228
- @recurrence = recurrence(:every => :month, :on => 31, :interval => 2, :starts => starts, :until => "2010-01-01")
288
+ @recurrence = recurrence(
289
+ :every => :month,
290
+ :on => 31,
291
+ :interval => 2,
292
+ :starts => starts,
293
+ :until => "2010-01-01"
294
+ )
229
295
  @recurrence.events[0].to_s.should == "2008-01-31"
230
296
  @recurrence.events[1].to_s.should == "2008-03-31"
231
297
  @recurrence.events[2].to_s.should == "2008-05-31"
@@ -235,7 +301,13 @@ describe "recurrence" do
235
301
  @recurrence.events[6].to_s.should == "2009-01-31"
236
302
 
237
303
  starts = Date.parse("2008-01-31")
238
- @recurrence = recurrence(:every => :month, :on => 29, :interval => 3, :starts => starts, :until => "2010-01-01")
304
+ @recurrence = recurrence(
305
+ :every => :month,
306
+ :on => 29,
307
+ :interval => 3,
308
+ :starts => starts,
309
+ :until => "2010-01-01"
310
+ )
239
311
  @recurrence.events[0].to_s.should == "2008-04-29"
240
312
  @recurrence.events[1].to_s.should == "2008-07-29"
241
313
  @recurrence.events[2].to_s.should == "2008-10-29"
@@ -244,7 +316,13 @@ describe "recurrence" do
244
316
  @recurrence.events[5].to_s.should == "2009-07-29"
245
317
 
246
318
  starts = Date.parse("2008-02-29")
247
- @recurrence = recurrence(:every => :month, :on => 31, :interval => 4, :starts => starts, :until => "2010-01-01")
319
+ @recurrence = recurrence(
320
+ :every => :month,
321
+ :on => 31,
322
+ :interval => 4,
323
+ :starts => starts,
324
+ :until => "2010-01-01"
325
+ )
248
326
  @recurrence.events[0].to_s.should == "2008-02-29"
249
327
  @recurrence.events[1].to_s.should == "2008-06-30"
250
328
  @recurrence.events[2].to_s.should == "2008-10-31"
@@ -261,14 +339,24 @@ describe "recurrence" do
261
339
  it "should repeat until 8 months from now" do
262
340
  date = 8.months.from_now
263
341
  week = (date.day - 1) / 7 + 1
264
- @recurrence = recurrence(:every => :month, :on => week, :weekday => date.wday, :until => date.to_date)
342
+ @recurrence = recurrence(
343
+ :every => :month,
344
+ :on => week,
345
+ :weekday => date.wday,
346
+ :until => date.to_date
347
+ )
265
348
  @recurrence.events[-1].should == date.to_date
266
349
  end
267
350
 
268
351
  it "should start 9 months ago" do
269
352
  date = 9.months.ago
270
353
  week = (date.day - 1) / 7 + 1
271
- @recurrence = recurrence(:every => :month, :on => week, :weekday => date.wday, :starts => date.to_date)
354
+ @recurrence = recurrence(
355
+ :every => :month,
356
+ :on => week,
357
+ :weekday => date.wday,
358
+ :starts => date.to_date
359
+ )
272
360
  @recurrence.events[0].should == date.to_date
273
361
  end
274
362
 
@@ -276,7 +364,13 @@ describe "recurrence" do
276
364
  starts = Date.parse("2008-06-07")
277
365
  ends = Date.parse("2008-11-01")
278
366
 
279
- @recurrence = recurrence(:every => :month, :on => :first, :weekday => :saturday, :starts => starts, :until => ends)
367
+ @recurrence = recurrence(
368
+ :every => :month,
369
+ :on => :first,
370
+ :weekday => :saturday,
371
+ :starts => starts,
372
+ :until => ends
373
+ )
280
374
  @recurrence.events[0].to_s.should == "2008-06-07"
281
375
  @recurrence.events[-1].to_s.should == "2008-11-01"
282
376
  end
@@ -285,14 +379,27 @@ describe "recurrence" do
285
379
  starts = Date.parse("2008-06-29")
286
380
  ends = Date.parse("2008-11-30")
287
381
 
288
- @recurrence = recurrence(:every => :month, :on => :last, :weekday => :sunday, :starts => starts, :until => ends)
382
+ @recurrence = recurrence(
383
+ :every => :month,
384
+ :on => :last,
385
+ :weekday => :sunday,
386
+ :starts => starts,
387
+ :until => ends
388
+ )
289
389
  @recurrence.events[0].to_s.should == "2008-06-29"
290
390
  @recurrence.events[-1].to_s.should == "2008-11-30"
291
391
  end
292
392
 
293
393
  it "should use interval" do
294
394
  starts = Date.parse("2009-01-01")
295
- @recurrence = recurrence(:every => :month, :on => :third, :weekday => :sunday, :interval => 2, :starts => starts, :until => "2010-02-01")
395
+ @recurrence = recurrence(
396
+ :every => :month,
397
+ :on => :third,
398
+ :weekday => :sunday,
399
+ :interval => 2,
400
+ :starts => starts,
401
+ :until => "2010-02-01"
402
+ )
296
403
  @recurrence.events[0].to_s.should == "2009-01-18"
297
404
  @recurrence.events[1].to_s.should == "2009-03-15"
298
405
  @recurrence.events[2].to_s.should == "2009-05-17"
@@ -317,19 +424,34 @@ describe "recurrence" do
317
424
  end
318
425
 
319
426
  it "should accept monthly symbol" do
320
- @recurrence = recurrence(:every => :month, :on => 10, :starts => @starts, :interval => :monthly)
427
+ @recurrence = recurrence(
428
+ :every => :month,
429
+ :on => 10,
430
+ :starts => @starts,
431
+ :interval => :monthly
432
+ )
321
433
  @recurrence.events[0].to_s.should == "2008-09-10"
322
434
  @recurrence.events[1].to_s.should == "2008-10-10"
323
435
  end
324
436
 
325
437
  it "should accept bimonthly symbol" do
326
- @recurrence = recurrence(:every => :month, :on => 10, :starts => @starts, :interval => :bimonthly)
438
+ @recurrence = recurrence(
439
+ :every => :month,
440
+ :on => 10,
441
+ :starts => @starts,
442
+ :interval => :bimonthly
443
+ )
327
444
  @recurrence.events[0].to_s.should == "2008-09-10"
328
445
  @recurrence.events[1].to_s.should == "2008-11-10"
329
446
  end
330
447
 
331
448
  it "should accept quarterly symbol" do
332
- @recurrence = recurrence(:every => :month, :on => 10, :starts => @starts, :interval => :quarterly)
449
+ @recurrence = recurrence(
450
+ :every => :month,
451
+ :on => 10,
452
+ :starts => @starts,
453
+ :interval => :quarterly
454
+ )
333
455
  @recurrence.events[0].to_s.should == "2008-09-10"
334
456
  @recurrence.events[1].to_s.should == "2008-12-10"
335
457
  end
@@ -350,13 +472,21 @@ describe "recurrence" do
350
472
 
351
473
  it "should repeat until 7 years from now" do
352
474
  date = 7.years.from_now
353
- @recurrence = recurrence(:every => :year, :on => [date.month, date.day], :until => date.to_date)
475
+ @recurrence = recurrence(
476
+ :every => :year,
477
+ :on => [date.month, date.day],
478
+ :until => date.to_date
479
+ )
354
480
  @recurrence.events[-1].should == date.to_date
355
481
  end
356
482
 
357
483
  it "should start 2 years ago" do
358
484
  date = 2.years.ago
359
- @recurrence = recurrence(:every => :year, :on => [date.month, date.day], :starts => date.to_date)
485
+ @recurrence = recurrence(
486
+ :every => :year,
487
+ :on => [date.month, date.day],
488
+ :starts => date.to_date
489
+ )
360
490
  @recurrence.events[0].should == date.to_date
361
491
  end
362
492
 
@@ -364,7 +494,12 @@ describe "recurrence" do
364
494
  starts = Date.parse("2003-06-07")
365
495
  ends = Date.parse("2018-06-07")
366
496
 
367
- @recurrence = recurrence(:every => :year, :on => [starts.month, starts.day], :starts => starts, :until => ends)
497
+ @recurrence = recurrence(
498
+ :every => :year,
499
+ :on => [starts.month, starts.day],
500
+ :starts => starts,
501
+ :until => ends
502
+ )
368
503
  @recurrence.events[0].to_s.should == "2003-06-07"
369
504
  @recurrence.events[-1].to_s.should == "2018-06-07"
370
505
  end
@@ -372,7 +507,12 @@ describe "recurrence" do
372
507
  it "should use interval" do
373
508
  starts = Date.parse("2008-09-21")
374
509
 
375
- @recurrence = recurrence(:every => :year, :on => [starts.month, starts.day], :interval => 2, :starts => starts)
510
+ @recurrence = recurrence(
511
+ :every => :year,
512
+ :on => [starts.month, starts.day],
513
+ :interval => 2,
514
+ :starts => starts
515
+ )
376
516
  @recurrence.events[0].to_s.should == "2008-09-21"
377
517
  @recurrence.events[1].to_s.should == "2010-09-21"
378
518
  @recurrence.events[2].to_s.should == "2012-09-21"
data/spec/spec_helper.rb CHANGED
@@ -2,4 +2,4 @@ require "rspec"
2
2
  require "recurrence"
3
3
 
4
4
  Date::DATE_FORMATS[:date] = "%d/%m/%Y"
5
- Time::DATE_FORMATS[:date] = "%d/%m/%Y"
5
+ Time::DATE_FORMATS[:date] = "%d/%m/%Y"
metadata CHANGED
@@ -3,10 +3,10 @@ name: recurrence
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
- - 0
7
6
  - 1
8
- - 5
9
- version: 0.1.5
7
+ - 0
8
+ - 0
9
+ version: 1.0.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Nando Vieira
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-03 00:00:00 -02:00
17
+ date: 2010-11-16 00:00:00 -02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -31,7 +31,7 @@ dependencies:
31
31
  type: :runtime
32
32
  version_requirements: *id001
33
33
  - !ruby/object:Gem::Dependency
34
- name: rspec-rails
34
+ name: rspec
35
35
  prerelease: false
36
36
  requirement: &id002 !ruby/object:Gem::Requirement
37
37
  none: false
@@ -45,6 +45,19 @@ dependencies:
45
45
  version: 2.0.0
46
46
  type: :development
47
47
  version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: ruby-debug19
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ segments:
57
+ - 0
58
+ version: "0"
59
+ type: :development
60
+ version_requirements: *id003
48
61
  description: A simple library to handle recurring events
49
62
  email:
50
63
  - fnando.vieira@gmail.com
@@ -62,9 +75,8 @@ files:
62
75
  - Gemfile.lock
63
76
  - History.txt
64
77
  - License.txt
65
- - README.markdown
78
+ - README.rdoc
66
79
  - Rakefile
67
- - init.rb
68
80
  - lib/recurrence.rb
69
81
  - lib/recurrence/event.rb
70
82
  - lib/recurrence/event/base.rb
data/README.markdown DELETED
@@ -1,138 +0,0 @@
1
- Recurrence
2
- ==========
3
-
4
- * [http://github.com/fnando/recurrence](http://github.com/fnando/recurrence)
5
-
6
- DESCRIPTION:
7
- ------------
8
-
9
- A simple library to handle recurring events.
10
-
11
-
12
- INSTALLATION:
13
- -------------
14
-
15
- Recurrence can be installed by running
16
-
17
- gem install recurrence
18
-
19
- USAGE:
20
- ------
21
-
22
- require 'rubygems'
23
- require 'recurrence'
24
-
25
- # Daily
26
- r = Recurrence.new(:every => :day)
27
- r = Recurrence.new(:every => :day, :interval => 9)
28
- r = Recurrence.daily(options = {})
29
-
30
- # Weekly
31
- r = Recurrence.new(:every => :week, :on => 5)
32
- r = Recurrence.new(:every => :week, :on => :monday)
33
- r = Recurrence.new(:every => :week, :on => [:monday, :friday])
34
- r = Recurrence.new(:every => :week, :on => [:monday, :wednesday, :friday])
35
- r = Recurrence.new(:every => :week, :on => :friday, :interval => 2)
36
- r = Recurrence.weekly(:on => :thursday)
37
-
38
- # Monthly by month day
39
- r = Recurrence.new(:every => :month, :on => 15)
40
- r = Recurrence.new(:every => :month, :on => 31)
41
- r = Recurrence.new(:every => :month, :on => 7, :interval => 2)
42
- r = Recurrence.new(:every => :month, :on => 7, :interval => :monthly)
43
- r = Recurrence.new(:every => :month, :on => 7, :interval => :bimonthly)
44
- r = Recurrence.monthly(:on => 31)
45
-
46
- # Monthly by week day
47
- r = Recurrence.new(:every => :month, :on => :first, :weekday => :sunday)
48
- r = Recurrence.new(:every => :month, :on => :third, :weekday => :monday)
49
- r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday)
50
- r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday, :interval => 2)
51
- r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday, :interval => :quarterly)
52
- r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday, :interval => :semesterly)
53
-
54
- # Yearly
55
- r = Recurrence.new(:every => :year, :on => [7, 4]) # => [month, day]
56
- r = Recurrence.new(:every => :year, :on => [10, 31], :interval => 3)
57
- r = Recurrence.new(:every => :year, :on => [:jan, 31])
58
- r = Recurrence.new(:every => :year, :on => [:january, 31])
59
- r = Recurrence.yearly(:on => [:january, 31])
60
-
61
- # Limit recurrence
62
- # :starts defaults to Date.today
63
- # :until defaults to 2037-12-31
64
- r = Recurrence.new(:every => :day, :starts => Date.today)
65
- r = Recurrence.new(:every => :day, :until => '2010-01-31')
66
- r = Recurrence.new(:every => :day, :starts => Date.today, :until => '2010-01-31')
67
-
68
- # Getting an array with all events
69
- r.events.each {|date| puts date.to_s } # => Memoized array
70
- r.events!.each {|date| puts date.to_s } # => reset items cache and re-execute it
71
- r.events(:starts => '2009-01-01').each {|date| puts date.to_s }
72
- r.events(:until => '2009-01-10').each {|date| puts date.to_s }
73
- r.events(:starts => '2009-01-05', :until => '2009-01-10').each {|date| puts date.to_s }
74
-
75
- # Iterating events
76
- r.each { |date| puts date.to_s } # => Use items method
77
- r.each! { |date| puts date.to_s } # => Use items! method
78
-
79
- # Check if a date is included
80
- r.include?(Date.today) # => true or false
81
- r.include?('2008-09-21')
82
-
83
- # Get next available date
84
- r.next # => Keep the original date object
85
- r.next! # => Change the internal date object to the next available date
86
-
87
- TROUBLESHOOTING
88
- ---------------
89
-
90
- If you're having problems because already have a class/module called Recurrence that is conflicting with this gem, you can require the namespace and create a class that inherits from `SimplesIdeias::Recurrence`.
91
-
92
- require "recurrence/namespace"
93
-
94
- class RecurrentEvent < SimplesIdeias::Recurrence
95
- end
96
-
97
- r = RecurrentEvent.new(:every => :day)
98
-
99
- If you're using Rails/Bundler or something like that, remember to override the `:require` option.
100
-
101
- # Gemfile
102
- source :rubygems
103
-
104
- gem "recurrence", :require => "recurrence/namespace"
105
-
106
- MAINTAINER
107
- ----------
108
-
109
- * Nando Vieira (<http://simplesideias.com.br/>)
110
-
111
- CONTRIBUTORS
112
- ------------
113
-
114
- * José Valim (<http://josevalim.blogspot.com/>)
115
-
116
- LICENSE:
117
- --------
118
-
119
- (The MIT License)
120
-
121
- Permission is hereby granted, free of charge, to any person obtaining
122
- a copy of this software and associated documentation files (the
123
- 'Software'), to deal in the Software without restriction, including
124
- without limitation the rights to use, copy, modify, merge, publish,
125
- distribute, sublicense, and/or sell copies of the Software, and to
126
- permit persons to whom the Software is furnished to do so, subject to
127
- the following conditions:
128
-
129
- The above copyright notice and this permission notice shall be
130
- included in all copies or substantial portions of the Software.
131
-
132
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
133
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
134
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
135
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
136
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
137
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
138
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/init.rb DELETED
@@ -1,2 +0,0 @@
1
- require "recurrence"
2
- warn "Using Recurrence as a Rails plugin is deprecated and won't be supported in future versions."