holidays 7.1.0 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.
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