holidays 7.1.0 → 8.0.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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -1
  3. data/README.md +3 -4
  4. data/doc/CONTRIBUTING.md +2 -1
  5. data/holidays.gemspec +5 -5
  6. data/lib/generated_definitions/MANIFEST +1 -0
  7. data/lib/generated_definitions/REGIONS.rb +2 -2
  8. data/lib/generated_definitions/au.rb +1 -1
  9. data/lib/generated_definitions/ca.rb +11 -10
  10. data/lib/generated_definitions/cl.rb +5 -5
  11. data/lib/generated_definitions/de.rb +3 -3
  12. data/lib/generated_definitions/es.rb +2 -1
  13. data/lib/generated_definitions/europe.rb +60 -16
  14. data/lib/generated_definitions/gb.rb +5 -3
  15. data/lib/generated_definitions/hu.rb +3 -2
  16. data/lib/generated_definitions/it.rb +14 -5
  17. data/lib/generated_definitions/jp.rb +21 -21
  18. data/lib/generated_definitions/lv.rb +52 -0
  19. data/lib/generated_definitions/northamerica.rb +15 -15
  20. data/lib/generated_definitions/ro.rb +5 -2
  21. data/lib/generated_definitions/southamerica.rb +5 -5
  22. data/lib/generated_definitions/tr.rb +1 -1
  23. data/lib/generated_definitions/ua.rb +6 -6
  24. data/lib/generated_definitions/us.rb +5 -6
  25. data/lib/holidays.rb +2 -0
  26. data/lib/holidays/definition/context/generator.rb +20 -34
  27. data/lib/holidays/definition/repository/holidays_by_month.rb +9 -1
  28. data/lib/holidays/finder/context/search.rb +34 -31
  29. data/lib/holidays/finder/rules/year_range.rb +30 -54
  30. data/lib/holidays/version.rb +1 -1
  31. data/test/coverage_report.rb +23 -5
  32. data/test/data/test_custom_year_range_holiday_defs.yaml +6 -10
  33. data/test/data/test_multiple_regions_with_conflicts_region_1.yaml +38 -0
  34. data/test/data/test_multiple_regions_with_conflicts_region_2.yaml +38 -0
  35. data/test/defs/test_defs_ca.rb +13 -1
  36. data/test/defs/test_defs_co.rb +3 -3
  37. data/test/defs/test_defs_europe.rb +126 -5
  38. data/test/defs/test_defs_hu.rb +12 -4
  39. data/test/defs/test_defs_it.rb +20 -0
  40. data/test/defs/test_defs_lv.rb +90 -0
  41. data/test/defs/test_defs_northamerica.rb +19 -11
  42. data/test/defs/test_defs_ro.rb +14 -0
  43. data/test/defs/test_defs_southamerica.rb +3 -3
  44. data/test/defs/test_defs_us.rb +6 -10
  45. data/test/holidays/core_extensions/test_date.rb +3 -2
  46. data/test/holidays/definition/context/test_generator.rb +5 -18
  47. data/test/holidays/definition/repository/test_holidays_by_month.rb +121 -1
  48. data/test/holidays/finder/rules/test_year_range.rb +43 -47
  49. data/test/integration/test_available_regions.rb +1 -1
  50. data/test/integration/test_custom_year_range_holidays.rb +0 -7
  51. data/test/integration/test_holidays.rb +1 -1
  52. data/test/integration/test_holidays_between.rb +10 -0
  53. data/test/integration/test_multiple_regions_with_conflict.rb +29 -0
  54. metadata +21 -13
@@ -5,7 +5,7 @@ require 'holidays/finder/rules/year_range'
5
5
  class FinderRulesYearRangeTests < Test::Unit::TestCase
6
6
  def setup
7
7
  @year = 2015
8
- @year_ranges = [{between: 1996..2002}]
8
+ @year_ranges = {between: 1996..2002}
9
9
  @subject = Holidays::Finder::Rules::YearRange
10
10
  end
11
11
 
@@ -29,13 +29,13 @@ class FinderRulesYearRangeTests < Test::Unit::TestCase
29
29
  end
30
30
 
31
31
  def test_returns_error_if_year_ranges_contains_only_non_hash
32
- @year_ranges = [:test]
32
+ @year_ranges = :test
33
33
  assert_raises ArgumentError do
34
34
  @subject.call(@year, @year_ranges)
