us_bank_holidays 0.0.5 → 0.2.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 +5 -5
- data/.travis.yml +3 -3
- data/README.md +4 -2
- data/lib/us_bank_holidays/holiday_year.rb +28 -22
- data/lib/us_bank_holidays/version.rb +1 -1
- data/lib/us_bank_holidays.rb +20 -0
- data/spec/functional/holiday_year_spec.rb +104 -19
- data/spec/functional/month_spec.rb +5 -5
- data/spec/functional/us_bank_holidays_spec.rb +237 -176
- data/us_bank_holidays.gemspec +1 -1
- metadata +16 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 8db39160147df2816e65af1fd851ff2fdc9488bdc189101c7bc03e86395a0189
|
4
|
+
data.tar.gz: ad4e2585e1539f8d82e8f1b11dd1b10b9625c57f019e85944a1b961baf699af9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f4933efb849b3df1673ccf858494d9ba183baa980193a980a15ccb0adf51d3527b42ce4a8c93a23bb402b0399f0510d14aaebf6c38f0a8b875a6172b7f43703
|
7
|
+
data.tar.gz: b78c5d1a86ae39a7307155580d8c33b15d0feb317fee9a680a1fbb7bcb20ee60a14b2e7444d11020937b2a5222bd1f31ec3cd2cdbf6c4028d18badd6ace3973f
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -12,8 +12,8 @@ Patches `Date` to make working with US bank holidays easier
|
|
12
12
|
|
13
13
|
Tested against the following Ruby runtimes:
|
14
14
|
|
15
|
-
* MRI
|
16
|
-
* JRuby
|
15
|
+
* MRI 2.3, 2.4, 2.5
|
16
|
+
* JRuby 9
|
17
17
|
* Rubinius (latest)
|
18
18
|
|
19
19
|
## Installation
|
@@ -46,6 +46,8 @@ date.bank_holiday? # Returns false
|
|
46
46
|
date.weekend? # Returns false
|
47
47
|
date.next_banking_day # Returns Monday, January 6, 2014
|
48
48
|
date.banking_day? # Returns true
|
49
|
+
date.first_banking_day_of_month? # Returns false
|
50
|
+
date.last_banking_day_of_month? # Returns false
|
49
51
|
|
50
52
|
Date.new(2014, 1, 16).add_banking_days(2) # Returns Tuesday, January 21, 2014
|
51
53
|
Date.new(2014, 1, 5).previous_banking_day # Returns Friday, January 3, 2014
|
@@ -9,6 +9,7 @@ module UsBankHolidays
|
|
9
9
|
:mlk_day,
|
10
10
|
:washingtons_birthday,
|
11
11
|
:memorial_day,
|
12
|
+
:juneteenth,
|
12
13
|
:independence_day,
|
13
14
|
:labor_day,
|
14
15
|
:columbus_day,
|
@@ -26,26 +27,27 @@ module UsBankHolidays
|
|
26
27
|
end
|
27
28
|
|
28
29
|
# Returns the federal holidays for the given year on the dates they will actually
|
29
|
-
# be observed.
|
30
|
-
# Saturday December 31 will also be included.
|
30
|
+
# be observed.
|
31
31
|
def bank_holidays
|
32
32
|
@bank_holidays ||= begin
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
33
|
+
holidays = [
|
34
|
+
new_years_day,
|
35
|
+
mlk_day,
|
36
|
+
washingtons_birthday,
|
37
|
+
memorial_day,
|
38
|
+
juneteenth,
|
39
|
+
independence_day,
|
40
|
+
labor_day,
|
41
|
+
columbus_day,
|
42
|
+
veterans_day,
|
43
|
+
thanksgiving,
|
44
|
+
christmas
|
45
|
+
].compact
|
46
|
+
if Date.new(year + 1, 1, 1).saturday? && ::UsBankHolidays.saturday_holiday_date_rolling?
|
47
|
+
holidays << Date.new(year, 12, 31)
|
48
|
+
end
|
49
|
+
holidays.freeze
|
50
|
+
end
|
49
51
|
end
|
50
52
|
|
51
53
|
{
|
@@ -97,7 +99,10 @@ module UsBankHolidays
|
|
97
99
|
# First of the year, rolls either forward or back.
|
98
100
|
@new_years_day = roll_nominal(Date.new(year, 1, 1))
|
99
101
|
|
100
|
-
#
|
102
|
+
# 19th of June
|
103
|
+
@juneteenth = (year > 2020 ? roll_nominal(Date.new(year, 6, 19)) : nil )
|
104
|
+
|
105
|
+
# 4th of July
|
101
106
|
@independence_day = roll_nominal(Date.new(year, 7, 4))
|
102
107
|
|
103
108
|
# November 11
|
@@ -107,11 +112,12 @@ module UsBankHolidays
|
|
107
112
|
@christmas = roll_nominal(Date.new(year, 12, 25))
|
108
113
|
end
|
109
114
|
|
110
|
-
# Figures out where to roll the given nominal date. If it's a Saturday
|
111
|
-
#
|
115
|
+
# Figures out where to roll the given nominal date. If it's a Saturday and
|
116
|
+
# Saturday holiday date rolling is enabled (see UsBankHolidays#saturday_holiday_date_rolling?),
|
117
|
+
# assumes it's the day before (Friday), if Sunday it's the date after (Monday), otherwise
|
112
118
|
# just returns self.
|
113
119
|
def roll_nominal(nominal)
|
114
|
-
if nominal.saturday?
|
120
|
+
if nominal.saturday? && ::UsBankHolidays.saturday_holiday_date_rolling?
|
115
121
|
nominal - 1
|
116
122
|
elsif nominal.sunday?
|
117
123
|
nominal + 1
|
data/lib/us_bank_holidays.rb
CHANGED
@@ -14,6 +14,8 @@ module UsBankHolidays
|
|
14
14
|
# Returns true if the given date is a bank holiday, false otherwise.
|
15
15
|
# Pass the optional 'include_weekends' to control whether weekends should count as
|
16
16
|
# bank holidays (default is true).
|
17
|
+
# If include_weekends is set to false but the date is a Federal bank holiday,
|
18
|
+
# returns true (Ex: 4th of July, 2015, Christmas Day 2016)
|
17
19
|
def self.bank_holiday?(date, include_weekends = true)
|
18
20
|
if include_weekends && weekend?(date)
|
19
21
|
true
|
@@ -44,6 +46,12 @@ module UsBankHolidays
|
|
44
46
|
end
|
45
47
|
end
|
46
48
|
|
49
|
+
# If enabled (ENV["NO_FRIDAY_HOLIDAY_ACH"]), a Friday that falls a day before
|
50
|
+
# a Saturday that's a bank holiday is considered a bank holiday
|
51
|
+
def self.saturday_holiday_date_rolling?
|
52
|
+
!!ENV["NO_FRIDAY_HOLIDAY_ACH"]
|
53
|
+
end
|
54
|
+
|
47
55
|
# Instance methods to be injected into the Date class
|
48
56
|
module DateMethods
|
49
57
|
|
@@ -55,6 +63,8 @@ module UsBankHolidays
|
|
55
63
|
# Returns true if the date is a bank holiday, false otherwise.
|
56
64
|
# Pass the optional 'include_weekends' to control whether weekends should count as
|
57
65
|
# bank holidays (default is true).
|
66
|
+
# If include_weekends is set to false but the date is a Federal bank holiday,
|
67
|
+
# returns true (Ex: 4th of July, 2015, Christmas Day 2016)
|
58
68
|
def bank_holiday?(include_weekends = true)
|
59
69
|
::UsBankHolidays.bank_holiday? self, include_weekends
|
60
70
|
end
|
@@ -87,6 +97,16 @@ module UsBankHolidays
|
|
87
97
|
def banking_day?
|
88
98
|
!bank_holiday?
|
89
99
|
end
|
100
|
+
|
101
|
+
# Returns true if the date is the last banking day of the month, false otherwise.
|
102
|
+
def last_banking_day_of_month?
|
103
|
+
!bank_holiday? && next_banking_day.month != month
|
104
|
+
end
|
105
|
+
|
106
|
+
# Returns true if the date is the first banking day of the month, false otherwise.
|
107
|
+
def first_banking_day_of_month?
|
108
|
+
!bank_holiday? && previous_banking_day.month != month
|
109
|
+
end
|
90
110
|
end
|
91
111
|
|
92
112
|
end
|
@@ -1,24 +1,109 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe UsBankHolidays::HolidayYear do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
3
|
+
RSpec.describe UsBankHolidays::HolidayYear do
|
4
|
+
|
5
|
+
context "should determine bank holidays" do
|
6
|
+
|
7
|
+
context "Before 2021" do
|
8
|
+
|
9
|
+
context "Force Saturday date rolling" do
|
10
|
+
before :each do
|
11
|
+
allow(::UsBankHolidays).to receive(:saturday_holiday_date_rolling?).and_return(true)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should determine bank holidays' do
|
15
|
+
expect(UsBankHolidays::HolidayYear.new(2017).bank_holidays).to eq([
|
16
|
+
'2017-01-02', #New Year’s Day
|
17
|
+
'2017-01-16', #Birthday of Martin Luther King, Jr.
|
18
|
+
'2017-02-20', #Washington’s Birthday
|
19
|
+
'2017-05-29', #Memorial Day
|
20
|
+
'2017-07-04', #Independence Day
|
21
|
+
'2017-09-04', #Labor Day
|
22
|
+
'2017-10-09', #Columbus Day
|
23
|
+
'2017-11-10', #Veterans Day
|
24
|
+
'2017-11-23', #Thanksgiving Day
|
25
|
+
'2017-12-25' #Christmas Day
|
26
|
+
].map { |d| Date.parse(d) }
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
context "No Saturday date rolling" do
|
33
|
+
it 'should determine bank holidays' do
|
34
|
+
expect(UsBankHolidays::HolidayYear.new(2017).bank_holidays).to eq([
|
35
|
+
'2017-01-02', #New Year’s Day
|
36
|
+
'2017-01-16', #Birthday of Martin Luther King, Jr.
|
37
|
+
'2017-02-20', #Washington’s Birthday
|
38
|
+
'2017-05-29', #Memorial Day
|
39
|
+
'2017-07-04', #Independence Day
|
40
|
+
'2017-09-04', #Labor Day
|
41
|
+
'2017-10-09', #Columbus Day
|
42
|
+
'2017-11-11', #Veterans Day
|
43
|
+
'2017-11-23', #Thanksgiving Day
|
44
|
+
'2017-12-25' #Christmas Day
|
45
|
+
].map { |d| Date.parse(d) }
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
context "2021 and later" do
|
54
|
+
|
55
|
+
context "Force Saturday date rolling" do
|
56
|
+
|
57
|
+
before :each do
|
58
|
+
allow(::UsBankHolidays).to receive(:saturday_holiday_date_rolling?).and_return(true)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should determine bank holidays' do
|
62
|
+
expect(UsBankHolidays::HolidayYear.new(2021).bank_holidays).to eq([
|
63
|
+
'2021-01-01', #New Year’s Day
|
64
|
+
'2021-01-18', #Birthday of Martin Luther King, Jr.
|
65
|
+
'2021-02-15', #Washington’s Birthday
|
66
|
+
'2021-05-31', #Memorial Day
|
67
|
+
'2021-06-18', #Juneteenth
|
68
|
+
'2021-07-05', #Independence Day
|
69
|
+
'2021-09-06', #Labor Day
|
70
|
+
'2021-10-11', #Columbus Day
|
71
|
+
'2021-11-11', #Veterans Day
|
72
|
+
'2021-11-25', #Thanksgiving Day
|
73
|
+
'2021-12-24', #Christmas Day
|
74
|
+
'2021-12-31' #New Year’s Day
|
75
|
+
].map { |d| Date.parse(d) }
|
76
|
+
)
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
context "No Saturday date rolling" do
|
82
|
+
before :each do
|
83
|
+
allow(::UsBankHolidays).to receive(:saturday_holiday_date_rolling?).and_return(false)
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'should determine bank holidays' do
|
87
|
+
expect(UsBankHolidays::HolidayYear.new(2021).bank_holidays).to eq([
|
88
|
+
'2021-01-01', #New Year’s Day
|
89
|
+
'2021-01-18', #Birthday of Martin Luther King, Jr.
|
90
|
+
'2021-02-15', #Washington’s Birthday
|
91
|
+
'2021-05-31', #Memorial Day
|
92
|
+
'2021-06-19', #Juneteenth
|
93
|
+
'2021-07-05', #Independence Day
|
94
|
+
'2021-09-06', #Labor Day
|
95
|
+
'2021-10-11', #Columbus Day
|
96
|
+
'2021-11-11', #Veterans Day
|
97
|
+
'2021-11-25', #Thanksgiving Day
|
98
|
+
'2021-12-25' #Christmas Day
|
99
|
+
].map { |d| Date.parse(d) }
|
100
|
+
)
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
19
106
|
|
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
107
|
end
|
23
108
|
|
24
109
|
context 'Months' do
|
@@ -39,7 +124,7 @@ describe UsBankHolidays::HolidayYear do
|
|
39
124
|
:december => 12
|
40
125
|
}.each do |month_name, month_index|
|
41
126
|
it "should respond to '#{month_name}' and return the right month" do
|
42
|
-
year.respond_to?(month_name).
|
127
|
+
expect(year.respond_to?(month_name)).to eq(true)
|
43
128
|
month = year.send(month_name)
|
44
129
|
month.year.should == 2014
|
45
130
|
month.month.should == month_index
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe UsBankHolidays::Month do
|
3
|
+
RSpec.describe UsBankHolidays::Month do
|
4
4
|
let(:january) { UsBankHolidays::Month.new(2014, 1) }
|
5
5
|
|
6
6
|
it 'should record the correct month' do
|
@@ -23,19 +23,19 @@ describe UsBankHolidays::Month do
|
|
23
23
|
|
24
24
|
it 'should return true if the month contains the given date' do
|
25
25
|
(1..31).each do |mday|
|
26
|
-
january.contains?(Date.new(january.year, january.month, mday)).should
|
26
|
+
january.contains?(Date.new(january.year, january.month, mday)).should eq(true)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'should return false if the month is not the same' do
|
31
31
|
(1..31).each do |mday|
|
32
|
-
january.contains?(Date.new(2014, 8, mday)).should
|
32
|
+
january.contains?(Date.new(2014, 8, mday)).should eq(false)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'should return false if the year is not the same' do
|
37
37
|
(1..31).each do |mday|
|
38
|
-
january.contains?(Date.new(2015, 1, mday)).should
|
38
|
+
january.contains?(Date.new(2015, 1, mday)).should eq(false)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
end
|
@@ -113,4 +113,4 @@ Su Mo Tu We Th Fr Sa
|
|
113
113
|
|
114
114
|
end
|
115
115
|
end
|
116
|
-
end
|
116
|
+
end
|
@@ -1,221 +1,282 @@
|
|
1
1
|
require 'spec_helper'
|
2
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
|
-
}
|
3
|
+
RSpec.describe UsBankHolidays do
|
84
4
|
|
85
5
|
let(:sample_weekends) { [Date.new(2014, 2, 1), Date.new(2014, 2, 2)] }
|
86
6
|
|
87
7
|
let(:sample_weekdays) { [3, 4, 5, 6, 7].map{|d| Date.new(2014, 2, d) } }
|
88
8
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
9
|
+
context "with saturday holiday date rolling" do
|
10
|
+
|
11
|
+
let(:sample_holidays) {
|
12
|
+
[
|
13
|
+
'2014-01-01', #New Year’s Day
|
14
|
+
'2014-01-20', #Birthday of Martin Luther King, Jr.
|
15
|
+
'2014-02-17', #Washington’s Birthday
|
16
|
+
'2014-05-26', #Memorial Day
|
17
|
+
'2014-07-04', #Independence Day
|
18
|
+
'2014-09-01', #Labor Day
|
19
|
+
'2014-10-13', #Columbus Day
|
20
|
+
'2014-11-11', #Veterans Day
|
21
|
+
'2014-11-27', #Thanksgiving Day
|
22
|
+
'2014-12-25', #Christmas Day
|
23
|
+
|
24
|
+
'2015-01-01', #New Year’s Day
|
25
|
+
'2015-01-19', #Birthday of Martin Luther King, Jr.
|
26
|
+
'2015-02-16', #Washington’s Birthday
|
27
|
+
'2015-05-25', #Memorial Day
|
28
|
+
'2015-07-03', #Independence Day
|
29
|
+
'2015-09-07', #Labor Day
|
30
|
+
'2015-10-12', #Columbus Day
|
31
|
+
'2015-11-11', #Veterans Day
|
32
|
+
'2015-11-26', #Thanksgiving Day
|
33
|
+
'2015-12-25', #Christmas Day
|
34
|
+
|
35
|
+
'2016-01-01', #New Year’s Day
|
36
|
+
'2016-01-18', #Birthday of Martin Luther King, Jr.
|
37
|
+
'2016-02-15', #Washington’s Birthday
|
38
|
+
'2016-05-30', #Memorial Day
|
39
|
+
'2016-07-04', #Independence Day
|
40
|
+
'2016-09-05', #Labor Day
|
41
|
+
'2016-10-10', #Columbus Day
|
42
|
+
'2016-11-11', #Veterans Day
|
43
|
+
'2016-11-24', #Thanksgiving Day
|
44
|
+
'2016-12-26', #Christmas Day
|
45
|
+
|
46
|
+
'2017-01-02', #New Year’s Day
|
47
|
+
'2017-01-16', #Birthday of Martin Luther King, Jr.
|
48
|
+
'2017-02-20', #Washington’s Birthday
|
49
|
+
'2017-05-29', #Memorial Day
|
50
|
+
'2017-07-04', #Independence Day
|
51
|
+
'2017-09-04', #Labor Day
|
52
|
+
'2017-10-09', #Columbus Day
|
53
|
+
'2017-11-10', #Veterans Day
|
54
|
+
'2017-11-23', #Thanksgiving Day
|
55
|
+
'2017-12-25', #Christmas Day
|
56
|
+
|
57
|
+
'2018-01-01', #New Year’s Day
|
58
|
+
'2018-01-15', #Birthday of Martin Luther King, Jr.
|
59
|
+
'2018-02-19', #Washington’s Birthday
|
60
|
+
'2018-05-28', #Memorial Day
|
61
|
+
'2018-07-04', #Independence Day
|
62
|
+
'2018-09-03', #Labor Day
|
63
|
+
'2018-10-08', #Columbus Day
|
64
|
+
'2018-11-12', #Veterans Day
|
65
|
+
'2018-11-22', #Thanksgiving Day
|
66
|
+
'2018-12-25', #Christmas Day
|
67
|
+
|
68
|
+
'2019-01-01', #New Year’s Day
|
69
|
+
'2019-01-21', #Birthday of Martin Luther King, Jr.
|
70
|
+
'2019-02-18', #Washington’s Birthday
|
71
|
+
'2019-05-27', #Memorial Day
|
72
|
+
'2019-07-04', #Independence Day
|
73
|
+
'2019-09-02', #Labor Day
|
74
|
+
'2019-10-14', #Columbus Day
|
75
|
+
'2019-11-11', #Veterans Day
|
76
|
+
'2019-11-28', #Thanksgiving Day
|
77
|
+
'2019-12-25', #Christmas Day
|
78
|
+
|
79
|
+
'2020-01-01', #New Year’s Day
|
80
|
+
'2020-01-20', #Birthday of Martin Luther King, Jr.
|
81
|
+
'2020-02-17', #Washington’s Birthday
|
82
|
+
'2020-05-25', #Memorial Day
|
83
|
+
'2020-07-03', #Independence Day
|
84
|
+
'2020-09-07', #Labor Day
|
85
|
+
'2020-10-12', #Columbus Day
|
86
|
+
'2020-11-11', #Veterans Day
|
87
|
+
'2020-11-26', #Thanksgiving Day
|
88
|
+
'2020-12-25', #Christmas Day
|
89
|
+
|
90
|
+
'2021-01-01',
|
91
|
+
'2021-01-18',
|
92
|
+
'2021-02-15',
|
93
|
+
'2021-05-31',
|
94
|
+
'2021-07-04',
|
95
|
+
'2021-09-06',
|
96
|
+
'2021-10-11',
|
97
|
+
'2021-11-11',
|
98
|
+
'2021-11-25',
|
99
|
+
'2021-12-25'
|
100
|
+
|
101
|
+
].map {|date_str| Date.parse(date_str) }
|
102
|
+
}
|
103
|
+
|
104
|
+
before :each do
|
105
|
+
allow(::UsBankHolidays).to receive(:saturday_holiday_date_rolling?).and_return(true)
|
102
106
|
end
|
103
107
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
108
|
+
describe '.bank_holiday?' do
|
109
|
+
it 'should determine bank holidays on the list' do
|
110
|
+
sample_holidays.each { |holiday|
|
111
|
+
UsBankHolidays.bank_holiday?(holiday).should eq(true)
|
112
|
+
UsBankHolidays.banking_day?(holiday).should eq(false)
|
113
|
+
}
|
114
|
+
end
|
109
115
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
end
|
116
|
+
it 'weekends should be bank holidays' do
|
117
|
+
sample_weekends.each { |weekend|
|
118
|
+
UsBankHolidays.bank_holiday?(weekend).should eq(true)
|
119
|
+
UsBankHolidays.banking_day?(weekend).should eq(false)
|
120
|
+
}
|
121
|
+
end
|
117
122
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
}
|
124
|
-
end
|
123
|
+
it 'should exclude weekends if the appropriate flag is passed' do
|
124
|
+
sample_weekends.each { |weekend|
|
125
|
+
UsBankHolidays.bank_holiday?(weekend, false).should eq(false)
|
126
|
+
}
|
127
|
+
end
|
125
128
|
|
126
|
-
|
127
|
-
|
129
|
+
it 'regular days should not be bank holidays' do
|
130
|
+
sample_weekdays.each { |day|
|
131
|
+
UsBankHolidays.bank_holiday?(day).should eq(false)
|
132
|
+
UsBankHolidays.banking_day?(day).should eq(true)
|
133
|
+
}
|
134
|
+
end
|
128
135
|
end
|
129
|
-
end
|
130
|
-
|
131
|
-
describe ::UsBankHolidays::DateMethods do
|
132
136
|
|
133
137
|
describe '.weekend?' do
|
134
|
-
|
135
138
|
it 'should recognize weekends' do
|
136
139
|
sample_weekends.each { |weekend|
|
137
|
-
weekend.
|
138
|
-
weekend.
|
140
|
+
UsBankHolidays.weekend?(weekend).should eq(true)
|
141
|
+
UsBankHolidays.banking_day?(weekend).should eq(false)
|
139
142
|
}
|
140
143
|
end
|
141
144
|
|
142
145
|
it 'weekdays should not be considered weekends' do
|
143
|
-
sample_weekdays.each { |day|
|
144
|
-
day.weekend?.should be_false
|
145
|
-
day.banking_day?.should be_true
|
146
|
-
}
|
146
|
+
sample_weekdays.each { |day| UsBankHolidays.weekend?(day).should eq(false) }
|
147
147
|
end
|
148
|
-
|
149
148
|
end
|
150
149
|
|
151
|
-
describe
|
150
|
+
describe ::UsBankHolidays::DateMethods do
|
152
151
|
|
153
|
-
|
154
|
-
sample_holidays.each { |holiday|
|
155
|
-
holiday.bank_holiday?.should be_true
|
156
|
-
holiday.banking_day?.should be_false
|
157
|
-
}
|
158
|
-
end
|
152
|
+
describe '.weekend?' do
|
159
153
|
|
160
|
-
|
161
|
-
|
162
|
-
|
154
|
+
it 'should recognize weekends' do
|
155
|
+
sample_weekends.each { |weekend|
|
156
|
+
weekend.weekend?.should eq(true)
|
157
|
+
weekend.banking_day?.should eq(false)
|
158
|
+
}
|
159
|
+
end
|
163
160
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
161
|
+
it 'weekdays should not be considered weekends' do
|
162
|
+
sample_weekdays.each { |day|
|
163
|
+
day.weekend?.should eq(false)
|
164
|
+
day.banking_day?.should eq(true)
|
165
|
+
}
|
166
|
+
end
|
170
167
|
|
171
|
-
it 'should not treat regular weekdays as bank holidays' do
|
172
|
-
sample_weekdays.each { |day|
|
173
|
-
day.bank_holiday?.should be_false
|
174
|
-
day.banking_day?.should be_true
|
175
|
-
}
|
176
168
|
end
|
177
169
|
|
178
|
-
|
179
|
-
|
170
|
+
describe '.bank_holiday?' do
|
171
|
+
|
172
|
+
it 'should recognize bank holidays' do
|
173
|
+
sample_holidays.each { |holiday|
|
174
|
+
holiday.bank_holiday?.should eq(true)
|
175
|
+
holiday.banking_day?.should eq(false)
|
176
|
+
}
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'should treat weekends as bank holidays' do
|
180
|
+
sample_weekends.each { |weekend| weekend.bank_holiday?.should eq(true) }
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'should exclude weekends if the appropriate flag is passed' do
|
184
|
+
sample_weekends.each { |weekend|
|
185
|
+
weekend.weekend?.should eq(true)
|
186
|
+
weekend.bank_holiday?(false).should eq(false)
|
187
|
+
}
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'should not treat regular weekdays as bank holidays' do
|
191
|
+
sample_weekdays.each { |day|
|
192
|
+
day.bank_holiday?.should eq(false)
|
193
|
+
day.banking_day?.should eq(true)
|
194
|
+
}
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'if Jan. 1 falls on a Saturday, Dec. 31 of the previous year should be a bank holiday' do
|
198
|
+
Date.new(2021, 12, 31).bank_holiday?.should eq(true)
|
199
|
+
end
|
180
200
|
end
|
181
|
-
end
|
182
201
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
202
|
+
describe '.next_banking_day' do
|
203
|
+
it 'should determine the next banking day' do
|
204
|
+
Date.new(2014, 1, 1).next_banking_day.should == Date.new(2014, 1, 2)
|
205
|
+
Date.new(2014, 1, 2).next_banking_day.should == Date.new(2014, 1, 3)
|
206
|
+
Date.new(2014, 1, 3).next_banking_day.should == Date.new(2014, 1, 6)
|
207
|
+
Date.new(2014, 1, 4).next_banking_day.should == Date.new(2014, 1, 6)
|
208
|
+
Date.new(2014, 1, 5).next_banking_day.should == Date.new(2014, 1, 6)
|
209
|
+
end
|
190
210
|
end
|
191
|
-
end
|
192
211
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
212
|
+
describe '.previous_baking_day' do
|
213
|
+
it 'should determine the previous banking day' do
|
214
|
+
Date.new(2014, 1, 7).previous_banking_day.should == Date.new(2014, 1, 6)
|
215
|
+
Date.new(2014, 1, 6).previous_banking_day.should == Date.new(2014, 1, 3)
|
216
|
+
Date.new(2014, 1, 5).previous_banking_day.should == Date.new(2014, 1, 3)
|
217
|
+
Date.new(2014, 1, 4).previous_banking_day.should == Date.new(2014, 1, 3)
|
218
|
+
Date.new(2014, 1, 21).previous_banking_day.should == Date.new(2014, 1, 17)
|
219
|
+
end
|
200
220
|
end
|
201
|
-
end
|
202
221
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
222
|
+
describe '.add_banking_days' do
|
223
|
+
it 'should return self if given 0' do
|
224
|
+
Date.new(2014, 1, 7).add_banking_days(0).should == Date.new(2014, 1, 7)
|
225
|
+
end
|
226
|
+
|
227
|
+
it 'should return self if given 0 even if self is a bank holiday' do
|
228
|
+
Date.new(2014, 1, 4).add_banking_days(0).should == Date.new(2014, 1, 4)
|
229
|
+
end
|
207
230
|
|
208
|
-
|
209
|
-
|
231
|
+
it 'if given a positive number, should add banking days, ignoring bank holidays' do
|
232
|
+
Date.new(2014, 1, 16).add_banking_days(2).should == Date.new(2014, 1, 21)
|
233
|
+
end
|
234
|
+
|
235
|
+
it 'if given a negative number, should subtract banking days, ignoring bank holidays' do
|
236
|
+
Date.new(2014, 1, 21).add_banking_days(-2).should == Date.new(2014, 1, 16)
|
237
|
+
end
|
210
238
|
end
|
211
239
|
|
212
|
-
|
213
|
-
|
240
|
+
describe '.last_banking_day_of_month?' do
|
241
|
+
it 'should determine if a date is the last banking day of the month' do
|
242
|
+
Date.new(2014, 1, 31).last_banking_day_of_month?.should eq(true)
|
243
|
+
Date.new(2014, 1, 30).last_banking_day_of_month?.should eq(false)
|
244
|
+
|
245
|
+
Date.new(2014, 11, 30).last_banking_day_of_month?.should eq(false)
|
246
|
+
Date.new(2014, 11, 28).last_banking_day_of_month?.should eq(true)
|
247
|
+
end
|
214
248
|
end
|
215
249
|
|
216
|
-
|
217
|
-
|
250
|
+
describe '.first_banking_day_of_month?' do
|
251
|
+
it 'should determine if the date if the first banking day of the month' do
|
252
|
+
Date.new(2014, 4, 1).first_banking_day_of_month?.should eq(true)
|
253
|
+
Date.new(2014, 4, 2).first_banking_day_of_month?.should eq(false)
|
254
|
+
|
255
|
+
Date.new(2014, 6, 1).first_banking_day_of_month?.should eq(false)
|
256
|
+
Date.new(2014, 6, 2).first_banking_day_of_month?.should eq(true)
|
257
|
+
end
|
218
258
|
end
|
219
259
|
end
|
220
260
|
end
|
261
|
+
|
262
|
+
context "no saturday holiday date rolling" do
|
263
|
+
|
264
|
+
before :each do
|
265
|
+
allow(::UsBankHolidays).to receive(:saturday_holiday_date_rolling?).and_return(false)
|
266
|
+
end
|
267
|
+
|
268
|
+
let(:banking_days) {
|
269
|
+
[
|
270
|
+
'2021-06-18',
|
271
|
+
'2021-12-31'
|
272
|
+
].map {|date_str| Date.parse(date_str) }
|
273
|
+
}
|
274
|
+
|
275
|
+
specify 'banking days' do
|
276
|
+
banking_days.each { |date|
|
277
|
+
UsBankHolidays.bank_holiday?(date).should eq(false)
|
278
|
+
UsBankHolidays.banking_day?(date).should eq(true)
|
279
|
+
}
|
280
|
+
end
|
281
|
+
end
|
221
282
|
end
|
data/us_bank_holidays.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_development_dependency 'bundler'
|
21
|
+
spec.add_development_dependency 'bundler'
|
22
22
|
spec.add_development_dependency 'rake'
|
23
23
|
spec.add_development_dependency 'rspec'
|
24
24
|
spec.add_development_dependency 'simplecov'
|
metadata
CHANGED
@@ -1,69 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: us_bank_holidays
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arthur Shagall
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-11-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: simplecov
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
description: Simplify working with US bank holidays.
|
@@ -73,7 +73,7 @@ executables: []
|
|
73
73
|
extensions: []
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
|
-
- .travis.yml
|
76
|
+
- ".travis.yml"
|
77
77
|
- Gemfile
|
78
78
|
- LICENSE.txt
|
79
79
|
- README.md
|
@@ -97,17 +97,17 @@ require_paths:
|
|
97
97
|
- lib
|
98
98
|
required_ruby_version: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
|
-
- -
|
100
|
+
- - ">="
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: '0'
|
103
103
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
104
|
requirements:
|
105
|
-
- -
|
105
|
+
- - ">="
|
106
106
|
- !ruby/object:Gem::Version
|
107
107
|
version: '0'
|
108
108
|
requirements: []
|
109
109
|
rubyforge_project:
|
110
|
-
rubygems_version: 2.
|
110
|
+
rubygems_version: 2.7.8
|
111
111
|
signing_key:
|
112
112
|
specification_version: 4
|
113
113
|
summary: Patches Date to add methods to make dealing with US bank holidays simpler.
|