shifty_week 0.1.0 → 0.1.1

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 CHANGED
@@ -2,6 +2,22 @@
2
2
 
3
3
  Description in ShiftyWeek[link:classes/ShiftyWeek.html]
4
4
 
5
+ == Quick Intro
6
+
7
+ n = DateTime.now
8
+ n.week_day_start = 'Wednesday'
9
+ n.week_days # => [2009-11-04T00:16:27-08:00, 2009-11-05T00:16:27-08:00, 2009-11-06T00:16:27-08:00, 2009-11-07T00:16:27-08:00, 2009-11-08T00:16:27-08:00, 2009-11-09T00:16:27-08:00, 2009-11-10T00:16:27-08:00]
10
+
11
+
12
+ == Installation
13
+
14
+ 1. Require the gem
15
+ 2. Require the libs:
16
+
17
+ shifty_week
18
+ shifty_week/time
19
+ shifty_week/date
20
+
5
21
  == Note on Patches/Pull Requests
6
22
 
7
23
  * Fork the project.
data/Rakefile CHANGED
@@ -6,15 +6,22 @@ begin
6
6
  require 'jeweler'
7
7
  Jeweler::Tasks.new do |gem|
8
8
  gem.name = "shifty_week"
9
- gem.summary = ShiftyWeek::Constants::SUMMARY
10
- gem.description = ShiftyWeek::Constants::DESCRIPTION
9
+ gem.summary = %q{Calculate dates based on a configurable first day of the week.}
10
+ gem.description = %q{Calculate dates based on a configurable first day of the week. If you want
11
+ the first day of the week to be Wednesday and the current calendar Year-Month are 2009-10,
12
+ DateTime#week_days will return an array of DateTime objects which when formatted with "%Y-%m-%d %a" look like
13
+ ["2009-10-14 Wed", "2009-10-15 Thu", "2009-10-16 Fri", "2009-10-17 Sat", "2009-10-18 Sun", "2009-10-19 Mon", "2009-10-20 Tue"] }
11
14
  gem.email = "frogstarr78@gmail.com"
12
15
  gem.homepage = "http://github.com/frogstarr78/shifty_week"
13
16
  gem.authors = ["Scott Noel-Hemming"]
14
17
  gem.rdoc_options << '--main' << 'ShiftyWeek' << '--line-numbers'
18
+ gem.rubyforge_project = "shifty-week"
15
19
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
20
  end
17
21
  Jeweler::GemcutterTasks.new
22
+ Jeweler::RubyforgeTasks.new do |rubyforge|
23
+ rubyforge.doc_task = "rdoc"
24
+ end
18
25
  rescue LoadError
19
26
  puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
20
27
  end
@@ -42,7 +49,7 @@ end
42
49
  task :test => :check_dependencies
43
50
 
44
51
  begin
45
- require 'reek/rake_task'
52
+ require 'reek/adapters/rake_task'
46
53
  Reek::RakeTask.new do |t|
47
54
  t.fail_on_error = true
48
55
  t.verbose = false
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
data/init.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  require 'time'
4
4
  require 'date'
5
5
 
6
- root_dir = File.dirname(__FILE__)
6
+ root_dir = File.expand_path(File.dirname(__FILE__))
7
7
  require File.join(root_dir, 'lib', 'shifty_week')
8
8
  require File.join(root_dir, 'lib', 'shifty_week', 'time')
9
9
  require File.join(root_dir, 'lib', 'shifty_week', 'date')
data/lib/shifty_week.rb CHANGED
@@ -30,6 +30,7 @@
30
30
  # 28 29 30 31
31
31
 
32
32
  module ShiftyWeek
33
+ WORKER_FORMAT = "%Y-%m-%d %H:%M:%S"
33
34
  class Constants # :nodoc:
34
35
  SUMMARY = %q{Calculate dates based on a configurable first day of the week.}
