us_bank_holidays 0.0.1
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.
- checksums.yaml +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +45 -0
- data/Rakefile +5 -0
- data/lib/us_bank_holidays.rb +67 -0
- data/lib/us_bank_holidays/holiday_year.rb +86 -0
- data/lib/us_bank_holidays/month.rb +92 -0
- data/lib/us_bank_holidays/version.rb +3 -0
- data/spec/functional/holiday_year_spec.rb +23 -0
- data/spec/functional/month_spec.rb +95 -0
- data/spec/functional/us_bank_holidays_spec.rb +184 -0
- data/spec/spec_helper.rb +16 -0
- data/us_bank_holidays.gemspec +25 -0
- metadata +117 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2c3a4c8155f725d440890a1d187c38596f34b326
|
4
|
+
data.tar.gz: 239f7ae539a79fce66e8eb97fd8d78e110bea7d2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e5631bf04812d8a388c88a0a5e834f7dfb8d9eadbd44baa9308ceb5aac6c74030545f2ce276f45c63a27e3c2daeb5afabdf510562f27d7796dd0ea4c81a7b0f1
|
7
|
+
data.tar.gz: 7f2af15f67b235524fb4a818c33aa5fdadc85b964495a56602e973190ed91ae35012560ffeb5c45572ba9f8c027ab1ef0d7e74349ab3449340e3091e9fa1f6bf
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Arthur Shagall
|
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,45 @@
|
|
1
|
+
# UsBankHolidays
|
2
|
+
|
3
|
+
Patches `Date` to make working with US bank holidays easier
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'us_bank_holidays'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install us_bank_holidays
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
First, load the gem.
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
require 'us_bank_holidays'
|
25
|
+
```
|
26
|
+
|
27
|
+
This adds the following features to dates.
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
date = Date.new(2014, 1, 3) # Friday, January 3, 2014
|
31
|
+
date.bank_holiday? # Returns false
|
32
|
+
date.weekend? # Returns false
|
33
|
+
date.next_banking_day # Returns Monday, January 6, 2014
|
34
|
+
|
35
|
+
Date.new(2014, 1, 16).add_banking_days(2) # Returns Tuesday, January 21, 2014
|
36
|
+
```
|
37
|
+
|
38
|
+
## Contributing
|
39
|
+
|
40
|
+
1. Fork it
|
41
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
42
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
43
|
+
4. Make sure all your changes are covered by tests
|
44
|
+
5. Push to the branch (`git push origin my-new-feature`)
|
45
|
+
6. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
require 'us_bank_holidays/version'
|
4
|
+
require 'us_bank_holidays/holiday_year'
|
5
|
+
require 'us_bank_holidays/month'
|
6
|
+
|
7
|
+
module UsBankHolidays
|
8
|
+
|
9
|
+
def self.weekend?(date)
|
10
|
+
date.sunday? || date.saturday?
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.bank_holiday?(date)
|
14
|
+
weekend?(date) ||
|
15
|
+
::UsBankHolidays::HolidayYear.new(date.year).bank_holidays.include?(date)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.next_banking_day(date)
|
19
|
+
if (next_date = date + 1).bank_holiday?
|
20
|
+
next_banking_day(next_date)
|
21
|
+
else
|
22
|
+
next_date
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.previous_banking_day(date)
|
27
|
+
if (previous_date = date - 1).bank_holiday?
|
28
|
+
previous_banking_day(previous_date)
|
29
|
+
else
|
30
|
+
previous_date
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
module DateMethods
|
35
|
+
|
36
|
+
def weekend?
|
37
|
+
::UsBankHolidays.weekend? self
|
38
|
+
end
|
39
|
+
|
40
|
+
def bank_holiday?
|
41
|
+
::UsBankHolidays.bank_holiday? self
|
42
|
+
end
|
43
|
+
|
44
|
+
def next_banking_day
|
45
|
+
::UsBankHolidays.next_banking_day self
|
46
|
+
end
|
47
|
+
|
48
|
+
def previous_banking_day
|
49
|
+
::UsBankHolidays.previous_banking_day self
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_banking_days(days)
|
53
|
+
day = self
|
54
|
+
if days > 0
|
55
|
+
days.times { day = day.next_banking_day }
|
56
|
+
elsif days < 0
|
57
|
+
(-days).times { day = day.previous_banking_day }
|
58
|
+
end
|
59
|
+
day
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
::Date.class_eval do
|
66
|
+
include ::UsBankHolidays::DateMethods
|
67
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module UsBankHolidays
|
2
|
+
|
3
|
+
class HolidayYear
|
4
|
+
|
5
|
+
attr_reader :year,
|
6
|
+
:new_years_day,
|
7
|
+
:mlk_day,
|
8
|
+
:washingtons_birthday,
|
9
|
+
:memorial_day,
|
10
|
+
:independence_day,
|
11
|
+
:labor_day,
|
12
|
+
:columbus_day,
|
13
|
+
:veterans_day,
|
14
|
+
:thanksgiving,
|
15
|
+
:christmas
|
16
|
+
|
17
|
+
def initialize(year)
|
18
|
+
@year = year
|
19
|
+
|
20
|
+
# First of the year, rolls either forward or back.
|
21
|
+
@new_years_day = roll_nominal(Date.new(year, 1, 1))
|
22
|
+
|
23
|
+
# Third Monday of January
|
24
|
+
@mlk_day = ::UsBankHolidays::Month.new(year, 1).mondays[2]
|
25
|
+
|
26
|
+
# Third Monday of February
|
27
|
+
@washingtons_birthday = ::UsBankHolidays::Month.new(year, 2).mondays[2]
|
28
|
+
|
29
|
+
# Last Monday of May
|
30
|
+
@memorial_day = ::UsBankHolidays::Month.new(year, 5).mondays.last
|
31
|
+
|
32
|
+
# 4'th of July
|
33
|
+
@independence_day = roll_nominal(Date.new(year, 7, 4))
|
34
|
+
|
35
|
+
# First Monday of September
|
36
|
+
@labor_day = ::UsBankHolidays::Month.new(year, 9).mondays.first
|
37
|
+
|
38
|
+
# Second Monday of October
|
39
|
+
@columbus_day = ::UsBankHolidays::Month.new(year, 10).mondays[1]
|
40
|
+
|
41
|
+
# November 11
|
42
|
+
@veterans_day = roll_nominal(Date.new(year, 11, 11))
|
43
|
+
|
44
|
+
# Fourth Thursday of November
|
45
|
+
@thanksgiving = ::UsBankHolidays::Month.new(year, 11).thursdays[3]
|
46
|
+
|
47
|
+
# December 25
|
48
|
+
@christmas = roll_nominal(Date.new(year, 12, 25))
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
def bank_holidays
|
53
|
+
@bank_holidays ||= begin
|
54
|
+
holidays = [ new_years_day,
|
55
|
+
mlk_day,
|
56
|
+
washingtons_birthday,
|
57
|
+
memorial_day,
|
58
|
+
independence_day,
|
59
|
+
labor_day,
|
60
|
+
columbus_day,
|
61
|
+
veterans_day,
|
62
|
+
thanksgiving,
|
63
|
+
christmas
|
64
|
+
]
|
65
|
+
if Date.new(year + 1, 1, 1).saturday?
|
66
|
+
holidays << Date.new(year, 12, 31)
|
67
|
+
end
|
68
|
+
holidays.freeze
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def roll_nominal(nominal)
|
75
|
+
if nominal.saturday?
|
76
|
+
nominal - 1
|
77
|
+
elsif nominal.sunday?
|
78
|
+
nominal + 1
|
79
|
+
else
|
80
|
+
nominal
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module UsBankHolidays
|
2
|
+
|
3
|
+
# Utility class to make it easier to work with a particular month
|
4
|
+
class Month
|
5
|
+
|
6
|
+
attr_reader :year, :month
|
7
|
+
|
8
|
+
def initialize(year, month)
|
9
|
+
if month < 1 || month > 12
|
10
|
+
raise ArgumentError, "Month is out of range, must be between 1 and 12, got #{month}"
|
11
|
+
end
|
12
|
+
@month = month
|
13
|
+
@year = year
|
14
|
+
init_month
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
@to_s ||= begin
|
19
|
+
wks = @weeks.map { |w|
|
20
|
+
w.map { |d|
|
21
|
+
if d.nil?
|
22
|
+
' '
|
23
|
+
elsif d.day < 10
|
24
|
+
" #{d.day}"
|
25
|
+
else
|
26
|
+
"#{d.day}"
|
27
|
+
end
|
28
|
+
}.join(' ')
|
29
|
+
}.join("\n")
|
30
|
+
"Su Mo Tu We Th Fr Sa\n#{wks}\n"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
{
|
35
|
+
:sundays => 0,
|
36
|
+
:mondays => 1,
|
37
|
+
:tuesdays => 2,
|
38
|
+
:wednesdays => 3,
|
39
|
+
:thursdays => 4,
|
40
|
+
:fridays => 5,
|
41
|
+
:saturdays => 6
|
42
|
+
}.each do |day, index|
|
43
|
+
|
44
|
+
define_method(day) do
|
45
|
+
@weeks.map { |w|
|
46
|
+
w[index]
|
47
|
+
}.compact
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def init_month
|
55
|
+
@weeks = []
|
56
|
+
current_date = Date.new(year, month, 1)
|
57
|
+
week = init_first_week(current_date)
|
58
|
+
while current_date.month == month
|
59
|
+
week << current_date
|
60
|
+
current_date += 1
|
61
|
+
if week.size == 7 || current_date.month != month
|
62
|
+
@weeks << week.freeze
|
63
|
+
unless current_date.month > month
|
64
|
+
week = []
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
@weeks.freeze
|
69
|
+
end
|
70
|
+
|
71
|
+
def init_first_week(start_date)
|
72
|
+
case start_date.wday
|
73
|
+
when 0
|
74
|
+
[]
|
75
|
+
when 1
|
76
|
+
[nil]
|
77
|
+
when 2
|
78
|
+
[nil, nil]
|
79
|
+
when 3
|
80
|
+
[nil, nil, nil]
|
81
|
+
when 4
|
82
|
+
[nil, nil, nil, nil]
|
83
|
+
when 5
|
84
|
+
[nil, nil, nil, nil, nil]
|
85
|
+
when 6
|
86
|
+
[nil, nil, nil, nil, nil, nil]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe UsBankHolidays::HolidayYear do
|
4
|
+
|
5
|
+
it 'should determine bank holidays' do
|
6
|
+
UsBankHolidays::HolidayYear.new(2017).bank_holidays.should == [
|
7
|
+
'2017-01-02', #New Year’s Day
|
8
|
+
'2017-01-16', #Birthday of Martin Luther King, Jr.
|
9
|
+
'2017-02-20', #Washington’s Birthday
|
10
|
+
'2017-05-29', #Memorial Day
|
11
|
+
'2017-07-04', #Independence Day
|
12
|
+
'2017-09-04', #Labor Day
|
13
|
+
'2017-10-09', #Columbus Day
|
14
|
+
'2017-11-10', #Veterans Day
|
15
|
+
'2017-11-23', #Thanksgiving Day
|
16
|
+
'2017-12-25' #Christmas Day
|
17
|
+
].map{|d| Date.parse(d) }
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should declare Dec. 31 a bank holiday if it falls on a Friday' do
|
21
|
+
UsBankHolidays::HolidayYear.new(2021).bank_holidays.last.should == Date.new(2021, 12, 31)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe UsBankHolidays::Month do
|
4
|
+
let(:january) { UsBankHolidays::Month.new(2014, 1) }
|
5
|
+
|
6
|
+
it 'should record the correct month' do
|
7
|
+
january.month.should == 1
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should record the correct year' do
|
11
|
+
january.year.should == 2014
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should raise an error if the month is out of range' do
|
15
|
+
[0,13].each { |m|
|
16
|
+
expect {
|
17
|
+
UsBankHolidays::Month.new(2014, m)
|
18
|
+
}.to raise_error(ArgumentError)
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '.to_s' do
|
23
|
+
|
24
|
+
let(:january_str) {
|
25
|
+
<<-JAN
|
26
|
+
Su Mo Tu We Th Fr Sa
|
27
|
+
1 2 3 4
|
28
|
+
5 6 7 8 9 10 11
|
29
|
+
12 13 14 15 16 17 18
|
30
|
+
19 20 21 22 23 24 25
|
31
|
+
26 27 28 29 30 31
|
32
|
+
JAN
|
33
|
+
}
|
34
|
+
|
35
|
+
let(:february_str) {
|
36
|
+
<<-FEB
|
37
|
+
Su Mo Tu We Th Fr Sa
|
38
|
+
1 2 3 4 5 6 7
|
39
|
+
8 9 10 11 12 13 14
|
40
|
+
15 16 17 18 19 20 21
|
41
|
+
22 23 24 25 26 27 28
|
42
|
+
FEB
|
43
|
+
}
|
44
|
+
|
45
|
+
let(:august_str) {
|
46
|
+
<<-AUG
|
47
|
+
Su Mo Tu We Th Fr Sa
|
48
|
+
1 2
|
49
|
+
3 4 5 6 7 8 9
|
50
|
+
10 11 12 13 14 15 16
|
51
|
+
17 18 19 20 21 22 23
|
52
|
+
24 25 26 27 28 29 30
|
53
|
+
31
|
54
|
+
AUG
|
55
|
+
}
|
56
|
+
|
57
|
+
let(:december_str) {
|
58
|
+
<<-DEC
|
59
|
+
Su Mo Tu We Th Fr Sa
|
60
|
+
1 2 3 4 5
|
61
|
+
6 7 8 9 10 11 12
|
62
|
+
13 14 15 16 17 18 19
|
63
|
+
20 21 22 23 24 25 26
|
64
|
+
27 28 29 30 31
|
65
|
+
DEC
|
66
|
+
}
|
67
|
+
|
68
|
+
it 'should convert the month to a string representation' do
|
69
|
+
UsBankHolidays::Month.new(2014, 1).to_s.should == january_str
|
70
|
+
UsBankHolidays::Month.new(2015, 2).to_s.should == february_str
|
71
|
+
UsBankHolidays::Month.new(2014, 8).to_s.should == august_str
|
72
|
+
UsBankHolidays::Month.new(2015, 12).to_s.should == december_str
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'days of week' do
|
77
|
+
{
|
78
|
+
:sundays => [5, 12, 19, 26],
|
79
|
+
:mondays => [6, 13, 20, 27],
|
80
|
+
:tuesdays => [7, 14, 21, 28],
|
81
|
+
:wednesdays => [1, 8, 15, 22, 29],
|
82
|
+
:thursdays => [2, 9, 16, 23, 30],
|
83
|
+
:fridays => [3, 10, 17, 24, 31],
|
84
|
+
:saturdays => [4, 11, 18, 25]
|
85
|
+
}.each do |method, days|
|
86
|
+
|
87
|
+
describe ".#{method}" do
|
88
|
+
it 'should gather up the required days and compact out the nils' do
|
89
|
+
january.send(method).map{|dt| dt.day }.should == days
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe UsBankHolidays do
|
4
|
+
let(:sample_holidays) {
|
5
|
+
[
|
6
|
+
'2014-01-01', #New Year’s Day
|
7
|
+
'2014-01-20', #Birthday of Martin Luther King, Jr.
|
8
|
+
'2014-02-17', #Washington’s Birthday
|
9
|
+
'2014-05-26', #Memorial Day
|
10
|
+
'2014-07-04', #Independence Day
|
11
|
+
'2014-09-01', #Labor Day
|
12
|
+
'2014-10-13', #Columbus Day
|
13
|
+
'2014-11-11', #Veterans Day
|
14
|
+
'2014-11-27', #Thanksgiving Day
|
15
|
+
'2014-12-25', #Christmas Day
|
16
|
+
|
17
|
+
'2015-01-01', #New Year’s Day
|
18
|
+
'2015-01-19', #Birthday of Martin Luther King, Jr.
|
19
|
+
'2015-02-16', #Washington’s Birthday
|
20
|
+
'2015-05-25', #Memorial Day
|
21
|
+
'2015-07-03', #Independence Day
|
22
|
+
'2015-09-07', #Labor Day
|
23
|
+
'2015-10-12', #Columbus Day
|
24
|
+
'2015-11-11', #Veterans Day
|
25
|
+
'2015-11-26', #Thanksgiving Day
|
26
|
+
'2015-12-25', #Christmas Day
|
27
|
+
|
28
|
+
'2016-01-01', #New Year’s Day
|
29
|
+
'2016-01-18', #Birthday of Martin Luther King, Jr.
|
30
|
+
'2016-02-15', #Washington’s Birthday
|
31
|
+
'2016-05-30', #Memorial Day
|
32
|
+
'2016-07-04', #Independence Day
|
33
|
+
'2016-09-05', #Labor Day
|
34
|
+
'2016-10-10', #Columbus Day
|
35
|
+
'2016-11-11', #Veterans Day
|
36
|
+
'2016-11-24', #Thanksgiving Day
|
37
|
+
'2016-12-26', #Christmas Day
|
38
|
+
|
39
|
+
'2017-01-02', #New Year’s Day
|
40
|
+
'2017-01-16', #Birthday of Martin Luther King, Jr.
|
41
|
+
'2017-02-20', #Washington’s Birthday
|
42
|
+
'2017-05-29', #Memorial Day
|
43
|
+
'2017-07-04', #Independence Day
|
44
|
+
'2017-09-04', #Labor Day
|
45
|
+
'2017-10-09', #Columbus Day
|
46
|
+
'2017-11-10', #Veterans Day
|
47
|
+
'2017-11-23', #Thanksgiving Day
|
48
|
+
'2017-12-25', #Christmas Day
|
49
|
+
|
50
|
+
'2018-01-01', #New Year’s Day
|
51
|
+
'2018-01-15', #Birthday of Martin Luther King, Jr.
|
52
|
+
'2018-02-19', #Washington’s Birthday
|
53
|
+
'2018-05-28', #Memorial Day
|
54
|
+
'2018-07-04', #Independence Day
|
55
|
+
'2018-09-03', #Labor Day
|
56
|
+
'2018-10-08', #Columbus Day
|
57
|
+
'2018-11-12', #Veterans Day
|
58
|
+
'2018-11-22', #Thanksgiving Day
|
59
|
+
'2018-12-25', #Christmas Day
|
60
|
+
|
61
|
+
'2019-01-01', #New Year’s Day
|
62
|
+
'2019-01-21', #Birthday of Martin Luther King, Jr.
|
63
|
+
'2019-02-18', #Washington’s Birthday
|
64
|
+
'2019-05-27', #Memorial Day
|
65
|
+
'2019-07-04', #Independence Day
|
66
|
+
'2019-09-02', #Labor Day
|
67
|
+
'2019-10-14', #Columbus Day
|
68
|
+
'2019-11-11', #Veterans Day
|
69
|
+
'2019-11-28', #Thanksgiving Day
|
70
|
+
'2019-12-25', #Christmas Day
|
71
|
+
|
72
|
+
'2020-01-01', #New Year’s Day
|
73
|
+
'2020-01-20', #Birthday of Martin Luther King, Jr.
|
74
|
+
'2020-02-17', #Washington’s Birthday
|
75
|
+
'2020-05-25', #Memorial Day
|
76
|
+
'2020-07-03', #Independence Day
|
77
|
+
'2020-09-07', #Labor Day
|
78
|
+
'2020-10-12', #Columbus Day
|
79
|
+
'2020-11-11', #Veterans Day
|
80
|
+
'2020-11-26', #Thanksgiving Day
|
81
|
+
'2020-12-25' #Christmas Day
|
82
|
+
].map {|date_str| Date.parse(date_str) }
|
83
|
+
}
|
84
|
+
|
85
|
+
let(:sample_weekends) { [Date.new(2014, 2, 1), Date.new(2014, 2, 2)] }
|
86
|
+
|
87
|
+
let(:sample_weekdays) { [3, 4, 5, 6, 7].map{|d| Date.new(2014, 2, d) } }
|
88
|
+
|
89
|
+
describe '.bank_holiday?' do
|
90
|
+
it 'should determine bank holidays on the list' do
|
91
|
+
sample_holidays.each{ |holiday| UsBankHolidays.bank_holiday?(holiday).should be_true }
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'weekends should be bank holidays' do
|
95
|
+
sample_weekends.each{ |weekend| UsBankHolidays.bank_holiday?(weekend).should be_true }
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'regular days should not be bank holidays' do
|
99
|
+
sample_weekdays.each { |day| UsBankHolidays.bank_holiday?(day).should be_false }
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe '.weekend?' do
|
104
|
+
it 'should recognize weekends' do
|
105
|
+
sample_weekends.each{ |weekend| UsBankHolidays.weekend?(weekend).should be_true }
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'weekdays should not be considered weekends' do
|
109
|
+
sample_weekdays.each { |day| UsBankHolidays.weekend?(day).should be_false }
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe ::UsBankHolidays::DateMethods do
|
114
|
+
|
115
|
+
describe '.bank_holiday?' do
|
116
|
+
|
117
|
+
it 'should recognize bank holidays' do
|
118
|
+
sample_holidays.each{ |holiday| holiday.bank_holiday?.should be_true }
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should treat weekends as bank holidays' do
|
122
|
+
sample_weekends.each{ |weekend| weekend.bank_holiday?.should be_true }
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'should not treat regular weekdays as bank holidays' do
|
126
|
+
sample_weekdays.each { |day| day.bank_holiday?.should be_false }
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'if Jan. 1 falls on a Saturday, Dec. 31 of the previous year should be a bank holiday' do
|
130
|
+
Date.new(2021, 12, 31).bank_holiday?.should be_true
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe '.weekend?' do
|
135
|
+
|
136
|
+
it 'should recognize weekends' do
|
137
|
+
sample_weekends.each{ |weekend| weekend.weekend?.should be_true }
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'weekdays should not be considered weekends' do
|
141
|
+
sample_weekdays.each { |day| day.weekend?.should be_false }
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
|
146
|
+
describe '.next_banking_day' do
|
147
|
+
it 'should determine the next banking day' do
|
148
|
+
Date.new(2014, 1, 1).next_banking_day.should == Date.new(2014, 1, 2)
|
149
|
+
Date.new(2014, 1, 2).next_banking_day.should == Date.new(2014, 1, 3)
|
150
|
+
Date.new(2014, 1, 3).next_banking_day.should == Date.new(2014, 1, 6)
|
151
|
+
Date.new(2014, 1, 4).next_banking_day.should == Date.new(2014, 1, 6)
|
152
|
+
Date.new(2014, 1, 5).next_banking_day.should == Date.new(2014, 1, 6)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe '.previous_baking_day' do
|
157
|
+
it 'should determine the previous banking day' do
|
158
|
+
Date.new(2014, 1, 7).previous_banking_day.should == Date.new(2014, 1, 6)
|
159
|
+
Date.new(2014, 1, 6).previous_banking_day.should == Date.new(2014, 1, 3)
|
160
|
+
Date.new(2014, 1, 5).previous_banking_day.should == Date.new(2014, 1, 3)
|
161
|
+
Date.new(2014, 1, 4).previous_banking_day.should == Date.new(2014, 1, 3)
|
162
|
+
Date.new(2014, 1, 21).previous_banking_day.should == Date.new(2014, 1, 17)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
describe '.add_banking_days' do
|
167
|
+
it 'should return self if given 0' do
|
168
|
+
Date.new(2014, 1, 7).add_banking_days(0).should == Date.new(2014, 1, 7)
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'should return self if given 0 even if self is a bank holiday' do
|
172
|
+
Date.new(2014, 1, 4).add_banking_days(0).should == Date.new(2014, 1, 4)
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'if given a positive number, should add banking days, ignoring bank holidays' do
|
176
|
+
Date.new(2014, 1, 16).add_banking_days(2).should == Date.new(2014, 1, 21)
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'if given a negative number, should subtract banking days, ignoring bank holidays' do
|
180
|
+
Date.new(2014, 1, 21).add_banking_days(-2).should == Date.new(2014, 1, 16)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
unless ENV['TRAVIS']
|
2
|
+
require 'simplecov'
|
3
|
+
SimpleCov.start
|
4
|
+
end
|
5
|
+
|
6
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'us_bank_holidays')
|
7
|
+
|
8
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
9
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
10
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
11
|
+
# loaded once.
|
12
|
+
#
|
13
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
14
|
+
RSpec.configure do |config|
|
15
|
+
config.fail_fast = true
|
16
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'us_bank_holidays/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "us_bank_holidays"
|
8
|
+
spec.version = UsBankHolidays::VERSION
|
9
|
+
spec.authors = ["Arthur Shagall"]
|
10
|
+
spec.email = ["arthur.shagall@gmail.com"]
|
11
|
+
spec.description = %q{Simplify working with US bank holidays.}
|
12
|
+
spec.summary = %q{Patches Date to add methods to make dealing with US bank holidays simpler.}
|
13
|
+
spec.homepage = "https://github.com/albertosaurus/us_bank_holidays"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/) - ['.gitignore', '.rvmrc', '.rspec']
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
22
|
+
spec.add_development_dependency 'rake'
|
23
|
+
spec.add_development_dependency 'rspec'
|
24
|
+
spec.add_development_dependency 'simplecov'
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: us_bank_holidays
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Arthur Shagall
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-02-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
requirement: !ruby/object:Gem::Requirement
|
21
|
+
requirements:
|
22
|
+
- - ~>
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: '1.3'
|
25
|
+
prerelease: false
|
26
|
+
type: :development
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
prerelease: false
|
40
|
+
type: :development
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - '>='
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
prerelease: false
|
54
|
+
type: :development
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: simplecov
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
prerelease: false
|
68
|
+
type: :development
|
69
|
+
description: Simplify working with US bank holidays.
|
70
|
+
email:
|
71
|
+
- arthur.shagall@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- Gemfile
|
77
|
+
- LICENSE.txt
|
78
|
+
- README.md
|
79
|
+
- Rakefile
|
80
|
+
- lib/us_bank_holidays.rb
|
81
|
+
- lib/us_bank_holidays/holiday_year.rb
|
82
|
+
- lib/us_bank_holidays/month.rb
|
83
|
+
- lib/us_bank_holidays/version.rb
|
84
|
+
- spec/functional/holiday_year_spec.rb
|
85
|
+
- spec/functional/month_spec.rb
|
86
|
+
- spec/functional/us_bank_holidays_spec.rb
|
87
|
+
- spec/spec_helper.rb
|
88
|
+
- us_bank_holidays.gemspec
|
89
|
+
homepage: https://github.com/albertosaurus/us_bank_holidays
|
90
|
+
licenses:
|
91
|
+
- MIT
|
92
|
+
metadata: {}
|
93
|
+
post_install_message:
|
94
|
+
rdoc_options: []
|
95
|
+
require_paths:
|
96
|
+
- lib
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - '>='
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
requirements: []
|
108
|
+
rubyforge_project:
|
109
|
+
rubygems_version: 2.2.1
|
110
|
+
signing_key:
|
111
|
+
specification_version: 4
|
112
|
+
summary: Patches Date to add methods to make dealing with US bank holidays simpler.
|
113
|
+
test_files:
|
114
|
+
- spec/functional/holiday_year_spec.rb
|
115
|
+
- spec/functional/month_spec.rb
|
116
|
+
- spec/functional/us_bank_holidays_spec.rb
|
117
|
+
- spec/spec_helper.rb
|