recurrence 0.1.4 → 0.1.5

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/History.txt CHANGED
@@ -56,3 +56,12 @@
56
56
  == 0.1.3 2010-09-14
57
57
 
58
58
  * Moved Recurrence class to SimpleIdeias namespace; see troubleshooting section for instructions.
59
+
60
+ == 0.1.4 2010-10-19
61
+
62
+ * Bug fix: yearly recurrence was raising an error
63
+
64
+ == 0.1.5 2010-11-03
65
+
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
@@ -8,7 +8,27 @@ module SimplesIdeias
8
8
 
9
9
  FREQUENCY = %w(day week month year)
10
10
 
11
- attr_reader :event
11
+ attr_reader :event, :options
12
+
13
+ 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
20
+ else
21
+ Date.today
22
+ end
23
+ end
24
+
25
+ def self.default_starts_date=(date)
26
+ unless date.respond_to?(:call) || date.is_a?(String) || date == nil
27
+ raise ArgumentError, 'default_starts_date must be a proc or an evaluatable string such as "Date.current"'
28
+ end
29
+
30
+ @default_starts_date = date
31
+ end
12
32
 
13
33
  def self.default_until_date
14
34
  @default_until_date ||= Date.new(2037, 12, 31)
@@ -46,18 +66,19 @@ module SimplesIdeias
46
66
  raise ArgumentError, ":every option is required" unless options.key?(:every)
47
67
  raise ArgumentError, "invalid :every option" unless FREQUENCY.include?(options[:every].to_s)
48
68
 
49
- @options = initialize_dates(options)
50
- @options[:interval] ||= 1
69
+ @options = options.dup
70
+ @normalized_options = initialize_dates(options)
71
+ @normalized_options[:interval] ||= 1
51
72
 
52
- @event = case @options[:every].to_sym
73
+ @event = case @normalized_options[:every].to_sym
53
74
  when :day
54
- Recurrence::Event::Daily.new(@options)
75
+ Recurrence::Event::Daily.new(@normalized_options)
55
76
  when :week
56
- Recurrence::Event::Weekly.new(@options)
77
+ Recurrence::Event::Weekly.new(@normalized_options)
57
78
  when :month
58
- Recurrence::Event::Monthly.new(@options)
79
+ Recurrence::Event::Monthly.new(@normalized_options)
59
80
  when :year
60
- Recurrence::Event::Yearly.new(@options)
81
+ Recurrence::Event::Yearly.new(@normalized_options)
61
82
  end
62
83
  end
63
84
 
@@ -69,7 +90,7 @@ module SimplesIdeias
69
90
  def include?(required_date)
70
91
  required_date = Date.parse(required_date) if required_date.is_a?(String)
71
92
 
72
- if required_date < @options[:starts] || required_date > @options[:until]
93
+ if required_date < @normalized_options[:starts] || required_date > @normalized_options[:until]
73
94
  false
74
95
  else
75
96
  each do |date|
@@ -135,7 +156,7 @@ module SimplesIdeias
135
156
  options[name] = Date.parse(options[name]) if options[name].is_a?(String)
136
157
  end
137
158
 
138
- options[:starts] ||= Date.today
159
+ options[:starts] ||= self.class.default_starts_date
139
160
  options[:until] ||= self.class.default_until_date
140
161
 
141
162
  options
@@ -3,7 +3,7 @@ module SimplesIdeias
3
3
  module Version
4
4
  MAJOR = 0
5
5
  MINOR = 1
6
- PATCH = 4
6
+ PATCH = 5
7
7
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
8
8
  end
9
9
  end
@@ -33,6 +33,44 @@ describe "recurrence" do
33
33
  expect { recurrence(:every => :month, :on => 10, :interval => :invalid) }.to raise_error(ArgumentError)
34
34
  end
35
35
 
36
+ describe '.default_starts_date' do
37
+ it 'should return Date.today by default' do
38
+ Recurrence.default_starts_date.should == Date.today
39
+ end
40
+
41
+ it 'should require only strings and procs' do
42
+ expect { Recurrence.default_starts_date = Date.tomorrow }.to raise_error(ArgumentError)
43
+ end
44
+
45
+ context 'when .default_starts_date is reassigned to "Date.tomorrow" string' do
46
+ before { Recurrence.default_starts_date = 'Date.tomorrow' }
47
+ after { Recurrence.default_starts_date = nil }
48
+
49
+ it 'should return Date.tomorrow' do
50
+ Recurrence.default_starts_date.should == Date.tomorrow
51
+ end
52
+
53
+ it 'should have effect on generated events' do
54
+ r = Recurrence.new(:every => :day, :until => 3.days.from_now.to_date)
55
+ r.events.first.should == Date.tomorrow
56
+ end
57
+ end
58
+
59
+ context 'when .default_starts_date is reassigned to lambda { Date.tomorrow } proc' do
60
+ before { Recurrence.default_starts_date = lambda { Date.tomorrow } }
61
+ after { Recurrence.default_starts_date = nil }
62
+
63
+ it 'should return Date.tomorrow' do
64
+ Recurrence.default_starts_date.should == Date.tomorrow
65
+ end
66
+
67
+ it 'should have effect on generated events' do
68
+ r = Recurrence.new(:every => :day, :until => 3.days.from_now.to_date)
69
+ r.events.first.should == Date.tomorrow
70
+ end
71
+ end
72
+ end
73
+
36
74
  context "with daily recurring" do
37
75
  it "should recur until limit date" do
38
76
  @recurrence = Recurrence.daily
@@ -359,6 +397,13 @@ describe "recurrence" do
359
397
  end
360
398
  end
361
399
 
400
+ describe "#options" do
401
+ it "should return passed-in options" do
402
+ @recurrence = recurrence(:every => :day)
403
+ @recurrence.options.should == {:every => :day}
404
+ end
405
+ end
406
+
362
407
  describe "#include?" do
363
408
  it "should include date (day)" do
364
409
  @recurrence = recurrence(:every => :day, :starts => "2008-09-30")
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 4
9
- version: 0.1.4
8
+ - 5
9
+ version: 0.1.5
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-10-19 00:00:00 -02:00
17
+ date: 2010-11-03 00:00:00 -02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency