holidays 6.6.0 → 6.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 10ac53801a7e5df310c955e2d14eff378b5486e7f6b8e6e55c2f2f680c3bc68f
4
- data.tar.gz: 249638ac1590932582342b2f6d39eaffca6d408f275420711916d94dce1eadbc
3
+ metadata.gz: 844c8c66842896fceda5b386a64bcfd8d03d51781ebc328bc246ecdc6e41effc
4
+ data.tar.gz: 341f07eb7869fa24a501b1cc3380d36dc7a84fba5f3d70a3d821c53c560db416
5
5
  SHA512:
6
- metadata.gz: 6a53bd90098905e561558ccc5c1adc42a40bbf19647ff70bb5cf846ffa7350cf6ef7958d251e8d6644d0e0ba5d3ef48a5c3fd008fb6c159b82df948a33fb72c5
7
- data.tar.gz: dc023803f7dea3acb449e58c4756b3408586f92b9f83620af72f9c84f712cbec50383198ff455ad97dfc151d1bf7f6e97d40a542dfab014000acace307bd0551
6
+ metadata.gz: 937db688aa9a3eb0b0bd928041eadbfc30b97cf0ffe92f2ee92bf92b160dc44fff196c6c3c84deb5a7cd3bfc8dbdaa2d4d2fb1a91dab83b59da726b7912f43bd
7
+ data.tar.gz: ba21c5e8ef10aa1507385c4cb62e531b9e9dc685190aa67dcd84753963726498828a4b46a9fabc2d4f090a1782bdcfa5325f0f1069214f383819d882d5b6e379
@@ -1,5 +1,9 @@
1
1
  # Ruby Holidays Gem CHANGELOG
2
2
 
