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
@@ -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]