holidate 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/.gitignore ADDED
@@ -0,0 +1,16 @@
1
+ /holidate-*.gem
2
+ /Gemfile.lock
3
+
4
+ /.bundle/
5
+ /.yardoc
6
+ /_yardoc/
7
+ /coverage/
8
+ /doc/
9
+ /pkg/
10
+ /spec/reports/
11
+ /tmp/
12
+ *.bundle
13
+ *.so
14
+ *.o
15
+ *.a
16
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1 @@
1
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Cohen Carlisle
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # Holidate
2
+
3
+ A simple gem that returns Date objects for holidays
4
+
5
+ # Usage
6
+
7
+ Currently has methods to find the 10 US federal holidays, with year as an optional argument that defaults to the current year.
8
+ ```ruby
9
+ Holidate.new_years_day # alias: new_year
10
+ Holidate.martin_luther_king_jr_day # alias: mlk
11
+ Holidate.washingtons_birthday # alias: washington
12
+ Holidate.memorial_day # alias: memorial
13
+ Holidate.independence_day # alias: july_4
14
+ Holidate.labor_day # alias: labor
15
+ Holidate.columbus_day # alias: columbus
16
+ Holidate.veterans_day # alias: veteran
17
+ Holidate.thanksgiving_day # alias: thanksgiving
18
+ Holidate.christmas_day # alias: xmas
19
+ ```
20
+
21
+ Also has a ::find method that allows you to find the nth day of the week in a given month and year.
22
+ ```ruby
23
+ Holidate.find('1st', 'Friday', 'December', '1985')
24
+ ```
25
+
26
+ You can also find the nth to last day.
27
+ ```ruby
28
+ Holidate.find(:third_to_last, :wed , :oct, :'2013')
29
+ ```
30
+
31
+ ::find is case-insensitive and accepts both strings and symbols.
32
+ It also accepts abbreviations for months and days of the week and allows first, second, etc. to be abbreviated as 1st, 2nd, etc.
33
+ You can also give ::find integers. Day of the week and month should correspond to Date#wday and Date#month, respectively.
34
+ ```ruby
35
+ Holidate.find(-1, 0, 7, 1985) # == Holidate.find('last', 'Sunday', 'July', '1985')
36
+ ```
37
+
38
+ Of course, magic numbers can make code harder to understand, so use with caution.
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'spec'
5
+ t.pattern = 'spec/*_spec.rb'
6
+ end
7
+
8
+ desc 'Run tests'
9
+ task :default => :test
data/holidate.gemspec ADDED
@@ -0,0 +1,18 @@
1
+ require 'date'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'holidate'
5
+ s.version = '0.0.4'
6
+ s.date = Date.today.to_s
7
+ s.summary = 'Holiday Dates'
8
+ s.description = 'A simple gem that returns Date objects for holidays'
9
+ s.authors = ['Cohen Carlisle']
10
+ s.email = 'holidate.gem@gmail.com'
11
+ s.files = `git ls-files`.split("\n")
12
+ s.homepage = 'http://rubygems.org/gems/holidate'
13
+ s.license = 'MIT'
14
+
15
+ s.add_development_dependency 'bundler', '~> 1.7'
16
+ s.add_development_dependency 'rake', '~> 10.0'
17
+ s.add_development_dependency 'minitest', '~> 5.5'
18
+ end
data/lib/holidate.rb CHANGED
@@ -1,91 +1,92 @@
1
1
  require 'date'
2
2
 
3
3
  class Holidate
4
- def self.find nth_, wday_, month_, year_=Date.today.year
4
+ def self.find(nth_, wday_, month_, year_=Date.today.year)
5
5
  nth = nth_int(nth_)
6
6
  wday = wday_int(wday_)
7
7
  month = month_int(month_)
8
8
  year = year_int(year_)
9
9
  if nth > 0
10
- Date.new year, month, ( 1 + ( nth - 1) * 7 + (wday - Date.new(year, month, 1).wday) % 7)
10
+ Date.new(year, month, (1 + (nth - 1) * 7 + (wday - Date.new(year, month, 1).wday) % 7))
11
11
  else
12
- days_in_month = ((Date.new(year, month) >> 1) -1).day
13
- Date.new year, month, (days_in_month - (-nth - 1) * 7 - (Date.new(year, month, days_in_month).wday - wday) % 7)
12
+ days_in_month = ((Date.new(year, month) >> 1) - 1).day
13
+ Date.new(year, month, (days_in_month - (-nth - 1) * 7 - (Date.new(year, month, days_in_month).wday - wday) % 7))
14
14
  end