35
35
  end
36
36
  end
37
37
 
38
- def test_returns_error_if_year_ranges_contains_only_empty_hashes
38
+ def test_returns_error_if_year_ranges_is_empty
39
39
  @year_ranges = [{}, {}]
40
40
  assert_raises ArgumentError do
41
41
  @subject.call(@year, @year_ranges)
@@ -43,128 +43,124 @@ class FinderRulesYearRangeTests < Test::Unit::TestCase
43
43
  end
44
44
 
45
45
  def test_returns_error_if_year_range_contains_a_hash_with_multiple_entries
46
- @year_ranges = [{:between => 1996..2002, :after => 2002}]
46
+ @year_ranges = {:between => 1996..2002, :after => 2002}
47
47
  assert_raises ArgumentError do
48
48
  @subject.call(@year, @year_ranges)
49
49
  end
50
50
  end
51
51
 
52
52
  def test_returns_error_if_year_range_contains_unrecognized_operator
53
- @year_ranges = [{:what => 2002}]
53
+ @year_ranges = {:what => 2002}
54
54
  assert_raises ArgumentError do
55
55
  @subject.call(@year, @year_ranges)
56
56
  end
57
57
  end
58
58
 
59
- def test_returns_error_if_before_operator_and_value_is_not_a_number
60
- @year_ranges = [{before: "bad"}]
59
+ def test_returns_error_if_until_operator_and_value_is_not_a_number
60
+ @year_ranges = {until: "bad"}
61
61
  assert_raises ArgumentError do
62
62
  @subject.call(@year, @year_ranges)
63
63
  end
64
64
  end
65
65
 
66
- def test_returns_true_if_before_operator_and_target_is_before
67
- @year_ranges = [{before: 2000}]
66
+ def test_returns_true_if_until_operator_and_target_is_until
67
+ @year_ranges = {until: 2000}
68
68
  assert_equal(true, @subject.call(1999, @year_ranges))
69
69
  end
70
70
 
71
- def test_returns_true_if_before_operator_and_target_is_equal
72
- @year_ranges = [{before: 2000}]
71
+ def test_returns_true_if_until_operator_and_target_is_equal
72
+ @year_ranges = {until: 2000}
73
73
  assert_equal(true, @subject.call(2000, @year_ranges))
74
74
  end
75
75
 
76
- def test_returns_false_if_before_operator_and_target_is_after
77
- @year_ranges = [{before: 2000}]
76
+ def test_returns_false_if_until_operator_and_target_is_after
77
+ @year_ranges = {until: 2000}
78
78
  assert_equal(false, @subject.call(2001, @year_ranges))
79
79
  end
80
80
 
81
- def test_returns_error_if_after_operator_with_bad_value
82
- @year_ranges = [{after: "bad"}]
81
+ def test_returns_error_if_from_operator_with_bad_value
82
+ @year_ranges = {from: "bad"}
83
83
  assert_raises ArgumentError do
84
84
  @subject.call(@year, @year_ranges)
85
85
  end
86
86
  end
87
87
 
88
- def test_returns_false_if_after_operator_and_target_is_before
89
- @year_ranges = [{after: 2000}]
88
+ def test_returns_false_if_from_operator_and_target_is_before
89
+ @year_ranges = {from: 2000}
90
90
  assert_equal(false, @subject.call(1999, @year_ranges))
91
91
  end
92
92
 
93
- def test_returns_true_if_after_operator_and_target_is_equal
94
- @year_ranges = [{after: 2000}]
93
+ def test_returns_true_if_from_operator_and_target_is_equal
94
+ @year_ranges = {from: 2000}
95
95
  assert_equal(true, @subject.call(2000, @year_ranges))
96
96
  end
97
97
 
98
- def test_returns_true_if_after_operator_and_target_is_after
99
- @year_ranges = [{after: 2000}]
98
+ def test_returns_true_if_from_operator_and_target_is_after
99
+ @year_ranges = {from: 2000}
100
100
  assert_equal(true, @subject.call(2001, @year_ranges))
101
101
  end
102
102
 
103
103
  def test_returns_error_if_limited_operator_and_bad_value