35
36
  DESCRIPTION = %q{Calculate dates based on a configurable first day of the week. If you want
@@ -58,9 +59,9 @@ module ShiftyWeek
58
59
  Time.send("month_days", self.year, self.month)
59
60
  end
60
61
 
61
- # alculate the number of weeks in a year taking into account "shifted" weeks
62
+ # Calculate the number of weeks in a year taking into account "shifted" weeks
62
63
  def weeks_in_year
63
- return (self-(self.yday-1)).wday == 6 ? 54 : 53
64
+ return (self-(self.yday-1)).wday == 6 && self.leap? ? 54 : 53
64
65
  end
65
66
 
66
67
  # Get the offset of this object's date, to the first day of the week.
@@ -84,8 +85,8 @@ module ShiftyWeek
84
85
  working_date.week_day_start = self.week_day_start
85
86
  working_date = (working_date-working_date.send("wday_offset"))
86
87
  week_num = 0
87
- working_date.step(self) { |d|
88
- if d.wday == _week_day_numbers.first
88
+ working_date.step(self) { |a_day|
89
+ if a_day.wday == _week_day_numbers.first
89
90
  week_num += 1
90
91
  end
91
92
  }
@@ -108,12 +109,12 @@ module ShiftyWeek
108
109
  def week_days(options={}, &block)
109
110
  start_date = self
110
111
  result = []
111
- (start_date-wday_offset).step 7 do |d|
112
- d.week_day_start = self.week_day_start
112
+ (start_date-wday_offset).step 7 do |a_day|
113
+ a_day.week_day_start = self.week_day_start
113
114
  if block_given?
114
- yield d
115
+ yield a_day
115
116
  else
116
- result.push(d)
117
+ result.push(a_day)
117
118
  end
118
119
  end
119
120
  result
@@ -135,7 +136,7 @@ module ShiftyWeek
135
136
  # Hopefully the name explains what this method does
136
137
  def step_to_month_end step = 1
137
138
  days_in_month = self.days_in_month
138
- days_in_month += self.wday_offset if self.days_in_month%(7*4) >= 0
139
+ days_in_month += self.wday_offset if days_in_month%(7*4) >= 0
139
140
  self.step(days_in_month, step) do |date|
140
141
  date.week_day_start = self.week_day_start
141
142
  yield date
@@ -2,13 +2,6 @@ class Date
2
2
  include ShiftyWeek
3
3
  attr_writer :week_day_start
4
4
 
5
- alias_method :'weekless_>>', :'>>'
6
- def >> int
7
- new_day = send(:'weekless_>>', int)
8
- new_day.week_day_start = self.week_day_start
9
- new_day
10
- end
11
-
12
5
  alias_method :step_to_date, :step #:nodoc:
13
6
  # Seemed to make more sense to me to have step accept an integer number
14
7
  # see step_to_date for previous behavior. Although, you can still pass
@@ -19,9 +12,9 @@ class Date
19
12
  limit = (self + limit)-1
20
13
  method = 'step'
21
14
  end
22
- send(method, limit, step) {|d|
23
- d.week_day_start = self.week_day_start
24
- yield d
15
+ send(method, limit, step) {|a_day|
16
+ a_day.week_day_start = self.week_day_start
17
+ yield a_day
25
18
  }
26
19
  end
27
20
  end
data/test/date_test.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'test/test_helper'
2
2
 
3
3
  class DateTest < Test::Unit::TestCase
4
+ FORMAT =
4
5
  def test_step
5
6
  date = Date.strptime Time.now.strftime("%Y-%m-%d")
6
7
  future_date = date+6
@@ -1,63 +1,7 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class ShiftyWeekTest < Test::Unit::TestCase
4
- def test_week_starting_sunday
5
- month_starts = [
6
- %w(Su Mo Tu We Th Fr Sa
7
- \ \ 1 2 3 4 5
8
- 6 7 8 9 10 11 12
9
- 13 14 15 16 17 18 19
10
- 20 21 22 23 24 25 26
11
- 27 28 29 30 31),
12
-
13
- %w(Mo Tu We Th Fr Sa Su
14
- \ 1 2 3 4 5 6
15
- 7 8 9 10 11 12 13
16
- 14 15 16 17 18 19 20
17
- 21 22 23 24 25 26 27
18
- 28 29 30 31),
19
-
20
- %w(Tu We Th Fr Sa Su Mo
21
- 1 2 3 4 5 6 7
22
- 8 9 10 11 12 13 14
23
- 15 16 17 18 19 20 21
24
- 22 23 24 25 26 27 28
25
- 29 30 31),
26
-
27
- %w(We Th Fr Sa Su Mo Tu
28
- \ \ \ \ \ \ 1
29
- 2 3 4 5 6 7 8
30
- 9 10 11 12 13 14 15
31
- 16 17 18 19 20 21 22
32
- 23 24 25 26 27 28 29
33
- 30 31),
34
-
35
- %w(Th Fr Sa Su Mo Tu We
36
- \ \ \ \ \ 1 2
37
- 3 4 5 6 7 8 9
38
- 10 11 12 13 14 15 16
39
- 17 18 19 20 21 22 23
40
- 24 25 26 27 28 29 30
41
- 31),
42
-
43
- %w(Fr Sa Su Mo Tu We Th
44
- \ \ \ \ 1 2 3
45
- 4 5 6 7 8 9 10
46
- 11 12 13 14 15 16 17
47
- 18 19 20 21 22 23 24
48
- 25 26 27 28 29 30 31),
49
-
50
- %w(Sa Su Mo Tu We Th Fr
51
- \ \ \ 1 2 3 4
52
- 5 6 7 8 9 10 11
53
- 12 13 14 15 16 17 18
54
- 19 20 21 22 23 24 25
55
- 26 27 28 29 30 31)
56
- ]
57
- end
58
-
59
- def test_week
60
-
4
+ def test_week_control
61
5
  date = DateTime.new(2008, 1, 6)
62
6
  assert_equal(0, date.send("wday_offset"))
63
7
  assert_equal(2, date.week, "week #{date.week} on date #{date.to_s} != 2")
@@ -65,7 +9,9 @@ class ShiftyWeekTest < Test::Unit::TestCase
65
9
  date = date-1
66
10
  assert_equal(6, date.send("wday_offset"))
67
11
  assert_equal(1, date.week, "week #{date.week} on date #{date.to_s} != 2")
12
+ end
68
13
 
14
+ def test_week_expected_for_a_few_years
69
15
  years_days = {
70
16
  2000 => 2,
71
17
  2001 => 7,
@@ -81,7 +27,9 @@ class ShiftyWeekTest < Test::Unit::TestCase
81
27
  date = DateTime.new(year, 1, day)
82
28
  assert_equal(2, date.week, "week #{date.week} on date #{date.to_s} != 1")
83
29
  }
30
+ end
84
31
 
32
+ def test_week_changes_calculate_correctly
85
33
  date = DateTime.new(2008, 1, 3)
86
34
  date.week_day_start = 'Wed'
87
35
  assert_equal(1, date.send("wday_offset"))
@@ -98,7 +46,9 @@ class ShiftyWeekTest < Test::Unit::TestCase
98
46
  assert_equal(6, date.send("wday_offset"))
99
47
  assert_equal("2008-01-01", date.strftime("%Y-%m-%d"))
100
48
  assert_equal(1, date.week, "week #{date.week} on date #{date.to_s} != 1 with wday_start #{date.week_day_start}")
49
+ end
101
50
 
51
+ def test_week
102
52
  date = DateTime.new(2007)
103
53
  date.week_day_start = 'Sunday'
104
54
  assert_equal(1, date.week, "week #{date.week} on date #{date.to_s} != 1")
@@ -108,74 +58,21 @@ class ShiftyWeekTest < Test::Unit::TestCase
108
58
  date = (date+7)
109
59
  # date = DateTime.new(2007, 9, 1)
110
60
  assert_equal(35, date.week, "week #{date.week} on date #{date.to_s} != 35")
61
+ end
111
62
 
112
- years_days = {
113
- 1998 => 53,
114
- 1999 => 53,
115
- 2000 => 54,
116
- 2001 => 53,
117
- 2002 => 53,
118
- 2003 => 53,
119
- 2004 => 53,
120
- 2005 => 53,
121
- 2006 => 53,
122
- 2007 => 53,
123
- 2008 => 53,
124
- 2009 => 53,
125
- 2010 => 53,
126
- 2011 => 53,
127
- 2012 => 53,
128
- 2013 => 53,
129
- 2014 => 53,
130
- 2015 => 53,
131
- 2016 => 53,
132
- }.each { |year, weeks|
63
+ def test_week_gets_correct_last_week_number
64
+ years_days_to_test.each { |year, weeks|
133
65
  date = DateTime.new(year, 12, 31)
134
- assert_equal(weeks, date.week, "week #{date.week} in year #{year} != 1")
66
+ assert_equal(date.weeks_in_year, date.week, "week #{date.week} in year #{year} != 1")
135
67
  }
68
+ end
136
69
 
137
- for year in (2000..2006)
70
+ def test_expected_week_one_regardless_of_year
71
+ (2000..2006).each do |year|
138
72
  day = 1
139
- date = DateTime.new(year, 1, day)
140
- assert_equal(1, date.week, "week #{date.week} on date #{date.to_s} != 1")
141
- # end
73
+ date = DateTime.new(year, 1, day)
74
+ assert_equal(1, date.week, "week #{date.week} on date #{date.to_s} != 1")
142
75
  end
143
-
144
- # date = DateTime.new(2003, 1, 1)
145
- # week = date.week(4)
146
- # assert_equal(week, 1, "week #{week} on date #{date.to_s} != 1")
147
- # date = DateTime.new(2003, 1, 2)
148
- # week = date.week(4)
149
- # assert_equal(week, 2, "week #{week} on date #{date.to_s} != 2")
150
- # week = date.week(10)
151
- # assert_equal(week, 2, "week #{week} on date #{date.to_s} != 2")
152
- # date = DateTime.new(2003, 1, 3)
153
- # week = date.week(4)
154
- # assert_equal(week, 2, "week #{week} on date #{date.to_s} != 2")
155
- end
156
-
157
- def test_weeks_in_year
158
- years_days = {
159
- 2000 => 54,
160
- 2001 => 53,
161
- 2002 => 53,
162
- 2003 => 53,
163
- 2004 => 53,
164
- 2005 => 54,
165
- 2006 => 53,
166
- 2007 => 53,
167
- 2008 => 53,
168
- 2009 => 53,
169
- 2010 => 53,
170
- 2011 => 54,
171
- 2012 => 53,
172
- 2013 => 53,
173
- 2014 => 53,
174
- 2015 => 53,
175
- }.each { |year, weeks|
176
- date = DateTime.new(year, 12, 31)
177
- assert_equal weeks, date.weeks_in_year, "week #{date.week} on date #{date.to_s} != 1"
178
- }
179
76
  end
180
77
 
181
78
  def test_wday_offset
@@ -187,7 +84,7 @@ class ShiftyWeekTest < Test::Unit::TestCase
187
84
  }
188
85
  end
189
86
 
190
- def test_week_days
87
+ def test_week_days_control
191
88
  date = DateTime.new(2007)
192
89
  assert_equal([
193
90
  DateTime.new(2006, 12, 31).to_s,
@@ -200,6 +97,9 @@ class ShiftyWeekTest < Test::Unit::TestCase
200
97
  ],
201
98
  date.week_days.collect {|date| date.to_s}
202
99
  )
100
+ end
101
+
102
+ def test_week_days_span_month_and_year_boundary_with_configured_week_day_start
203
103
  date = DateTime.new(2007)
204
104
  date.week_day_start = 'Saturday'
205
105
  assert_equal([
@@ -212,7 +112,9 @@ class ShiftyWeekTest < Test::Unit::TestCase
212
112
  DateTime.new(2007, 1, 5).to_s,
213
113
  ], date.week_days.collect {|date| date.to_s}
214
114
  )
115
+ end
215
116
 
117
+ def test_week_days_dont_span_month_and_year_boundary_and_leap_year_because_of_configured_week_day_start
216
118
  date = DateTime.new(2008)
217
119
  date.week_day_start = 'Tue'
218
120
  assert_equal([
@@ -225,6 +127,9 @@ class ShiftyWeekTest < Test::Unit::TestCase
225
127
  DateTime.new(2008, 1, 7).to_s,
226
128
  ], date.week_days.collect {|date| date.to_s}
227
129
  )
130
+ end
131
+
132
+ def test_week_days_span_month_and_year_boundary_and_leap_year_because_of_configured_week_day_start
228
133
  date = DateTime.new(2008)
229
134
  date.week_day_start = 'Wed'
230
135
  assert_equal([
@@ -237,9 +142,10 @@ class ShiftyWeekTest < Test::Unit::TestCase
237
142
  DateTime.new(2008, 1, 1).to_s,
238
143
  ], date.week_days.collect {|date| date.to_s}
239
144
  )
145
+ end
240
146
 
241
-
242
- date = DateTime.new(2003)
147
+ def test_week_days_span_month_and_year_boundary_non_leap_year_with_non_configured_week_day_start
148
+ date = DateTime.new(2003)
243
149
  assert_equal([
244
150
  DateTime.new(2002, 12, 29).to_s,
245
151
  DateTime.new(2002, 12, 30).to_s,
@@ -251,57 +157,59 @@ class ShiftyWeekTest < Test::Unit::TestCase
251
157
  ],
252
158
  date.week_days.collect {|date| date.to_s}
253
159
  )
160
+ end
161
+
162
+ def unshifted_week_spanning_month_and_year
163
+ [
164
+ DateTime.new(2007, 12, 30).to_s,
165
+ DateTime.new(2007, 12, 31).to_s,
166
+ DateTime.new(2008, 1, 1).to_s,
167
+ DateTime.new(2008, 1, 2).to_s,
168
+ DateTime.new(2008, 1, 3).to_s,
169
+ DateTime.new(2008, 1, 4).to_s,
170
+ DateTime.new(2008, 1, 5).to_s,
171
+ ]
172
+ end
173
+
174
+ def shifted_week_after_spanning_month_and_year_unshifted
175
+ [
176
+ DateTime.new(2008, 1, 1).to_s,
177
+ DateTime.new(2008, 1, 2).to_s,
178
+ DateTime.new(2008, 1, 3).to_s,
179
+ DateTime.new(2008, 1, 4).to_s,
180
+ DateTime.new(2008, 1, 5).to_s,
181
+ DateTime.new(2008, 1, 6).to_s,
182
+ DateTime.new(2008, 1, 7).to_s,
183
+ ]
184
+ end
185
+
186
+ def re_shifted_week_after_spanning_month_and_year_unshifted
187
+ [
188
+ DateTime.new(2008, 1, 2).to_s,
189
+ DateTime.new(2008, 1, 3).to_s,
190
+ DateTime.new(2008, 1, 4).to_s,
191
+ DateTime.new(2008, 1, 5).to_s,
192
+ DateTime.new(2008, 1, 6).to_s,
193
+ DateTime.new(2008, 1, 7).to_s,
194
+ DateTime.new(2008, 1, 8).to_s,
195
+ ]
196
+ end
197
+ private :unshifted_week_spanning_month_and_year, :shifted_week_after_spanning_month_and_year_unshifted, :re_shifted_week_after_spanning_month_and_year_unshifted
198
+
199
+ def test_week_days_span_month_and_year_boundary_non_leap_year_changing_the_week_day_start
254
200
  date = DateTime.new(2007, 12, 31)
255
- assert_equal([
256
- DateTime.new(2007, 12, 30).to_s,
257
- DateTime.new(2007, 12, 31).to_s,
258
- DateTime.new(2008, 1, 1).to_s,
259
- DateTime.new(2008, 1, 2).to_s,
260
- DateTime.new(2008, 1, 3).to_s,
261
- DateTime.new(2008, 1, 4).to_s,
262
- DateTime.new(2008, 1, 5).to_s,
263
- ],
264
- date.week_days.collect {|date| date.to_s}
265
- )
201
+ assert_equal(unshifted_week_spanning_month_and_year, date.week_days.collect {|date| date.to_s})
266
202
  assert_equal('2008-01-05', date.strftime("%Y-%m-%d"))
267
- date.week_day_start = 2
268
- assert_equal([
269
- DateTime.new(2008, 1, 1).to_s,
270
- DateTime.new(2008, 1, 2).to_s,
271
- DateTime.new(2008, 1, 3).to_s,
272
- DateTime.new(2008, 1, 4).to_s,
273
- DateTime.new(2008, 1, 5).to_s,
274
- DateTime.new(2008, 1, 6).to_s,
275
- DateTime.new(2008, 1, 7).to_s,
276
- ],
277
- date.week_days.collect {|date| date.to_s }
278
- )
279
203
 
204
+ date.week_day_start = 2
205
+ assert_equal(shifted_week_after_spanning_month_and_year_unshifted, date.week_days.collect {|date| date.to_s })
280
206
  assert_equal('2008-01-07', date.strftime("%Y-%m-%d"))
207
+
281
208
  date.week_day_start = 'We'
282
- assert_equal([
283
- DateTime.new(2008, 1, 2).to_s,
284
- DateTime.new(2008, 1, 3).to_s,
285
- DateTime.new(2008, 1, 4).to_s,
286
- DateTime.new(2008, 1, 5).to_s,
287
- DateTime.new(2008, 1, 6).to_s,
288
- DateTime.new(2008, 1, 7).to_s,
289
- DateTime.new(2008, 1, 8).to_s,
290
- ],
291
- date.week_days.collect {|date| date.to_s }
292
- )
209
+ assert_equal(re_shifted_week_after_spanning_month_and_year_unshifted, date.week_days.collect {|date| date.to_s })
293
210
  end
294
211
 
295
212
  def test_step_to_month_end
296
- # expected_display = {
297
- # %w(January 2009) =>
298
- # %w(Su Mo Tu We Th Fr Sa
299
- # 28 29 30 31 1 2 3
300
- # 4 5 6 7 8 9 10
301
- # 11 12 13 14 15 16 17
302
- # 18 19 20 21 22 23 24
303
- # 25 26 27 28 29 30 31)
304
- # }
305
213
  expected_display = {
306
214
  %w(January 2009) =>
307
215
  %w(
@@ -354,4 +262,28 @@ class ShiftyWeekTest < Test::Unit::TestCase
354
262
  assert_equal(DateTime.new(2007, 11).last_week_day, 5);
355
263
  assert_equal(DateTime.new(2007, 12).last_week_day, 1);
356
264
  end
265
+
266
+ private
267
+
268
+ def years_days_to_test
269
+ { 1998 => 53,
270
+ 1999 => 53,
271
+ 2000 => 54,
272
+ 2001 => 53,
273
+ 2002 => 53,
274
+ 2003 => 53,
275
+ 2004 => 53,
276
+ 2005 => 53,
277
+ 2006 => 53,
278
+ 2007 => 53,
279
+ 2008 => 53,
280
+ 2009 => 53,
281
+ 2010 => 53,
282
+ 2011 => 53,
283
+ 2012 => 53,
284
+ 2013 => 53,
285
+ 2014 => 53,
286
+ 2015 => 53,
287
+ 2016 => 53 }
288
+ end
357
289
  end
data/test/test_helper.rb CHANGED
@@ -4,4 +4,5 @@ require 'test/unit'
4
4
  require 'shifty_week'
5
5
 
6
6
  class Test::Unit::TestCase
7
+ DATE_AND_TIME_FORMAT = "%a %Y-%m-%d %X %p"
7
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shifty_week
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Noel-Hemming
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-19 00:00:00 -07:00
12
+ date: 2009-11-08 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -68,7 +68,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
68
68
  version:
69
69
  requirements: []
70
70
 
71
- rubyforge_project:
71
+ rubyforge_project: shifty-week
72
72
  rubygems_version: 1.3.5
73
73
  signing_key:
74
74
  specification_version: 3