15
15
  end
16
16
  singleton_class.send(:alias_method, :find_day, :find)
17
17
 
18
- def self.new_years_day year=Date.today.year
19
- Date.new year, 1, 1
18
+ def self.new_years_day(year=Date.today.year)
19
+ Date.new(year, 1, 1)
20
20
  end
21
21
  singleton_class.send(:alias_method, :new_year, :new_years_day)
22
22
 
23
- def self.martin_luther_king_jr_day year=Date.today.year
24
- find 'third', 'monday', 'january', year
23
+ def self.martin_luther_king_jr_day(year=Date.today.year)
24
+ find('third', 'monday', 'january', year)
25
25
  end
26
26
  singleton_class.send(:alias_method, :mlk, :martin_luther_king_jr_day)
27
27
 
28
- def self.washingtons_birthday year=Date.today.year
29
- find 'third', 'monday', 'february', year
28
+ def self.washingtons_birthday(year=Date.today.year)
29
+ find('third', 'monday', 'february', year)
30
30
  end
31
31
  singleton_class.send(:alias_method, :washington, :washingtons_birthday)
32
32
 
33
- def self.memorial_day year=Date.today.year
34
- find 'last', 'monday', 'may', year
33
+ def self.memorial_day(year=Date.today.year)
34
+ find('last', 'monday', 'may', year)
35
35
  end
36
36
  singleton_class.send(:alias_method, :memorial, :memorial_day)
37
37
 
38
- def self.independence_day year=Date.today.year
39
- Date.new year, 7, 4
38
+ def self.independence_day(year=Date.today.year)
39
+ Date.new(year, 7, 4)
40
40
  end
41
41
  singleton_class.send(:alias_method, :july_4, :independence_day)
42
42
 
43
- def self.labor_day year=Date.today.year
44
- find 'first', 'monday', 'september', year
43
+ def self.labor_day(year=Date.today.year)
44
+ find('first', 'monday', 'september', year)
45
45
  end
46
46
  singleton_class.send(:alias_method, :labor, :labor_day)
47
47
 
48
- def self.columbus_day year=Date.today.year
49
- find 'second', 'monday', 'october', year
48
+ def self.columbus_day(year=Date.today.year)
49
+ find('second', 'monday', 'october', year)
50
50
  end
51
51
  singleton_class.send(:alias_method, :columbus, :columbus_day)
52
52
 
53
- def self.veterans_day year=Date.today.year
54
- Date.new year, 11, 11
53
+ def self.veterans_day(year=Date.today.year)
54
+ Date.new(year, 11, 11)
55
55
  end
56
56
  singleton_class.send(:alias_method, :veteran, :veterans_day)
57
57
 
58
- def self.thanksgiving_day year=Date.today.year
59
- find 'fourth', 'thursday', 'november', year
58
+ def self.thanksgiving_day(year=Date.today.year)
59
+ find('fourth', 'thursday', 'november', year)
60
60
  end
61
61
  singleton_class.send(:alias_method, :thanksgiving, :thanksgiving_day)
62
62
 
63
- def self.christmas_day year=Date.today.year
64
- Date.new year, 12, 25
63
+ def self.christmas_day(year=Date.today.year)
64
+ Date.new(year, 12, 25)
65
65
  end
66
66
  singleton_class.send(:alias_method, :xmas, :christmas_day)
67
67
 
68
- private
68
+ class << self
69
+ protected
69
70
 
70
- def self.nth_int nth_
71
- h = { 'first' => 1, 'second' => 2, 'third' => 3, 'fourth' => 4, 'fifth' => 5, 'last' => 1 }
72
- nth = nth_.to_s.downcase
73
- nth_int = nth.to_i == 0 ? h[nth.split(/[-_ ]/).first] : nth.to_i
74
- nth_int = -nth_int if nth.to_s.downcase.end_with?('last')
75
- nth_int
76
- end
71
+ def nth_int(nth_)
72
+ h = { 'first' => 1, 'second' => 2, 'third' => 3, 'fourth' => 4, 'fifth' => 5, 'last' => 1 }
73
+ nth = nth_.to_s.downcase
74
+ nth_int = (nth.to_i == 0 ? h[nth.split(/[-_ ]/).first] : nth.to_i)
75
+ nth.end_with?('last') ? -nth_int : nth_int
76
+ end
77
77
 