104
- @year_ranges = [{limited: "bad"}]
104
+ @year_ranges = {limited: "bad"}
105
+ assert_raises ArgumentError do
106
+ @subject.call(@year, @year_ranges)
107
+ end
108
+ end
109
+
110
+ def test_returns_error_if_limited_operator_with_empty_array
111
+ @year_ranges = {limited: []}
112
+ assert_raises ArgumentError do
113
+ @subject.call(@year, @year_ranges)
114
+ end
115
+ end
116
+
117
+ def test_returns_error_if_limited_operator_with_array_containing_non_integer_value
118
+ @year_ranges = {limited: ["bad"]}
105
119
  assert_raises ArgumentError do
106
120
  @subject.call(@year, @year_ranges)
107
121
  end
108
122
  end
109
123
 
110
124
  def test_returns_true_if_limited_operator_and_value_is_number_that_matches_target
111
- @year_ranges = [{limited: 2002}]
125
+ @year_ranges = {limited: [2002]}
112
126
  assert_equal(true, @subject.call(2002, @year_ranges))
113
127
  end
114
128
 
115
129
  def test_returns_false_if_limited_operator_and_target_is_not_included
116
- @year_ranges = [{limited: [1998,2000]}]
130
+ @year_ranges = {limited: [1998,2000]}
117
131
  assert_equal(false, @subject.call(1997, @year_ranges))
118
132
  assert_equal(false, @subject.call(1999, @year_ranges))
119
133
  assert_equal(false, @subject.call(2002, @year_ranges))
120
134
  end
121
135
 
122
136
  def test_returns_true_if_limited_operator_and_target_is_included
123
- @year_ranges = [{limited: [1998, 2000, 2002]}]
137
+ @year_ranges = {limited: [1998, 2000, 2002]}
124
138
  assert_equal(true, @subject.call(1998, @year_ranges))
125
139
  assert_equal(true, @subject.call(2000, @year_ranges))
126
140
  assert_equal(true, @subject.call(2002, @year_ranges))
127
141
  end
128
142
 
129
143
  def test_returns_error_if_between_operator_and_value_not_a_range
130
- @year_ranges = [{between: 2000}]
144
+ @year_ranges = {between: 2000}
131
145
  assert_raises ArgumentError do
132
146
  @subject.call(2003, @year_ranges)
133
147
  end
134
148
  end
135
149
 
136
150
  def test_returns_false_if_between_operator_and_target_is_before
137
- @year_ranges = [{between: 1998..2002}]
151
+ @year_ranges = {between: 1998..2002}
138
152
  assert_equal(false, @subject.call(1997, @year_ranges))
139
153
  end
140
154
 
141
155
  def test_returns_true_if_between_operator_and_target_is_covered
142
- @year_ranges = [{between: 1998..2002}]
156
+ @year_ranges = {between: 1998..2002}
143
157
  assert_equal(true, @subject.call(1998, @year_ranges))
144
158
  assert_equal(true, @subject.call(2000, @year_ranges))
145
159
  assert_equal(true, @subject.call(2002, @year_ranges))
146
160
  end
147
161
 
148
162
  def test_returns_false_if_between_operator_and_target_is_after
149
- @year_ranges = [{between: 1998..2002}]
163
+ @year_ranges = {between: 1998..2002}
150
164
  assert_equal(false, @subject.call(2003, @year_ranges))
151
165
  end
152
-
153
- def test_returns_false_multiple_nonmatching_operators
154
- @year_ranges = [{between: 1998..2002}, {:after => 2005}]
155
- assert_equal(false, @subject.call(2003, @year_ranges))
156
-
157
- @year_ranges = [{before: 1995}, {:limited => [1990, 1991, 1992]}]
158
- assert_equal(false, @subject.call(1996, @year_ranges))
159
- end
160
-
161
- def test_returns_true_multiple_operators_all_matching
162
- @year_ranges = [{between: 1998..2002}, {:limited=> [2000, 2001]}]
163
- assert_equal(true, @subject.call(2001, @year_ranges))
164
- end
165
-
166
- def test_returns_true_if_multiple_operators_and_only_one_matches
167
- @year_ranges = [{before: 2015}, {:after=> 2017}]
168
- assert_equal(true, @subject.call(2001, @year_ranges))
169
- end
170
166
  end
@@ -18,6 +18,6 @@ class AvailableRegionsTests < Test::Unit::TestCase
18
18
  # This test might fail if we add new regions. Since this is an integration test
19
19
  # I am fine with that!
20
20
  def test_available_regions_returns_correct_number_of_regions
