weekday 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +6 -0
- data/README.md +5 -0
- data/README.txt +89 -0
- data/lib/weekday.rb +76 -2
- data/test/test_wd.rb +46 -8
- data/version.txt +1 -1
- metadata +9 -7
data/History.txt
CHANGED
data/README.md
CHANGED
@@ -3,6 +3,11 @@ weekday
|
|
3
3
|
|
4
4
|
This gem calculates date like 'first tuesday in december 2010' or 'third friday in may 2011' or 'last Saturday in december 2010'
|
5
5
|
|
6
|
+
Support this project
|
7
|
+
--------------------
|
8
|
+
|
9
|
+
If you find this gem useful and you want to support this work, send Bitcoins to the address <b><code>1ASyu5EuTkUEmiNz3y2ikSDAjdySpDJSMb</code></b>.
|
10
|
+
|
6
11
|
Features
|
7
12
|
--------
|
8
13
|
|
data/README.txt
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
= weekday
|
2
|
+
|
3
|
+
This gem calculates date like 'first tuesday in december 2010' or 'third friday in may 2011' or 'last Saturday in december 2010'
|
4
|
+
|
5
|
+
== Support this project
|
6
|
+
|
7
|
+
If you find this gem useful and you want to support this work, send Bitcoins to the address <b><code>1ASyu5EuTkUEmiNz3y2ikSDAjdySpDJSMb</code></b>.
|
8
|
+
|
9
|
+
== Features
|
10
|
+
|
11
|
+
* All method names are a combination of 'first', 'second', 'third', 'fourth', 'fifth' and 'monday', 'tuesday', ...
|
12
|
+
* Also 'last' + 'monday', 'tuesday', ... is possible
|
13
|
+
* If there is for example no fifth saturday in a specific month then nil is returned
|
14
|
+
* Calculations like next (previous) third friday
|
15
|
+
* Calculations like all first mondays in a complete year
|
16
|
+
|
17
|
+
== Examples
|
18
|
+
|
19
|
+
require 'rubygems'
|
20
|
+
require 'weekday'
|
21
|
+
require 'date'
|
22
|
+
#
|
23
|
+
# calculate every first thursday in a year
|
24
|
+
1.upto 12 do |month|
|
25
|
+
day = Weekday.first_thursday(2010, month)
|
26
|
+
puts day
|
27
|
+
end
|
28
|
+
#
|
29
|
+
# calculate last monday in September 2011
|
30
|
+
puts Weekday.last_monday(2011,9)
|
31
|
+
#
|
32
|
+
# calculate fifth monday in September 2011
|
33
|
+
# this will return a nil value because there is no fifth monday in this month
|
34
|
+
puts Weekday.fifth_monday(2011,9)
|
35
|
+
#
|
36
|
+
# calculate all third wednesdays in 2011
|
37
|
+
# this returns an array of Date objects
|
38
|
+
days = Weekday.third_wednesdays(2011)
|
39
|
+
#
|
40
|
+
# calculates the next second tuesdays from today
|
41
|
+
puts Weekday.next_second_tuesday
|
42
|
+
#
|
43
|
+
# if next_... is called with an argument of type Date this date is used for
|
44
|
+
# next-calculation
|
45
|
+
puts Weekday.next_second_tuesday(Date.new(2012,1,1))
|
46
|
+
#
|
47
|
+
# there is also a calculation of the last previous date
|
48
|
+
puts Weekday.previous_second_tuesday
|
49
|
+
#
|
50
|
+
# next- and previous-calculations will automatically skip months if there
|
51
|
+
# is no such specified date in this month. This example results in the date
|
52
|
+
# 2011-06-30 because this was the last fifth thursday in a month when called
|
53
|
+
# with at 2011-09-20.
|
54
|
+
puts Weekday.previous_fifth_thursday(Date.new(2011,9,20))
|
55
|
+
|
56
|
+
For a complete listing of all call syntax see the documentation of the Weekday class.
|
57
|
+
|
58
|
+
== Install
|
59
|
+
|
60
|
+
gem install weekday
|
61
|
+
|
62
|
+
== Author
|
63
|
+
|
64
|
+
Original author: Thomas Preymesser
|
65
|
+
|
66
|
+
== License
|
67
|
+
|
68
|
+
(The MIT License)
|
69
|
+
|
70
|
+
Copyright (c) 2010-2011 Thomas Preymesser
|
71
|
+
|
72
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
73
|
+
a copy of this software and associated documentation files (the
|
74
|
+
'Software'), to deal in the Software without restriction, including
|
75
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
76
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
77
|
+
permit persons to whom the Software is furnished to do so, subject to
|
78
|
+
the following conditions:
|
79
|
+
|
80
|
+
The above copyright notice and this permission notice shall be
|
81
|
+
included in all copies or substantial portions of the Software.
|
82
|
+
|
83
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
84
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
85
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
86
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
87
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
88
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
89
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/lib/weekday.rb
CHANGED
@@ -25,6 +25,8 @@ If a certain date like 'fifth_saturday' is not possible, nil is returned.
|
|
25
25
|
PREV = %w(nil nil) + COUNTWORDS
|
26
26
|
ILLEGAL_ARGUMENTS = "illegal month or year number"
|
27
27
|
DAYS_PER_WEEK = 7
|
28
|
+
NEXT = 'next'
|
29
|
+
PREVIOUS = 'previous'
|
28
30
|
|
29
31
|
# Weekday.method_missing implements the methods like
|
30
32
|
# * Weekday.second_tuesday(2010,12) or
|
@@ -35,9 +37,61 @@ If a certain date like 'fifth_saturday' is not possible, nil is returned.
|
|
35
37
|
# * Weekday.last_monday(2011) returns the very last monday in this year
|
36
38
|
# * Weekday.mondays(2011) returns all mondays in this year as an array of Date objects
|
37
39
|
# * Weekday.first_thursdays(2011) returns all first thursdays in this year as an array of Date objects
|
40
|
+
# * Weekday.next_first_tuesday returns the next specified date (today if this date matches today). This method can take a argument of type Date - if no argument is given, this argument defaults to the current date.
|
41
|
+
# * Weekday.previous_first_tuesday returns the previous specified date (today if this date matches today). This method can take a argument of type Date - if no argument is given, this argument defaults to the current date.
|
38
42
|
def self.method_missing(m, *args)
|
39
|
-
# first_thursdays(year)
|
40
43
|
count_s,weekday = m.to_s.split('_')
|
44
|
+
# next_first_thursday
|
45
|
+
if m.to_s.split('_').first == NEXT
|
46
|
+
n,count_s,weekday = m.to_s.split('_')
|
47
|
+
today = args[0]
|
48
|
+
today ||= Date.today
|
49
|
+
month = today.month
|
50
|
+
year = today.year
|
51
|
+
nn = nil
|
52
|
+
loop do
|
53
|
+
nn = self.send(count_s+'_'+weekday,year,month)
|
54
|
+
break if nn
|
55
|
+
year,month = next_month(year,month)
|
56
|
+
end
|
57
|
+
if nn < today
|
58
|
+
loop do
|
59
|
+
nn = self.send(count_s+'_'+weekday,next_month(year,month)[0],
|
60
|
+
next_month(year,month)[1])
|
61
|
+
break if nn
|
62
|
+
year,month = next_month(year,month)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
return nn
|
66
|
+
end
|
67
|
+
# end next_first_thursday
|
68
|
+
|
69
|
+
# previous_first_thursday
|
70
|
+
if m.to_s.split('_').first == PREVIOUS
|
71
|
+
n,count_s,weekday = m.to_s.split('_')
|
72
|
+
today = args[0]
|
73
|
+
today ||= Date.today
|
74
|
+
month = today.month
|
75
|
+
year = today.year
|
76
|
+
nn = nil
|
77
|
+
loop do
|
78
|
+
nn = self.send(count_s+'_'+weekday,year,month)
|
79
|
+
break if nn
|
80
|
+
year,month = previous_month(year,month)
|
81
|
+
end
|
82
|
+
if nn > today
|
83
|
+
loop do
|
84
|
+
nn = self.send(count_s+'_'+weekday, previous_month(year,month)[0],
|
85
|
+
previous_month(year,month)[1])
|
86
|
+
break if nn
|
87
|
+
year,month = previous_month(year,month)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
return nn
|
91
|
+
end
|
92
|
+
# end previous_first_thursday
|
93
|
+
|
94
|
+
# first_thursdays(year)
|
41
95
|
if DAYNAMESS.include?(weekday) and args.size == 1
|
42
96
|
unless COUNTWORDS.include?(count_s)
|
43
97
|
raise NoMethodError, "undefined method `#{m}'"
|
@@ -47,11 +101,12 @@ If a certain date like 'fifth_saturday' is not possible, nil is returned.
|
|
47
101
|
year = args[0]
|
48
102
|
result = []
|
49
103
|
1.upto(12) do |month|
|
50
|
-
|
104
|
+
result << self.send(count_s+"_"+DAYNAMES[wnum],year,month)
|
51
105
|
end
|
52
106
|
return result
|
53
107
|
end
|
54
108
|
# end first_thursdays
|
109
|
+
|
55
110
|
# self.mondays .. self.sundays
|
56
111
|
if DAYNAMESS.include?(m.to_s)
|
57
112
|
wnum = DAYNAMESS.index(m.to_s)
|
@@ -149,4 +204,23 @@ If a certain date like 'fifth_saturday' is not possible, nil is returned.
|
|
149
204
|
self.send(s,year,month)
|
150
205
|
end
|
151
206
|
|
207
|
+
private
|
208
|
+
|
209
|
+
def self.next_month(year,month)
|
210
|
+
month += 1
|
211
|
+
if month > 12
|
212
|
+
month = 1
|
213
|
+
year += 1
|
214
|
+
end
|
215
|
+
return year,month
|
216
|
+
end
|
217
|
+
|
218
|
+
def self.previous_month(year,month)
|
219
|
+
month -= 1
|
220
|
+
if month < 1
|
221
|
+
month = 12
|
222
|
+
year -= 1
|
223
|
+
end
|
224
|
+
return year,month
|
225
|
+
end
|
152
226
|
end
|
data/test/test_wd.rb
CHANGED
@@ -158,24 +158,62 @@ class TestWd < Test::Unit::TestCase
|
|
158
158
|
def test_third_sunday_with_nth
|
159
159
|
assert_equal(Date.new(2010,12,19),
|
160
160
|
Weekday.nth(3, # third
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
161
|
+
0, # sunday = 0, monday = 1 ... saturday = 6
|
162
|
+
2010, # year
|
163
|
+
12 # month
|
164
|
+
))
|
165
165
|
end
|
166
166
|
|
167
167
|
def test_last_sunday_with_nth
|
168
|
-
assert_equal Date.new(2010,12,26),
|
169
|
-
Weekday.nth(-1,0,2010,12)
|
168
|
+
assert_equal Date.new(2010,12,26), Weekday.nth(-1,0,2010,12)
|
170
169
|
end
|
171
170
|
|
172
171
|
def test_first_thursdays
|
173
172
|
expected = []
|
174
|
-
y = 2011
|
175
173
|
1.upto 12 do |m|
|
176
|
-
expected << Weekday.first_thursday(
|
174
|
+
expected << Weekday.first_thursday(2011,m)
|
177
175
|
end
|
178
176
|
assert_equal expected, Weekday.first_thursdays(2011)
|
179
177
|
end
|
178
|
+
|
179
|
+
def test_next_first_thursday
|
180
|
+
# next month
|
181
|
+
today = Date.new(2011,9,19)
|
182
|
+
assert_equal Date.new(2011,10,6), Weekday.next_first_thursday(today)
|
183
|
+
|
184
|
+
# today
|
185
|
+
today = Date.new(2011,10,6)
|
186
|
+
assert_equal Date.new(2011,10,6), Weekday.next_first_thursday(today)
|
187
|
+
|
188
|
+
# end of year
|
189
|
+
today = Date.new(2011,12,25)
|
190
|
+
assert_equal Date.new(2012,1,5), Weekday.next_first_thursday(today)
|
191
|
+
|
192
|
+
# Monate ueberspringen, wenn z.B. kein fuenfter Donnerstag vorhanden
|
193
|
+
today = Date.new(2011,9,30)
|
194
|
+
assert_equal Date.new(2011,12,29), Weekday.next_fifth_thursday(today)
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_previous_first_thursday
|
198
|
+
# today
|
199
|
+
today = Date.new(2011,9,15)
|
200
|
+
assert_equal Date.new(2011,9,15), Weekday.previous_third_thursday(today)
|
201
|
+
|
202
|
+
# im gleichen Monat schon vergangen
|
203
|
+
today = Date.new(2011,9,21)
|
204
|
+
assert_equal Date.new(2011,9,15), Weekday.previous_third_thursday(today)
|
205
|
+
|
206
|
+
# im gleichen Monat noch nicht vergangen
|
207
|
+
today = Date.new(2011,9,8)
|
208
|
+
assert_equal Date.new(2011,8,18), Weekday.previous_third_thursday(today)
|
209
|
+
|
210
|
+
# previous year
|
211
|
+
today = Date.new(2011,1,1)
|
212
|
+
assert_equal Date.new(2010,12,2), Weekday.previous_first_thursday(today)
|
213
|
+
|
214
|
+
# Monate ueberspringen, wenn z.B. kein fuenfter Donnerstag vorhanden
|
215
|
+
today = Date.new(2011,9,1)
|
216
|
+
assert_equal Date.new(2011,6,30), Weekday.previous_fifth_thursday(today)
|
217
|
+
end
|
180
218
|
end
|
181
219
|
|
data/version.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.4
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: weekday
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,19 +9,19 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-09-22 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bones
|
16
|
-
requirement: &
|
16
|
+
requirement: &16913364 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 3.
|
21
|
+
version: 3.7.1
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *16913364
|
25
25
|
description: This gem calculates date like 'first tuesday in december 2010' or 'third
|
26
26
|
friday in may 2011' or 'last Saturday in december 2010'
|
27
27
|
email: thopre@gmail.com
|
@@ -29,6 +29,7 @@ executables: []
|
|
29
29
|
extensions: []
|
30
30
|
extra_rdoc_files:
|
31
31
|
- History.txt
|
32
|
+
- README.txt
|
32
33
|
- lib/doc/Object.html
|
33
34
|
- lib/doc/Weekday.html
|
34
35
|
- lib/doc/created.rid
|
@@ -62,6 +63,7 @@ extra_rdoc_files:
|
|
62
63
|
files:
|
63
64
|
- History.txt
|
64
65
|
- README.md
|
66
|
+
- README.txt
|
65
67
|
- Rakefile
|
66
68
|
- examples/termine.rb
|
67
69
|
- lib/doc/Object.html
|
@@ -103,7 +105,7 @@ licenses: []
|
|
103
105
|
post_install_message:
|
104
106
|
rdoc_options:
|
105
107
|
- --main
|
106
|
-
- README.
|
108
|
+
- README.txt
|
107
109
|
require_paths:
|
108
110
|
- lib
|
109
111
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -120,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
122
|
version: '0'
|
121
123
|
requirements: []
|
122
124
|
rubyforge_project: weekday
|
123
|
-
rubygems_version: 1.
|
125
|
+
rubygems_version: 1.8.10
|
124
126
|
signing_key:
|
125
127
|
specification_version: 3
|
126
128
|
summary: This gem calculates date like 'first tuesday in december 2010' or 'third
|