78
- def self.wday_int wday
79
- h = { 'sun' => 0, 'mon' => 1, 'tue' => 2, 'wed' => 3, 'thu' => 4, 'fri' => 5, 'sat' => 6 }
80
- (0..6).include?(wday) ? wday : h[wday.to_s.downcase[0..2]]
81
- end
78
+ def wday_int(wday)
79
+ h = { 'sun' => 0, 'mon' => 1, 'tue' => 2, 'wed' => 3, 'thu' => 4, 'fri' => 5, 'sat' => 6 }
80
+ (0..6).include?(wday) ? wday : h[wday.to_s.downcase[0..2]]
81
+ end
82
82
 
83
- def self.month_int month
84
- h = { 'jan' => 1, 'feb' => 2, 'mar' => 3, 'apr' => 4, 'may' => 5, 'jun' => 6, 'jul' => 7, 'aug' => 8, 'sep' => 9, 'oct' => 10, 'nov' => 11, 'dec' => 12 }
85
- (1..12).include?(month) ? month : h[month.to_s.downcase[0..2]]
86
- end
83
+ def month_int(month)
84
+ h = { 'jan' => 1, 'feb' => 2, 'mar' => 3, 'apr' => 4, 'may' => 5, 'jun' => 6, 'jul' => 7, 'aug' => 8, 'sep' => 9, 'oct' => 10, 'nov' => 11, 'dec' => 12 }
85
+ (1..12).include?(month) ? month : h[month.to_s.downcase[0..2]]
86
+ end
87
87
 
88
- def self.year_int year
89
- year.to_s.to_i
88
+ def year_int(year)
89
+ year.to_s.to_i
90
+ end
90
91
  end
91
92
  end
