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
@@ -19,7 +19,9 @@ module Holidays
19
19
  {:mday => 2, :observed => "to_weekday_if_boxing_weekend(date)", :observed_arguments => [:date], :name => "2nd January", :regions => [:gb_sct]}],
20
20
  3 => [{:mday => 5, :name => "St. Piran's Day", :regions => [:gb_con]},
21
21
  {:mday => 17, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "St. Patrick's Day", :regions => [:gb_nir]}],
22
- 5 => [{:wday => 1, :week => 1, :name => "May Day", :regions => [:gb]},
22
+ 5 => [{:wday => 1, :week => 1, :year_ranges => { :until => 2019 },:name => "May Day", :regions => [:gb]},
23
+ {:mday => 8, :year_ranges => { :limited => [2020] },:name => "May Day", :regions => [:gb]},
24
+ {:wday => 1, :week => 1, :year_ranges => { :from => 2021 },:name => "May Day", :regions => [:gb]},
23
25
  {:mday => 9, :name => "Liberation Day", :regions => [:je, :gb_jsy, :gg, :gb_gsy]},
24
26
  {:wday => 1, :week => -1, :name => "Bank Holiday", :regions => [:gb]}],
25
27
  7 => [{:mday => 5, :name => "Tynwald Day", :regions => [:im, :gb_iom]},
@@ -27,8 +29,8 @@ module Holidays
27
29
  8 => [{:wday => 1, :week => 1, :name => "Bank Holiday", :regions => [:gb_sct]},
28
30
  {:wday => 1, :week => -1, :name => "Bank Holiday", :regions => [:gb_eng, :gb_wls, :gb_eaw, :gb_nir, :je, :gb_jsy, :gg, :gb_gsy]}],
29
31
  11 => [{:mday => 5, :type => :informal, :name => "Guy Fawkes Day", :regions => [:gb]},
30
- {:mday => 30, :year_ranges => [{:before => 2006}],:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :type => :informal, :name => "St. Andrew's Day", :regions => [:gb_sct]},
31
- {:mday => 30, :year_ranges => [{:after => 2007}],:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "St. Andrew's Day", :regions => [:gb_sct]}],
32
+ {:mday => 30, :year_ranges => { :until => 2006 },:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :type => :informal, :name => "St. Andrew's Day", :regions => [:gb_sct]},
33
+ {:mday => 30, :year_ranges => { :from => 2007 },:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "St. Andrew's Day", :regions => [:gb_sct]}],
32
34
  12 => [{:mday => 25, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Christmas Day", :regions => [:gb]},
33
35
  {:mday => 26, :observed => "to_weekday_if_boxing_weekend(date)", :observed_arguments => [:date], :name => "Boxing Day", :regions => [:gb]}]
34
36
  }
@@ -12,8 +12,9 @@ module Holidays
12
12
 
13
13
  def self.holidays_by_month
14
14
  {
15
- 0 => [{:function => "easter(year)", :function_arguments => [:year], :function_modifier => 1, :name => "Húsvét hétfő", :regions => [:hu]},
16
- {:function => "easter(year)", :function_arguments => [:year], :function_modifier => 50, :name => "Pünkösd hétfő", :regions => [:hu]}],
15
+ 0 => [{:function => "easter(year)", :function_arguments => [:year], :function_modifier => -2, :year_ranges => { :from => 2017 },:name => "Nagypéntek", :regions => [:hu]},
16
+ {:function => "easter(year)", :function_arguments => [:year], :function_modifier => 1, :name => "Húsvéthétfő", :regions => [:hu]},
17
+ {:function => "easter(year)", :function_arguments => [:year], :function_modifier => 50, :name => "Pünkösdhétfő", :regions => [:hu]}],
17
18
  1 => [{:mday => 1, :name => "Újév", :regions => [:hu]}],
18
19
  3 => [{:mday => 15, :name => "1848/49-es forradalom és szabadságharc ünnepe", :regions => [:hu]}],
19
20
  5 => [{:mday => 1, :name => "A munka ünnepe", :regions => [:hu]}],
@@ -7,7 +7,7 @@ module Holidays
7
7
  # All the definitions are available at https://github.com/holidays/holidays
8
8
  module IT # :nodoc:
9
9
  def self.defined_regions
10
- [:it]
10
+ [:it, :it_ve, :it_tv, :it_vr, :it_pd, :it_fi, :it_ge, :it_to, :it_rm, :it_vi, :it_bl, :it_ro]
11
11
  end
12
12
 
13
13
  def self.holidays_by_month
@@ -16,11 +16,20 @@ module Holidays
16
16
  {:function => "easter(year)", :function_arguments => [:year], :function_modifier => 1, :name => "Lunedì dell'Angelo", :regions => [:it]}],
17
17
  1 => [{:mday => 1, :name => "Capodanno", :regions => [:it]},
18
18
  {:mday => 6, :name => "Epifania", :regions => [:it]}],
19
- 4 => [{:mday => 25, :name => "Festa della Liberazione", :regions => [:it]}],
20
- 5 => [{:mday => 1, :name => "Festa dei Lavoratori", :regions => [:it]}],
21
- 6 => [{:mday => 2, :name => "Festa della Repubblica", :regions => [:it]}],
19
+ 4 => [{:mday => 25, :name => "Festa della Liberazione", :regions => [:it]},
20
+ {:mday => 25, :name => "Festa di San Marco Evangelista", :regions => [:it_ve]},
21
+ {:mday => 27, :name => "Festa di San Liberale", :regions => [:it_tv]}],
22
+ 5 => [{:mday => 1, :name => "Festa dei Lavoratori", :regions => [:it]},
23
+ {:mday => 21, :name => "Festa di San Zeno", :regions => [:it_vr]}],
24
+ 6 => [{:mday => 2, :name => "Festa della Repubblica", :regions => [:it]},
25
+ {:mday => 13, :name => "Festa di Sant'Antonio di Padova", :regions => [:it_pd]},
26
+ {:mday => 24, :name => "Festa di San Giovanni Battista", :regions => [:it_fi, :it_ge, :it_to]},
27
+ {:mday => 29, :name => "Festa di San Pietro e Paolo", :regions => [:it_rm]}],
22
28
  8 => [{:mday => 15, :name => "Assunzione", :regions => [:it]}],
23
- 11 => [{:mday => 1, :name => "Ognissanti", :regions => [:it]}],
29
+ 9 => [{:mday => 8, :name => "Festa della Madonna di Monte Berico", :regions => [:it_vi]}],
30
+ 11 => [{:mday => 1, :name => "Ognissanti", :regions => [:it]},
31
+ {:mday => 11, :name => "Festa di San Martino", :regions => [:it_bl]},
32
+ {:mday => 26, :name => "Festa di San Bellino", :regions => [:it_ro]}],
24
33
  12 => [{:mday => 8, :name => "Immacolata Concezione", :regions => [:it]},
25
34
  {:mday => 25, :name => "Natale", :regions => [:it]},
26
35
  {:mday => 26, :name => "Santo Stefano", :regions => [:it]}]
@@ -17,46 +17,46 @@ module Holidays
17
17
  {:mday => 1, :function => "jp_substitute_holiday(year, month, day)", :function_arguments => [:year, :month, :day], :name => "振替休日", :regions => [:jp]}],
