koyomi 0.0.4.1 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +27 -1
- data/lib/koyomi/calendar.rb +55 -30
- data/lib/koyomi/helper/date.rb +36 -0
- data/lib/koyomi/helper/week.rb +9 -0
- data/lib/koyomi/month.rb +16 -0
- data/lib/koyomi/version.rb +1 -1
- data/test/units/test_calendar.rb +28 -4
- data/test/units/test_date.rb +16 -1
- data/test/units/test_month.rb +6 -0
- metadata +1 -1
data/README.md
CHANGED
@@ -38,16 +38,42 @@ Handling calendar by this gem.
|
|
38
38
|
# weeks and week days.
|
39
39
|
|
40
40
|
# nth week day.
|
41
|
-
|
41
|
+
#
|
42
|
+
# Version 0.0.5 or later, NOT compatible version 0.0.4.x.
|
43
|
+
# To get version 0.0.4 compatible result, use Koyomi::Month#nth_wday.
|
44
|
+
#
|
45
|
+
# (japanese)
|
46
|
+
# バージョン 0.0.5 以上では、バージョン 0.0.4.x と互換性がありません。
|
47
|
+
# 以前のバージョンと同様の結果を得るためには、 Koyomi::Month#nth_wday メソッドを利用して下さい。
|
48
|
+
#
|
49
|
+
cal.nth_wday(1, :sat).to_s
|
50
|
+
# => "2012-12-01"
|
51
|
+
cal.nth_wday(1, :tue).to_s
|
52
|
+
# => "2012-11-27"
|
53
|
+
cal.the_month.nth_wday(1, :tue).to_s
|
54
|
+
# => "2012-12-04"
|
42
55
|
|
43
56
|
# cycle: every monday.
|
44
57
|
# (japanese) 周期:毎週月曜
|
45
58
|
cal.cycles(:every, :mon).collect { |d| d.to_s }
|
59
|
+
# => ["2012-11-26", "2012-12-03", "2012-12-10", "2012-12-17", "2012-12-24", "2012-12-31"]
|
60
|
+
#
|
61
|
+
# Version 0.0.5 or later, NOT compatible version 0.0.4.x.
|
62
|
+
# To get version 0.0.4 compatible result, use Koyomi::Month#cycles.
|
63
|
+
#
|
64
|
+
# (japanese)
|
65
|
+
# バージョン 0.0.5 以上では、バージョン 0.0.4.x と互換性がありません。
|
66
|
+
# 以前のバージョンと同様の結果を得るためには、 Koyomi::Month#cycles メソッドを利用して下さい。
|
67
|
+
#
|
68
|
+
cal.the_month.cycles(:every, :mon).collect { |d| d.to_s }
|
46
69
|
# => ["2012-12-03", "2012-12-10", "2012-12-17", "2012-12-24", "2012-12-31"]
|
47
70
|
|
48
71
|
# cycle: 1st, 3rd week's tuesday or friday.
|
49
72
|
# (japanese) 周期:第1、第3の火曜と金曜
|
73
|
+
#
|
50
74
|
cal.cycles([1, 3], [:tue, :fri]).collect { |d| d.to_s }
|
75
|
+
# => ["2012-11-27", "2012-11-30", "2012-12-11", "2012-12-14"]
|
76
|
+
cal.the_month.cycles([1, 3], [:tue, :fri]).collect { |d| d.to_s }
|
51
77
|
# => ["2012-12-04", "2012-12-07", "2012-12-18", "2012-12-21"]
|
52
78
|
|
53
79
|
|
data/lib/koyomi/calendar.rb
CHANGED
@@ -18,9 +18,10 @@ class Koyomi::Calendar < Koyomi::Period
|
|
18
18
|
|
19
19
|
#--------------------#
|
20
20
|
# instance methods
|
21
|
-
attr_reader :year, :month, :koyomi_month
|
22
21
|
attr_accessor :week_start
|
23
|
-
|
22
|
+
attr_reader :year, :month, :koyomi_month
|
23
|
+
attr_reader :weeks
|
24
|
+
|
24
25
|
# initialize instance
|
25
26
|
#
|
26
27
|
# @param [Integer] year optional, use instance create date.
|
@@ -30,16 +31,16 @@ class Koyomi::Calendar < Koyomi::Period
|
|
30
31
|
super()
|
31
32
|
self.year = year||self.created_at.year
|
32
33
|
self.month = month||self.created_at.month
|
33
|
-
self.week_start = week_start||DEFAULT_WEEK_START
|
34
|
-
|
35
34
|
self.koyomi_month = Koyomi::Month.new(self.month, self.year)
|
35
|
+
self.week_start = week_start||DEFAULT_WEEK_START
|
36
36
|
end
|
37
37
|
|
38
38
|
# set week_start
|
39
39
|
#
|
40
40
|
# @param [Object] value
|
41
41
|
def week_start=(value)
|
42
|
-
|
42
|
+
self.setup_week_start(value)
|
43
|
+
@week_start
|
43
44
|
end
|
44
45
|
|
45
46
|
# first date of the calendar (NOT first date of the MONTH)
|
@@ -70,28 +71,13 @@ class Koyomi::Calendar < Koyomi::Period
|
|
70
71
|
self.koyomi_month
|
71
72
|
end
|
72
73
|
|
73
|
-
# weeks of the calendar.
|
74
|
-
#
|
75
|
-
# @return [Array<Week>]
|
76
|
-
def weeks
|
77
|
-
a_date = self.first
|
78
|
-
the_last = self.last
|
79
|
-
weeks = []
|
80
|
-
|
81
|
-
while (a_date < the_last)
|
82
|
-
weeks << Koyomi::Week.new(a_date, self.week_start)
|
83
|
-
a_date += WEEK_DAYS
|
84
|
-
end
|
85
|
-
weeks
|
86
|
-
end
|
87
|
-
|
88
74
|
# week day of nth week.
|
89
75
|
#
|
90
76
|
# @param [Integer] nth
|
91
77
|
# @param [Object] wday_name
|
92
78
|
# @return [Date]
|
93
79
|
def nth_wday(nth, wday_name)
|
94
|
-
self.
|
80
|
+
self.weeks[nth - 1].wday(wday_name)
|
95
81
|
end
|
96
82
|
|
97
83
|
# week days
|
@@ -99,13 +85,7 @@ class Koyomi::Calendar < Koyomi::Period
|
|
99
85
|
# @param [Object] wday_name
|
100
86
|
# @return [Array<Date>]
|
101
87
|
def wdays(wday_name)
|
102
|
-
|
103
|
-
a_date = self.nth_wday(1, wday_name)
|
104
|
-
while ((a_date.month == self.month))
|
105
|
-
_wdays << a_date
|
106
|
-
a_date += WEEK_DAYS
|
107
|
-
end
|
108
|
-
_wdays
|
88
|
+
self.weeks.collect { |w| w.wday(wday_name) }
|
109
89
|
end
|
110
90
|
|
111
91
|
# cycle dates
|
@@ -114,11 +94,56 @@ class Koyomi::Calendar < Koyomi::Period
|
|
114
94
|
# @param [Array<Object>|Object] wdays
|
115
95
|
# @return [Array<Date>]
|
116
96
|
def cycles(weeks, wdays)
|
117
|
-
|
97
|
+
_dates = []
|
98
|
+
cycle_weeks_filter(weeks).each do |n|
|
99
|
+
[wdays].flatten.each do |w|
|
100
|
+
_dates << self.nth_wday(n, w)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
_dates.sort
|
118
104
|
end
|
119
105
|
|
120
106
|
#--------------------#
|
121
107
|
protected
|
122
108
|
|
123
109
|
attr_writer :year, :month, :koyomi_month
|
124
|
-
|
110
|
+
|
111
|
+
# setup week start
|
112
|
+
#
|
113
|
+
# @param [Object] value
|
114
|
+
def setup_week_start(value)
|
115
|
+
@week_start = self.class.windex(value)
|
116
|
+
self.setup_weeks(@week_start)
|
117
|
+
end
|
118
|
+
|
119
|
+
# setup weeks of the calendar.
|
120
|
+
#
|
121
|
+
# @return [Array<Week>]
|
122
|
+
def setup_weeks(week_start)
|
123
|
+
a_date = self.first
|
124
|
+
the_last = self.last
|
125
|
+
@weeks = []
|
126
|
+
|
127
|
+
while (a_date < the_last)
|
128
|
+
@weeks << Koyomi::Week.new(a_date, week_start)
|
129
|
+
a_date += WEEK_DAYS
|
130
|
+
end
|
131
|
+
@weeks
|
132
|
+
end
|
133
|
+
|
134
|
+
#--------------------#
|
135
|
+
private
|
136
|
+
|
137
|
+
# cycle weeks filter
|
138
|
+
#
|
139
|
+
# @param [Object] weeks
|
140
|
+
# @return [Iterator] Array or Range
|
141
|
+
def cycle_weeks_filter(weeks)
|
142
|
+
case
|
143
|
+
when weeks.to_s =~ /every/
|
144
|
+
(1..self.weeks.size)
|
145
|
+
else
|
146
|
+
[weeks].flatten
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
data/lib/koyomi/helper/date.rb
CHANGED
@@ -15,6 +15,14 @@ class Date
|
|
15
15
|
self.class.week_ends?(self, week_start)
|
16
16
|
end
|
17
17
|
|
18
|
+
# check week start?
|
19
|
+
#
|
20
|
+
# @param [Object] week_start
|
21
|
+
# @return [Boolean]
|
22
|
+
def week_start?(week_start = nil)
|
23
|
+
self.class.week_starts?(self, week_start)
|
24
|
+
end
|
25
|
+
|
18
26
|
# week day index
|
19
27
|
#
|
20
28
|
# @return [Integer]
|
@@ -28,4 +36,32 @@ class Date
|
|
28
36
|
def wday_name
|
29
37
|
self.class.wday_name(self)
|
30
38
|
end
|
39
|
+
|
40
|
+
# nth week day of the month
|
41
|
+
#
|
42
|
+
# @return [Integer]
|
43
|
+
def nth_month_week
|
44
|
+
_week = (self.day / WEEK_DAYS).to_i
|
45
|
+
_fraction = (self.day % WEEK_DAYS)
|
46
|
+
(_week + (_fraction == 0 ? 0 : 1))
|
47
|
+
end
|
48
|
+
|
49
|
+
# nth week, week day of the month
|
50
|
+
#
|
51
|
+
# @return [Array] [<Integer>nth_month_week, <Symbol>wday_name]
|
52
|
+
def nth_wday
|
53
|
+
[self.nth_month_week, self.wday_name]
|
54
|
+
end
|
55
|
+
|
56
|
+
# monthly information
|
57
|
+
#
|
58
|
+
# @return [Hash]
|
59
|
+
def month_info
|
60
|
+
_info = {}
|
61
|
+
_infos = self.nth_wday.dup
|
62
|
+
_info[:nth] = _infos.shift
|
63
|
+
_info[:wday] = _infos.shift
|
64
|
+
|
65
|
+
_info
|
66
|
+
end
|
31
67
|
end
|
data/lib/koyomi/helper/week.rb
CHANGED
@@ -40,5 +40,14 @@ module Koyomi::Helper::Week
|
|
40
40
|
def week_ends?(date, week_start = nil)
|
41
41
|
Koyomi::Week.ends?(date, week_start)
|
42
42
|
end
|
43
|
+
|
44
|
+
# week start?
|
45
|
+
#
|
46
|
+
# @param [Date] date
|
47
|
+
# @param [Object] week_start week start
|
48
|
+
# @return [Boolean]
|
49
|
+
def week_starts?(date, week_start = nil)
|
50
|
+
Koyomi::Week.starts?(date, week_start)
|
51
|
+
end
|
43
52
|
end
|
44
53
|
end
|
data/lib/koyomi/month.rb
CHANGED
@@ -70,6 +70,22 @@ class Koyomi::Month < Koyomi::Period
|
|
70
70
|
Koyomi::Week.new(a_date, a_date.wday).wday(wday_name)
|
71
71
|
end
|
72
72
|
|
73
|
+
|
74
|
+
# week days
|
75
|
+
#
|
76
|
+
# @param [Object] wday_name
|
77
|
+
# @return [Array<Date>]
|
78
|
+
def wdays(wday_name)
|
79
|
+
_dates = []
|
80
|
+
a_date = self.nth_wday(1, wday_name)
|
81
|
+
|
82
|
+
while (a_date.month == self.month)
|
83
|
+
_dates << a_date
|
84
|
+
a_date += Koyomi::Week::DAYS
|
85
|
+
end
|
86
|
+
_dates.sort
|
87
|
+
end
|
88
|
+
|
73
89
|
#--------------------#
|
74
90
|
protected
|
75
91
|
|
data/lib/koyomi/version.rb
CHANGED
data/test/units/test_calendar.rb
CHANGED
@@ -90,22 +90,46 @@ class TestKoyomiCalendar < Test::Unit::TestCase
|
|
90
90
|
end # should "have weeks"
|
91
91
|
|
92
92
|
should "respond to nth_wday" do
|
93
|
-
assert_equal(Date.new(2012,
|
93
|
+
assert_equal(Date.new(2012,12,1), @cal.nth_wday(1, :sat))
|
94
|
+
|
95
|
+
# version 0.0.5 or later
|
96
|
+
assert_equal(Date.new(2012,11,27), @cal.nth_wday(1, :tue))
|
94
97
|
end # should "respond to nth_wday"
|
95
98
|
|
96
99
|
should "respond to wdays" do
|
97
|
-
|
98
|
-
assert_equal(
|
100
|
+
# version 0.0.4.x
|
101
|
+
#assert_equal(5, @cal.wdays(:sat).size)
|
102
|
+
#assert_equal(4, @cal.wdays(:fri).size)
|
103
|
+
|
104
|
+
# version 0.0.5 or later
|
105
|
+
assert_equal(6, @cal.wdays(:sat).size)
|
106
|
+
assert_equal(6, @cal.wdays(:fri).size)
|
99
107
|
end # should "respond to wdays"
|
100
108
|
|
101
109
|
should "respond to cycles" do
|
102
110
|
dates = @cal.cycles([1, 3], [:tue, :fri])
|
103
|
-
|
104
111
|
assert_equal(4, dates.size)
|
105
112
|
|
106
113
|
dates.each do |date|
|
107
114
|
assert((date.wday_name == :tue) || (date.wday_name == :fri))
|
108
115
|
end
|
116
|
+
|
117
|
+
# version 0.0.5 or later
|
118
|
+
dates = @cal.cycles(:every, [:tue, :fri])
|
119
|
+
assert_equal(12, dates.size)
|
120
|
+
|
121
|
+
dates.each do |date|
|
122
|
+
assert((date.wday_name == :tue) || (date.wday_name == :fri))
|
123
|
+
end
|
124
|
+
|
125
|
+
@cal.week_start = :tue
|
126
|
+
dates = @cal.cycles(:every, [:tue, :fri])
|
127
|
+
assert_equal(10, dates.size)
|
128
|
+
|
129
|
+
dates.each do |date|
|
130
|
+
assert((date.wday_name == :tue) || (date.wday_name == :fri))
|
131
|
+
end
|
132
|
+
|
109
133
|
end # should "respond to cycles"
|
110
134
|
|
111
135
|
end # context "week day methods"
|
data/test/units/test_date.rb
CHANGED
@@ -9,7 +9,7 @@ class TestKoyomiDate < Test::Unit::TestCase
|
|
9
9
|
@wdays = Date::WEEK_WDAYS
|
10
10
|
end # setup
|
11
11
|
|
12
|
-
should "correct week end" do
|
12
|
+
should "correct week start, end" do
|
13
13
|
cal = Koyomi::Calendar.of(@date)
|
14
14
|
|
15
15
|
cal.each do |date|
|
@@ -19,9 +19,24 @@ class TestKoyomiDate < Test::Unit::TestCase
|
|
19
19
|
else
|
20
20
|
assert(!date.week_end?(wd))
|
21
21
|
end
|
22
|
+
|
23
|
+
if (date).wday == @wdays.index(wd)
|
24
|
+
assert(date.week_start?(wd))
|
25
|
+
else
|
26
|
+
assert(!date.week_start?(wd))
|
27
|
+
end
|
22
28
|
end # each wd
|
23
29
|
end # each date
|
24
30
|
end # should "correct week end"
|
25
31
|
|
32
|
+
should "respond to nth_wday" do
|
33
|
+
assert_equal(3, @date.nth_month_week)
|
34
|
+
end # should "respond to nth_wday"
|
35
|
+
|
36
|
+
should "respond to info" do
|
37
|
+
assert_equal(3, @date.month_info[:nth])
|
38
|
+
assert_equal(:sun, @date.month_info[:wday])
|
39
|
+
end
|
40
|
+
|
26
41
|
end # context "Koyomi::Date"
|
27
42
|
end
|
data/test/units/test_month.rb
CHANGED
@@ -26,6 +26,12 @@ class TestKoyomiMonth < Test::Unit::TestCase
|
|
26
26
|
assert_equal(Date.new(2012, 12, 1), month.nth_wday(1, :sat))
|
27
27
|
end
|
28
28
|
|
29
|
+
should "respond to wdays" do
|
30
|
+
month = Koyomi::Month.new(12, 2012)
|
31
|
+
assert_equal(5, @month.wdays(:sat).size)
|
32
|
+
assert_equal(4, @month.wdays(:fri).size)
|
33
|
+
end # should "respond to wdays"
|
34
|
+
|
29
35
|
should "respond to cycles" do
|
30
36
|
month = Koyomi::Month.new(12, 2012)
|
31
37
|
|