@@ -0,0 +1,125 @@
1
+ gem 'minitest'
2
+ require 'minitest/spec'
3
+ require 'minitest/autorun'
4
+ require 'holidate'
5
+
6
+ describe Holidate do
7
+
8
+ describe '::new_years_day' do
9
+ it "finds New Year's Day" do
10
+ Holidate.new_year(2014).must_equal Date.new(2014, 1, 1)
11
+ Holidate.new_year(2015).must_equal Date.new(2015, 1, 1)
12
+ Holidate.new_year(2016).must_equal Date.new(2016, 1, 1)
13
+ Holidate.new_year(2017).must_equal Date.new(2017, 1, 1)
14
+ end
15
+ end
16
+
17
+ describe '::martin_luther_king_jr_day' do
18
+ it 'finds Martin Luther King, Jr. Day' do
19
+ Holidate.mlk(2014).must_equal Date.new(2014, 1, 20)
20
+ Holidate.mlk(2015).must_equal Date.new(2015, 1, 19)
21
+ Holidate.mlk(2016).must_equal Date.new(2016, 1, 18)
22
+ Holidate.mlk(2017).must_equal Date.new(2017, 1, 16)
23
+ end
24
+ end
25
+
26
+ describe '::washingtons_birthday' do
27
+ it "finds Washington's Birthday" do
28
+ Holidate.washington(2014).must_equal Date.new(2014, 2, 17)
29
+ Holidate.washington(2015).must_equal Date.new(2015, 2, 16)
30
+ Holidate.washington(2016).must_equal Date.new(2016, 2, 15)
31
+ Holidate.washington(2017).must_equal Date.new(2017, 2, 20)
32
+ end
33
+ end
34
+
35
+ describe '::memorial_day' do
36
+ it 'finds Memorial Day' do
37
+ Holidate.memorial(2014).must_equal Date.new(2014, 5, 26)
38
+ Holidate.memorial(2015).must_equal Date.new(2015, 5, 25)
39
+ Holidate.memorial(2016).must_equal Date.new(2016, 5, 30)
40
+ Holidate.memorial(2017).must_equal Date.new(2017, 5, 29)
41
+ end
42
+ end
43
+
44
+ describe '::independence_day' do
45
+ it 'finds Independence Day' do
46
+ Holidate.july_4(2014).must_equal Date.new(2014, 7, 4)
47
+ Holidate.july_4(2015).must_equal Date.new(2015, 7, 4)
48
+ Holidate.july_4(2016).must_equal Date.new(2016, 7, 4)
49
+ Holidate.july_4(2017).must_equal Date.new(2017, 7, 4)
50
+ end
51
+ end
52
+
53
+ describe '::labor_day' do
54
+ it 'finds Labor Day' do
55
+ Holidate.labor(2014).must_equal Date.new(2014, 9, 1)
56
+ Holidate.labor(2015).must_equal Date.new(2015, 9, 7)
57
+ Holidate.labor(2016).must_equal Date.new(2016, 9, 5)
58
+ Holidate.labor(2017).must_equal Date.new(2017, 9, 4)
59
+ end
60
+ end
61
+
62
+ describe '::columbus_day' do
63
+ it 'finds Columbus Day' do
64
+ Holidate.columbus(2014).must_equal Date.new(2014, 10, 13)
65
+ Holidate.columbus(2015).must_equal Date.new(2015, 10, 12)
66
+ Holidate.columbus(2016).must_equal Date.new(2016, 10, 10)
67
+ Holidate.columbus(2017).must_equal Date.new(2017, 10, 9)
68
+ end
69
+ end
70
+
71
+ describe '::veterans_day' do
72
+ it 'finds Veterans Day' do
73
+ Holidate.veteran(2014).must_equal Date.new(2014, 11, 11)
74
+ Holidate.veteran(2015).must_equal Date.new(2015, 11, 11)
75
+ Holidate.veteran(2016).must_equal Date.new(2016, 11, 11)
76
+ Holidate.veteran(2017).must_equal Date.new(2017, 11, 11)
77
+ end
78
+ end
79
+
80
+ describe '::thanksgiving_day' do
81
+ it 'finds Thanksgiving Day' do
82
+ Holidate.thanksgiving(2014).must_equal Date.new(2014, 11, 27)
83
+ Holidate.thanksgiving(2015).must_equal Date.new(2015, 11, 26)
84
+ Holidate.thanksgiving(2016).must_equal Date.new(2016, 11, 24)
85
+ Holidate.thanksgiving(2017).must_equal Date.new(2017, 11, 23)
86
+ end
87
+ end
88
+
89
+ describe '::christmas_day' do
90
+ it 'finds Christmas Day' do
91
+ Holidate.xmas(2014).must_equal Date.new(2014, 12, 25)
92
+ Holidate.xmas(2015).must_equal Date.new(2015, 12, 25)
93
+ Holidate.xmas(2016).must_equal Date.new(2016, 12, 25)
94
+ Holidate.xmas(2017).must_equal Date.new(2017, 12, 25)
95
+ end
96
+ end
97
+
98
+ describe '::find' do
99
+ it 'accepts a strings, symbols, or integers as arguments' do
100
+ Holidate.find('first', 'Friday', 'December', '1985').must_equal Date.new(1985, 12, 6)
101
+ Holidate.find(:third, :wednesday , :october, :'2013').must_equal Date.new(2013, 10, 16)
102
+ Holidate.find(4, 0, 7, 1985).must_equal Date.new(1985, 7, 28)
103
+ end
104
+
105
+ it 'allows you to search from the beginning or end of a month' do
106
+ Holidate.find('second', 'Tuesday', 'July', 2012).must_equal Date.new(2012, 7, 10)
107
+ Holidate.find('last', 'Thursday', 'January', 2006).must_equal Date.new(2006, 1, 26)
108
+ end
109
+
110
+ it 'allows spaces, underscores, or hyphens to separate words in the first argument when searching from the end of a month' do
111
+ Holidate.find('second to last', 'Tuesday', 'September', 1991).must_equal Date.new(1991, 9, 17)
112
+ Holidate.find('fourth-from-last', 'Thursday', 'April', 2005).must_equal Date.new(2005, 4, 7)
113
+ Holidate.find(:fourth_to_last, :wednesday, :june, 1989).must_equal Date.new(1989, 6, 7)
114
+ end
115
+
116
+ it 'ignores case for string and symbol arguments' do
117
+ Holidate.find('third', 'wednesday', 'october', 2004).must_equal Date.new(2004, 10, 20)
118
+ Holidate.find(:last, :Sunday, :August, 2006).must_equal Date.new(2006, 8, 27)
119
+ end
120
+
121
+ it 'allows abbreviations for the first three arguments' do
122
+ Holidate.find('1st', 'thu', 'jan', 1970).must_equal Date.new(1970, 1, 1)
123
+ end
124
+ end
125
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: holidate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-02-03 00:00:00.000000000 Z
12
+ date: 2015-02-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -65,7 +65,14 @@ executables: []
65
65
  extensions: []
66
66
  extra_rdoc_files: []
67
67
  files:
68
+ - .gitignore
69
+ - Gemfile
70
+ - LICENSE.txt
71
+ - README.md
72
+ - Rakefile
73
+ - holidate.gemspec
68
74
  - lib/holidate.rb
75
+ - spec/holidate_spec.rb
69
76
  homepage: http://rubygems.org/gems/holidate
70
77
  licenses:
71
78
  - MIT