18
18
  2 => [{:mday => 11, :name => "建国記念の日", :regions => [:jp]},
19
19
  {:mday => 11, :function => "jp_substitute_holiday(year, month, day)", :function_arguments => [:year, :month, :day], :name => "振替休日", :regions => [:jp]},
20
- {:mday => 23, :year_ranges => [{:after => 2020}],:name => "天皇誕生日", :regions => [:jp]},
21
- {:mday => 23, :function => "jp_substitute_holiday(year, month, day)", :function_arguments => [:year, :month, :day], :year_ranges => [{:after => 2020}],:name => "振替休日", :regions => [:jp]}],
20
+ {:mday => 23, :year_ranges => { :from => 2020 },:name => "天皇誕生日", :regions => [:jp]},
21
+ {:mday => 23, :function => "jp_substitute_holiday(year, month, day)", :function_arguments => [:year, :month, :day], :year_ranges => { :from => 2020 },:name => "振替休日", :regions => [:jp]}],
22
22
  3 => [{:function => "jp_vernal_equinox_day(year)", :function_arguments => [:year], :name => "春分の日", :regions => [:jp]},
23
23
  {:function => "jp_vernal_equinox_day_substitute(year)", :function_arguments => [:year], :name => "振替休日", :regions => [:jp]}],
24
24
  4 => [{:mday => 29, :name => "昭和の日", :regions => [:jp]},
25
25
  {:mday => 29, :function => "jp_substitute_holiday(year, month, day)", :function_arguments => [:year, :month, :day], :name => "振替休日", :regions => [:jp]},
26
- {:mday => 30, :year_ranges => [{:limited => [2019]}],:name => "休日", :regions => [:jp]}],
27
- 5 => [{:mday => 1, :year_ranges => [{:limited => [2019]}],:name => "天皇即位", :regions => [:jp]},
28
- {:mday => 2, :year_ranges => [{:limited => [2019]}],:name => "休日", :regions => [:jp]},
26
+ {:mday => 30, :year_ranges => { :limited => [2019] },:name => "休日", :regions => [:jp]}],
27
+ 5 => [{:mday => 1, :year_ranges => { :limited => [2019] },:name => "天皇即位", :regions => [:jp]},
28
+ {:mday => 2, :year_ranges => { :limited => [2019] },:name => "休日", :regions => [:jp]},
29
29
  {:mday => 3, :name => "憲法記念日", :regions => [:jp]},
30
30
  {:mday => 4, :name => "みどりの日", :regions => [:jp]},
31
31
  {:mday => 5, :name => "こどもの日", :regions => [:jp]},
32
32
  {:mday => 3, :function => "jp_substitute_holiday(year, month, day)", :function_arguments => [:year, :month, :day], :name => "振替休日", :regions => [:jp]},
33
33
  {:mday => 4, :function => "jp_substitute_holiday(year, month, day)", :function_arguments => [:year, :month, :day], :name => "振替休日", :regions => [:jp]},
34
34
  {:mday => 5, :function => "jp_substitute_holiday(year, month, day)", :function_arguments => [:year, :month, :day], :name => "振替休日", :regions => [:jp]}],
35
- 7 => [{:mday => 20, :year_ranges => [{:between => 1996..2002}],:name => "海の日", :regions => [:jp]},
36
- {:wday => 1, :week => 3, :year_ranges => [{:between => 2003..2019}],:name => "海の日", :regions => [:jp]},
37
- {:mday => 23, :year_ranges => [{:limited => [2020]}],:name => "海の日", :regions => [:jp]},
38
- {:wday => 1, :week => 3, :year_ranges => [{:after => 2021}],:name => "海の日", :regions => [:jp]},
39
- {:function => "jp_marine_day_substitute(year)", :function_arguments => [:year], :year_ranges => [{:between => 1996..2002}],:name => "振替休日", :regions => [:jp]},
40
- {:mday => 24, :year_ranges => [{:limited => [2020]}],:name => "スポーツの日", :regions => [:jp]}],
41
- 8 => [{:function => "jp_mountain_holiday(year)", :function_arguments => [:year], :year_ranges => [{:between => 2016..2019}],:name => "山の日", :regions => [:jp]},
42
- {:mday => 10, :year_ranges => [{:limited => [2020]}],:name => "山の日", :regions => [:jp]},
43
- {:function => "jp_mountain_holiday(year)", :function_arguments => [:year], :year_ranges => [{:after => 2021}],:name => "山の日", :regions => [:jp]},
44
- {:function => "jp_mountain_holiday_substitute(year)", :function_arguments => [:year], :year_ranges => [{:after => 2016}],:name => "振替休日", :regions => [:jp]}],
35
+ 7 => [{:mday => 20, :year_ranges => { :between => 1996..2002 },:name => "海の日", :regions => [:jp]},
36
+ {:wday => 1, :week => 3, :year_ranges => { :between => 2003..2019 },:name => "海の日", :regions => [:jp]},
37
+ {:mday => 23, :year_ranges => { :limited => [2020] },:name => "海の日", :regions => [:jp]},
38
+ {:wday => 1, :week => 3, :year_ranges => { :from => 2021 },:name => "海の日", :regions => [:jp]},
39
+ {:function => "jp_marine_day_substitute(year)", :function_arguments => [:year], :year_ranges => { :between => 1996..2002 },:name => "振替休日", :regions => [:jp]},
40
+ {:mday => 24, :year_ranges => { :limited => [2020] },:name => "スポーツの日", :regions => [:jp]}],
41
+ 8 => [{:function => "jp_mountain_holiday(year)", :function_arguments => [:year], :year_ranges => { :between => 2016..2019 },:name => "山の日", :regions => [:jp]},
42
+ {:mday => 10, :year_ranges => { :limited => [2020] },:name => "山の日", :regions => [:jp]},
43
+ {:function => "jp_mountain_holiday(year)", :function_arguments => [:year], :year_ranges => { :from => 2021 },:name => "山の日", :regions => [:jp]},
44
+ {:function => "jp_mountain_holiday_substitute(year)", :function_arguments => [:year], :year_ranges => { :from => 2016 },:name => "振替休日", :regions => [:jp]}],
45
45
  9 => [{:wday => 1, :week => 3, :name => "敬老の日", :regions => [:jp]},
46
46
  {:function => "jp_respect_for_aged_holiday_substitute(year)", :function_arguments => [:year], :name => "振替休日", :regions => [:jp]},
47
- {:function => "jp_citizens_holiday(year)", :function_arguments => [:year], :year_ranges => [{:after => 2003}],:name => "国民の休日", :regions => [:jp]},
47
+ {:function => "jp_citizens_holiday(year)", :function_arguments => [:year], :year_ranges => { :from => 2003 },:name => "国民の休日", :regions => [:jp]},
48
48
  {:function => "jp_national_culture_day(year)", :function_arguments => [:year], :name => "秋分の日", :regions => [:jp]},
49
49
  {:function => "jp_national_culture_day_substitute(year)", :function_arguments => [:year], :name => "振替休日", :regions => [:jp]}],
