koyomi 0.0.4.1 → 0.0.5
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.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
|
|