21
- assert_equal 244, Holidays.available_regions.count
21
+ assert_equal 256, Holidays.available_regions.count
22
22
  end
23
23
  end
@@ -32,11 +32,4 @@ class CustomYearRangeHolidaysTest < Test::Unit::TestCase
32
32
  assert_not_equal [], Holidays.on(Date.civil(2019,6,4), :custom_year_range_file)
33
33
  assert_equal [], Holidays.on(Date.civil(2020,6,4), :custom_year_range_file)
34
34
  end
35
-
36
- def test_multiple_condition
37
- Holidays.load_custom('test/data/test_custom_year_range_holiday_defs.yaml')
38
- assert_not_equal [], Holidays.on(Date.civil(2015,6,5), :custom_year_range_file)
39
- assert_equal [], Holidays.on(Date.civil(2016,6,5), :custom_year_range_file)
40
- assert_not_equal [], Holidays.on(Date.civil(2017,6,5), :custom_year_range_file)
41
- end
42
35
  end
@@ -266,6 +266,6 @@ class HolidaysTests < Test::Unit::TestCase
266
266
 
267
267
  def test_load_all
268
268
  Holidays.load_all
269
- assert_equal 244, Holidays.available_regions.count
269
+ assert_equal 256, Holidays.available_regions.count
270
270
  end
271
271
  end
@@ -41,6 +41,16 @@ class HolidaysBetweenTests < Test::Unit::TestCase
41
41
  end
42
42
  end
43
43
 
44
+ def test_between_raises_error_if_end_date_is_before_start_date
45
+ assert_raise ArgumentError do
46
+ @subject.call(Date.civil(2019, 2, 1), Date.civil(2019, 1, 1), :us)
47
+ end
48
+
49
+ assert_raise ArgumentError do
50
+ @subject.call(Date.civil(2008,7,2), Date.civil(2000,7,2), :ca)
51
+ end
52
+ end
53
+
44
54
  def test_cached_holidays_are_returned_if_present
45
55
  start_date = Date.civil(2015, 1, 1)
46
56
  end_date = Date.civil(2015, 1, 31)
@@ -0,0 +1,29 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
2
+
3
+ # See https://github.com/holidays/holidays/issues/344 for more info on why
4
+ # these tests exist.
5
+ class MultipleRegionsWithConflictsTests < Test::Unit::TestCase
6
+
7
+ def test_corpus_christi_returns_correctly_for_co_even_if_br_is_loaded_first
8
+ result = Holidays.on(Date.new(2014, 6, 19), :br)
9
+ assert_equal 1, result.count
10
+ assert_equal 'Corpus Christi', result.first[:name]
11
+
12
+ result = Holidays.on(Date.new(2014, 6, 23), :co)
13
+ assert_equal 1, result.count
14
+ assert_equal 'Corpus Christi', result.first[:name]
15
+ end
16
+
17
+ def test_custom_loaded_region_returns_correct_value_with_function_modifier_conflict_even_if_conflict_definition_is_loaded_first
18
+ Holidays.load_custom('test/data/test_multiple_regions_with_conflicts_region_1.yaml')
19
+ result = Holidays.on(Date.new(2019, 6, 20), :multiple_with_conflict_1)
20
+ assert_equal 1, result.count
21
+ assert_equal 'With Function Modifier', result.first[:name]
22
+
23
+ Holidays.load_custom('test/data/test_multiple_regions_with_conflicts_region_2.yaml')
24
+ result = Holidays.on(Date.new(2019, 6, 24), :multiple_with_conflict_2)
25
+ assert_equal 1, result.count
26
+ assert_equal 'With Function Modifier', result.first[:name]
27
+ end
28
+
29
+ end
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: 7.1.0
4
+ version: 8.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Dunae
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-02-03 00:00:00.000000000 Z
12
+ date: 2019-09-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '1.16'
20
+ version: '2'
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: '1.16'
27
+ version: '2'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -59,42 +59,42 @@ dependencies:
59
59
  requirements:
60
60
  - - "~>"
61
61
  - !ruby/object:Gem::Version
62
- version: '3.2'
62
+ version: '3'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '3.2'
69
+ version: '3'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: mocha
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - "~>"
75
75
  - !ruby/object:Gem::Version
76
- version: '1.7'
76
+ version: '1'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - "~>"
82
82
  - !ruby/object:Gem::Version