50
- 10 => [{:wday => 1, :week => 2, :year_ranges => [{:before => 2019}],:name => "体育の日", :regions => [:jp]},
51
- {:wday => 1, :week => 2, :year_ranges => [{:after => 2021}],:name => "スポーツの日", :regions => [:jp]},
50
+ 10 => [{:wday => 1, :week => 2, :year_ranges => { :until => 2019 },:name => "体育の日", :regions => [:jp]},
51
+ {:wday => 1, :week => 2, :year_ranges => { :from => 2021 },:name => "スポーツの日", :regions => [:jp]},
52
52
  {:function => "jp_health_sports_day_substitute(year)", :function_arguments => [:year], :name => "振替休日", :regions => [:jp]},
53
- {:mday => 22, :year_ranges => [{:limited => [2019]}],:name => "即位礼正殿の儀", :regions => [:jp]}],
53
+ {:mday => 22, :year_ranges => { :limited => [2019] },:name => "即位礼正殿の儀", :regions => [:jp]}],
54
54
  11 => [{:mday => 3, :name => "文化の日", :regions => [:jp]},
55
55
  {:mday => 3, :function => "jp_substitute_holiday(year, month, day)", :function_arguments => [:year, :month, :day], :name => "振替休日", :regions => [:jp]},
56
56
  {:mday => 23, :name => "勤労感謝の日", :regions => [:jp]},
57
57
  {:mday => 23, :function => "jp_substitute_holiday(year, month, day)", :function_arguments => [:year, :month, :day], :name => "振替休日", :regions => [:jp]}],
58
- 12 => [{:mday => 23, :year_ranges => [{:before => 2018}],:name => "天皇誕生日", :regions => [:jp]},
59
- {:mday => 23, :function => "jp_substitute_holiday(year, month, day)", :function_arguments => [:year, :month, :day], :year_ranges => [{:before => 2018}],:name => "振替休日", :regions => [:jp]}]
58
+ 12 => [{:mday => 23, :year_ranges => { :until => 2018 },:name => "天皇誕生日", :regions => [:jp]},
59
+ {:mday => 23, :function => "jp_substitute_holiday(year, month, day)", :function_arguments => [:year, :month, :day], :year_ranges => { :until => 2018 },:name => "振替休日", :regions => [:jp]}]
60
60
  }
61
61
  end
