acts_as_event_owner 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +47 -44
- data/acts_as_event_owner.gemspec +2 -2
- data/lib/acts_as_event_owner/core.rb +12 -4
- data/lib/acts_as_event_owner/version.rb +1 -1
- data/spec/acts_as_event_owner/core_spec.rb +22 -7
- metadata +3 -3
data/README.textile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
h1. ActsAsEventOwner
|
2
2
|
|
3
|
-
ActsAsEventOwner is an ActiveRecord extension that adds calendar event management to any ActiveRecord model. Models that declare themselves as @acts_as_event_owner@ gain two @has_many@ associations- one for the event specifications, and one for the event occurrences.
|
3
|
+
ActsAsEventOwner is an ActiveRecord extension that adds calendar event management to any ActiveRecord model. Models that declare themselves as @acts_as_event_owner@ gain two @has_many@ associations- one for the event specifications, and one for the event occurrences.
|
4
4
|
|
5
5
|
ActsAsEventOwner supports recurring events, with roughly the same recurrence rule capabilities as Apple's iCal application. Under the hood, ActsAsEventOwner uses "ri_cal":http://github.com/rubyredrick/ri_cal to provide recurring event support.
|
6
6
|
|
@@ -8,7 +8,7 @@ h1. Installation
|
|
8
8
|
|
9
9
|
h2. Rails 2.3.x
|
10
10
|
|
11
|
-
ActsAsEventOwner is available both as a gem and as a plugin.
|
11
|
+
ActsAsEventOwner is available both as a gem and as a plugin.
|
12
12
|
|
13
13
|
h3. Installing as a Rails 2.3.x plugin
|
14
14
|
|
@@ -53,7 +53,7 @@ Then do:
|
|
53
53
|
|
54
54
|
<pre>
|
55
55
|
bundle install
|
56
|
-
|
56
|
+
</pre>
|
57
57
|
|
58
58
|
h3. Rails 3 post-installation steps
|
59
59
|
|
@@ -70,22 +70,25 @@ h1. Usage
|
|
70
70
|
class User < ActiveRecord::Base
|
71
71
|
acts_as_event_owner
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
@user = User.create :name => 'Alvin Seville'
|
75
|
-
@user.event_specifications.create :description => 'acquire cheese balls',
|
76
|
-
:start_at => Date.today.to_time.utc,
|
75
|
+
@user.event_specifications.create :description => 'acquire cheese balls',
|
76
|
+
:start_at => Date.today.to_time.utc,
|
77
77
|
:repeat => :daily,
|
78
78
|
:generate => false
|
79
|
-
|
79
|
+
|
80
80
|
@user.events # => []
|
81
|
-
|
81
|
+
|
82
82
|
@user.events.generate :from => Date.today.to_time.utc, :to => Date.today.to_time.utc + 1.week
|
83
|
-
|
83
|
+
|
84
84
|
# override the description on a per-generate basis
|
85
|
-
@user.events.generate :from => Date.today.to_time.utc, :to => Date.today.to_time.utc + 1.week,
|
85
|
+
@user.events.generate :from => Date.today.to_time.utc - 1.day, :to => Date.today.to_time.utc + 1.week,
|
86
86
|
:attributes => { :description => 'acquire cheese balls, like, right away!' }
|
87
|
-
|
88
|
-
@user.events # => (
|
87
|
+
|
88
|
+
@user.events # => (8 ActsAsEventOwner::EventOccurrence objects)
|
89
|
+
|
90
|
+
@user.events.past # => (1 ActsAsEventOwner::EventOccurrence objects)
|
91
|
+
@user.events.upcoming #=> (7 ActsAsEventOwner::EventOccurrence objects)
|
89
92
|
</pre>
|
90
93
|
|
91
94
|
h2. Adding custom fields
|
@@ -103,92 +106,92 @@ ActsAsEventOwner supports recurrence rules roughly equivalent to those supported
|
|
103
106
|
h3. One-time event
|
104
107
|
|
105
108
|
<pre>
|
106
|
-
EventSpecification.create :description => 'pick up laundry',
|
109
|
+
EventSpecification.create :description => 'pick up laundry',
|
107
110
|
:start_at => Time.parse("4:00pm")
|
108
111
|
</pre>
|
109
112
|
|
110
113
|
h3. Every day
|
111
114
|
|
112
115
|
<pre>
|
113
|
-
EventSpecification.create :description => 'eat breakfast',
|
114
|
-
:start_at => Time.parse("7:30am"),
|
116
|
+
EventSpecification.create :description => 'eat breakfast',
|
117
|
+
:start_at => Time.parse("7:30am"),
|
115
118
|
:repeat => :daily
|
116
119
|
</pre>
|
117
120
|
|
118
121
|
h3. Every three days
|
119
122
|
|
120
123
|
<pre>
|
121
|
-
EventSpecification.create :description => 'call mom',
|
122
|
-
:start_at => Time.parse("10:30am"),
|
123
|
-
:repeat => :daily,
|
124
|
+
EventSpecification.create :description => 'call mom',
|
125
|
+
:start_at => Time.parse("10:30am"),
|
126
|
+
:repeat => :daily,
|
124
127
|
:frequency => 3
|
125
128
|
</pre>
|
126
129
|
|
127
130
|
h3. On Monday, Wednesday, and Friday of each week
|
128
131
|
|
129
132
|
<pre>
|
130
|
-
EventSpecification.create :description => 'go to the gym',
|
131
|
-
:start_at => Time.parse("6:30am"),
|
132
|
-
:repeat => :weekly,
|
133
|
+
EventSpecification.create :description => 'go to the gym',
|
134
|
+
:start_at => Time.parse("6:30am"),
|
135
|
+
:repeat => :weekly,
|
133
136
|
:on => [ :mo, :we, :fr ]
|
134
137
|
</pre>
|
135
138
|
|
136
139
|
h3. On Thursday, every other week
|
137
140
|
|
138
141
|
<pre>
|
139
|
-
EventSpecification.create :description => 'clean the bathroom',
|
140
|
-
:start_at => Time.parse("8:00pm"),
|
141
|
-
:repeat => :weekly,
|
142
|
+
EventSpecification.create :description => 'clean the bathroom',
|
143
|
+
:start_at => Time.parse("8:00pm"),
|
144
|
+
:repeat => :weekly,
|
142
145
|
:frequency => 2, :on => [ :th ]
|
143
146
|
</pre>
|
144
147
|
|
145
148
|
h3. On the 10th and 25th of each month
|
146
149
|
|
147
150
|
<pre>
|
148
|
-
EventSpecification.create :description => 'pick up paycheck',
|
149
|
-
:start_at => Time.parse("9:30am"),
|
150
|
-
:repeat => :monthly,
|
151
|
+
EventSpecification.create :description => 'pick up paycheck',
|
152
|
+
:start_at => Time.parse("9:30am"),
|
153
|
+
:repeat => :monthly,
|
151
154
|
:on => [ 10, 25 ]
|
152
155
|
</pre>
|
153
156
|
|
154
157
|
h3. On the last Saturday of each month
|
155
158
|
|
156
159
|
<pre>
|
157
|
-
EventSpecification.create :description => 'run a marathon',
|
158
|
-
:start_at => Time.parse("6:30am"),
|
159
|
-
:repeat => :monthly,
|
160
|
-
:on_the => :last,
|
160
|
+
EventSpecification.create :description => 'run a marathon',
|
161
|
+
:start_at => Time.parse("6:30am"),
|
162
|
+
:repeat => :monthly,
|
163
|
+
:on_the => :last,
|
161
164
|
:target => [ :sa ]
|
162
165
|
</pre>
|
163
166
|
|
164
167
|
h3. On the last weekday of each month
|
165
168
|
|
166
169
|
<pre>
|
167
|
-
EventSpecification.create :description => 'wine tasting',
|
168
|
-
:start_at => Time.parse("6:30pm"),
|
169
|
-
:repeat => :monthly,
|
170
|
-
:on_the => :last,
|
170
|
+
EventSpecification.create :description => 'wine tasting',
|
171
|
+
:start_at => Time.parse("6:30pm"),
|
172
|
+
:repeat => :monthly,
|
173
|
+
:on_the => :last,
|
171
174
|
:target => :wkday
|
172
175
|
</pre>
|
173
176
|
|
174
177
|
h3. Every April 15th
|
175
178
|
|
176
179
|
<pre>
|
177
|
-
EventSpecification.create :description => 'pay taxes',
|
178
|
-
:start_at => Time.parse("4/15/2010 5:00pm"),
|
180
|
+
EventSpecification.create :description => 'pay taxes',
|
181
|
+
:start_at => Time.parse("4/15/2010 5:00pm"),
|
179
182
|
:repeat => :yearly
|
180
183
|
</pre>
|
181
184
|
|
182
185
|
h3. On the second Thursday in May, every other year, until Dec 31, 2012
|
183
186
|
|
184
187
|
<pre>
|
185
|
-
EventSpecification.create :description => 'freak out',
|
186
|
-
:start_at => Time.now.utc,
|
187
|
-
:repeat => :yearly,
|
188
|
-
:frequency => 2,
|
189
|
-
:on => [ 5 ],
|
190
|
-
:on_the => :second,
|
191
|
-
:target => [ :th ],
|
188
|
+
EventSpecification.create :description => 'freak out',
|
189
|
+
:start_at => Time.now.utc,
|
190
|
+
:repeat => :yearly,
|
191
|
+
:frequency => 2,
|
192
|
+
:on => [ 5 ],
|
193
|
+
:on_the => :second,
|
194
|
+
:target => [ :th ],
|
192
195
|
:until => Time.parse("12/31/2012")
|
193
196
|
</pre>
|
194
197
|
|
data/acts_as_event_owner.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{acts_as_event_owner}
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Danny Burkes"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-11-27}
|
13
13
|
s.description = %q{Simple calendar events for any ActiveRecord model}
|
14
14
|
s.email = %q{dburkes@netable.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -3,7 +3,7 @@ module ActsAsEventOwner
|
|
3
3
|
def self.included(base)
|
4
4
|
base.send :extend, ClassMethods
|
5
5
|
end
|
6
|
-
|
6
|
+
|
7
7
|
module ClassMethods
|
8
8
|
def acts_as_event_owner options = {}
|
9
9
|
include InstanceMethods
|
@@ -15,18 +15,26 @@ module ActsAsEventOwner
|
|
15
15
|
proxy_owner.event_specifications.find(:all, :conditions => "until IS NULL OR until >= '#{Time.now.utc.to_s(:db)}'").each {|spec| spec.generate_events(options)}
|
16
16
|
self.reload
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def <<(obj)
|
20
20
|
raise ActsAsEventOwner::Exception.new("Do not add events directly- add event specifications, then call events.generate")
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def build(attributes={})
|
24
24
|
raise ActsAsEventOwner::Exception.new("Do not build events directly- build event specifications, then call events.generate")
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def create(attributes={})
|
28
28
|
raise ActsAsEventOwner::Exception.new("Do not create events directly- build event specifications, then call events.generate")
|
29
29
|
end
|
30
|
+
|
31
|
+
def upcoming
|
32
|
+
find(:all, :conditions => ["start_at >= ?", Time.now.utc])
|
33
|
+
end
|
34
|
+
|
35
|
+
def past
|
36
|
+
find(:all, :conditions => ["start_at < ?", Time.now.utc])
|
37
|
+
end
|
30
38
|
end
|
31
39
|
end
|
32
40
|
end
|
@@ -7,32 +7,32 @@ describe ActsAsEventOwner::Core do
|
|
7
7
|
@now = Time.now.utc
|
8
8
|
@bod = Date.today.to_time.utc
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
it "adds associations to the host object" do
|
12
12
|
lambda {
|
13
13
|
@user.events
|
14
14
|
@user.event_specifications
|
15
15
|
}.should_not raise_error
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
it "adds event specifications to the host object" do
|
19
19
|
lambda {
|
20
20
|
@user.event_specifications.create :description => 'walk the dog', :start_at => @now, :repeat => :daily, :frequency => 1
|
21
21
|
}.should change(EventSpecification, :count).by(1)
|
22
|
-
|
22
|
+
|
23
23
|
specs = @user.reload.event_specifications
|
24
24
|
specs.size.should == 1
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
it "adds events to the host object" do
|
28
28
|
@user.event_specifications.create :description => 'walk the dog', :start_at => @now, :repeat => :daily, :frequency => 1, :generate => false
|
29
29
|
@user.event_specifications.create :description => 'go to the gym', :start_at => @now, :repeat => :daily, :frequency => 2, :generate => false
|
30
|
-
|
30
|
+
|
31
31
|
lambda {
|
32
32
|
@user.events.generate :from => @bod, :to => @bod + 1.week
|
33
33
|
}.should change(EventOccurrence, :count).by(11)
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
it "injects events into the association immediately" do
|
37
37
|
@user.event_specifications.create :description => 'walk the dog', :start_at => @now, :repeat => :daily, :frequency => 1, :generate => false
|
38
38
|
@user.events.should be_empty
|
@@ -40,7 +40,7 @@ describe ActsAsEventOwner::Core do
|
|
40
40
|
@user.events.should be_present
|
41
41
|
@user.events.size.should == 7
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
describe "events association" do
|
45
45
|
before(:each) do
|
46
46
|
@new_event = EventOccurrence.new
|
@@ -58,5 +58,20 @@ describe ActsAsEventOwner::Core do
|
|
58
58
|
it "raises an exception if #create is called" do
|
59
59
|
lambda { @user.events.create @new_event.attributes }.should raise_error(ActsAsEventOwner::Exception)
|
60
60
|
end
|
61
|
+
|
62
|
+
describe "extensions" do
|
63
|
+
before(:each) do
|
64
|
+
@user.event_specifications.create :description => 'walk the dog', :start_at => @bod - 7.days, :repeat => :daily, :frequency => 1
|
65
|
+
@user.events.length.should == 30
|
66
|
+
end
|
67
|
+
|
68
|
+
it "provides an extension for upcoming events" do
|
69
|
+
@user.events.upcoming.length.should == 22
|
70
|
+
end
|
71
|
+
|
72
|
+
it "provides an extension for past events" do
|
73
|
+
@user.events.past.length.should == 8
|
74
|
+
end
|
75
|
+
end
|
61
76
|
end
|
62
77
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 1
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
|
9
|
-
version: 1.0.0
|
9
|
+
version: 1.1.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Danny Burkes
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-11-27 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|