olauzon-weekender 0.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/README.rdoc ADDED
@@ -0,0 +1,37 @@
1
+ = weekender
2
+
3
+ A simple Ruby library for creating calendars based on weeks rather than months.
4
+
5
+
6
+ == Installation
7
+
8
+ $ sudo gem sources -a http://gems.github.com
9
+ $ sudo gem install olauzon-weekender
10
+
11
+
12
+ == Usage
13
+
14
+ >> weekender = Weekender.new( :year => Date.today.year,
15
+ :month => Date.today.month,
16
+ :day => Date.today.day,
17
+ :before => 3, # number of weeks to display before
18
+ :after => 4) # number of weeks to display after
19
+ => Returns a Weekender instance
20
+
21
+ >> weekender.add_event(Date.today,
22
+ :html_class => 'special_event',
23
+ :content => '<p>special event 1</p>')
24
+ => Returns weekender with an event (you can add as many events as necessary)
25
+
26
+ >> weekender.display
27
+ => Outputs HTML calendar
28
+
29
+
30
+ == Inspiration
31
+
32
+ * nakajima's Calendar Maker http://github.com/nakajima/calendar-maker
33
+
34
+
35
+ == Copyright
36
+
37
+ Copyright (c) 2009 Olivier Lauzon. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,56 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "weekender"
8
+ gem.summary = %Q{A simple Ruby library for creating calendars based on weeks rather than months.}
9
+ gem.email = "olauzon@gmail.com"
10
+ gem.homepage = "http://github.com/olauzon/weekender"
11
+ gem.authors = ["Olivier Lauzon"]
12
+
13
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
14
+ end
15
+ rescue LoadError
16
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
17
+ end
18
+
19
+ require 'spec/rake/spectask'
20
+ Spec::Rake::SpecTask.new(:spec) do |spec|
21
+ spec.libs << 'lib' << 'spec'
22
+ spec.spec_files = FileList['spec/**/*_spec.rb']
23
+ end
24
+
25
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
26
+ spec.libs << 'lib' << 'spec'
27
+ spec.pattern = 'spec/**/*_spec.rb'
28
+ spec.rcov = true
29
+ end
30
+
31
+ begin
32
+ require 'cucumber/rake/task'
33
+ Cucumber::Rake::Task.new(:features)
34
+ rescue LoadError
35
+ task :features do
36
+ abort "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
37
+ end
38
+ end
39
+
40
+ task :default => :spec
41
+
42
+ require 'rake/rdoctask'
43
+ Rake::RDocTask.new do |rdoc|
44
+ if File.exist?('VERSION.yml')
45
+ config = YAML.load(File.read('VERSION.yml'))
46
+ version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
47
+ else
48
+ version = ""
49
+ end
50
+
51
+ rdoc.rdoc_dir = 'rdoc'
52
+ rdoc.title = "weekender #{version}"
53
+ rdoc.rdoc_files.include('README*')
54
+ rdoc.rdoc_files.include('lib/**/*.rb')
55
+ end
56
+
@@ -0,0 +1,15 @@
1
+ class Date
2
+
3
+ def day_name
4
+ strftime('%A')
5
+ end
6
+
7
+ def month_name
8
+ strftime('%B')
9
+ end
10
+
11
+ def day_of_month
12
+ strftime('%d').to_i
13
+ end
14
+
15
+ end
@@ -0,0 +1,15 @@
1
+ class String
2
+
3
+ # Aligns each line n spaces.
4
+ #
5
+ # CREDIT: Gavin Sinclair
6
+ #
7
+ def tab(n)
8
+ gsub(/^ */, ' ' * n)
9
+ end
10
+
11
+ def add(string)
12
+ self << "\n#{string}"
13
+ end
14
+
15
+ end
data/lib/weekender.rb ADDED
@@ -0,0 +1,9 @@
1
+ $:.unshift(File.expand_path(File.dirname(__FILE__)))
2
+
3
+ require 'date'
4
+
5
+ require 'core_ext/date'
6
+ require 'core_ext/string'
7
+
8
+ require 'weekender/view_helpers'
9
+ require 'weekender/weekender'
@@ -0,0 +1,76 @@
1
+ module WeekenderHelpers
2
+
3
+ attr_reader :date_format,
4
+ :name_format
5
+
6
+ def display(options={})
7
+ @date_format = options[:date_format] || '%Y-%m-%d'
8
+ @name_format = options[:name_format] || :long
9
+ output = '<table class="weekender">'
10
+ output.add header_row
11
+ output.add week_rows(:reverse => (options[:reverse] || false))
12
+ output.add '</table>'
13
+ end
14
+
15
+ private
16
+
17
+ def header_row
18
+ output = '<tr class="weekender_header">'.tab(2)
19
+ Weekender::DAY_NAMES.each do |day_name|
20
+ output.add ['<th>', abbreviate(day_name), '</th>'].join.tab(4)
21
+ end
22
+ output.add '</tr>'.tab(2)
23
+ end
24
+
25
+ def week_rows(options={})
26
+ output = ''
27
+ if options[:reverse] && options[:reverse] == true
28
+ weeks.downto(1) do |week|
29
+ if week == weeks
30
+ output = '<tr>'.tab(2)
31
+ else
32
+ output.add '<tr>'.tab(2)
33
+ end
34
+ 1.upto(7) do |day|
35
+ output.add day_cell(week, day)
36
+ end
37
+ output.add '</tr>'.tab(2)
38
+ end
39
+ else
40
+ 1.upto(weeks) do |week|
41
+ if week == 1
42
+ output = '<tr>'.tab(2)
43
+ else
44
+ output.add '<tr>'.tab(2)
45
+ end
46
+ 1.upto(7) do |day|
47
+ output.add day_cell(week, day)
48
+ end
49
+ output.add '</tr>'.tab(2)
50
+ end
51
+ end
52
+ output
53
+ end
54
+
55
+ def day_cell(week, day)
56
+ date = date_on(week, day)
57
+ output = '<td>'
58
+ output << '<a href="#" class="weekender_date">'
59
+ output << date.strftime(date_format)
60
+ output << '</a>'
61
+ output << content_on(date.to_s)
62
+ output << '</td>'
63
+ output.tab(4)
64
+ end
65
+
66
+ def abbreviate(day_name)
67
+ if name_format == :medium
68
+ day_name[0..2]
69
+ elsif name_format == :short
70
+ day_name[0..0]
71
+ else
72
+ day_name
73
+ end
74
+ end
75
+
76
+ end
@@ -0,0 +1,154 @@
1
+ class Weekender
2
+
3
+ include WeekenderHelpers
4
+
5
+ DAY_NAMES = [ 'Monday',
6
+ 'Tuesday',
7
+ 'Wednesday',
8
+ 'Thursday',
9
+ 'Friday',
10
+ 'Saturday',
11
+ 'Sunday' ]
12
+
13
+ attr_accessor :year,
14
+ :month,
15
+ :day,
16
+ :year_end,
17
+ :month_end,
18
+ :day_end,
19
+ :before,
20
+ :after,
21
+ :events
22
+
23
+ def initialize(options={})
24
+ @year = options[:year] || Date.today.year
25
+ @month = options[:month] || Date.today.month
26
+ @day = options[:day] || Date.today.day
27
+ @year_end = options[:year_end] || year
28
+ @month_end = options[:month_end] || month
29
+ @day_end = options[:day_end] || day
30
+ @before = options[:before] || 0
31
+ @after = options[:after] || 0
32
+ @events = options[:events] || []
33
+ end
34
+
35
+ def weeks
36
+ before + span + after
37
+ end
38
+
39
+ def span
40
+ ((spans_to - spans_from).to_i + 1) / 7
41
+ end
42
+
43
+ def spans_from
44
+ Date.commercial(date.cwyear, date.cweek, 1)
45
+ end
46
+
47
+ def starts_on
48
+ Date.commercial(start_week.cwyear, start_week.cweek, 1)
49
+ end
50
+
51
+ def ends_on
52
+ Date.commercial(end_week.cwyear, end_week.cweek, 7)
53
+ end
54
+
55
+ def spans_to
56
+ Date.commercial(end_date.cwyear, end_date.cweek, 7)
57
+ end
58
+
59
+ def date_on(week, day)
60
+ Date.commercial(week_date(week).cwyear, week_date(week).cweek, day)
61
+ end
62
+
63
+ def add_event(date, options={})
64
+ @events << [date, options]
65
+ end
66
+
67
+ def event_on?(date)
68
+ if events.empty?
69
+ false
70
+ else
71
+ events_dates.include?(date)
72
+ end
73
+ end
74
+
75
+ def events_dates
76
+ events.map { |event| event[0] }
77
+ end
78
+
79
+ def events_on(date)
80
+ if event_on?(date)
81
+ events.select { |event| event[0] == date }
82
+ else
83
+ []
84
+ end
85
+ end
86
+
87
+ def content_on(date)
88
+ content = ''
89
+ events_on(date).each do |event|
90
+ content << event[1][:content]
91
+ end
92
+ content
93
+ end
94
+
95
+ def html_classes_on(date)
96
+ classes = ''
97
+ events_on(date).each do |event|
98
+ classes << ' ' unless classes == ''
99
+ classes << event[1][:html_class]
100
+ end
101
+ classes
102
+ end
103
+
104
+ def previous
105
+ Weekender.new(
106
+ :year => previous_date.year,
107
+ :month => previous_date.month,
108
+ :day => previous_date.day,
109
+ :before => before,
110
+ :after => after
111
+ )
112
+ end
113
+
114
+ def next
115
+ Weekender.new(
116
+ :year => next_date.year,
117
+ :month => next_date.month,
118
+ :day => next_date.day,
119
+ :before => before,
120
+ :after => after
121
+ )
122
+ end
123
+
124
+ # private
125
+
126
+ def date
127
+ Date.new(year, month, day)
128
+ end
129
+
130
+ def end_date
131
+ Date.new(year_end, month_end, day_end)
132
+ end
133
+
134
+ def start_week
135
+ date - (before * 7)
136
+ end
137
+
138
+ def end_week
139
+ end_date + (after * 7)
140
+ end
141
+
142
+ def week_date(week)
143
+ start_week + ((week - 1) * 7)
144
+ end
145
+
146
+ def previous_date
147
+ starts_on - 1 - (after * 7)
148
+ end
149
+
150
+ def next_date
151
+ ends_on + 1 + (before * 7)
152
+ end
153
+
154
+ end
@@ -0,0 +1,38 @@
1
+ <table class="weekender">
2
+ <tr class="weekender_header">
3
+ <th>Monday</th>
4
+ <th>Tuesday</th>
5
+ <th>Wednesday</th>
6
+ <th>Thursday</th>
7
+ <th>Friday</th>
8
+ <th>Saturday</th>
9
+ <th>Sunday</th>
10
+ </tr>
11
+ <tr>
12
+ <td><a href="#" class="weekender_date">2009-04-20</a></td>
13
+ <td><a href="#" class="weekender_date">2009-04-21</a></td>
14
+ <td><a href="#" class="weekender_date">2009-04-22</a></td>
15
+ <td><a href="#" class="weekender_date">2009-04-23</a></td>
16
+ <td><a href="#" class="weekender_date">2009-04-24</a></td>
17
+ <td><a href="#" class="weekender_date">2009-04-25</a></td>
18
+ <td><a href="#" class="weekender_date">2009-04-26</a></td>
19
+ </tr>
20
+ <tr>
21
+ <td><a href="#" class="weekender_date">2009-04-27</a></td>
22
+ <td><a href="#" class="weekender_date">2009-04-28</a></td>
23
+ <td><a href="#" class="weekender_date">2009-04-29</a></td>
24
+ <td><a href="#" class="weekender_date">2009-04-30</a></td>
25
+ <td><a href="#" class="weekender_date">2009-05-01</a><p>This is an event</p></td>
26
+ <td><a href="#" class="weekender_date">2009-05-02</a><p>This is another event</p></td>
27
+ <td><a href="#" class="weekender_date">2009-05-03</a></td>
28
+ </tr>
29
+ <tr>
30
+ <td><a href="#" class="weekender_date">2009-05-04</a></td>
31
+ <td><a href="#" class="weekender_date">2009-05-05</a></td>
32
+ <td><a href="#" class="weekender_date">2009-05-06</a></td>
33
+ <td><a href="#" class="weekender_date">2009-05-07</a></td>
34
+ <td><a href="#" class="weekender_date">2009-05-08</a></td>
35
+ <td><a href="#" class="weekender_date">2009-05-09</a></td>
36
+ <td><a href="#" class="weekender_date">2009-05-10</a></td>
37
+ </tr>
38
+ </table>
@@ -0,0 +1,9 @@
1
+ require 'spec'
2
+
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ require 'weekender'
6
+
7
+ Spec::Runner.configure do |config|
8
+
9
+ end
@@ -0,0 +1,281 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe Weekender do
4
+
5
+ describe "defaults" do
6
+
7
+ before(:each) do
8
+ @weekender = Weekender.new
9
+ end
10
+
11
+ it "should be this year" do
12
+ @weekender.year.should eql(Date.today.year)
13
+ end
14
+
15
+ it "should be this month" do
16
+ @weekender.month.should eql(Date.today.month)
17
+ end
18
+
19
+ it "should be today" do
20
+ @weekender.day.should eql(Date.today.day)
21
+ end
22
+
23
+ it "should have 0 weeks before" do
24
+ @weekender.before.should eql(0)
25
+ end
26
+
27
+ it "should have 0 weeks after" do
28
+ @weekender.after.should eql(0)
29
+ end
30
+
31
+ it "should have 1 week" do
32
+ @weekender.weeks.should eql(1)
33
+ end
34
+
35
+ it "should start on a Monday" do
36
+ @weekender.starts_on.day_name.should eql("Monday")
37
+ end
38
+
39
+ it "should end on a Sunday" do
40
+ @weekender.ends_on.day_name.should eql("Sunday")
41
+ end
42
+
43
+ it "should have a date by week number and day number" do
44
+ @weekender.date_on(1, 1).should eql(@weekender.starts_on)
45
+ end
46
+
47
+ it "should have a date on end week and end day" do
48
+ @weekender.date_on(1, 7).should eql(@weekender.ends_on)
49
+ end
50
+
51
+ it "should start and end on the same date" do
52
+ @weekender.date.strftime('%Y-%m-%d').
53
+ should eql(@weekender.end_date.strftime('%Y-%m-%d'))
54
+ end
55
+
56
+ it "should start and end on the same week" do
57
+ @weekender.start_week.should eql(@weekender.end_week)
58
+ end
59
+
60
+ end
61
+
62
+ describe "with start date" do
63
+
64
+ before(:each) do
65
+ @weekender = Weekender.new( :year => 1999,
66
+ :month => 12,
67
+ :day => 31,
68
+ :before => 3,
69
+ :after => 4)
70
+ end
71
+
72
+ it "should be in 1999" do
73
+ @weekender.year.should eql(1999)
74
+ end
75
+
76
+ it "should start on a Monday" do
77
+ @weekender.starts_on.day_name.should eql("Monday")
78
+ end
79
+
80
+ it "should start in December" do
81
+ @weekender.starts_on.month_name.should eql('December')
82
+ end
83
+
84
+ it "should start on the 6th" do
85
+ @weekender.starts_on.day_of_month.should eql(6)
86
+ end
87
+
88
+ it "should start in 1999" do
89
+ @weekender.starts_on.year.should eql(1999)
90
+ end
91
+
92
+ it "should start on Monday, December 6th, 1999" do
93
+ @weekender.starts_on.should eql(Date.new(1999, 12, 6))
94
+ end
95
+
96
+ it "should end on a Sunday" do
97
+ @weekender.ends_on.day_name.should eql("Sunday")
98
+ end
99
+
100
+ it "should end in January" do
101
+ @weekender.ends_on.month_name.should eql("January")
102
+ end
103
+
104
+ it "should end on the 29th" do
105
+ @weekender.ends_on.day_of_month.should eql(30)
106
+ end
107
+
108
+ it "should end in 2000" do
109
+ @weekender.ends_on.year.should eql(2000)
110
+ end
111
+
112
+ end
113
+
114
+ describe "with start and end date" do
115
+
116
+ before(:each) do
117
+ @weekender = Weekender.new( :year => 2009,
118
+ :month => 5,
119
+ :day => 1,
120
+ :year_end => 2009,
121
+ :month_end => 5,
122
+ :day_end => 15,
123
+ :before => 0,
124
+ :after => 0)
125
+ end
126
+
127
+ it "should start on Monday, April 27th, 2009" do
128
+ @weekender.starts_on.should eql(Date.new(2009, 4, 27))
129
+ end
130
+
131
+ it "should end on a Sunday, May 17th, 2009" do
132
+ @weekender.ends_on.should eql(Date.new(2009, 5, 17))
133
+ end
134
+
135
+ it "should have 3 weeks" do
136
+ @weekender.weeks.should eql(3)
137
+ end
138
+
139
+ end
140
+
141
+ describe 'events' do
142
+
143
+ it 'should be an array of events' do
144
+ Weekender.new.events.should be_a_kind_of(Array)
145
+ end
146
+
147
+ it 'should be initialized as empty by default' do
148
+ Weekender.new.events.should be_empty
149
+ end
150
+
151
+ describe 'adding' do
152
+
153
+ before(:each) do
154
+ @weekender = Weekender.new
155
+ end
156
+
157
+ it "should not be an eventful day by default" do
158
+ @weekender.event_on?(Date.today).should be_false
159
+ end
160
+
161
+ it 'should add events to the specified day' do
162
+ @weekender.add_event(Date.today - 1)
163
+ @weekender.event_on?(Date.today - 1).should be_true
164
+ end
165
+
166
+ end
167
+
168
+ describe 'adding with content' do
169
+
170
+ before(:each) do
171
+ @weekender = Weekender.new
172
+
173
+ @weekender.add_event(Date.today - 1,
174
+ :html_class => 'first',
175
+ :content => '<p>special content 1</p>')
176
+
177
+ @weekender.add_event(Date.today - 1,
178
+ :html_class => 'second',
179
+ :content => '<p>special content 2</p>')
180
+
181
+ @weekender.add_event(Date.today - 2,
182
+ :html_class => 'third',
183
+ :content => 'special content 3')
184
+ end
185
+
186
+ it "should have two events yesterday" do
187
+ @weekender.events_on(Date.today - 1).length.should eql(2)
188
+ end
189
+
190
+ it "should store the content" do
191
+ @weekender.content_on(Date.today - 1).
192
+ should eql('<p>special content 1</p><p>special content 2</p>')
193
+ end
194
+
195
+ it "should store the HTML class" do
196
+ @weekender.html_classes_on(Date.today - 1).
197
+ should eql('first second')
198
+ end
199
+
200
+ end
201
+
202
+ end
203
+
204
+ describe "day names" do
205
+
206
+ it "should be Monday through Sunday" do
207
+ Weekender::DAY_NAMES.should eql(
208
+ [ 'Monday',
209
+ 'Tuesday',
210
+ 'Wednesday',
211
+ 'Thursday',
212
+ 'Friday',
213
+ 'Saturday',
214
+ 'Sunday' ]
215
+ )
216
+ end
217
+
218
+ end
219
+
220
+ describe "previous and next" do
221
+
222
+ describe "defaults" do
223
+
224
+ it "should have previous" do
225
+ Weekender.new.previous.should be
226
+ end
227
+
228
+ it "should have next" do
229
+ Weekender.new.next.should be
230
+ end
231
+
232
+ end
233
+
234
+ describe "with weekender" do
235
+
236
+ before(:each) do
237
+ @weekender = Weekender.new(:year => 2009,
238
+ :month => 5,
239
+ :day => 1,
240
+ :before => 1,
241
+ :after => 1)
242
+ end
243
+
244
+ it "should return the previous weekender" do
245
+ @weekender.previous.month.should eql(4)
246
+ end
247
+
248
+ it "should return the next weekender" do
249
+ @weekender.next.month.should eql(5)
250
+ end
251
+
252
+ end
253
+
254
+ end
255
+
256
+ describe 'generate HTML' do
257
+
258
+ describe 'for default' do
259
+
260
+ before(:each) do
261
+ @weekender = Weekender.new(:year => 2009,
262
+ :month => 5,
263
+ :day => 1,
264
+ :before => 1,
265
+ :after => 1)
266
+ @weekender.add_event("2009-05-01",
267
+ :content => "<p>This is an event</p>")
268
+ @weekender.add_event("2009-05-02",
269
+ :content => "<p>This is another event</p>")
270
+ @default_table = File.read('spec/fixtures/weekender.html').chomp
271
+ end
272
+
273
+ it 'should display an HTML calendar' do
274
+ @weekender.display.should == @default_table
275
+ end
276
+
277
+ end
278
+
279
+ end
280
+
281
+ end
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: olauzon-weekender
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Olivier Lauzon
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-08-19 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: olauzon@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.rdoc
24
+ files:
25
+ - README.rdoc
26
+ - Rakefile
27
+ - lib/core_ext/date.rb
28
+ - lib/core_ext/string.rb
29
+ - lib/weekender.rb
30
+ - lib/weekender/view_helpers.rb
31
+ - lib/weekender/weekender.rb
32
+ - spec/fixtures/weekender.html
33
+ - spec/spec_helper.rb
34
+ - spec/weekender_spec.rb
35
+ has_rdoc: false
36
+ homepage: http://github.com/olauzon/weekender
37
+ licenses:
38
+ post_install_message:
39
+ rdoc_options:
40
+ - --charset=UTF-8
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ version:
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ requirements: []
56
+
57
+ rubyforge_project:
58
+ rubygems_version: 1.3.5
59
+ signing_key:
60
+ specification_version: 3
61
+ summary: A simple Ruby library for creating calendars based on weeks rather than months.
62
+ test_files:
63
+ - spec/spec_helper.rb
64
+ - spec/weekender_spec.rb