62
62
 
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+ module Holidays
3
+ # This file is generated by the Ruby Holidays gem.
4
+ #
5
+ # Definitions loaded: definitions/lv.yaml
6
+ #
7
+ # All the definitions are available at https://github.com/holidays/holidays
8
+ module LV # :nodoc:
9
+ def self.defined_regions
10
+ [:lv]
11
+ end
12
+
13
+ def self.holidays_by_month
14
+ {
15
+ 0 => [{:function => "easter(year)", :function_arguments => [:year], :function_modifier => -2, :name => "Lielā Piektdiena", :regions => [:lv]},
16
+ {:function => "easter(year)", :function_arguments => [:year], :name => "Pirmās Lieldienas", :regions => [:lv]},
17
+ {:function => "easter(year)", :function_arguments => [:year], :function_modifier => 1, :name => "Otrās Lieldienas", :regions => [:lv]},
18
+ {:function => "easter(year)", :function_arguments => [:year], :function_modifier => 49, :name => "Vasarsvētki", :regions => [:lv]},
19
+ {:function => "lv_song_and_dance_festival_end_date(year)", :function_arguments => [:year], :year_ranges => { :from => 2018 },:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Vispārējo latviešu Dziesmu un deju svētku noslēguma diena", :regions => [:lv]}],
20
+ 1 => [{:mday => 1, :name => "Jaungada diena", :regions => [:lv]}],
21
+ 5 => [{:mday => 1, :name => "Darba svētki, Latvijas Republikas Satversmes sapulces sasaukšanas diena", :regions => [:lv]},
22
+ {:mday => 4, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Latvijas Republikas Neatkarības atjaunošanas diena", :regions => [:lv]},
23
+ {:wday => 0, :week => 2, :name => "Mātes diena", :regions => [:lv]}],
24
+ 6 => [{:mday => 23, :name => "Līgo diena", :regions => [:lv]},
25
+ {:mday => 24, :name => "Jāņu diena", :regions => [:lv]}],
26
+ 9 => [{:mday => 24, :year_ranges => { :limited => [2018] },:name => "Viņa Svētības pāvesta Franciska pastorālās vizītes Latvijā diena", :regions => [:lv]}],
27
+ 11 => [{:mday => 18, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Latvijas Republikas Proklamēšanas diena", :regions => [:lv]}],
28
+ 12 => [{:mday => 24, :name => "Ziemassvētku vakars", :regions => [:lv]},
29
+ {:mday => 25, :name => "Pirmie Ziemassvētki", :regions => [:lv]},
30
+ {:mday => 26, :name => "Otrie Ziemassvētki", :regions => [:lv]},
31
+ {:mday => 31, :name => "Vecgada diena", :regions => [:lv]}]
32
+ }
33
+ end
34
+
35
+ def self.custom_methods
36
+ {
37
+ "lv_song_and_dance_festival_end_date(year)" => Proc.new { |year|
38
+ case year
39
+ when 2018
40
+ # https://likumi.lv/ta/id/281541 (Ministru kabineta rīkojums Nr. 252 "Par XXVI Vispārējo latviešu dziesmu un XVI Deju svētku norises laiku")
41
+ Date.new(2018, 7, 8)
42
+ when 2023
43
+ # Event's period/next year is known, but precise dates aren't.
44
+ # Previously, dates were announced 2 years ahead, so at ~2021-05 this method would need to be revisited.
45
+ end
46
+ },
47
+
48
+
49
+ }
50
+ end
51
+ end
52
+ end
@@ -7,7 +7,7 @@ module Holidays
7
7
  # All the definitions are available at https://github.com/holidays/holidays
8
8
  module NORTHAMERICA # :nodoc:
9
9
  def self.defined_regions
10
- [:ca, :ca_qc, :ca_ab, :ca_sk, :ca_on, :ca_bc, :ca_nb, :ca_mb, :ca_ns, :ca_pe, :ca_nl, :ca_nt, :ca_nu, :ca_yt, :mx, :mx_pue, :us_fl, :us_la, :us, :us_ct, :us_de, :us_gu, :us_hi, :us_in, :us_ky, :us_nj, :us_nc, :us_nd, :us_pr, :us_tn, :us_ms, :us_id, :us_ar, :us_tx, :us_dc, :us_md, :us_va, :us_il, :us_vt, :us_ak, :us_ca, :us_me, :us_ma, :us_al, :us_ga, :us_ne, :us_mo, :us_sc, :us_wv, :us_vi, :us_ut, :us_ri, :us_az, :us_co, :us_mt, :us_nm, :us_ny, :us_oh, :us_pa, :us_mi, :us_mn, :us_nv, :us_or, :us_sd, :us_wa, :us_wi, :us_wy, :us_ia, :us_ks, :us_nh, :us_ok]
10
+ [:ca, :ca_qc, :ca_ab, :ca_sk, :ca_on, :ca_bc, :ca_nb, :ca_mb, :ca_ns, :ca_pe, :ca_nl, :ca_nt, :ca_nu, :ca_yt, :mx, :mx_pue, :us_fl, :us_la, :us, :us_ct, :us_de, :us_gu, :us_hi, :us_in, :us_ky, :us_nj, :us_nc, :us_nd, :us_pr, :us_tn, :us_ms, :us_id, :us_ar, :us_tx, :us_dc, :us_md, :us_va, :us_vt, :us_ak, :us_ca, :us_me, :us_ma, :us_al, :us_ga, :us_ne, :us_mo, :us_sc, :us_wv, :us_vi, :us_ut, :us_ri, :us_az, :us_co, :us_il, :us_mt, :us_nm, :us_ny, :us_oh, :us_pa, :us_mi, :us_mn, :us_nv, :us_or, :us_sd, :us_wa, :us_wi, :us_wy, :us_ia, :us_ks, :us_nh, :us_ok]
11
11
  end
12
12
 
13
13
  def self.holidays_by_month
@@ -32,22 +32,22 @@ module Holidays
32
32
  {:function => "us_inauguration_day(year)", :function_arguments => [:year], :name => "Inauguration Day", :regions => [:us_tx, :us_dc, :us_la, :us_md, :us_va]},
33
33
  {:function => "lee_jackson_day(year, month)", :function_arguments => [:year, :month], :name => "Lee-Jackson Day", :regions => [:us_va]},
34
34
  {:mday => 19, :name => "Confederate Heroes Day", :regions => [:us_tx]}],
35
- 2 => [{:wday => 1, :week => 3, :year_ranges => [{:after => 1990}],:name => "Family Day", :regions => [:ca_ab]},
36
- {:wday => 1, :week => 3, :year_ranges => [{:after => 2007}],:name => "Family Day", :regions => [:ca_sk]},
37
- {:wday => 1, :week => 3, :year_ranges => [{:after => 2008}],:name => "Family Day", :regions => [:ca_on]},
38
- {:wday => 1, :week => 2, :year_ranges => [{:between => 2013..2018}],:name => "Family Day", :regions => [:ca_bc]},
39
- {:wday => 1, :week => 3, :year_ranges => [{:after => 2019}],:name => "Family Day", :regions => [:ca_bc]},
40
- {:wday => 1, :week => 3, :year_ranges => [{:after => 2018}],:name => "Family Day", :regions => [:ca_nb]},
35
+ 2 => [{:wday => 1, :week => 3, :year_ranges => { :from => 1990 },:name => "Family Day", :regions => [:ca_ab]},
36
+ {:wday => 1, :week => 3, :year_ranges => { :from => 2007 },:name => "Family Day", :regions => [:ca_sk]},
37
+ {:wday => 1, :week => 3, :year_ranges => { :from => 2008 },:name => "Family Day", :regions => [:ca_on]},
38
+ {:wday => 1, :week => 2, :year_ranges => { :between => 2013..2018 },:name => "Family Day", :regions => [:ca_bc]},
39
+ {:wday => 1, :week => 3, :year_ranges => { :from => 2019 },:name => "Family Day", :regions => [:ca_bc]},
40
+ {:wday => 1, :week => 3, :year_ranges => { :from => 2018 },:name => "Family Day", :regions => [:ca_nb]},
41
41
  {:wday => 1, :week => 3, :name => "Louis Riel Day", :regions => [:ca_mb]},
42
- {:wday => 1, :week => 3, :year_ranges => [{:after => 2015}],:name => "Nova Scotia Heritage Day", :regions => [:ca_ns]},
42
+ {:wday => 1, :week => 3, :year_ranges => { :from => 2015 },:name => "Nova Scotia Heritage Day", :regions => [:ca_ns]},
43
43
  {:wday => 1, :week => 3, :name => "Islander Day", :regions => [:ca_pe]},
44
44
  {:wday => 1, :week => 1, :name => "Día de la Constitución", :regions => [:mx]},
45
45
  {:wday => 1, :week => 3, :name => "Presidents' Day", :regions => [:us]},
46
46
  {:mday => 2, :type => :informal, :name => "Groundhog Day", :regions => [:us, :ca]},
47
47
  {:mday => 14, :type => :informal, :name => "Valentine's Day", :regions => [:us, :ca]}],
48
- 3 => [{:mday => 23, :type => :informal, :name => "St. George's Day", :regions => [:ca_nl]},
48
+ 3 => [{:mday => 17, :type => :informal, :name => "St. Patrick's Day", :regions => [:ca_nl]},
49
+ {:mday => 23, :type => :informal, :name => "St. George's Day", :regions => [:ca_nl]},
49
50
  {:wday => 1, :week => 3, :name => "Natalicio de Benito Juárez", :regions => [:mx]},
50
- {:wday => 1, :week => 1, :name => "Casimir Pulaski Day", :regions => [:us_il]},
51
51
  {:wday => 2, :week => 1, :name => "Town Meeting Day", :regions => [:us_vt]},
52
52
  {:mday => 2, :name => "Texas Independence Day", :regions => [:us_tx]},
53
53
  {:mday => 26, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Prince Jonah Kuhio Kalanianaole Day", :regions => [:us_hi]},
@@ -69,7 +69,7 @@ module Holidays
69
69
  6 => [{:mday => 24, :type => :informal, :name => "Discovery Day", :regions => [:ca_nl]},
70
70
  {:mday => 24, :name => "Fête Nationale", :regions => [:ca_qc]},
71
71
  {:mday => 21, :name => "National Aboriginal Day", :regions => [:ca_nt]},
72
- {:mday => 21, :year_ranges => [{:after => 2017}],:name => "National Aboriginal Day", :regions => [:ca_yt]},
72
+ {:mday => 21, :year_ranges => { :from => 2017 },:name => "National Aboriginal Day", :regions => [:ca_yt]},
73
73
  {:wday => 0, :week => 3, :type => :informal, :name => "Día del Padre", :regions => [:mx]},
74
74
  {:wday => 1, :week => 1, :name => "Jefferson Davis' Birthday", :regions => [:us_al]},
75
75
  {:mday => 3, :name => "Birthday of Jefferson Davis", :regions => [:us_fl]},
@@ -114,7 +114,7 @@ module Holidays
114
114
  {:mday => 1, :type => :informal, :name => "Todos los Santos", :regions => [:mx]},
115
115
  {:mday => 2, :type => :informal, :name => "Los Fieles Difuntos", :regions => [:mx]},
116
116
  {:wday => 1, :week => 3, :name => "Día de la Revolución", :regions => [:mx]},
117
- {:function => "election_day(year)", :function_arguments => [:year], :name => "Election Day", :regions => [:us_de, :us_hi, :us_il, :us_in, :us_mt, :us_nj, :us_ny, :us_pa, :us_ri]},
117
+ {:function => "election_day(year)", :function_arguments => [:year], :name => "Election Day", :regions => [:us_de, :us_hi, :us_in, :us_mt, :us_nj, :us_ny, :us_pa, :us_ri]},
118
118
  {:mday => 11, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Veterans Day", :regions => [:us]},
119
119
  {:wday => 4, :week => 4, :name => "Thanksgiving", :regions => [:us]},
120
120
  {:function => "day_after_thanksgiving(year)", :function_arguments => [:year], :name => "Family Day", :regions => [:us_nv]},
@@ -123,7 +123,7 @@ module Holidays
123
123
  {:function => "day_after_thanksgiving(year)", :function_arguments => [:year], :name => "Lincoln's Birthday", :regions => [:us_in]},
124
124
  {:function => "day_after_thanksgiving(year)", :function_arguments => [:year], :name => "American Indian Heritage Day", :regions => [:us_md]},
125
125
  {:function => "day_after_thanksgiving(year)", :function_arguments => [:year], :name => "Day after Thanksgiving (Black Friday)", :regions => [:us_ca, :us_de, :us_fl, :us_ia, :us_il, :us_ks, :us_ky, :us_me, :us_mi, :us_mn, :us_ms, :us_ne, :us_nh, :us_nc, :us_pa, :us_sc, :us_ok, :us_tn, :us_tx, :us_va, :us_wa, :us_wv]}],
126
- 12 => [{:mday => 25, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Christmas Day", :regions => [:ca]},
126
+ 12 => [{:mday => 25, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Christmas Day", :regions => [:ca]},
127
127
  {:mday => 26, :observed => "to_weekday_if_boxing_weekend(date)", :observed_arguments => [:date], :name => "Boxing Day", :regions => [:ca_on]},
128
128
  {:mday => 26, :observed => "to_weekday_if_boxing_weekend(date)", :observed_arguments => [:date], :type => :informal, :name => "Boxing Day", :regions => [:ca_ab, :ca_bc, :ca_mb, :ca_nb, :ca_nl, :ca_nt, :ca_ns, :ca_nu, :ca_pe, :ca_sk, :ca_yt]},
129
129
  {:mday => 12, :type => :informal, :name => "Día de la Virgen de Guadalupe", :regions => [:mx]},
@@ -132,11 +132,11 @@ module Holidays
132
132
  {:mday => 28, :name => "Los Santos Inocentes", :regions => [:mx]},
133
133
  {:mday => 24, :name => "Christmas Eve", :regions => [:us_ar, :us_mi, :us_nc, :us_sc, :us_tx, :us_wi]},
134
134
  {:mday => 24, :function => "christmas_eve_holiday(date)", :function_arguments => [:date], :name => "Christmas Eve (Holiday)", :regions => [:us_mi, :us_sc, :us_va]},
135
- {:mday => 25, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Christmas Day", :regions => [:us]},
135
+ {:mday => 25, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Christmas Day", :regions => [:us]},
136
136
  {:mday => 26, :name => "Day after Christmas", :regions => [:us_ar, :us_nc, :us_ok, :us_sc, :us_tn, :us_tx]},
137
137
  {:mday => 31, :name => "New Year's Eve", :regions => [:us_mi, :us_wi]}],
138
138
  4 => [{:mday => 30, :type => :informal, :name => "Día del Niño", :regions => [:mx]},
139
- {:mday => 16, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Emancipation Day", :regions => [:us_dc, :us_ca]},
139
+ {:mday => 16, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Emancipation Day", :regions => [:us_dc]},
140
140
  {:wday => 1, :week => 3, :name => "Patriots' Day", :regions => [:us_me, :us_ma]},
141
141
  {:mday => 21, :name => "San Jacinto Day", :regions => [:us_tx]},
142
142
  {:wday => 1, :week => -1, :name => "Confederate Memorial Day", :regions => [:us_al, :us_ms]},
@@ -12,13 +12,16 @@ module Holidays
12
12
 
13
13
  def self.holidays_by_month
14
14
  {
15
- 0 => [{:function => "orthodox_easter(year)", :function_arguments => [:year], :name => "Paștele - duminică", :regions => [:ro]},
15
+ 0 => [{:function => "orthodox_easter(year)", :function_arguments => [:year], :function_modifier => -2, :year_ranges => { :from => 2018 },:name => "Paștele - Vinerea Mare", :regions => [:ro]},
16
+ {:function => "orthodox_easter(year)", :function_arguments => [:year], :name => "Paștele - duminică", :regions => [:ro]},
16
17
  {:function => "orthodox_easter(year)", :function_arguments => [:year], :function_modifier => 1, :name => "Paștele - luni", :regions => [:ro]},
17
18
  {:function => "orthodox_easter(year)", :function_arguments => [:year], :function_modifier => 49, :name => "Rusaliile - 50", :regions => [:ro]},
18
19
  {:function => "orthodox_easter(year)", :function_arguments => [:year], :function_modifier => 50, :name => "Rusaliile - 51", :regions => [:ro]}],
19
20
  1 => [{:mday => 1, :name => "Anul nou", :regions => [:ro]},
20
- {:mday => 2, :name => "Anul nou", :regions => [:ro]}],
21
+ {:mday => 2, :name => "Anul nou", :regions => [:ro]},
22
+ {:mday => 24, :year_ranges => { :from => 2017 },:name => "Unirea Principatelor Române", :regions => [:ro]}],
21
23
  5 => [{:mday => 1, :name => "Ziua muncii", :regions => [:ro]}],
24
+ 6 => [{:mday => 1, :year_ranges => { :from => 2017 },:name => "Ziua Copilului", :regions => [:ro]}],
22
25
  8 => [{:mday => 15, :name => "Adormirea Maicii Domnului", :regions => [:ro]}],
23
26
  11 => [{:mday => 30, :name => "Sfântul Apostol Andrei", :regions => [:ro]}],
24
27
  12 => [{:mday => 1, :name => "Ziua Națională", :regions => [:ro]},
@@ -21,8 +21,8 @@ module Holidays
21
21
  {:function => "easter(year)", :function_arguments => [:year], :function_modifier => 60, :name => "Corpus Christi", :regions => [:br]},
22
22
  {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -2, :name => "Viernes Santo", :regions => [:cl]},
23
23
  {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -1, :name => "Sábado Santo", :regions => [:cl]},
24
- {:function => "st_peter_st_paul_cl(year)", :function_arguments => [:year], :year_ranges => [{:after => 2000}],:name => "San Pedro y San Pablo", :regions => [:cl]},
25
- {:function => "other_churches_day_cl(year)", :function_arguments => [:year], :year_ranges => [{:after => 2008}],:name => "Día de las Iglesias Evangélicas y Protestantes", :regions => [:cl]},
24
+ {:function => "st_peter_st_paul_cl(year)", :function_arguments => [:year], :year_ranges => { :from => 2000 },:name => "San Pedro y San Pablo", :regions => [:cl]},
25
+ {:function => "other_churches_day_cl(year)", :function_arguments => [:year], :year_ranges => { :from => 2008 },:name => "Día de las Iglesias Evangélicas y Protestantes", :regions => [:cl]},
26
26
  {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -3, :name => "Jueves Santo", :regions => [:co]},
27
27
  {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -2, :name => "Viernes Santo", :regions => [:co]},
28
28
  {:function => "easter(year)", :function_arguments => [:year], :function_modifier => 43, :name => "Día de la Ascensión", :regions => [:co]},
@@ -58,7 +58,7 @@ module Holidays
58
58
  {:wday => 0, :week => 2, :type => :informal, :name => "Día de la Madre", :regions => [:pe]},
59
59
  {:mday => 1, :name => "Día del Trabajador", :regions => [:ve]}],
60
60
  6 => [{:mday => 20, :name => "Día de la Bandera", :regions => [:ar]},
61
- {:mday => 29, :year_ranges => [{:before => 1999}],:name => "San Pedro y San Pablo", :regions => [:cl]},
61
+ {:mday => 29, :year_ranges => { :until => 1999 },:name => "San Pedro y San Pablo", :regions => [:cl]},
62
62
  {:function => "saint_peter_and_saint_paul(year)", :function_arguments => [:year], :name => "San Pedro y San Pablo", :regions => [:co]},
63
63
  {:mday => 7, :type => :informal, :name => "Día de la Bandera", :regions => [:pe]},
64
64
  {:wday => 0, :week => 3, :type => :informal, :name => "Día del Padre", :regions => [:pe]},
@@ -80,8 +80,8 @@ module Holidays
80
80
  {:mday => 30, :name => "Santa Rosa de Lima", :regions => [:pe]}],
81
81
  10 => [{:mday => 12, :name => "Día del Respeto a la Diversidad Cultural", :regions => [:ar]},
82
82
  {:mday => 12, :name => "Dia de Nossa Senhora Aparecida", :regions => [:br]},
83
- {:mday => 12, :year_ranges => [{:before => 1999}],:name => "Encuentro de Dos Mundos", :regions => [:cl]},
84
- {:function => "columbus_day_cl(year)", :function_arguments => [:year], :year_ranges => [{:after => 2000}],:name => "Encuentro de Dos Mundos", :regions => [:cl]},
83
+ {:mday => 12, :year_ranges => { :until => 1999 },:name => "Encuentro de Dos Mundos", :regions => [:cl]},
84
+ {:function => "columbus_day_cl(year)", :function_arguments => [:year], :year_ranges => { :from => 2000 },:name => "Encuentro de Dos Mundos", :regions => [:cl]},
85
85
  {:function => "columbus_day(year)", :function_arguments => [:year], :name => "Día de la Raza", :regions => [:co]},
86
86
  {:mday => 8, :name => "Batalla de Angamos", :regions => [:pe]},
87
87
  {:mday => 12, :name => "Día de la Resistencia Indígena", :regions => [:ve]}],
@@ -23,7 +23,7 @@ module Holidays
23
23
  4 => [{:mday => 23, :name => "Ulusal Egemenlik ve Çocuk Bayramı", :regions => [:tr]}],
24
24
  5 => [{:mday => 1, :name => "Emek ve Dayanışma Günü", :regions => [:tr]},
25
25
  {:mday => 19, :name => "Atatürk'ü Anma Gençlik ve Spor Bayramı", :regions => [:tr]}],
26
- 7 => [{:mday => 15, :year_ranges => [{:after => 2016}],:name => "Demokrasi ve Milli Birlik Günü", :regions => [:tr]}],
26
+ 7 => [{:mday => 15, :year_ranges => { :from => 2016 },:name => "Demokrasi ve Milli Birlik Günü", :regions => [:tr]}],
27
27
  8 => [{:mday => 30, :name => "Zafer Bayramı", :regions => [:tr]}],
28
28
  10 => [{:mday => 29, :name => "Cumhuriyet Bayramı", :regions => [:tr]}]
29
29
  }
@@ -18,13 +18,13 @@ module Holidays
18
18
  {:mday => 7, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Різдво Христове", :regions => [:ua]}],
19
19
  3 => [{:mday => 8, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Міжнародний жіночий день", :regions => [:ua]}],
20
20
  5 => [{:mday => 1, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "День праці", :regions => [:ua]},
21
- {:mday => 2, :year_ranges => [{:before => 2017}],:name => "День міжнародної солідарності трудящих", :regions => [:ua]},
21
+ {:mday => 2, :year_ranges => { :until => 2017 },:name => "День міжнародної солідарності трудящих", :regions => [:ua]},
22
22
  {:mday => 9, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "День перемоги над нацизмом у Другій світовій війні", :regions => [:ua]}],
23
- 6 => [{:mday => 28, :year_ranges => [{:after => 1997}],:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "День Конституції", :regions => [:ua]}],
24
- 7 => [{:mday => 16, :year_ranges => [{:limited => [1991]}],:name => "День Незалежності України", :regions => [:ua]}],
25
- 8 => [{:mday => 24, :year_ranges => [{:after => 1992}],:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "День Незалежності", :regions => [:ua]}],
26
- 10 => [{:mday => 14, :year_ranges => [{:after => 2015}],:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "День захисника України", :regions => [:ua]}],
27
- 12 => [{:mday => 25, :year_ranges => [{:after => 2017}],:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Різдво Христове", :regions => [:ua]}]
23
+ 6 => [{:mday => 28, :year_ranges => { :from => 1997 },:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "День Конституції", :regions => [:ua]}],
24
+ 7 => [{:mday => 16, :year_ranges => { :limited => [1991] },:name => "День Незалежності України", :regions => [:ua]}],
25
+ 8 => [{:mday => 24, :year_ranges => { :from => 1992 },:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "День Незалежності", :regions => [:ua]}],
26
+ 10 => [{:mday => 14, :year_ranges => { :from => 2015 },:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "День захисника України", :regions => [:ua]}],
27
+ 12 => [{:mday => 25, :year_ranges => { :from => 2017 },:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Різдво Христове", :regions => [:ua]}]
28
28
  }
29
29
  end
30
30
 
@@ -7,7 +7,7 @@ module Holidays
7
7
  # All the definitions are available at https://github.com/holidays/holidays
8
8
  module US # :nodoc:
9
9
  def self.defined_regions
10
- [:us_fl, :us_la, :us, :us_ct, :us_de, :us_gu, :us_hi, :us_in, :us_ky, :us_nj, :us_nc, :us_nd, :us_pr, :us_tn, :us_ms, :us_id, :us_ar, :us_tx, :us_dc, :us_md, :us_va, :us_il, :us_vt, :us_ak, :us_ca, :us_me, :us_ma, :us_al, :us_ga, :us_ne, :us_mo, :us_sc, :us_wv, :us_vi, :us_ut, :us_ri, :us_az, :us_co, :us_mt, :us_nm, :us_ny, :us_oh, :us_pa, :us_mi, :us_mn, :us_nv, :us_or, :us_sd, :us_wa, :us_wi, :us_wy, :us_ia, :us_ks, :us_nh, :us_ok, :ca]
10
+ [:us_fl, :us_la, :us, :us_ct, :us_de, :us_gu, :us_hi, :us_in, :us_ky, :us_nj, :us_nc, :us_nd, :us_pr, :us_tn, :us_ms, :us_id, :us_ar, :us_tx, :us_dc, :us_md, :us_va, :us_vt, :us_ak, :us_ca, :us_me, :us_ma, :us_al, :us_ga, :us_ne, :us_mo, :us_sc, :us_wv, :us_vi, :us_ut, :us_ri, :us_az, :us_co, :us_il, :us_mt, :us_nm, :us_ny, :us_oh, :us_pa, :us_mi, :us_mn, :us_nv, :us_or, :us_sd, :us_wa, :us_wi, :us_wy, :us_ia, :us_ks, :us_nh, :us_ok, :ca]
11
11
  end
12
12
 
13
13
  def self.holidays_by_month
@@ -28,14 +28,13 @@ module Holidays
28
28
  2 => [{:wday => 1, :week => 3, :name => "Presidents' Day", :regions => [:us]},
29
29
  {:mday => 2, :type => :informal, :name => "Groundhog Day", :regions => [:us, :ca]},
30
30
  {:mday => 14, :type => :informal, :name => "Valentine's Day", :regions => [:us, :ca]}],
31
- 3 => [{:wday => 1, :week => 1, :name => "Casimir Pulaski Day", :regions => [:us_il]},
32
- {:wday => 2, :week => 1, :name => "Town Meeting Day", :regions => [:us_vt]},
31
+ 3 => [{:wday => 2, :week => 1, :name => "Town Meeting Day", :regions => [:us_vt]},
33
32
  {:mday => 2, :name => "Texas Independence Day", :regions => [:us_tx]},
34
33
  {:mday => 26, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Prince Jonah Kuhio Kalanianaole Day", :regions => [:us_hi]},
35
34
  {:wday => 1, :week => -1, :name => "Seward's Day", :regions => [:us_ak]},
36
35
  {:mday => 31, :name => "César Chávez Day", :regions => [:us_ca]},
37
36
  {:mday => 17, :type => :informal, :name => "St. Patrick's Day", :regions => [:us, :ca]}],
38
- 4 => [{:mday => 16, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Emancipation Day", :regions => [:us_dc, :us_ca]},
37
+ 4 => [{:mday => 16, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Emancipation Day", :regions => [:us_dc]},
39
38
  {:wday => 1, :week => 3, :name => "Patriots' Day", :regions => [:us_me, :us_ma]},
40
39
  {:mday => 21, :name => "San Jacinto Day", :regions => [:us_tx]},
41
40
  {:wday => 1, :week => -1, :name => "Confederate Memorial Day", :regions => [:us_al, :us_ms]},
@@ -71,7 +70,7 @@ module Holidays
71
70
  {:mday => 18, :name => "Alaska Day", :regions => [:us_ak]},
72
71
  {:wday => 5, :week => -1, :name => "Nevada Day", :regions => [:us_nv]},
73
72
  {:mday => 31, :type => :informal, :name => "Halloween", :regions => [:us, :ca]}],
74
- 11 => [{:function => "election_day(year)", :function_arguments => [:year], :name => "Election Day", :regions => [:us_de, :us_hi, :us_il, :us_in, :us_mt, :us_nj, :us_ny, :us_pa, :us_ri]},
73
+ 11 => [{:function => "election_day(year)", :function_arguments => [:year], :name => "Election Day", :regions => [:us_de, :us_hi, :us_in, :us_mt, :us_nj, :us_ny, :us_pa, :us_ri]},
75
74
  {:mday => 11, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Veterans Day", :regions => [:us]},
76
75
  {:wday => 4, :week => 4, :name => "Thanksgiving", :regions => [:us]},
77
76
  {:function => "day_after_thanksgiving(year)", :function_arguments => [:year], :name => "Family Day", :regions => [:us_nv]},
@@ -82,7 +81,7 @@ module Holidays
82
81
  {:function => "day_after_thanksgiving(year)", :function_arguments => [:year], :name => "Day after Thanksgiving (Black Friday)", :regions => [:us_ca, :us_de, :us_fl, :us_ia, :us_il, :us_ks, :us_ky, :us_me, :us_mi, :us_mn, :us_ms, :us_ne, :us_nh, :us_nc, :us_pa, :us_sc, :us_ok, :us_tn, :us_tx, :us_va, :us_wa, :us_wv]}],
83
82
  12 => [{:mday => 24, :name => "Christmas Eve", :regions => [:us_ar, :us_mi, :us_nc, :us_sc, :us_tx, :us_wi]},
84
83
  {:mday => 24, :function => "christmas_eve_holiday(date)", :function_arguments => [:date], :name => "Christmas Eve (Holiday)", :regions => [:us_mi, :us_sc, :us_va]},
85
- {:mday => 25, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Christmas Day", :regions => [:us]},
84
+ {:mday => 25, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Christmas Day", :regions => [:us]},
86
85
  {:mday => 26, :name => "Day after Christmas", :regions => [:us_ar, :us_nc, :us_ok, :us_sc, :us_tn, :us_tx]},
87
86
  {:mday => 31, :name => "New Year's Eve", :regions => [:us_mi, :us_wi]}]
88
87
  }
@@ -40,6 +40,8 @@ module Holidays
40
40
 
41
41
  start_date, end_date = get_date(start_date), get_date(end_date)
42
42
 
43
+ raise ArgumentError if end_date < start_date
44
+
43
45
  if cached_holidays = Factory::Definition.cache_repository.find(start_date, end_date, options)
44
46
  return cached_holidays
45
47
  end
@@ -87,16 +87,27 @@ module Holidays
87
87
  rule = {}
88
88
 
89
89
  definition.each do |key, val|
90
+ # Ruby 2.4 doesn't have the `transform_keys` method. Once we drop 2.4 support we can
91
+ # use `val.transform_keys!(&:to_sym) if val.is_a?(Hash)` instead of this `if` statement.
92
+ if val.is_a?(Hash)
93
+ val = val.keys.each_with_object({}) do |k, result|
94
+ result[k.to_sym] = val[k]
95
+ end
96
+ end
97
+
90
98
  rule[key.to_sym] = val
91
99
  end
92
100
 
93
- rule[:regions] = rule[:regions].collect { |r| r.to_sym }
94
- regions << rule[:regions]
101
+ if rule[:year_ranges] && rule[:year_ranges].key?(:between)
102
+ start_year = rule[:year_ranges][:between]["start"].to_i
103
+ end_year = rule[:year_ranges][:between]["end"].to_i
95
104
 
96
- if rule[:year_ranges]
97
- rule[:year_ranges] = clean_year_ranges(rule[:year_ranges])
105
+ rule[:year_ranges][:between] = Range.new(start_year, end_year)
98
106
  end
99
107
 
108
+ rule[:regions] = rule[:regions].collect { |r| r.to_sym }
109
+ regions << rule[:regions]
110
+
100
111
  exists = false
101
112
  rules_by_month[month].each do |ex|
102
113
  if ex[:name] == rule[:name] and ex[:wday] == rule[:wday] and ex[:mday] == rule[:mday] and ex[:week] == rule[:week] and ex[:type] == rule[:type] and ex[:function] == rule[:function] and ex[:observed] == rule[:observed] and ex[:year_ranges] == rule[:year_ranges]
@@ -121,23 +132,6 @@ module Holidays
121
132
  [regions, rules_by_month]
122
133
  end
123
134
 
124
- # In this case we end up parsing a range as "2006..2008" a string. This is codifying
125
- # what we already do...today we parse as a string but when writing out to our final
126
- # generated files it comes out as a range that Ruby interprets. This just puts it in stone
127
- # what we want to do.
128
- def clean_year_ranges(year_ranges)
129
- year_ranges.collect do |year_range|
130
- if year_range["between"]
131
- range = year_range["between"]
132
- if range.is_a?(String)
133
- year_range["between"] = Range.new(*range.split("..").map(&:to_i))
134
- end
135
- end
136
-
137
- year_range
138
- end
139
- end
140
-
141
135
  #FIXME This should really be split out and tested with its own unit tests.
142
136
  def generate_month_definition_strings(rules_by_month, parsed_custom_methods)
143
137
  month_strings = []
@@ -170,19 +164,11 @@ module Holidays
170
164
  string << ":wday => #{rule[:wday]}, :week => #{rule[:week]}, "
171
165
  end
172
166
 
173
- #FIXME I think this should be split out into its own file.
174
- if rule[:year_ranges] && rule[:year_ranges].kind_of?(Array)
175
- year_string = " :year_ranges => ["
176
- len = rule[:year_ranges].length
177
- rule[:year_ranges].each_with_index do |year,index|
178
- year_string << "{:#{year.keys.first} => #{year.values.first}}"
179
- if len == index + 1
180
- year_string << "],"
181
- else
182
- year_string << ","
183
- end
184
- end
185
- string << year_string
167
+ if rule[:year_ranges] && rule[:year_ranges].is_a?(Hash)
168
+ selector = rule[:year_ranges].keys.first
169
+ value = rule[:year_ranges][selector]
170
+
171
+ string << ":year_ranges => { :#{selector} => #{value} },"
186
172
  end
187
173
 
188
174
  if rule[:observed]