mysql_yearweek 1.0.0

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.
Files changed (2) hide show
  1. data/lib/mysql_yearweek.rb +137 -0
  2. metadata +48 -0
@@ -0,0 +1,137 @@
1
+ # encoding=utf-8
2
+ require 'time'
3
+
4
+
5
+ class MySQLYearweek
6
+ MIN_ALLOWED_DATE = Date.new(1584, 1, 1).freeze
7
+ MAX_TESTED_DATE = Date.new(4000, 12, 31).freeze
8
+
9
+ def self.yearweek(date, mode=4)
10
+ raise TypeError unless date.is_a?(Date)
11
+ if (date < MIN_ALLOWED_DATE)
12
+ raise ArgumentError, "Dates before #{MIN_ALLOWED_DATE} are not allowed"
13
+ end
14
+
15
+ case mode
16
+ when 0
17
+ return mode_zero(date)
18
+ when 1
19
+ return mode_one(date)
20
+ when 2
21
+ return mode_two(date)
22
+ when 3
23
+ return mode_three(date)
24
+ when 4
25
+ return mode_four(date)
26
+ when 5
27
+ return mode_five(date)
28
+ when 6
29
+ return mode_six(date)
30
+ when 7
31
+ return mode_seven(date)
32
+ else
33
+ raise ArgumentError, 'Valid modes are from 0 to 7'
34
+ end
35
+ end
36
+
37
+ def self.mode_zero(date)
38
+ if (date.sunday?)
39
+ date += 1
40
+ end
41
+
42
+ if (last_week_of_year_has_sunday(date.cwyear - 1))
43
+ if (last_week_of_year_has_sunday(date.cwyear - 2))
44
+ last_week_of_prev_year = 52
45
+ else
46
+ last_week_of_prev_year = 53
47
+ end
48
+ year = date.cweek > 1 ? date.cwyear : date.cwyear - 1
49
+ week = date.cweek > 1 ? date.cweek - 1 : last_week_of_prev_year
50
+
51
+ yearweek = "%04d%02d" % [year, week]
52
+ else
53
+ yearweek = "%04d%02d" % [date.cwyear, date.cweek]
54
+ end
55
+
56
+ yearweek
57
+ end
58
+ private_class_method :mode_zero
59
+
60
+
61
+ def self.mode_one(date)
62
+ yearweek = "%04d%02d" % [date.cwyear, date.cweek]
63
+ end
64
+ private_class_method :mode_one
65
+
66
+ def self.mode_two(date)
67
+ mode_zero(date)
68
+ end
69
+ private_class_method :mode_two
70
+
71
+ def self.mode_three(date)
72
+ mode_one(date)
73
+ end
74
+ private_class_method :mode_three
75
+
76
+ def self.mode_four(date)
77
+ if (date.sunday?)
78
+ date += 1
79
+ end
80
+
81
+ if (Date.new(date.cwyear, 1, 1).thursday?)
82
+ week = date.cweek > 1 ? date.cweek - 1 : 53
83
+ year = week == 53 ? date.cwyear - 1 : date.cwyear
84
+
85
+ yearweek = "%04d%02d" % [year, week]
86
+ else
87
+ yearweek = "%04d%02d" % [date.cwyear, date.cweek]
88
+ end
89
+
90
+ yearweek
91
+ end
92
+ private_class_method :mode_four
93
+
94
+ def self.mode_five(date)
95
+ if (last_week_of_year_has_monday(date.cwyear - 1))
96
+ if (last_week_of_year_has_monday(date.cwyear - 2))
97
+ last_week_of_prev_year = 52
98
+ else
99
+ last_week_of_prev_year = 53
100
+ end
101
+ year = date.cweek > 1 ? date.cwyear : date.cwyear - 1
102
+ week = date.cweek > 1 ? date.cweek - 1 : last_week_of_prev_year
103
+
104
+ yearweek = "%04d%02d" % [year, week]
105
+ else
106
+ yearweek = "%04d%02d" % [date.cwyear, date.cweek]
107
+ end
108
+
109
+ yearweek
110
+ end
111
+ private_class_method :mode_five
112
+
113
+ def self.mode_six(date)
114
+ mode_four(date)
115
+ end
116
+ private_class_method :mode_six
117
+
118
+ def self.mode_seven(date)
119
+ mode_five(date)
120
+ end
121
+ private_class_method :mode_five
122
+
123
+ def self.last_week_of_year_has_sunday(year)
124
+ Date.new(year, 12, 28).sunday? or
125
+ Date.new(year, 12, 29).sunday? or
126
+ Date.new(year, 12, 30).sunday? or
127
+ Date.new(year, 12, 31).sunday?
128
+ end
129
+ private_class_method :last_week_of_year_has_sunday
130
+
131
+ def self.last_week_of_year_has_monday(year)
132
+ Date.new(year, 12, 29).monday? or
133
+ Date.new(year, 12, 30).monday? or
134
+ Date.new(year, 12, 31).monday?
135
+ end
136
+ private_class_method :last_week_of_year_has_monday
137
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mysql_yearweek
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Dean Morin
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-26 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: ! " MySQL's `yearweek` function has eight different modes for determining
15
+ the\n yearweek. This will get the same yearweek for each mode, with `4` being
16
+ the\n default mode.\n"
17
+ email: morin.dean@gmail.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - lib/mysql_yearweek.rb
23
+ homepage: http://github.com/deanmorin/mysql_yearweek
24
+ licenses:
25
+ - MIT
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 1.8.23
45
+ signing_key:
46
+ specification_version: 3
47
+ summary: Returns yearweek values equivalent to the MySQL function
48
+ test_files: []