date_ext 0.0.3 → 0.0.4
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/VERSION +1 -1
- data/date_ext.gemspec +10 -4
- data/lib/core_ext.rb +7 -0
- data/lib/date_ext.rb +2 -0
- data/lib/month.rb +12 -18
- data/lib/quarter.rb +47 -0
- data/lib/weekday.rb +40 -9
- data/lib/year.rb +42 -0
- data/test/month_test.rb +13 -0
- data/test/quarter_test.rb +23 -0
- data/test/weekday_test.rb +20 -9
- data/test/year_test.rb +44 -0
- metadata +8 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.4
|
data/date_ext.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{date_ext}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["hasclass"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2010-01-13}
|
13
13
|
s.description = %q{Ruby classes for weekday, month, etc.}
|
14
14
|
s.email = %q{sebastian.burkhard@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -28,10 +28,14 @@ Gem::Specification.new do |s|
|
|
28
28
|
"lib/core_ext.rb",
|
29
29
|
"lib/date_ext.rb",
|
30
30
|
"lib/month.rb",
|
31
|
+
"lib/quarter.rb",
|
31
32
|
"lib/weekday.rb",
|
33
|
+
"lib/year.rb",
|
32
34
|
"test/month_test.rb",
|
35
|
+
"test/quarter_test.rb",
|
33
36
|
"test/test_helper.rb",
|
34
|
-
"test/weekday_test.rb"
|
37
|
+
"test/weekday_test.rb",
|
38
|
+
"test/year_test.rb"
|
35
39
|
]
|
36
40
|
s.homepage = %q{http://github.com/hasclass/test}
|
37
41
|
s.rdoc_options = ["--charset=UTF-8"]
|
@@ -40,8 +44,10 @@ Gem::Specification.new do |s|
|
|
40
44
|
s.summary = %q{date extensions helps you work with weekdays, workdays, holidays, months, weeks, etc.}
|
41
45
|
s.test_files = [
|
42
46
|
"test/month_test.rb",
|
47
|
+
"test/quarter_test.rb",
|
43
48
|
"test/test_helper.rb",
|
44
|
-
"test/weekday_test.rb"
|
49
|
+
"test/weekday_test.rb",
|
50
|
+
"test/year_test.rb"
|
45
51
|
]
|
46
52
|
|
47
53
|
if s.respond_to? :specification_version then
|
data/lib/core_ext.rb
CHANGED
data/lib/date_ext.rb
CHANGED
data/lib/month.rb
CHANGED
@@ -40,7 +40,6 @@ class Month
|
|
40
40
|
@year = year.to_i
|
41
41
|
@month = month.to_i
|
42
42
|
end
|
43
|
-
|
44
43
|
|
45
44
|
# If _months_ is a Numeric value, create a new Month object that is x months earlier than the current one.
|
46
45
|
#
|
@@ -93,20 +92,12 @@ class Month
|
|
93
92
|
|
94
93
|
# Returns the last weekday (everyday except saturday or sunday) of the current month.
|
95
94
|
def last_cday
|
96
|
-
|
97
|
-
while date.cwday > 5
|
98
|
-
date = date -= 1
|
99
|
-
end
|
100
|
-
date
|
95
|
+
last_weekday
|
101
96
|
end
|
102
97
|
|
103
98
|
# Returns the first weekday (everyday except saturday or sunday) of the current month.
|
104
99
|
def first_cday
|
105
|
-
|
106
|
-
while date.cwday > 5
|
107
|
-
date = date += 1
|
108
|
-
end
|
109
|
-
date
|
100
|
+
first_weekday
|
110
101
|
end
|
111
102
|
|
112
103
|
# Returns the first commercial weekday with the given weekday number
|
@@ -117,7 +108,16 @@ class Month
|
|
117
108
|
end
|
118
109
|
date
|
119
110
|
end
|
120
|
-
|
111
|
+
|
112
|
+
def first_weekday
|
113
|
+
d = first_day
|
114
|
+
Weekday.civil_or_newer(d.year, d.month, d.day)
|
115
|
+
end
|
116
|
+
|
117
|
+
def last_weekday
|
118
|
+
last_day.to_weekday
|
119
|
+
end
|
120
|
+
|
121
121
|
# Returns the last day of current month as a Date object.
|
122
122
|
def last_day
|
123
123
|
first_of_next_month = first_day + 32
|
@@ -135,9 +135,3 @@ class Month
|
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
138
|
-
class Date
|
139
|
-
# Creates a Month object of the current month
|
140
|
-
def to_month
|
141
|
-
Month.new(self)
|
142
|
-
end
|
143
|
-
end
|
data/lib/quarter.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
class Quarter
|
2
|
+
attr_accessor :year, :quarter
|
3
|
+
|
4
|
+
def initialize(year, quarter)
|
5
|
+
@year = year
|
6
|
+
@quarter = quarter
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_year
|
10
|
+
Year.new(@year)
|
11
|
+
end
|
12
|
+
|
13
|
+
# def -(x)
|
14
|
+
# if x.is_a?(Numeric)
|
15
|
+
# return self.class.new(@year - x)
|
16
|
+
# elsif x.is_a?(Quarter)
|
17
|
+
# return @year - x.year
|
18
|
+
# else
|
19
|
+
# raise TypeError, 'expected numeric or year'
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# def +(x)
|
24
|
+
# if x.is_a?(Numeric)
|
25
|
+
# return self.class.new(@year + x)
|
26
|
+
# elsif x.is_a?(Quarter)
|
27
|
+
# return @year + x.year
|
28
|
+
# else
|
29
|
+
# raise TypeError, 'expected numeric or year'
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
|
33
|
+
def months; (first_month..last_month).to_a; end
|
34
|
+
|
35
|
+
def first_month; Month.new(@year,@quarter); end
|
36
|
+
def last_month; Month.new(@year,@quarter+2); end
|
37
|
+
|
38
|
+
def dates; (first_date..last_date).to_a; end
|
39
|
+
|
40
|
+
def first_date; first_month.first_day; end
|
41
|
+
def last_date; last_month.last_day; end
|
42
|
+
|
43
|
+
def weekdays; (first_weekday..last_date).to_a; end
|
44
|
+
|
45
|
+
def first_weekday; first_month.first_weekday; end
|
46
|
+
def last_weekday; last_weekday.last_weekday; end
|
47
|
+
end
|
data/lib/weekday.rb
CHANGED
@@ -2,21 +2,39 @@ module WeekDayCoreExt
|
|
2
2
|
def is_weekday?
|
3
3
|
self.cwday < 6
|
4
4
|
end
|
5
|
-
|
5
|
+
|
6
|
+
# Returns a Weekday. Doesn't raise an exception if not a weekday,
|
7
|
+
# but returns the most previous weekday.
|
8
|
+
#
|
6
9
|
def to_weekday
|
7
|
-
|
10
|
+
Weekday.civil(self.year, self.month, self.day)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns a Weekday. Raises Exception if not a weekday
|
14
|
+
#
|
15
|
+
def to_weekday!
|
16
|
+
Weekday.civil!(self.year, self.month, self.day)
|
8
17
|
end
|
9
18
|
end
|
10
19
|
|
20
|
+
class Weekday < Date
|
21
|
+
OLDER = '-'
|
22
|
+
NEWER = '+'
|
11
23
|
|
24
|
+
def self.civil(y=-4712, m=1, d=1, sg=ITALY)
|
25
|
+
weekday_or_nearest(y,m,d,OLDER)
|
26
|
+
end
|
12
27
|
|
13
|
-
|
14
|
-
|
15
|
-
def initialize(ajd=0, of=0, sg=ITALY)
|
16
|
-
super(ajd, of, sg)
|
17
|
-
raise 'Is not a weekday' unless self.is_weekday?
|
28
|
+
def self.civil_or_newer(y=-4712, m=1, d=1, sg=ITALY)
|
29
|
+
weekday_or_nearest(y,m,d,NEWER)
|
18
30
|
end
|
19
|
-
|
31
|
+
|
32
|
+
def self.civil!(y=-4712, m=1, d=1, sg=ITALY)
|
33
|
+
day = new(y,m,d)
|
34
|
+
raise "Is not a Weekday" unless day.is_weekday?
|
35
|
+
day
|
36
|
+
end
|
37
|
+
|
20
38
|
def -(x)
|
21
39
|
if x.is_a?(Numeric)
|
22
40
|
# weekend_offset = 0
|
@@ -33,7 +51,7 @@ class Weekday < Date
|
|
33
51
|
raise TypeError, 'expected numeric or date'
|
34
52
|
end
|
35
53
|
end
|
36
|
-
|
54
|
+
|
37
55
|
def +(x)
|
38
56
|
if x.is_a?(Numeric)
|
39
57
|
days = x % 5
|
@@ -50,4 +68,17 @@ class Weekday < Date
|
|
50
68
|
def self.today
|
51
69
|
super.class.today.to_weekday
|
52
70
|
end
|
71
|
+
|
72
|
+
def self.today!
|
73
|
+
super.class.today.to_weekday!
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
def self.weekday_or_nearest(y,m,d,operator = OLDER)
|
78
|
+
day = Date.new(y,m,d)
|
79
|
+
while !day.is_weekday?
|
80
|
+
day = day.send(operator, 1)
|
81
|
+
end
|
82
|
+
day.to_weekday!
|
83
|
+
end
|
53
84
|
end
|
data/lib/year.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
class Year
|
2
|
+
attr_accessor :year
|
3
|
+
|
4
|
+
def initialize(year)
|
5
|
+
@year = year
|
6
|
+
end
|
7
|
+
|
8
|
+
def -(x)
|
9
|
+
if x.is_a?(Numeric)
|
10
|
+
return self.class.new(@year - x)
|
11
|
+
elsif x.is_a?(Year)
|
12
|
+
return @year - x.year
|
13
|
+
else
|
14
|
+
raise TypeError, 'expected numeric or year'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def +(x)
|
19
|
+
if x.is_a?(Numeric)
|
20
|
+
return self.class.new(@year + x)
|
21
|
+
elsif x.is_a?(Year)
|
22
|
+
return @year + x.year
|
23
|
+
else
|
24
|
+
raise TypeError, 'expected numeric or year'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def months; (first_month..last_month).to_a; end
|
29
|
+
|
30
|
+
def first_month; Month.new(year,1); end
|
31
|
+
def last_month; Month.new(year,12); end
|
32
|
+
|
33
|
+
def dates; (first_date..last_date).to_a; end
|
34
|
+
|
35
|
+
def first_date; Date.new(year,1,1); end
|
36
|
+
def last_date; Date.new(year,12,31); end
|
37
|
+
|
38
|
+
def weekdays; (first_weekday..last_date).to_a; end
|
39
|
+
|
40
|
+
def first_weekday; first_month.first_weekday; end
|
41
|
+
def last_weekday; last_month.last_weekday; end
|
42
|
+
end
|
data/test/month_test.rb
CHANGED
@@ -5,6 +5,19 @@ require File.dirname(__FILE__) + '/test_helper'
|
|
5
5
|
|
6
6
|
class MonthTest < Test::Unit::TestCase
|
7
7
|
|
8
|
+
context "December" do
|
9
|
+
setup {
|
10
|
+
@month = Month.new(2011,12)
|
11
|
+
}
|
12
|
+
should "have last_day 2011-12-31" do
|
13
|
+
assert_equal Date.new(2011,12,31), @month.last_day
|
14
|
+
end
|
15
|
+
should "have last_weekday 2011-12-30" do
|
16
|
+
assert_equal Date.new(2011,12,30), @month.last_weekday
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
8
21
|
context "Date#to_month" do
|
9
22
|
setup do
|
10
23
|
@d = Date.new(2009,2,1)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class QuarterTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "Quarter 2009" do
|
6
|
+
setup {
|
7
|
+
@quarter = Quarter.new(2009,1)
|
8
|
+
}
|
9
|
+
should "have 2009-01 as first_month" do
|
10
|
+
assert_equal Month.new(2009,1), @quarter.first_month
|
11
|
+
end
|
12
|
+
should "have 2009-12 as last_month" do
|
13
|
+
assert_equal Month.new(2009,3), @quarter.last_month
|
14
|
+
end
|
15
|
+
should "have 2009-01-01 as first_date" do
|
16
|
+
assert_equal Date.new(2009,1,1), @quarter.first_date
|
17
|
+
end
|
18
|
+
should "have 2009-12-31 as last_date" do
|
19
|
+
assert_equal Date.new(2009,3,31), @quarter.last_date
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
data/test/weekday_test.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
3
|
class WeekdayTest < Test::Unit::TestCase
|
7
4
|
context "range friday ... friday_next_week" do
|
8
5
|
setup {
|
@@ -10,35 +7,48 @@ class WeekdayTest < Test::Unit::TestCase
|
|
10
7
|
@fri_next = Weekday.new(2009,12,11)
|
11
8
|
@range = (@fri...@fri_next)
|
12
9
|
}
|
13
|
-
|
10
|
+
|
14
11
|
should "have 5 elements" do
|
15
12
|
assert_equal 5, @range.to_a.length
|
16
13
|
end
|
17
|
-
|
14
|
+
|
18
15
|
should "all be weekdays" do
|
19
16
|
assert @range.to_a.all?{|wd| wd.is_a?(Weekday)}
|
20
17
|
end
|
21
18
|
end
|
22
|
-
|
19
|
+
|
23
20
|
context "Weekday methods" do
|
24
21
|
should "return a Weekday object on #new" do
|
25
22
|
assert_equal Weekday, Weekday.new(2009,12,3).class
|
26
23
|
end
|
27
|
-
|
24
|
+
|
28
25
|
should "return a Weekday object on #today" do
|
29
26
|
assert_equal Weekday, Weekday.today.class
|
30
27
|
end
|
31
28
|
end
|
32
|
-
|
29
|
+
|
30
|
+
context "On weekends" do
|
31
|
+
should "return previous friday if #civil on weekend" do
|
32
|
+
assert_equal Weekday.civil(2009,12,4), Weekday.civil(2009,12,5)
|
33
|
+
assert_equal Weekday.civil(2009,12,4), Weekday.civil(2009,12,6)
|
34
|
+
end
|
35
|
+
|
36
|
+
should "return next monday if #civil_or_newer on weekend" do
|
37
|
+
assert_equal Weekday.civil(2009,12,7), Weekday.civil_or_newer(2009,12,5)
|
38
|
+
assert_equal Weekday.civil(2009,12,7), Weekday.civil_or_newer(2009,12,6)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
33
42
|
context "Weekdays" do
|
34
43
|
setup {
|
35
44
|
@thu = Weekday.new(2009,12,3)
|
36
45
|
@fri = Weekday.new(2009,12,4)
|
37
|
-
|
46
|
+
|
38
47
|
@mon = Weekday.new(2009,12,7)
|
39
48
|
@tue = Weekday.new(2009,12,8)
|
40
49
|
@wed = Weekday.new(2009,12,9)
|
41
50
|
}
|
51
|
+
|
42
52
|
context "Wednesday" do
|
43
53
|
should "be valid" do
|
44
54
|
assert Weekday, @wed
|
@@ -59,6 +69,7 @@ class WeekdayTest < Test::Unit::TestCase
|
|
59
69
|
assert_equal Weekday.new(2009,12,2), @wed - 5
|
60
70
|
end
|
61
71
|
end
|
72
|
+
|
62
73
|
context "Monday" do
|
63
74
|
should "be valid" do
|
64
75
|
assert Weekday, @mon
|
data/test/year_test.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class YearTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "Year 2009" do
|
6
|
+
setup {
|
7
|
+
@year = Year.new(2009)
|
8
|
+
}
|
9
|
+
should "assign year" do
|
10
|
+
assert_equal 2009, @year.year
|
11
|
+
end
|
12
|
+
should "have 2009-01 as first_month" do
|
13
|
+
assert_equal Month.new(2009,1), @year.first_month
|
14
|
+
end
|
15
|
+
should "have 2009-12 as last_month" do
|
16
|
+
assert_equal Month.new(2009,12), @year.last_month
|
17
|
+
end
|
18
|
+
should "have 2009-01-01 as first_date" do
|
19
|
+
assert_equal Date.new(2009,1,1), @year.first_date
|
20
|
+
end
|
21
|
+
should "have 2009-12-31 as last_date" do
|
22
|
+
assert_equal Date.new(2009,12,31), @year.last_date
|
23
|
+
end
|
24
|
+
should "have 2009-01-01 as first_weekday" do
|
25
|
+
assert_equal Date.new(2009,1,1), @year.first_weekday
|
26
|
+
end
|
27
|
+
should "have 2009-12-31 as last_weekday" do
|
28
|
+
assert_equal Date.new(2009,12,31), @year.last_weekday
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "Year 2011" do
|
33
|
+
setup {
|
34
|
+
@year = Year.new(2011)
|
35
|
+
}
|
36
|
+
should "have 2011-01-03 as first_weekday" do
|
37
|
+
assert_equal Date.new(2011,1,3), @year.first_weekday
|
38
|
+
end
|
39
|
+
should "have 2011-12-30 as last_weekday" do
|
40
|
+
assert_equal Date.new(2011,12,30), @year.last_weekday
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: date_ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hasclass
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-13 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -43,10 +43,14 @@ files:
|
|
43
43
|
- lib/core_ext.rb
|
44
44
|
- lib/date_ext.rb
|
45
45
|
- lib/month.rb
|
46
|
+
- lib/quarter.rb
|
46
47
|
- lib/weekday.rb
|
48
|
+
- lib/year.rb
|
47
49
|
- test/month_test.rb
|
50
|
+
- test/quarter_test.rb
|
48
51
|
- test/test_helper.rb
|
49
52
|
- test/weekday_test.rb
|
53
|
+
- test/year_test.rb
|
50
54
|
has_rdoc: true
|
51
55
|
homepage: http://github.com/hasclass/test
|
52
56
|
licenses: []
|
@@ -77,5 +81,7 @@ specification_version: 3
|
|
77
81
|
summary: date extensions helps you work with weekdays, workdays, holidays, months, weeks, etc.
|
78
82
|
test_files:
|
79
83
|
- test/month_test.rb
|
84
|
+
- test/quarter_test.rb
|
80
85
|
- test/test_helper.rb
|
81
86
|
- test/weekday_test.rb
|
87
|
+
- test/year_test.rb
|