week_of_month 1.2.1 → 1.2.2

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/.gitignore ADDED
@@ -0,0 +1,24 @@
1
+ ## Netbeans
2
+ nbproject/
3
+
4
+ ## Aptans
5
+ .project
6
+
7
+ ## EMACS
8
+ *~
9
+ \#*
10
+ .\#*
11
+
12
+ ## VIM
13
+ *.swp
14
+
15
+ # IDEA / RUBYMINE
16
+ .idea
17
+
18
+ ## PROJECT::GENERAL
19
+ tags
20
+ coverage
21
+ rdoc
22
+ doc
23
+ .yardoc
24
+ pkg
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+
data/Gemfile.lock ADDED
@@ -0,0 +1,8 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+
5
+ PLATFORMS
6
+ ruby
7
+
8
+ DEPENDENCIES
data/README.rdoc ADDED
@@ -0,0 +1,111 @@
1
+ = Week Of Month
2
+
3
+ Week Of Month is a library which gives you week_of_month method on Date and Time
4
+ class object, that returns week of the month. It basically extends the Date and Time
5
+ class with several useful date helpers.
6
+
7
+ == Getting Started
8
+
9
+ Week Of Month is released as a Ruby Gem. The gem is to be installed within a Ruby
10
+ or Rails application. To install, simply add the following to your Gemfile:
11
+
12
+ gem 'week_of_month'
13
+
14
+ == Usage
15
+
16
+ It returns week split of that date's month
17
+
18
+ Date.new(2012,1,1).week_split
19
+
20
+ => [[1, 2, 3, 4, 5, 6, 7],
21
+ [8, 9, 10, 11, 12, 13, 14],
22
+ [15, 16, 17, 18, 19, 20, 21],
23
+ [22, 23, 24, 25, 26, 27, 28],
24
+ [29, 30, 31]]
25
+
26
+ It returns month's week in which the date lies
27
+
28
+ Date.new(2012,1,1).week_of_month
29
+ => 1
30
+
31
+ It return true if date lies in first week of month, else false.
32
+
33
+ Date.new(2012,1,1).first_week?
34
+ => true
35
+
36
+ It returns true if date lies in second week of month, else false.
37
+
38
+ Date.new(2012,1,9).second_week?
39
+ => true
40
+
41
+ It returns true if date lies in last week of month, else false.
42
+
43
+ Date.new(2012,1,31).last_week?
44
+ => true
45
+
46
+ It returns total number of weeks in month.
47
+
48
+ Date.new(2012,1,31).total_weeks
49
+ => 5
50
+
51
+ It returns month's week in which the date lies
52
+
53
+ Date.new(2012,1,31).week_of_month_in_eng
54
+ => "Fifth"
55
+
56
+ == Tools Being Used
57
+
58
+ We believe strongly in not writing code unless we have to, so Week Of Month is built using
59
+
60
+ Ruby Date Class
61
+
62
+ Ruby Time Class
63
+
64
+ == Version History
65
+
66
+ 1.2.1
67
+
68
+ Support for Time class
69
+
70
+ Methods Added
71
+
72
+ name_of_week_day, name_of_month, week_end?, working_day?,
73
+ all_sundays_in_month, all_mondays_in_month, all_tuesdays_in_month,
74
+ all_wednesdays_in_month, all_thursdays_in_month, all_fridays_in_month,
75
+ all_saturdays_in_month
76
+
77
+ 1.1.0
78
+
79
+ ActiveSupport Dependency removed
80
+
81
+ Methods Added
82
+
83
+ january?, february?, march?, april?, may?, june?, july?,
84
+ august?, september?, october?, november?, december?, last_day_of_month
85
+
86
+ == Contributing to Week Of Month
87
+
88
+ Fork, fix, then send me a pull request.
89
+
90
+ == Copyright
91
+
92
+ (The MIT License)
93
+
94
+ Copyright (c) 2012 Sachin Singh. See LICENSE for details.
95
+
96
+ Permission is hereby granted, free of charge, to any person obtaining a copy
97
+ of this software and associated documentation files (the ‘Software’), to deal
98
+ in the Software without restriction, including without limitation the rights
99
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
100
+ of the Software, and to permit persons to whom the Software is furnished to do so,
101
+ subject to the following conditions:
102
+
103
+ The above copyright notice and this permission notice shall be included in all
104
+ copies or substantial portions of the Software.
105
+
106
+ THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
107
+ INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
108
+ PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
109
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
110
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
111
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << "test"
5
+ t.test_files = FileList['lib/test/modules/test*.rb']
6
+ t.verbose = true
7
+ end
8
+
9
+ desc "Run tests"
10
+ task :default => :test
@@ -0,0 +1,41 @@
1
+ #!/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ # @author Sachin Singh
5
+
6
+ module WeekOfMonth
7
+ module Constant
8
+
9
+ # hash containg english words from one to seventh
10
+ WEEK_IN_ENG = { 1 => 'First', 2 => 'Second', 3 => 'Third',
11
+ 4 => 'Fourth', 5 => 'Fifth', 6 => 'Sixth', 7 => 'Seventh'}
12
+
13
+ # hash containg french words from one to seventh
14
+ WEEK_IN_FR = { 1 => 'First', 2 => 'Second', 3 => 'Third',
15
+ 4 => 'Quatrième', 5 => 'Cinquième', 6 => 'sixième', 7 => 'septième'}
16
+
17
+ # hash containg german words from one to seventh
18
+ WEEK_IN_GER = { 1 => 'First', 2 => 'Second', 3 => 'Dritten',
19
+ 4 => 'Vierte', 5 => 'Fünfte', 6 => 'Sechste', 7 => 'siebte'}
20
+
21
+ # hash containg japneese words from one to seventh
22
+ WEEK_IN_JAP = { 1 => '最初', 2 => '秒', 3 => 'サード',
23
+ 4 => '第4回', 5 => '第五', 6=> 'シックス', 7 => '第7' }
24
+
25
+ # hash containg month name with days in that month(in non leap yaer)
26
+ MONTH_WITH_DAY = { :january => 31, :february => 28, :march => 31,
27
+ :april => 30, :may => 31, :june => 30, :july => 31,
28
+ :august => 31, :september => 30, :october => 31,
29
+ :november => 30, :december => 31 }
30
+
31
+ # hash containg month names with their sequence
32
+ MONTH_WITH_SEQUENCE = { :january => 1, :february => 2, :march => 3,
33
+ :april => 4, :may => 5, :june => 6, :july => 7,
34
+ :august => 8, :september => 9, :october => 10,
35
+ :november => 11, :december => 12 }
36
+
37
+ # array of days names ordered starting with sunday and ending with saturday.
38
+ DAYS_IN_SEQUENCE = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
39
+ "Saturday"]
40
+ end
41
+ end
@@ -0,0 +1,64 @@
1
+ #!/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ # @author Sachin Singh
5
+
6
+ module WeekOfMonth
7
+ module Day
8
+
9
+ # gives array of days in month
10
+ # Date.new(2012,1,1).days_array
11
+ # => [ 1, 2, 3, 4, 5, 6, 7, 8, 9,
12
+ # 10, 11, 12, 13, 14, 15, 16,
13
+ # 17, 18, 19, 20, 21, 22, 23,
14
+ # 24, 25, 26, 27, 28, 29, 30,
15
+ # 31]
16
+ # @return [Array]
17
+ def days_array
18
+ day = self.beginning_of_month.to_date.wday
19
+ array = []
20
+ array[day] = 1
21
+ (2..self.end_of_month.mday).each {|i| array << i }
22
+ array
23
+ end
24
+
25
+ # Date.new(2012,11,1).name_of_week_day
26
+ # => 'Thursday'
27
+ # @return [String]
28
+ def name_of_week_day
29
+ self.class.new(year,month,day).strftime('%A')
30
+ end
31
+
32
+ # this code generates method names like 'upcomong_monday' and 'previous_monday'
33
+ # Date.new(2013,1,1).upcoming_monday
34
+ # => #<Date: 2013-01-07 ((2456300j,0s,0n),+0s,2299161j)>
35
+ # Date.new(2013,1,1).previous_monday
36
+ # => #<Date: 2012-12-31 ((2456293j,0s,0n),+0s,2299161j)>
37
+ { 'upcoming' => '+', 'previous' => '-' }.each_pair do |key,value|
38
+ Date::DAYNAMES.each do |day_name|
39
+ name = "#{key}_#{day_name.downcase}".to_sym
40
+ check = "#{day_name.downcase}?".to_sym
41
+ define_method(name) do
42
+ date = eval "self"
43
+ if date.send(check)
44
+ if date.class == Date
45
+ date = date.send(value,7)
46
+ elsif date.class == Time
47
+ date = date.send(value,(60 * 60 * 24 * 7))
48
+ end
49
+ else
50
+ until date.send(check)
51
+ if date.class == Date
52
+ date = date.send(value,1)
53
+ elsif date.class == Time
54
+ date = date.send(value,(60 * 60 * 24))
55
+ end
56
+ end
57
+ end
58
+ date
59
+ end
60
+ end
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,68 @@
1
+ # @author Sachion Singh
2
+
3
+ require_relative 'constant'
4
+
5
+ module WeekOfMonth
6
+ module Month
7
+
8
+ include WeekOfMonth::Constant
9
+
10
+ # this code generates method named like january?..december?
11
+ # to check whether a month is january or march? etc.
12
+ # @return [Boolean]
13
+ MONTH_WITH_DAY.keys.each do |month_name|
14
+ define_method((month_name.to_s + '?').to_sym) do
15
+ MONTH_WITH_SEQUENCE[month_name] == month
16
+ end
17
+ end
18
+
19
+ # returns day of last day of month for a given date.
20
+ # Date.new(2012,11,1).last_day_of_month
21
+ # => 30
22
+ # @return [Fixnum]
23
+ def last_day_of_month
24
+ if leap? && february?
25
+ 29
26
+ else
27
+ MONTH_WITH_DAY[MONTH_WITH_SEQUENCE.key(month)]
28
+ end
29
+ end
30
+
31
+ # returns date of last day of month for a given date.
32
+ # Date.new(2012,11,1).end_of_month
33
+ # => #<Date: 2012-11-30 ((2456262j,0s,0n),+0s,2299161j)>
34
+ # @return [Date]
35
+ def end_of_month
36
+ self.class.new(year,month,last_day_of_month)
37
+ end
38
+
39
+ # returns date of first day of month for a given date.
40
+ # Date.new(2012,11,1).beginning_of_month
41
+ # => #<Date: 2012-11-01 ((2456233j,0s,0n),+0s,2299161j)>
42
+ # @return [Date]
43
+ def beginning_of_month
44
+ self.class.new(year,month,1)
45
+ end
46
+
47
+ # returns name of month for a given date.
48
+ # Date.new(2012,11,1).name_of_month
49
+ # => "November"
50
+ # @return [String]
51
+ def name_of_month
52
+ self.class.new(year,month,day).strftime('%B')
53
+ end
54
+
55
+ # this code generates method named like 'all_mondays_in_month',
56
+ # 'all_tuesdays_in_month' etc. for all seven days of week
57
+ # Date.new(2012,11,1).all_mondays_in_month
58
+ # => [5, 12, 19, 26]
59
+ # @return [Array]
60
+ DAYS_IN_SEQUENCE.each_with_index do |day_name, i|
61
+ method_name = "all_#{day_name.downcase}s_in_month".to_sym
62
+ define_method(method_name) do
63
+ week_split.map{|d| d[i] }.compact
64
+ end
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +1,179 @@
1
+ # @author Sachion Singh
2
+
3
+ require_relative 'constant'
4
+
5
+ module WeekOfMonth
6
+ module Week
7
+
8
+ include WeekOfMonth::Constant
9
+
10
+ # returns week of month for a given date
11
+ # Date.new(2012,11,15).week_of_month
12
+ # => 3
13
+ # @return [Fixnum]
14
+ def week_of_month
15
+ week_split.each_with_index do |o,i|
16
+ return (i + 1) if o.include?(self.day)
17
+ end
18
+ end
19
+
20
+ # checks whether the given day lies in first week of month
21
+ # Date.new(2012,11,1).first_week?
22
+ # => true
23
+ # @return [Boolean]
24
+ def first_week?
25
+ week_split[0].include?((self.day))
26
+ end
27
+
28
+ # checks whether the given day lies in second week of month
29
+ # Date.new(2012,11,8).second_week?
30
+ # => true
31
+ # @return [Boolean]
32
+ def second_week?
33
+ week_split[1].include?((self.day))
34
+ end
35
+
36
+ # checks whether the given day lies in last week of month
37
+ # Date.new(2012,11,8).last_week?
38
+ # => false
39
+ # @return [Boolean]
40
+ def last_week?
41
+ week_split.last.include?((self.day))
42
+ end
43
+
44
+ # returns total number of weeks in month
45
+ # Date.new(2012,11,8).total_weeks
46
+ # => 5
47
+ # @return [Fixnum]
48
+ def total_weeks
49
+ week_split.size
50
+ end
51
+
52
+ # checks whether the given day is saturday or sunday.
53
+ # Date.new(2012,11,8).week_end?
54
+ # => false
55
+ # @return [Boolean]
56
+ def week_end?
57
+ saturday? || sunday?
58
+ end
59
+
60
+ # checks whether the given day is not saturday or sunday.
61
+ # Date.new(2012,11,8).working_day?
62
+ # => true
63
+ # @return [Boolean]
64
+ def working_day?
65
+ !week_end?
66
+ end
67
+
68
+ # returns week split of the month for the given date
69
+ # example-
70
+ # Date.new(2012,1,1).week_split
71
+ # => [[1, 2, 3, 4, 5, 6, 7],
72
+ # [8, 9, 10, 11, 12, 13, 14],
73
+ # [15, 16, 17, 18, 19, 20, 21],
74
+ # [22, 23, 24, 25, 26, 27, 28],
75
+ # [29, 30, 31]
76
+ # @return [Array]
77
+ def week_split
78
+ days_array.each_slice(7).to_a
79
+ end
80
+
81
+ # this code generates method like 'week_of_month_eng', 'week_of_month_fr' etc.
82
+ # Date.new(2012,11,15).week_of_month_in_eng
83
+ # => 'Third'
84
+ # Date.new(2012,11,30).week_of_month_in_fr
85
+ # => "Cinquième"
86
+ # @return [String]
87
+ ['eng', 'fr', 'ger', 'jap'].each do |lang|
88
+ method_name = "week_of_month_in_#{lang}"
89
+ define_method(method_name) do
90
+ eval "WEEK_IN_#{lang.upcase}[week_of_month]"
91
+ end
92
+ end
93
+
94
+ # it returns days past in the week
95
+ # Date.new(2012,11,15).days_past_in_week
96
+ # => 4
97
+ # Time.new(2012,11,30).days_past_in_week
98
+ # => 5
99
+ # @return [Fixnum]
100
+ def days_past_in_week
101
+ self.to_date.cwday
102
+ end
103
+
104
+ # it returns days left in the week
105
+ # Date.new(2012,11,15).days_left_in_week
106
+ # => 3
107
+ # Time.new(2012,11,30).days_left_in_week
108
+ # => 2
109
+ # @return [Fixnum]
110
+ def days_left_in_week
111
+ 7 - days_past_in_week
112
+ end
113
+
114
+ # it returns date of the first day(sunday) of the week
115
+ # Date.new(2012,11,15).beginning_of_week
116
+ # => #<Date: 2012-11-12 ((2456244j,0s,0n),+0s,2299161j)>
117
+ # Time.new(2012,11,30).beginning_of_week
118
+ # => 2012-11-29 23:59:55 +0530
119
+ # @return [Date || Time]
120
+ def beginning_of_week
121
+ self.class.new(year,month,current_week.detect {|i| !i.nil?})
122
+ end
123
+
124
+ # it returns date of the last day(saturday) of the week
125
+ # Date.new(2012,11,15).end_of_week
126
+ # => #<Date: 2012-11-19 ((2456251j,0s,0n),+0s,2299161j)>
127
+ # Time.new(2012,11,30).end_of_week
128
+ # => 2012-11-30 00:00:02 +0530
129
+ # @return [Date || Time]
130
+ def end_of_week
131
+ if current_week.index(self.day) == 6
132
+ self.class.new(year,month,current_week.last)
133
+ elsif current_week.index(self.day) < 6
134
+ if self.class == Date
135
+ self + (6 - current_week.index(self.day))
136
+ elsif self.class == Time
137
+ self + (60 * 60 * 24 * (6 - current_week.index(self.day)))
138
+ end
139
+ end
140
+ end
141
+
142
+ # it returns date of the next week day.
143
+ # Date.new(2012,11,15).next_week
144
+ # => #<Date: 2012-11-22 ((2456254j,0s,0n),+0s,2299161j)>
145
+ # Time.new(2012,11,30).next_week
146
+ # => 2012-11-30 00:00:07 +0530
147
+ # @return [Date || Time]
148
+ def next_week
149
+ if self.class == Date
150
+ self + 7
151
+ elsif self.class == Time
152
+ self + (60 * 60 * 24 * 7)
153
+ end
154
+ end
155
+
156
+ # it returns date of the previous week day.
157
+ # Date.new(2012,11,15).previous_week
158
+ # => #<Date: 2012-11-08 ((2456240j,0s,0n),+0s,2299161j)>
159
+ # Time.new(2012,11,30).previous_week
160
+ # => 2012-11-29 23:59:53 +0530
161
+ # @return [Date || Time]
162
+ def previous_week
163
+ if self.class == Date
164
+ self - 7
165
+ elsif self.class == Time
166
+ self - (60 * 60 * 24 * 7)
167
+ end
168
+ end
169
+
170
+ # it returns array of days in current week.
171
+ # Date.new(2013,1,13).current_week
172
+ # => [7, 8, 9, 10, 11, 12, 13]
173
+ # @return [Array]
174
+ def current_week
175
+ week_split.select{|c| c.include?((self.day))}.flatten
176
+ end
177
+
178
+ end
179
+ end