holidays 1.1.0 → 1.2.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.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/CHANGELOG.md +5 -0
- data/README.md +15 -11
- data/Rakefile +2 -1
- data/data/federal_reserve.yaml +1 -14
- data/lib/holidays.rb +29 -9
- data/lib/holidays/federal_reserve.rb +1 -10
- data/lib/holidays/version.rb +1 -1
- data/test/defs/test_defs_federal_reserve.rb +1 -3
- data/test/test_holidays.rb +15 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 858b7ca8ee12adf0ca16bd039b094ac5b396592b
|
4
|
+
data.tar.gz: 6dea8e8c8abc0ecb1e1983a932aa8877c60544ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9be91c59476aebe6cb91da7ab7c2a7003d0286e2e723c4853f804e62f96b33681bdc2797fe73170dfbd67a659725e2ee34c28717d9da30b0fbc6c523dde90716
|
7
|
+
data.tar.gz: 51a8a704f91f3966ecba80796a02d3087db3966afa8a59f492a9efe7ef272f2f00bf98154fde2dd4ff1b7149506d9ef198ba01163f211ac69f6bea650d890aa9
|
data/.coveralls.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
service_name: travis-ci
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Ruby Holidays Gem CHANGELOG
|
2
2
|
|
3
|
+
## 1.2.0
|
4
|
+
|
5
|
+
* Remove inauguration day from USA Federal Reserve definitions (https://github.com/aripollak)
|
6
|
+
* Add caching functionality for date ranges (https://github.com/ndbroadbent & https://github.com/ghiculescu)
|
7
|
+
|
3
8
|
## 1.1.0
|
4
9
|
|
5
10
|
* Add support to load custom holidays on the fly
|
data/README.md
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
-
# Ruby Holidays Gem
|
1
|
+
# Ruby Holidays Gem [](https://travis-ci.org/alexdunae/holidays)
|
2
2
|
|
3
3
|
A set of functions to deal with holidays in Ruby.
|
4
4
|
|
5
5
|
Extends Ruby's built-in Date class and supports custom holiday definition lists.
|
6
6
|
|
7
|
+
Full documentation can be found [here](http://www.rubydoc.info/github/alexdunae/holidays/master/frames).
|
8
|
+
|
7
9
|
## Installation
|
8
10
|
|
9
11
|
To install the gem from RubyGems:
|
@@ -94,6 +96,14 @@ Lookup Canada Day in different regions.
|
|
94
96
|
d.holiday?(:fr) # France
|
95
97
|
=> false
|
96
98
|
|
99
|
+
### Caching Holiday Lookups
|
100
|
+
|
101
|
+
If you are checking holidays regularly you can cache your results for improved performance. Run this before looking up a holiday (eg. in an initializer):
|
102
|
+
|
103
|
+
Holidays.cache_between(Time.now, 2.years.from_now, :ca, :us, :observed)
|
104
|
+
|
105
|
+
Holidays for the regions specified within the dates specified will be pre-calculated.
|
106
|
+
|
97
107
|
### How to contribute
|
98
108
|
|
99
109
|
To make changes to any of the definitions, edit the YAML files only.
|
@@ -106,14 +116,8 @@ It is also very appreciated if documentation is attached to the pull request. A
|
|
106
116
|
|
107
117
|
### Credits and code
|
108
118
|
|
109
|
-
*
|
110
|
-
*
|
111
|
-
*
|
112
|
-
* Build status: http://travis-ci.org/#!/alexdunae/holidays
|
113
|
-
|
114
|
-
Started by [Alex Dunae](http://dunae.ca) (e-mail 'code' at the same domain), 2007-12.
|
115
|
-
Maintained by [Hana Wang](https://github.com/hahahana), 2013
|
116
|
-
|
117
|
-
On Twitter: @MrMrBug.
|
119
|
+
* Started by [Alex Dunae](http://dunae.ca) (e-mail 'code' at the same domain), 2007-12
|
120
|
+
* Maintained by [Hana Wang](https://github.com/hahahana), 2013
|
121
|
+
* Maintained by [Phil Trimble](https://github.com/ptrimble), 2014-present
|
118
122
|
|
119
|
-
|
123
|
+
Plus all of these [wonderful contributors!](https://github.com/alexdunae/holidays/contributors)
|
data/Rakefile
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
$:.unshift File.expand_path('../lib', __FILE__)
|
2
|
+
$:.unshift File.expand_path('../test', __FILE__)
|
2
3
|
|
3
4
|
require 'bundler/gem_tasks'
|
4
5
|
require 'rake/testtask'
|
@@ -8,7 +9,7 @@ require 'holidays'
|
|
8
9
|
|
9
10
|
Rake::TestTask.new(:test) do |t|
|
10
11
|
t.libs << 'test'
|
11
|
-
t.test_files = FileList['test/**/
|
12
|
+
t.test_files = FileList['test/**/test_*.rb']
|
12
13
|
end
|
13
14
|
|
14
15
|
task :default => :test
|
data/data/federal_reserve.yaml
CHANGED
@@ -15,9 +15,6 @@ months:
|
|
15
15
|
week: 3
|
16
16
|
wday: 1
|
17
17
|
regions: [federal_reserve]
|
18
|
-
- name: Inauguration Day
|
19
|
-
function: us_inauguration_day(year)
|
20
|
-
regions: [federal_reserve]
|
21
18
|
2:
|
22
19
|
- name: Washington's Birthday
|
23
20
|
week: 3
|
@@ -57,14 +54,6 @@ months:
|
|
57
54
|
regions: [federal_reserve]
|
58
55
|
mday: 25
|
59
56
|
observed: to_monday_if_sunday
|
60
|
-
methods:
|
61
|
-
us_inauguration_day: |
|
62
|
-
# January 20, every fourth year, following Presidential election
|
63
|
-
def self.us_inauguration_day(year)
|
64
|
-
year % 4 == 1 ? 20 : nil
|
65
|
-
end
|
66
|
-
|
67
|
-
|
68
57
|
tests: |
|
69
58
|
{Date.civil(2012,1,2) => "New Year's Day",
|
70
59
|
Date.civil(2012,1,16) => "Birthday of Martin Luther King, Jr",
|
@@ -87,7 +76,7 @@ tests: |
|
|
87
76
|
Date.civil(2013,11,11) => "Veterans Day",
|
88
77
|
Date.civil(2013,11,28) => "Thanksgiving Day",
|
89
78
|
Date.civil(2013,12,25) => "Christmas Day",
|
90
|
-
|
79
|
+
|
91
80
|
Date.civil(2014,1,1) => "New Year's Day",
|
92
81
|
Date.civil(2014,1,20) => "Birthday of Martin Luther King, Jr",
|
93
82
|
Date.civil(2014,2,17) => "Washington's Birthday",
|
@@ -120,8 +109,6 @@ tests: |
|
|
120
109
|
Date.civil(2016,11,11) => "Veterans Day",
|
121
110
|
Date.civil(2016,11,24) => "Thanksgiving Day",
|
122
111
|
Date.civil(2016,12,26) => "Christmas Day",
|
123
|
-
|
124
|
-
Date.civil(2017,1, 20) => "Inauguration Day",
|
125
112
|
}.each do |date, name|
|
126
113
|
assert_equal name, (Holidays.on(date, :federal_reserve, :observed)[0] || {})[:name]
|
127
114
|
end
|
data/lib/holidays.rb
CHANGED
@@ -51,6 +51,13 @@ module Holidays
|
|
51
51
|
@@holidays_by_month = {}
|
52
52
|
@@proc_cache = {}
|
53
53
|
|
54
|
+
@@cache = {}
|
55
|
+
@@cache_range = {}
|
56
|
+
class << self
|
57
|
+
def cache_range; @@cache_range; end
|
58
|
+
def cache; @@cache; end
|
59
|
+
end
|
60
|
+
|
54
61
|
WEEKS = {:first => 1, :second => 2, :third => 3, :fourth => 4, :fifth => 5, :last => -1, :second_last => -2, :third_last => -3}
|
55
62
|
MONTH_LENGTHS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
56
63
|
DAY_SYMBOLS = Date::DAYNAMES.collect { |n| n.downcase.intern }
|
@@ -108,16 +115,14 @@ module Holidays
|
|
108
115
|
end_date = end_date.new_offset(0) + end_date.offset if end_date.respond_to?(:new_offset)
|
109
116
|
|
110
117
|
# get simple dates
|
111
|
-
|
112
|
-
start_date = start_date.to_date
|
113
|
-
else
|
114
|
-
start_date = Date.civil(start_date.year, start_date.mon, start_date.mday)
|
115
|
-
end
|
118
|
+
start_date, end_date = get_date(start_date), get_date(end_date)
|
116
119
|
|
117
|
-
if
|
118
|
-
|
119
|
-
|
120
|
-
|
120
|
+
if range = @@cache_range[options]
|
121
|
+
if range.begin < start_date && range.end > end_date
|
122
|
+
return @@cache[options].select do |holiday|
|
123
|
+
holiday[:date] >= start_date && holiday[:date] <= end_date
|
124
|
+
end
|
125
|
+
end
|
121
126
|
end
|
122
127
|
|
123
128
|
regions, observed, informal = parse_options(options)
|
@@ -179,6 +184,13 @@ module Holidays
|
|
179
184
|
holidays.sort{|a, b| a[:date] <=> b[:date] }
|
180
185
|
end
|
181
186
|
|
187
|
+
# Allows a developer to explicitly calculate and cache holidays within a given period
|
188
|
+
def self.cache_between(start_date, end_date, *options)
|
189
|
+
start_date, end_date = get_date(start_date), get_date(end_date)
|
190
|
+
@@cache[options] = between(start_date, end_date, *options)
|
191
|
+
@@cache_range[options] = start_date..end_date
|
192
|
+
end
|
193
|
+
|
182
194
|
# Merge a new set of definitions into the Holidays module.
|
183
195
|
#
|
184
196
|
# This method is automatically called when including holiday definition
|
@@ -336,6 +348,14 @@ private
|
|
336
348
|
return regions, observed, informal
|
337
349
|
end
|
338
350
|
|
351
|
+
def self.get_date(date)
|
352
|
+
if date.respond_to?(:to_date)
|
353
|
+
date.to_date
|
354
|
+
else
|
355
|
+
Date.civil(date.year, date.mon, date.mday)
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
339
359
|
# Derive the containing region from a sub region wild-card or a sub region
|
340
360
|
# and load its definition. (Common code factored out from parse_regions)
|
341
361
|
def self.load_containing_region(sub_reg)
|
@@ -19,8 +19,7 @@ module Holidays
|
|
19
19
|
def self.holidays_by_month
|
20
20
|
{
|
21
21
|
1 => [{:mday => 1, :observed => lambda { |date| Holidays.to_monday_if_sunday(date) }, :observed_id => "to_monday_if_sunday", :name => "New Year's Day", :regions => [:federal_reserve]},
|
22
|
-
{:wday => 1, :week => 3, :name => "Birthday of Martin Luther King, Jr", :regions => [:federal_reserve]},
|
23
|
-
{:function => lambda { |year| Holidays.us_inauguration_day(year) }, :function_id => "us_inauguration_day(year)", :name => "Inauguration Day", :regions => [:federal_reserve]}],
|
22
|
+
{:wday => 1, :week => 3, :name => "Birthday of Martin Luther King, Jr", :regions => [:federal_reserve]}],
|
24
23
|
2 => [{:wday => 1, :week => 3, :name => "Washington's Birthday", :regions => [:federal_reserve]}],
|
25
24
|
5 => [{:wday => 1, :week => -1, :name => "Memorial Day", :regions => [:federal_reserve]}],
|
26
25
|
7 => [{:mday => 4, :observed => lambda { |date| Holidays.to_monday_if_sunday(date) }, :observed_id => "to_monday_if_sunday", :name => "Independence Day", :regions => [:federal_reserve]}],
|
@@ -33,14 +32,6 @@ module Holidays
|
|
33
32
|
end
|
34
33
|
end
|
35
34
|
|
36
|
-
# January 20, every fourth year, following Presidential election
|
37
|
-
def self.us_inauguration_day(year)
|
38
|
-
year % 4 == 1 ? 20 : nil
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
35
|
|
45
36
|
end
|
46
37
|
|
data/lib/holidays/version.rb
CHANGED
@@ -28,7 +28,7 @@ class Federal_reserveDefinitionTests < Test::Unit::TestCase # :nodoc:
|
|
28
28
|
Date.civil(2013,11,11) => "Veterans Day",
|
29
29
|
Date.civil(2013,11,28) => "Thanksgiving Day",
|
30
30
|
Date.civil(2013,12,25) => "Christmas Day",
|
31
|
-
|
31
|
+
|
32
32
|
Date.civil(2014,1,1) => "New Year's Day",
|
33
33
|
Date.civil(2014,1,20) => "Birthday of Martin Luther King, Jr",
|
34
34
|
Date.civil(2014,2,17) => "Washington's Birthday",
|
@@ -61,8 +61,6 @@ class Federal_reserveDefinitionTests < Test::Unit::TestCase # :nodoc:
|
|
61
61
|
Date.civil(2016,11,11) => "Veterans Day",
|
62
62
|
Date.civil(2016,11,24) => "Thanksgiving Day",
|
63
63
|
Date.civil(2016,12,26) => "Christmas Day",
|
64
|
-
|
65
|
-
Date.civil(2017,1, 20) => "Inauguration Day",
|
66
64
|
}.each do |date, name|
|
67
65
|
assert_equal name, (Holidays.on(date, :federal_reserve, :observed)[0] || {})[:name]
|
68
66
|
end
|
data/test/test_holidays.rb
CHANGED
@@ -157,4 +157,19 @@ class HolidaysTests < Test::Unit::TestCase
|
|
157
157
|
}
|
158
158
|
}
|
159
159
|
end
|
160
|
+
|
161
|
+
def test_caching
|
162
|
+
Holidays.cache_between(Date.civil(2008,3,21), Date.civil(2008,3,25), :ca, :informal)
|
163
|
+
|
164
|
+
# Test that cache has been set
|
165
|
+
cache_key = [:ca, :informal]
|
166
|
+
assert_equal Date.civil(2008,3,21), Holidays.cache_range[cache_key].begin
|
167
|
+
assert_equal Date.civil(2008,3,25), Holidays.cache_range[cache_key].end
|
168
|
+
assert_equal Date.civil(2008,3,21), Holidays.cache[cache_key].first[:date]
|
169
|
+
assert_equal Date.civil(2008,3,24), Holidays.cache[cache_key].last[:date]
|
170
|
+
|
171
|
+
# Test that correct results are returned outside the cache range, and with no caching
|
172
|
+
assert_equal 1, Holidays.on(Date.civil(2035,1,1), :ca, :informal).length
|
173
|
+
assert_equal 1, Holidays.on(Date.civil(2035,1,1), :us).length
|
174
|
+
end
|
160
175
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: holidays
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Dunae
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -46,6 +46,7 @@ executables: []
|
|
46
46
|
extensions: []
|
47
47
|
extra_rdoc_files: []
|
48
48
|
files:
|
49
|
+
- ".coveralls.yml"
|
49
50
|
- CHANGELOG.md
|
50
51
|
- Gemfile
|
51
52
|
- LICENSE
|