3
+ ## 6.6.1
4
+
5
+ * Fixes `any_holidays_during_work_week?` so that it actually does what it says it does [issue-264](https://github.com/holidays/holidays/issues/264)
6
+
3
7
  ## 6.6.0
4
8
 
5
9
  * Update to [v3.0.0 definitions](https://github.com/holidays/definitions/releases/tag/v3.0.0). This required updates to the custom method parser but no behavior changes.
data/README.md CHANGED
@@ -1,21 +1,31 @@
1
1
  # Ruby Holidays Gem [![Build Status](https://travis-ci.org/holidays/holidays.svg?branch=master)](https://travis-ci.org/holidays/holidays)
2
2
 
3
- A set of functions to deal with holidays in Ruby.
3
+ Functionality to deal with holidays in Ruby.
4
4
 
5
- Extends Ruby's built-in Date class and supports custom holiday definition lists.
5
+ Extends Ruby's built-in Date and Time classes and supports custom holiday definition lists.
6
6
 
7
7
  ## Installation
8
8
 
9
- To install the gem from RubyGems:
9
+ ```
10
+ gem install holidays
11
+ ```
10
12
 
11
- gem install holidays
13
+ ## Tested versions
12
14
 
13
- This gem is tested with the following ruby versions: 2.2.0, 2.3.0, 2.4.0, 2.5.0, JRuby
15
+ This gem is tested with the following ruby versions:
16
+
17
+ * 2.2.0
18
+ * 2.3.0,
19
+ * 2.4.0
20
+ * 2.5.0
21
+ * JRuby 9.0.5.0
22
+
23
+ ## Semver
14
24
 
15
25
  This gem follows [semantic versioning](http://semver.org/). The guarantee specifically covers:
16
26
 
17
- * methods in the topmost `Holidays` namespace e.g. `Holidays.<method>`
18
- * the [core extension](#extending-rubys-date-and-time-classes)
27
+ * methods in the top-most `Holidays` namespace e.g. `Holidays.<method>`
28
+ * the [core extensions](#extending-rubys-date-and-time-classes)
19
29
 
20
30
  Please note that we consider definition changes to be 'minor' bumps, meaning they are backwards compatible with your code but might give different holiday results!
21
31
 
@@ -23,159 +33,287 @@ Please note that we consider definition changes to be 'minor' bumps, meaning the
23
33
 
24
34
  Time zones are ignored. This library assumes that all dates are within the same time zone.
25
35
 
26
- ### Using the Holidays class
36
+ ## Usage
27
37
 
28
- Get all holidays on April 25, 2008 in Australia.
38
+ This gem offers multiple ways to check for holidays for a variety of scenarios.
29
39
 
30
- date = Date.civil(2008,4,25)
40
+ #### Checking a specific date
31
41
 
32
- Holidays.on(date, :au)
33
- => [{:name => 'ANZAC Day',...}]
42
+ Get all holidays on April 25, 2008 in Australia:
34
43
 
35
- Get holidays that are observed on July 2, 2007 in British Columbia, Canada.
44
+ ```
45
+ Holidays.on(Date.civil(2008, 4, 25), :au)
46
+ => [{:name => 'ANZAC Day',...}]
47
+ ```
36
48
 
37
- date = Date.civil(2007,7,2)
49
+ You can check multiple regions in a single call:
38
50
 
39
- Holidays.on(date, :ca_bc, :observed)
40
- => [{:name => 'Canada Day',...}]
51
+ ```
52
+ Holidays.on(Date.civil(2008, 1, 1), :us, :fr)
53
+ => [{:name=>"New Year's Day", :regions=>[:us],...},
54
+ {:name=>"Jour de l'an", :regions=>[:fr],...}]
55
+ ```
41
56
 
42
- Get all holidays in July, 2008 in Canada and the US.
57
+ You can leave off 'regions' to get holidays for any region in our [definitions](https://github.com/holidays/definitions):
43
58
 
44
- from = Date.civil(2008,7,1)
45
- to = Date.civil(2008,7,31)
59
+ ```
60
+ Holidays.on(Date.civil(2007, 4, 25))
61
+ => [{:name=>"ANZAC Day", :regions=>[:au],...},
62
+ {:name=>"Festa della Liberazione", :regions=>[:it],...},
63
+ {:name=>"Dia da Liberdade", :regions=>[:pt],...}
64
+ ...
65
+ ]
66
+ ```
46
67
 
47
- Holidays.between(from, to, :ca, :us)
48
- => [{:name => 'Canada Day',...}
49
- {:name => 'Independence Day',...}]
68
+ #### Checking a date range
50
69
 
51
- Get all US Federal holidays between 2018 and 2019.
70
+ Get all holidays during the month of July 2008 in Canada and the US:
52
71
 
53
- from = Date.civil(2018,1,1)
54
- to = Date.civil(2019,12,31)
72
+ ```
73
+ from = Date.civil(2008,7,1)
74
+ to = Date.civil(2008,7,31)
55
75
 
56
- Holidays.between(from, to, :federal_reserve, :observed)
57
- => [{:name => "New Year's Day"....}
58
- {:name => "Birthday of Martin Luther King, Jr"....}]
76
+ Holidays.between(from, to, :ca, :us)
77
+ => [{:name => 'Canada Day',...}
78
+ {:name => 'Independence Day',...}]
79
+ ```
59
80
 
60
- Get informal holidays in February.
81
+ #### Check for 'informal' holidays
61
82
 
62
- from = Date.civil(2008,2,1)
63
- to = Date.civil(2008,2,15)
83
+ You can pass the 'informal' flag to include holidays specified as informal in your results. See [here](https://github.com/holidays/definitions/blob/master/doc/SYNTAX.md#formalinformal) for information on what constitutes 'informal' vs 'formal'.
64
84
 
65
- Holidays.between(from, to, :informal)
66
- => [{:name => 'Valentine\'s Day',...}]
85
+ By default this flag is turned off, meaning no informal holidays will be returned.
67
86
 
68
- Return all available regions:
87
+ Get Valentine's Day in the US:
88
+
89
+ ```
90
+ Holidays.on(Date.new(2018, 2, 14), :us, :informal)
91
+ => [{:name=>"Valentine's Day",...}]
92
+ ```
93
+
94
+ Leaving off 'informal' will mean that Valentine's Day is not returned:
95
+
96
+ ```
97
+ Holidays.on(Date.new(2018, 2, 14), :us)
98
+ => []
99
+ ```
100
+
101
+ Get informal holidays during the month of February 2008 for any region:
102
+
103
+ ```
104
+ from = Date.civil(2008,2,1)
105
+ to = Date.civil(2008,2,15)
106
+
107
+ Holidays.between(from, to, :informal)
108
+ => [{:name => 'Valentine\'s Day',...}]
109
+ ```
110
+
111
+ #### Check for 'observed' holidays
112
+
113
+ You can pass the 'observed' flag to include holidays that are observed on different days than they actually occur. See [here](https://github.com/holidays/definitions/blob/master/doc/SYNTAX.md#observed) for further explanation of 'observed'.
114
+
115
+ By default this flag is turned off, meaning no observed logic will be applied.
116
+
117
+ Get holidays that are observed on Monday July 2, 2007 in British Columbia, Canada:
118
+
119
+ ```
120
+ Holidays.on(Date.civil(2007, 7, 2), :ca_bc, :observed)
121
+ => [{:name => 'Canada Day',...}]
122
+ ```
123
+
124
+ Leaving off the 'observed' flag will mean that 'Canada Day' is not returned since it actually falls on Sunday July 1:
69
125
 
70
- Holidays.available_regions
71
- => [:ar, :at, ..., :sg] # this will be a big array
126
+ ```
127
+ Holidays.on(Date.civil(2007, 7, 2), :ca_bc)
128
+ => []
129
+ Holidays.on(Date.civil(2007, 7, 1), :ca_bc)
130
+ => [{:name=>"Canada Day", :regions=>[:ca],...}]
131
+ ```
72
132
 
73
- To check if there are any holidays taking place during a specified work week:
133
+ Get all observed US Federal holidays between 2018 and 2019:
74
134
 
75
- Holidays.any_holidays_during_work_week?(Date.civil(2016, 1, 1))
76
- => true
135
+ ```
136
+ from = Date.civil(2018,1,1)
137
+ to = Date.civil(2019,12,31)
77
138
 
78
- To find and return the next holidays occurring from date, inclusively:
139
+ Holidays.between(from, to, :federal_reserve, :observed)
140
+ => [{:name => "New Year's Day"....}
141
+ {:name => "Birthday of Martin Luther King, Jr"....}]
142
+ ```
79
143
 
80
- Holidays.next_holidays(3, [:us, :informal], Date.civil(2016, 2, 23))
81
- => [{:name => "St. Patrick's Day",...}, {:name => "Good Friday",...}, {:name => "Easter Sunday",...}]
144
+ #### Check whether any holidays occur during work week
82
145
 
83
- Will default to `Date.today` if no date is provided.
146
+ Check if there are any holidays taking place during a specified work week. 'Work week' is defined as the period of Monday through Friday of the week specified by the date.
84
147
 
85
- To find all holidays occuring from date to end of year, inclusively:
148
+ Check whether a holiday falls during first week of the year for any region:
86
149
 
87
- Holidays.year_holidays([:ca_on], Date.civil(2016, 2, 23))
88
- => [{:name=>"Good Friday",...},
89
- {name=>"Easter Sunday",...},
90
- {:name=>"Victoria Day",...},
91
- {:name=>"Canada Day",...},
92
- {:name=>"Civic Holiday",...},
93
- {:name=>"Labour Day",...},
94
- {:name=>"Thanksgiving",...},
95
- {:name=>"Remembrance Day",...},
96
- {:name=>"Christmas Day",...},
97
- {:name=>"Boxing Day",...}]
150
+ ```
151
+ Holidays.any_holidays_during_work_week?(Date.civil(2016, 1, 1))
152
+ => true
153
+ ```
98
154
 
99
- Will default to `Date.today` if no date is provided.
155
+ You can also pass in `informal` or `observed`:
100
156
 
101
- ### Loading Custom Definitions on the fly
157
+ ```
158
+ # Returns true since Valentine's Day falls on a Wednesday
159
+ holidays.any_holidays_during_work_week?(date.civil(2018, 2, 14), :us, :informal)
160
+ => true
161
+ # Returns false if you don't specify informal
162
+ irb(main):006:0> Holidays.any_holidays_during_work_week?(Date.civil(2018, 2, 14), :us)
163
+ => false
164
+ # Returns true since Veteran's Day is observed on Monday November 12, 2018
165
+ holidays.any_holidays_during_work_week?(date.civil(2018, 11, 12), :us, :observed)
166
+ => true
167
+ # Returns false if you don't specify observed since the actual holiday is on Sunday November 11th 2018
168
+ irb(main):005:0> Holidays.any_holidays_during_work_week?(Date.civil(2018, 11, 12), :us)
169
+ => false
170
+ ```
102
171
 
103
- Load custom definitions file on the fly and use them immediately.
172
+ #### Find the next holiday(s) that will occur from a specific date
104
173
 
105
- Load custom 'Company Founding' holiday on June 1st:
174
+ Get the next holidays occurring from February 23, 2016 for the US:
106
175
 
107
- Holidays.load_custom('/home/user/holiday_definitions/custom_holidays.yaml')
176
+ ```
177
+ Holidays.next_holidays(3, [:us, :informal], Date.civil(2016, 2, 23))
178
+ => [{:name => "St. Patrick's Day",...}, {:name => "Good Friday",...}, {:name => "Easter Sunday",...}]
179
+ ```
108
180
 
109
- date = Date.civil(2013,6,1)
181
+ You can specify the number of holidays to return. This method will default to `Date.today` if no date is provided.
110
182
 
111
- Holidays.on(date, :my_custom_region)
112
- => [{:name => 'Company Founding',...}]
183
+ #### Find all holidays occuring starting from a specific date to the end of the year
113
184
 
114
- Custom definition files must match the format of the existing definition YAML files location in the 'definitions' directory.
185
+ Get all holidays starting from February 23, 2016 to end of year in the US:
115
186
 
116
- Multiple files can also be passed:
187
+ ```
188
+ Holidays.year_holidays([:ca_on], Date.civil(2016, 2, 23))
189
+ => [{:name=>"Good Friday",...},
190
+ {name=>"Easter Sunday",...},
191
+ {:name=>"Victoria Day",...},
192
+ {:name=>"Canada Day",...},
193
+ {:name=>"Civic Holiday",...},
194
+ {:name=>"Labour Day",...},
195
+ {:name=>"Thanksgiving",...},
196
+ {:name=>"Remembrance Day",...},
197
+ {:name=>"Christmas Day",...},
198
+ {:name=>"Boxing Day",...}]
199
+ ```
117
200
 
118
- Holidays.load_custom('/home/user/holidays/custom_holidays1.yaml', '/home/user/holidays/custom_holidays2.yaml')
201
+ This method will default to `Date.today` if no date is provided.
119
202
 
120
- ### Extending Ruby's Date and Time classes
203
+ #### Return all available regions
204
+
205
+ Return all available regions:
206
+
207
+ ```
208
+ Holidays.available_regions
209
+ => [:ar, :at, ..., :sg] # this will be a big array
210
+ ```
211
+
212
+ ## Loading Custom Definitions on the fly
213
+
214
+ In addition to the [provided definitions](https://github.com/holidays/definitions) you can load custom definitions file on the fly and use them immediately.
215
+
216
+ To load custom 'Company Founding' holiday on June 1st:
217
+
218
+ ```
219
+ Holidays.load_custom('/home/user/holiday_definitions/custom_holidays.yaml')
220
+ Holidays.on(Date.civil(2013, 6, 1), :my_custom_region)
221
+ => [{:name => 'Company Founding',...}]
222
+ ```
223
+
224
+ Custom definition files must match the [syntax of the existing definition files](https://github.com/holidays/definitions/blob/master/doc/SYNTAX.md).
225
+
226
+ Multiple files can be loaded at the same time:
227
+
228
+ ```
229
+ Holidays.load_custom('/home/user/holidays/custom_holidays1.yaml', '/home/user/holidays/custom_holidays2.yaml')
230
+ ```
231
+
232
+ ## Extending Ruby's Date and Time classes
233
+
234
+ ### Date
121
235
 
122
236
  To extend the 'Date' class:
123
237
 
124
- require 'holidays/core_extensions/date'
125
- class Date
126
- include Holidays::CoreExtensions::Date
127
- end
238
+ ```
239
+ require 'holidays/core_extensions/date'
240
+ class Date
241
+ include Holidays::CoreExtensions::Date
242
+ end
243
+ ```
128
244
 
129
245
  Now you can check which holidays occur in Iceland on January 1, 2008:
130
246
 
131
- d = Date.civil(2008,7,1)
247
+ ```
248
+ d = Date.civil(2008,7,1)
132
249
 
133
- d.holidays(:is)
134
- => [{:name => 'Nýársdagur'}...]
250
+ d.holidays(:is)
251
+ => [{:name => 'Nýársdagur'}...]
252
+ ```
135
253
 
136
254
  Or lookup Canada Day in different regions:
137
255
 
138
- d = Date.civil(2008,7,1)
256
+ ```
257
+ d = Date.civil(2008,7,1)
139
258
 
140
- d.holiday?(:ca) # Canada
141
- => true
259
+ d.holiday?(:ca) # Canada
260
+ => true
142
261
 
143
- d.holiday?(:ca_bc) # British Columbia, Canada
144
- => true
262
+ d.holiday?(:ca_bc) # British Columbia, Canada
263
+ => true
145
264
 
146
- d.holiday?(:fr) # France
147
- => false
265
+ d.holiday?(:fr) # France
266
+ => false
267
+ ```
148
268
 
149
269
  Or return the new date based on the options:
150
270
 
151
- d = Date.civil(2008,7,1)
152
- d.change(:year => 2016, :month => 1, :day => 1)
153
- => #<Date: 2016-01-01 ((2457389j,0s,0n),+0s,2299161j)>
271
+ ```
272
+ d = Date.civil(2008,7,1)
273
+ d.change(:year => 2016, :month => 1, :day => 1)
274
+ => #<Date: 2016-01-01 ((2457389j,0s,0n),+0s,2299161j)>
275
+ ```
154
276
 
155
277
  Or you can calculate the day of the month:
156
278
 
157
- Date.calculate_mday(2015, 4, :first, 2)
158
- => 7
279
+ ```
280
+ Date.calculate_mday(2015, 4, :first, 2)
281
+ => 7
282
+ ```
283
+
284
+ ### Time
285
+
286
+ ```
287
+ require 'holidays/core_extensions/time'
288
+ class Time
289
+ include Holidays::CoreExtensions::Time
290
+ end
291
+ ```
159
292
 
160
- Or find end of month for given date (requires 'Time' extensions as well):
293
+ Find end of month for given date:
161
294
 
162
- d = Date.civil(2016,8,1)
163
- d.end_of_month
164
- => #<Date: 2016-08-31 ((2457632j,0s,0n),+0s,2299161j)>
295
+ ```
296
+ d = Date.civil(2016,8,1)
297
+ d.end_of_month
298
+ => #<Date: 2016-08-31 ((2457632j,0s,0n),+0s,2299161j)>
299
+ ```
165
300
 
166
- ### Caching Holiday Lookups
301
+ ## Caching Holiday Lookups
167
302
 
168
- 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):
303
+ If you are checking holidays regularly you can cache your results for improved performance. Run this before looking up a holiday (e.g. in an initializer):
169
304
 
170
- Holidays.cache_between(Time.now, 2.years.from_now, :ca, :us, :observed)
305
+ ```
306
+ YEAR = 365 * 24 * 60 * 60
307
+ Holidays.cache_between(Time.now, Time.now + 2 * YEAR, :ca, :us, :observed)
308
+ ```
171
309
 
172
310
  Holidays for the regions specified within the dates specified will be pre-calculated and stored in-memory. Future lookups will be much faster.
173
311
 
174
- ### How to contribute
312
+ ## How to contribute
175
313
 
176
314
  See our [contribution guidelines](doc/CONTRIBUTING.md) for information on how to help out!
177
315
 
178
- ### Credits and code
316
+ ## Credits and code
179
317
 
180
318
  * Started by [@alexdunae](http://github.com/alexdunae) 2007-2012
181
319
  * Maintained by [@hahahana](https://github.com/hahahana), 2013
@@ -17,8 +17,8 @@ Gem::Specification.new do |gem|
17
17
  gem.require_paths = ['lib']
18
18
  gem.licenses = ['MIT']
19
19
  gem.required_ruby_version = '~> 2.2'
20
- gem.add_development_dependency 'bundler'
21
- gem.add_development_dependency 'rake', '~> 12.0'
20
+ gem.add_development_dependency 'bundler', '~> 1.16'
21
+ gem.add_development_dependency 'rake', '~> 12'
22
22
  gem.add_development_dependency 'simplecov', '~> 0.16'
23
23
  gem.add_development_dependency 'test-unit', '~> 3.2'
24
24
  gem.add_development_dependency 'mocha', '~> 1.7'
@@ -19,7 +19,7 @@ module Holidays
19
19
  {:function => "easter(year)", :function_arguments => [:year], :function_modifier => 60, :name => "Fronleichnam", :regions => [:ch_lu, :ch_ur, :ch_sz, :ch_ow, :ch_nw, :ch_zg, :ch_fr, :ch_so, :ch_ai, :ch_ag, :ch_ti, :ch_vs, :ch_ne, :ch_ju]},
20
20
  {:function => "ch_vd_lundi_du_jeune_federal(year)", :function_arguments => [:year], :name => "Lundi du Jeûne fédéral", :regions => [:ch_vd]},
21
21
  {:function => "ch_ge_jeune_genevois(year)", :function_arguments => [:year], :name => "Jeûne genevois", :regions => [:ch_ge]}],
22
- 1 => [{:mday => 1, :name => "Neujahrstag", :regions => [:ch_zh, :ch_be, :ch_lu, :ch_ur, :ch_sz, :ch_ow, :ch_nw, :ch_gl, :ch_zg, :ch_fr, :ch_so, :ch_bs, :ch_bl, :ch_sh, :ch_ar, :ch_ai, :ch_sg, :ch_gr, :ch_ag, :ch_tg, :ch_vd, :ch_vs, :ch_ne, :ch_ge, :ch_ju, :ch_ti]},
22
+ 1 => [{:mday => 1, :name => "Neujahrstag", :regions => [:ch]},
23
23
  {:mday => 2, :name => "Berchtoldstag", :regions => [:ch_zh, :ch_be, :ch_lu, :ch_ow, :ch_nw, :ch_gl, :ch_zg, :ch_fr, :ch_so, :ch_sh, :ch_sg, :ch_ag, :ch_tg, :ch_vd, :ch_vs, :ch_ne, :ch_ju]},
24
24
  {:mday => 6, :name => "Dreikönigstag", :regions => [:ch_ur, :ch_sz, :ch_ti]}],
25
25
  3 => [{:mday => 1, :name => "Instauration de la République", :regions => [:ch_ne]},
@@ -151,7 +151,7 @@ module Holidays
151
151
  {:mday => 6, :name => "Heilige Drei Könige", :regions => [:at]},
152
152
  {:mday => 1, :name => "Jour de l'an", :regions => [:be_fr]},
153
153
  {:mday => 1, :name => "Nieuwjaar", :regions => [:be_nl]},
154
- {:mday => 1, :name => "Neujahrstag", :regions => [:ch_zh, :ch_be, :ch_lu, :ch_ur, :ch_sz, :ch_ow, :ch_nw, :ch_gl, :ch_zg, :ch_fr, :ch_so, :ch_bs, :ch_bl, :ch_sh, :ch_ar, :ch_ai, :ch_sg, :ch_gr, :ch_ag, :ch_tg, :ch_vd, :ch_vs, :ch_ne, :ch_ge, :ch_ju, :ch_ti]},
154
+ {:mday => 1, :name => "Neujahrstag", :regions => [:ch]},
155
155
  {:mday => 2, :name => "Berchtoldstag", :regions => [:ch_zh, :ch_be, :ch_lu, :ch_ow, :ch_nw, :ch_gl, :ch_zg, :ch_fr, :ch_so, :ch_sh, :ch_sg, :ch_ag, :ch_tg, :ch_vd, :ch_vs, :ch_ne, :ch_ju]},
156
156
  {:mday => 6, :name => "Dreikönigstag", :regions => [:ch_ur, :ch_sz, :ch_ti]},
157
157
  {:mday => 1, :name => "Den obnovy samostatného českého státu", :regions => [:cz]},
@@ -19,13 +19,12 @@ module Holidays
19
19
 
20
20
  class << self
21
21
  def any_holidays_during_work_week?(date, *options)
22
- days_to_monday = date.wday - 1
23
- days_to_friday = 5 - date.wday
24
- start_date = date - days_to_monday
25
- end_date = date + days_to_friday
26
- options += [:observed] unless options.include?(:no_observed)
27
- options.delete(:no_observed)
28
- between(start_date, end_date, options).empty?
22
+ monday = date - (date.wday - 1)
23
+ friday = date + (5 - date.wday)
24
+
25
+ holidays = between(monday, friday, *options)
26
+
27
+ holidays && holidays.count > 0
29
28
  end
30
29
 
31
30
  def on(date, *options)
@@ -48,6 +47,9 @@ module Holidays
48
47
  Factory::Finder.between.call(start_date, end_date, options)
49
48
  end
50
49
 
50
+ #FIXME All other methods start with a date and require a date. For the next
51
+ # major version bump we should take the opportunity to change this
52
+ # signature to match, e.g. next_holidays(from_date, count, options)
51
53
  def next_holidays(holidays_count, options, from_date = Date.today)
52
54
  raise ArgumentError unless holidays_count
53
55
  raise ArgumentError if options.empty?
@@ -61,6 +63,9 @@ module Holidays
61
63
  Factory::Finder.next_holiday.call(holidays_count, from_date, options)
62
64
  end
63
65
 
66
+ #FIXME All other methods start with a date and require a date. For the next
67
+ # major version bump we should take the opportunity to change this
68
+ # signature to match, e.g. year_holidays(from_date, options)
64
69
  def year_holidays(options, from_date = Date.today)
65
70
  raise ArgumentError if options.empty?
66
71
  raise ArgumentError unless options.is_a?(Array)
@@ -4,7 +4,7 @@ module Holidays
4
4
  def self.included(base)
5
5
  base.extend ClassMethods
6
6
  end
7
-
7
+
8
8
  module ClassMethods
9
9
  COMMON_YEAR_DAYS_IN_MONTH = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
10
10
 
@@ -17,7 +17,7 @@ module Holidays
17
17
  COMMON_YEAR_DAYS_IN_MONTH[month]
18
18
  end
19
19
  end
20
- end
20
+ end
21
21
  end
22
22
  end
23
- end
23
+ end
@@ -14,15 +14,14 @@ module Holidays
14
14
  regions, observed, informal = @options_parser.call(options)
15
15
  dates_driver = @dates_driver_builder.call(start_date, end_date)
16
16
 
17
- holidays = []
18
-
19
17
  #FIXME Why are we calling the options_parser to convert the observed/informal
20
18
  # symbols to bool and then...converting them back? O_o
21
19
  opts = gather_options(observed, informal)
22
20
 
23
- holidays = @definition_search.call(dates_driver, regions, opts)
24
- holidays = holidays.select{|holiday|holiday[:date].between?(start_date, end_date)}
25
- holidays.sort{|a, b| a[:date] <=> b[:date] }
21
+ @definition_search
22
+ .call(dates_driver, regions, opts)
23
+ .select { |holiday| holiday[:date].between?(start_date, end_date) }
24
+ .sort_by { |a| a[:date] }
26
25
  end
27
26
 
28
27
  private
@@ -35,8 +34,8 @@ module Holidays
35
34
  def gather_options(observed, informal)
36
35
  opts = []
37
36
 
38
- opts << :observed if observed == true
39
- opts << :informal if informal == true
37
+ opts << :observed if observed
38
+ opts << :informal if informal
40
39
 
41
40
  opts
42
41
  end
@@ -14,7 +14,6 @@ module Holidays
14
14
  regions, observed, informal = @options_parser.call(options)
15
15
 
16
16
  holidays = []
17
- ret_holidays = []
18
17
  opts = gather_options(observed, informal)
19
18
 
20
19
  # This could be smarter but I don't have any evidence that just checking for
@@ -22,17 +21,18 @@ module Holidays
22
21
  # smarter here to check in smaller increments.
23
22
  dates_driver = @dates_driver_builder.call(from_date, from_date >> 12)
24
23
 
25
- ret_holidays = @definition_search.call(dates_driver, regions, opts)
26
-
27
- ret_holidays.sort{|a, b| a[:date] <=> b[:date] }.each do |holiday|
28
- if holiday[:date] >= from_date
29
- holidays << holiday
30
- holidays_count -= 1
31
- break if holidays_count == 0
24
+ @definition_search
25
+ .call(dates_driver, regions, opts)
26
+ .sort_by { |a| a[:date] }
27
+ .each do |holiday|
28
+ if holiday[:date] >= from_date
29
+ holidays << holiday
30
+ holidays_count -= 1
31
+ break if holidays_count == 0
32
+ end
32
33
  end
33
- end
34
34
 
35
- holidays.sort{|a, b| a[:date] <=> b[:date] }
35
+ holidays.sort_by { |a| a[:date] }
36
36
  end
37
37
 
38
38
  private
@@ -46,8 +46,8 @@ module Holidays
46
46
  def gather_options(observed, informal)
47
47
  opts = []
48
48
 
49
- opts << :observed if observed == true
50
- opts << :informal if informal == true
49
+ opts << :observed if observed
50
+ opts << :informal if informal
51
51
 
52
52
  opts
53
53
  end
@@ -1,3 +1,3 @@
1
1
  module Holidays
2
- VERSION = '6.6.0'
2
+ VERSION = '6.6.1'
3
3
  end
@@ -7,6 +7,8 @@ require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
7
7
  class ChDefinitionTests < Test::Unit::TestCase # :nodoc:
8
8
 
9
9
  def test_ch
10
+ assert_equal "Neujahrstag", (Holidays.on(Date.civil(2018, 1, 1), [:ch])[0] || {})[:name]
11
+
10
12
  assert_equal "Bundesfeiertag", (Holidays.on(Date.civil(2012, 8, 1), [:ch])[0] || {})[:name]
11
13
 
12
14
  assert_equal "Weihnachten", (Holidays.on(Date.civil(2012, 12, 25), [:ch])[0] || {})[:name]
@@ -95,6 +95,8 @@ class EuropeDefinitionTests < Test::Unit::TestCase # :nodoc:
95
95
 
96
96
  assert_equal "Pinkstermaandag", (Holidays.on(Date.civil(2017, 6, 5), [:be_nl])[0] || {})[:name]
97
97
 
98
+ assert_equal "Neujahrstag", (Holidays.on(Date.civil(2018, 1, 1), [:ch])[0] || {})[:name]
99
+
98
100
  assert_equal "Bundesfeiertag", (Holidays.on(Date.civil(2012, 8, 1), [:ch])[0] || {})[:name]
99
101
 
100
102
  assert_equal "Weihnachten", (Holidays.on(Date.civil(2012, 12, 25), [:ch])[0] || {})[:name]
@@ -0,0 +1,90 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
2
+
3
+ class AnyHolidaysDuringWorkWeekTests < Test::Unit::TestCase
4
+ def subject
5
+ Holidays.method(:any_holidays_during_work_week?)
6
+ end
7
+
8
+ def test_returns_true_when_single_holiday_exists_during_week
9
+ assert subject.call(Date.new(2018, 1, 1), :us)
10
+ end
11
+
12
+ def test_returns_true_when_multiple_holidays_exist_during_week
13
+ assert subject.call(Date.new(2018, 12, 26), :gb)
14
+ end
15
+
16
+ def test_returns_true_if_informal_flag_set_and_informal_holiday_exists_during_week
17
+ assert subject.call(Date.new(2018, 10, 31), :us, :informal)
18
+ end
19
+
20
+ def test_returns_true_when_no_region_specified_and_single_holiday_exists_during_week
21
+ assert subject.call(Date.new(2018, 1, 1))
22
+ end
23
+
24
+ def test_returns_true_if_both_informal_and_observed_flags_set_and_informal_holiday_observed_during_week
25
+ assert subject.call(Date.new(2008, 11, 30), :gb_sct, :informal, :observed)
26
+ end
27
+
28
+ def test_returns_true_when_observed_flag_set_and_holiday_is_observed_during_week
29
+ assert subject.call(Date.new(2012,9,5), :us, :observed)
30
+ end
31
+
32
+ def test_returns_true_when_observed_flag_set_and_holiday_is_observed_on_monday
33
+ assert subject.call(Date.new(2018,11,12), :us, :observed)
34
+ end
35
+
36
+ def test_returns_true_with_multiple_regions_and_holiday_occurs_during_week
37
+ assert subject.call(Date.new(2018,1,1), [:us, :gb])
38
+ end
39
+
40
+ def test_returns_true_when_observed_flag_set_and_holiday_on_saturday_but_observed_on_friday
41
+ assert subject.call(Date.new(2018,7,3), [:us], :observed)
42
+ end
43
+
44
+ def test_returns_false_when_no_holiday_exists_during_week
45
+ assert_equal false, subject.call(Date.new(2018,7,30), :us)
46
+ end
47
+
48
+ def test_returns_false_when_holiday_on_sunday
49
+ assert_equal false, subject.call(Date.new(2018,11,11), :us)
50
+ end
51
+
52
+ def test_returns_false_when_holiday_on_saturday
53
+ assert_equal false, subject.call(Date.new(2017,11,11), :us)
54
+ end
55
+
56
+ def test_returns_false_when_observed_flag_not_set_and_holiday_occurs_on_sunday_but_observed_on_monday
57
+ assert_equal false, subject.call(Date.new(2017,1,1), :us)
58
+ end
59
+
60
+ def test_returns_false_if_informal_and_observed_flags_both_set_and_no_holiday_exists_during_week
61
+ assert_equal false, subject.call(Date.new(2018,7,30), :us, :informal, :observed)
62
+ end
63
+
64
+ def test_returns_false_when_informal_flag_set_and_informal_holiday_occurs_on_weekend
65
+ assert_equal false, subject.call(Date.new(2018,4,14), :us, :informal)
66
+ end
67
+
68
+ def test_returns_false_when_informal_flag_set_but_observed_is_not_and_informal_holiday_is_observed_on_monday
69
+ assert_equal false, subject.call(Date.new(2008, 11, 30), :gb_sct, :informal)
70
+ end
71
+
72
+ def test_verify_count_of_weeks_without_any_holidays_for_2012
73
+ weeks_in_2012 = Date.commercial(2013, -1).cweek
74
+ holidays_in_2012 = weeks_in_2012.times.count { |week| subject.call(Date.commercial(2012,week+1), :us) == false }
75
+ assert_equal 45, holidays_in_2012
76
+ end
77
+
78
+ def test_returns_true_for_new_years_in_any_region
79
+ assert subject.call(Date.civil(2016, 1, 1))
80
+ end
81
+
82
+ # These are in response to https://github.com/holidays/holidays/issues/264, just to be completely sure it's fixed.
83
+ def returns_true_for_various_holidays_in_poland
84
+ assert subject.call(Date.civil(2018, 1, 1), :pl)
85
+ assert subject.call(Date.civil(2018, 1, 2), :pl)
86
+ assert subject.call(Date.civil(2018, 5, 2), :pl)
87
+ assert subject.call(Date.civil(2018, 5, 3), :pl)
88
+ assert subject.call(Date.today, Date.today + 365*2, :pl, :observed)
89
+ end
90
+ end
@@ -20,30 +20,6 @@ class HolidaysTests < Test::Unit::TestCase
20
20
  assert_equal 0, holidays.length
21
21
  end
22
22
 
23
- def test_any_holidays_during_work_week
24
- ## Full weeks:
25
- # Try with a Monday
26
- assert Holidays.any_holidays_during_work_week?(Date.civil(2012,1,23), :us)
27
- # Try with a Wednesday
28
- assert Holidays.any_holidays_during_work_week?(Date.civil(2012,1,25), :us)
29
- # Try Sunday on a week going into a new month
30
- assert Holidays.any_holidays_during_work_week?(Date.civil(2012,1,29), :us)
31
- # Try Wednesday on a week going into a new month
32
- assert Holidays.any_holidays_during_work_week?(Date.civil(2012,2,1), :us)
33
-
34
- ## Weeks with holidays:
35
- # New Year's 2012 (on Sunday, observed Monday). Test from a Wednesday.
36
- assert_equal(false, Holidays.any_holidays_during_work_week?(Date.civil(2012,1,4), :us))
37
- # Ignore observed holidays with :no_observed
38
- assert Holidays.any_holidays_during_work_week?(Date.civil(2012,1,4), :us, :no_observed)
39
- # Labor Day 2012 should be Sept 3
40
- assert_equal(false, Holidays.any_holidays_during_work_week?(Date.civil(2012,9,5), :us))
41
- # Should be 10 non-full weeks in the year (in the US)
42
- weeks_in_2012 = Date.commercial(2013, -1).cweek
43
- holidays_in_2012 = weeks_in_2012.times.count { |week| Holidays.any_holidays_during_work_week?(Date.commercial(2012,week+1), :us) == false }
44
- assert_equal 9, holidays_in_2012
45
- end
46
-
47
23
  def test_requires_valid_regions
48
24
  assert_raises Holidays::InvalidRegion do
49
25
  Holidays.on(Date.civil(2008,1,1), :xx)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: holidays
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.6.0
4
+ version: 6.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Dunae
@@ -9,36 +9,36 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-10-01 00:00:00.000000000 Z
12
+ date: 2018-10-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ">="
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '0'
20
+ version: '1.16'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ">="
25
+ - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '0'
27
+ version: '1.16'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '12.0'
34
+ version: '12'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '12.0'
41
+ version: '12'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: simplecov
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -348,6 +348,7 @@ files:
348
348
  - test/holidays/finder/rules/test_year_range.rb
349
349
  - test/integration/README.md
350
350
  - test/integration/test_all_regions.rb
351
+ - test/integration/test_any_holidays_during_work_week.rb
351
352
  - test/integration/test_available_regions.rb
352
353
  - test/integration/test_custom_holidays.rb
353
354
  - test/integration/test_custom_informal_holidays.rb
@@ -497,6 +498,7 @@ test_files:
497
498
  - test/holidays/finder/rules/test_year_range.rb
498
499
  - test/integration/README.md
499
500
  - test/integration/test_all_regions.rb
501
+ - test/integration/test_any_holidays_during_work_week.rb
500
502
  - test/integration/test_available_regions.rb
501
503
  - test/integration/test_custom_holidays.rb
502
504
  - test/integration/test_custom_informal_holidays.rb