83
- version: '1.7'
83
+ version: '1'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: pry
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '0.11'
90
+ version: '0.12'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: '0.11'
97
+ version: '0.12'
98
98
  description: A collection of Ruby methods to deal with statutory and other holidays.
99
99
  You deserve a holiday!
100
100
  email:
@@ -158,6 +158,7 @@ files:
158
158
  - lib/generated_definitions/li.rb
159
159
  - lib/generated_definitions/lt.rb
160
160
  - lib/generated_definitions/lu.rb
161
+ - lib/generated_definitions/lv.rb
161
162
  - lib/generated_definitions/ma.rb
162
163
  - lib/generated_definitions/mt_en.rb
163
164
  - lib/generated_definitions/mt_mt.rb
@@ -242,6 +243,8 @@ files:
242
243
  - test/data/test_custom_year_range_holiday_defs.yaml
243
244
  - test/data/test_invalid_region.rb
244
245
  - test/data/test_multiple_custom_holiday_defs.yaml
246
+ - test/data/test_multiple_regions_with_conflicts_region_1.yaml
247
+ - test/data/test_multiple_regions_with_conflicts_region_2.yaml
245
248
  - test/data/test_region.rb
246
249
  - test/data/test_single_custom_holiday_defs.yaml
247
250
  - test/data/test_single_custom_holiday_with_custom_procs.yaml
@@ -284,6 +287,7 @@ files:
284
287
  - test/defs/test_defs_li.rb
285
288
  - test/defs/test_defs_lt.rb
286
289
  - test/defs/test_defs_lu.rb
290
+ - test/defs/test_defs_lv.rb
287
291
  - test/defs/test_defs_ma.rb
288
292
  - test/defs/test_defs_mt_en.rb
289
293
  - test/defs/test_defs_mt_mt.rb
@@ -364,6 +368,7 @@ files:
364
368
  - test/integration/test_holidays.rb
365
369
  - test/integration/test_holidays_between.rb
366
370
  - test/integration/test_multiple_regions.rb
371
+ - test/integration/test_multiple_regions_with_conflict.rb
367
372
  - test/integration/test_nonstandard_regions.rb
368
373
  - test/test_helper.rb
369
374
  homepage: https://github.com/holidays/holidays
@@ -378,15 +383,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
378
383
  requirements:
379
384
  - - "~>"
380
385
  - !ruby/object:Gem::Version
381
- version: '2.2'
386
+ version: '2.4'
382
387
  required_rubygems_version: !ruby/object:Gem::Requirement
383
388
  requirements:
384
389
  - - ">="
385
390
  - !ruby/object:Gem::Version
386
391
  version: '0'
387
392
  requirements: []
388
- rubyforge_project:
389
- rubygems_version: 2.7.6
393
+ rubygems_version: 3.0.3
390
394
  signing_key:
391
395
  specification_version: 4
392
396
  summary: A collection of Ruby methods to deal with statutory and other holidays.
@@ -397,6 +401,8 @@ test_files:
397
401
  - test/data/test_custom_year_range_holiday_defs.yaml
398
402
  - test/data/test_invalid_region.rb
399
403
  - test/data/test_multiple_custom_holiday_defs.yaml
404
+ - test/data/test_multiple_regions_with_conflicts_region_1.yaml
405
+ - test/data/test_multiple_regions_with_conflicts_region_2.yaml
400
406
  - test/data/test_region.rb
401
407
  - test/data/test_single_custom_holiday_defs.yaml
402
408
  - test/data/test_single_custom_holiday_with_custom_procs.yaml
@@ -439,6 +445,7 @@ test_files:
439
445
  - test/defs/test_defs_li.rb
440
446
  - test/defs/test_defs_lt.rb
441
447
  - test/defs/test_defs_lu.rb
448
+ - test/defs/test_defs_lv.rb
442
449
  - test/defs/test_defs_ma.rb
443
450
  - test/defs/test_defs_mt_en.rb
444
451
  - test/defs/test_defs_mt_mt.rb
@@ -519,5 +526,6 @@ test_files:
519
526
  - test/integration/test_holidays.rb
520
527
  - test/integration/test_holidays_between.rb
521
528
  - test/integration/test_multiple_regions.rb
529
+ - test/integration/test_multiple_regions_with_conflict.rb
522
530
  - test/integration/test_nonstandard_regions.rb
523
531
  - test/test_helper.rb