holidays 8.8.0 → 9.1.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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/changelog-check.yml +47 -0
  3. data/.github/workflows/release.yml +46 -0
  4. data/.github/workflows/ruby.yml +2 -2
  5. data/CHANGELOG.md +10 -0
  6. data/README.md +4 -8
  7. data/holidays.gemspec +4 -4
  8. data/lib/generated_definitions/MANIFEST +3 -0
  9. data/lib/generated_definitions/REGIONS.rb +2 -2
  10. data/lib/generated_definitions/au.rb +9 -5
  11. data/lib/generated_definitions/bg.rb +7 -7
  12. data/lib/generated_definitions/cy.rb +40 -0
  13. data/lib/generated_definitions/de.rb +9 -5
  14. data/lib/generated_definitions/europe.rb +20 -14
  15. data/lib/generated_definitions/hk.rb +12 -77
  16. data/lib/generated_definitions/in.rb +64 -0
  17. data/lib/generated_definitions/it.rb +1 -0
  18. data/lib/generated_definitions/northamerica.rb +13 -5
  19. data/lib/generated_definitions/pl.rb +2 -1
  20. data/lib/generated_definitions/ro.rb +2 -0
  21. data/lib/generated_definitions/sk.rb +2 -4
  22. data/lib/generated_definitions/tsx.rb +46 -0
  23. data/lib/generated_definitions/ups.rb +2 -1
  24. data/lib/generated_definitions/us.rb +13 -5
  25. data/lib/holidays/date_calculator/lunar_date.rb +160 -5
  26. data/lib/holidays/date_calculator/weekend_modifier.rb +13 -0
  27. data/lib/holidays/definition/context/generator.rb +2 -2
  28. data/lib/holidays/definition/generator/regions.rb +2 -1
  29. data/lib/holidays/definition/generator/test.rb +1 -1
  30. data/lib/holidays/finder/context/search.rb +4 -1
  31. data/lib/holidays/load_all_definitions.rb +4 -1
  32. data/lib/holidays/version.rb +1 -1
  33. data/test/defs/test_defs_bg.rb +4 -4
  34. data/test/defs/test_defs_cy.rb +41 -0
  35. data/test/defs/test_defs_de.rb +2 -0
  36. data/test/defs/test_defs_europe.rb +26 -20
  37. data/test/defs/test_defs_hk.rb +34 -0
  38. data/test/defs/test_defs_in.rb +94 -0
  39. data/test/defs/test_defs_it.rb +2 -0
  40. data/test/defs/test_defs_northamerica.rb +16 -9
  41. data/test/defs/test_defs_pl.rb +3 -1
  42. data/test/defs/test_defs_ro.rb +4 -0
  43. data/test/defs/test_defs_sk.rb +11 -15
  44. data/test/defs/test_defs_tsx.rb +70 -0
  45. data/test/defs/test_defs_us.rb +16 -9
  46. data/test/holidays/definition/context/test_generator.rb +2 -2
  47. data/test/holidays/definition/generator/test_regions.rb +4 -4
  48. data/test/integration/test_available_regions.rb +1 -1
  49. data/test/integration/test_holidays.rb +1 -1
  50. metadata +21 -13
@@ -0,0 +1,64 @@
1
+ # encoding: utf-8
2
+ module Holidays
3
+ # This file is generated by the Ruby Holidays gem.
4
+ #
5
+ # Definitions loaded: definitions/in.yaml
6
+ #
7
+ # All the definitions are available at https://github.com/holidays/holidays
8
+ module IN # :nodoc:
9
+ def self.defined_regions
10
+ [:in, :in_wb, :in_od, :in_tr, :in_mh, :in_ar, :in_mz, :in_br, :in_hp, :in_gj, :in_sk, :in_ts, :in_jh, :in_py, :in_kl, :in_ka, :in_jk, :in_ap, :in_cg, :in_hr, :in_mp, :in_pb, :in_nl, :in_as, :in_ga]
11
+ end
12
+
13
+ def self.holidays_by_month
14
+ {
15
+ 0 => [{:function => "easter(year)", :function_arguments => [:year], :function_modifier => -2, :name => "Good Friday", :regions => [:in]}],
16
+ 1 => [{:mday => 1, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "New Year's Day", :regions => [:in]},
17
+ {:mday => 12, :name => "Swami Vivekananda Jayanti", :regions => [:in_wb]},
18
+ {:mday => 14, :name => "Makar Sankranti / Pongal / Magh Bihu / Uttarayan / Khichdi / Sankranti", :regions => [:in]},
19
+ {:mday => 23, :name => "Netaji Subhas Chandra Bose Jayanti", :regions => [:in_od, :in_wb, :in_tr]},
20
+ {:mday => 26, :name => "Republic Day", :regions => [:in]}],
21
+ 2 => [{:mday => 19, :name => "Chhatrapati Shivaji Maharaj Jayanti", :regions => [:in_mh]},
22
+ {:mday => 20, :name => "Arunachal Pradesh Statehood Day", :regions => [:in_ar]},
23
+ {:mday => 20, :name => "Mizoram State Day", :regions => [:in_mz]}],
24
+ 3 => [{:mday => 22, :name => "Bihar Day", :regions => [:in_br]}],
25
+ 4 => [{:mday => 1, :name => "Odisha Day", :regions => [:in_od]},
26
+ {:mday => 14, :name => "Dr. B. R. Ambedkar Jayanti", :regions => [:in]},
27
+ {:mday => 15, :name => "Himachal Pradesh Day", :regions => [:in_hp]},
28
+ {:mday => 15, :name => "West Bengal Day", :regions => [:in_wb]}],
29
+ 5 => [{:mday => 1, :name => "Gujarat Day", :regions => [:in_gj]},
30
+ {:mday => 1, :name => "Maharashtra Day", :regions => [:in_mh]},
31
+ {:mday => 1, :name => "Labour Day", :regions => [:in]},
32
+ {:mday => 7, :name => "Rabindranath Tagore Jayanti", :regions => [:in_wb]},
33
+ {:mday => 16, :name => "Sikkim State Day", :regions => [:in_sk]}],
34
+ 6 => [{:mday => 2, :name => "Telangana Formation Day", :regions => [:in_ts]}],
35
+ 7 => [{:mday => 13, :name => "Martyrs' Day", :regions => [:in_jh]}],
36
+ 8 => [{:mday => 15, :name => "Independence day", :regions => [:in]},
37
+ {:mday => 16, :name => "Puducherry De Jure Transfer Day", :regions => [:in_py]},
38
+ {:mday => 20, :name => "Sree Narayana Guru Jayanti", :regions => [:in_kl]}],
39
+ 9 => [{:mday => 17, :name => "Hyderabad-Karnataka Liberation Day", :regions => [:in_ka]}],
40
+ 10 => [{:mday => 2, :name => "Mahatma Gandhi Jayanti", :regions => [:in]},
41
+ {:mday => 26, :name => "Jammu and Kashmir Association Day", :regions => [:in_jk]},
42
+ {:mday => 31, :name => "Sardar Vallabhbhai Patel Jayanti", :regions => [:in_gj]}],
43
+ 11 => [{:mday => 1, :name => "Andhra Pradesh Day", :regions => [:in_ap]},
44
+ {:mday => 1, :name => "Chhattisgarh Rajyotsava", :regions => [:in_cg]},
45
+ {:mday => 1, :name => "Haryana Day", :regions => [:in_hr]},
46
+ {:mday => 1, :name => "Kannada Rajyothsava", :regions => [:in_ka]},
47
+ {:mday => 1, :name => "Kerala Day", :regions => [:in_kl]},
48
+ {:mday => 1, :name => "Madhya Pradesh Day", :regions => [:in_mp]},
49
+ {:mday => 1, :name => "Punjab Day", :regions => [:in_pb]},
50
+ {:mday => 1, :name => "Puducherry Liberation Day", :regions => [:in_py]}],
51
+ 12 => [{:mday => 1, :name => "Nagaland State Inauguration Day", :regions => [:in_nl]},
52
+ {:mday => 2, :name => "Asom Day", :regions => [:in_as]},
53
+ {:mday => 19, :name => "Goa Liberation Day", :regions => [:in_ga]},
54
+ {:mday => 25, :name => "Christmas Day", :regions => [:in]}]
55
+ }
56
+ end
57
+
58
+ def self.custom_methods
59
+ {
60
+
61
+ }
62
+ end
63
+ end
64
+ end
@@ -27,6 +27,7 @@ module Holidays
27
27
  {:mday => 29, :name => "Festa di San Pietro e Paolo", :regions => [:it_rm]}],
28
28
  8 => [{:mday => 15, :name => "Assunzione", :regions => [:it]}],
29
29
  9 => [{:mday => 8, :name => "Festa della Madonna di Monte Berico", :regions => [:it_vi]}],
30
+ 10 => [{:mday => 4, :year_ranges => { :from => 2026 },:name => "Festa di San Francesco d'Assisi", :regions => [:it]}],
30
31
  11 => [{:mday => 1, :name => "Ognissanti", :regions => [:it]},
31
32
  {:mday => 11, :name => "Festa di San Martino", :regions => [:it_bl]},
32
33
  {:mday => 26, :name => "Festa di San Bellino", :regions => [:it_ro]}],
@@ -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_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]
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_al, :us_la, :us, :us_ct, :us_de, :us_gu, :us_hi, :us_in, :us_ky, :us_nj, :us_nc, :us_nd, :us_pa, :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_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_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
@@ -16,9 +16,9 @@ module Holidays
16
16
  {:function => "easter(year)", :function_arguments => [:year], :type => :informal, :name => "Easter Sunday", :regions => [:ca]},
17
17
  {:function => "easter(year)", :function_arguments => [:year], :function_modifier => 1, :type => :informal, :name => "Easter Monday", :regions => [:ca]},
18
18
  {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -47, :name => "Shrove Tuesday", :regions => [:us_fl]},
19
- {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -47, :name => "Mardi Gras Day", :regions => [:us_la]},
19
+ {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -47, :name => "Mardi Gras Day", :regions => [:us_al, :us_la]},
20
20
  {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -2, :type => :informal, :name => "Good Friday", :regions => [:us]},
21
- {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -2, :name => "Good Friday", :regions => [:us_ct, :us_de, :us_gu, :us_hi, :us_in, :us_ky, :us_la, :us_nj, :us_nc, :us_nd, :us_pr, :us_tn]},
21
+ {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -2, :name => "Good Friday", :regions => [:us_ct, :us_de, :us_gu, :us_hi, :us_in, :us_ky, :us_la, :us_nj, :us_nc, :us_nd, :us_pa, :us_pr, :us_tn]},
22
22
  {:function => "easter(year)", :function_arguments => [:year], :type => :informal, :name => "Easter Sunday", :regions => [:us]}],
23
23
  1 => [{:mday => 1, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "New Year's Day", :regions => [:ca]},
24
24
  {:mday => 2, :name => "New Year's", :regions => [:ca_qc]},
@@ -118,6 +118,7 @@ module Holidays
118
118
  {:mday => 2, :type => :informal, :name => "Los Fieles Difuntos", :regions => [:mx]},
119
119
  {:wday => 1, :week => 3, :name => "Día de la Revolución", :regions => [:mx]},
120
120
  {: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]},
121
+ {:function => "even_year_election_day(year)", :function_arguments => [:year], :name => "Election Day", :regions => [:us_la]},
121
122
  {:mday => 11, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Veterans Day", :regions => [:us]},
122
123
  {:wday => 4, :week => 4, :name => "Thanksgiving", :regions => [:us]},
123
124
  {:function => "day_after_thanksgiving(year)", :function_arguments => [:year], :name => "Family Day", :regions => [:us_nv]},
@@ -145,10 +146,11 @@ module Holidays
145
146
  {:mday => 16, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Emancipation Day", :regions => [:us_dc]},
146
147
  {:wday => 1, :week => 3, :name => "Patriots' Day", :regions => [:us_me, :us_ma]},
147
148
  {:mday => 21, :name => "San Jacinto Day", :regions => [:us_tx]},
148
- {:wday => 1, :week => -1, :name => "Confederate Memorial Day", :regions => [:us_al, :us_ms]},
149
+ {:wday => 1, :week => -1, :name => "Confederate Memorial Day", :regions => [:us_ms]},
150
+ {:wday => 1, :week => 4, :name => "Confederate Memorial Day", :regions => [:us_al]},
149
151
  {:mday => 26, :observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Confederate Memorial Day", :regions => [:us_fl]},
150
152
  {:function => "georgia_state_holiday(year, month)", :function_arguments => [:year, :month], :name => "State Holiday", :regions => [:us_ga]},
151
- {:mday => 28, :name => "Arbor Day", :regions => [:us_ne]},
153
+ {:wday => 5, :week => -1, :name => "Arbor Day", :regions => [:us_ne]},
152
154
  {:mday => 1, :type => :informal, :name => "April Fool's Day", :regions => [:us, :ca]},
153
155
  {:mday => 22, :type => :informal, :name => "Earth Day", :regions => [:us, :ca]}]
154
156
  }
@@ -214,6 +216,12 @@ king_day.downto(beginning_of_month).find {|date| date if date.wday == 5 }
214
216
  Holidays::Factory::DateCalculator.day_of_month_calculator.call(year, 11, 1, 1) + 1
215
217
  },
216
218
 
219
+ "even_year_election_day(year)" => Proc.new { |year|
220
+ if year % 2 == 0
221
+ Holidays::Factory::DateCalculator.day_of_month_calculator.call(year, 11, 1, 1) + 1
222
+ end
223
+ },
224
+
217
225
  "us_inauguration_day(year)" => Proc.new { |year|
218
226
  year % 4 == 1 ? 20 : nil
219
227
  },
@@ -48,7 +48,8 @@ module Holidays
48
48
  {:mday => 29, :type => :informal, :name => "Andrzejki", :regions => [:pl]}],
49
49
  12 => [{:mday => 4, :type => :informal, :name => "Barbórka (Dzień Górnika, Naftowca i Gazownika)", :regions => [:pl]},
50
50
  {:mday => 6, :type => :informal, :name => "Mikołajki", :regions => [:pl]},
51
- {:mday => 24, :type => :informal, :name => "Wigilia Bożego Narodzenia", :regions => [:pl]},
51
+ {:mday => 24, :year_ranges => { :from => 2025 },:name => "Wigilia Bożego Narodzenia", :regions => [:pl]},
52
+ {:mday => 24, :year_ranges => { :until => 2024 },:type => :informal, :name => "Wigilia Bożego Narodzenia", :regions => [:pl]},
52
53
  {:mday => 25, :name => "pierwszy dzień Bożego Narodzenia", :regions => [:pl]},
53
54
  {:mday => 26, :name => "drugi dzień Bożego Narodzenia", :regions => [:pl]},
54
55
  {:mday => 31, :type => :informal, :name => "Sylwester", :regions => [:pl]}]
@@ -19,6 +19,8 @@ module Holidays
19
19
  {:function => "orthodox_easter(year)", :function_arguments => [:year], :function_modifier => 50, :name => "Rusaliile - 51", :regions => [:ro]}],
20
20
  1 => [{:mday => 1, :name => "Anul nou", :regions => [:ro]},
21
21
  {:mday => 2, :name => "Anul nou", :regions => [:ro]},
22
+ {:mday => 6, :name => "Botezul Domnului - Boboteaza", :regions => [:ro]},
23
+ {:mday => 7, :name => "Soborul Sfântului Proroc Ioan Botezătorul", :regions => [:ro]},
22
24
  {:mday => 24, :year_ranges => { :from => 2017 },:name => "Unirea Principatelor Române", :regions => [:ro]}],
23
25
  5 => [{:mday => 1, :name => "Ziua muncii", :regions => [:ro]}],
24
26
  6 => [{:mday => 1, :year_ranges => { :from => 2017 },:name => "Ziua Copilului", :regions => [:ro]}],
@@ -20,10 +20,8 @@ module Holidays
20
20
  {:mday => 8, :name => "Deň víťazstva nad fašizmom", :regions => [:sk]}],
21
21
  7 => [{:mday => 5, :name => "Sviatok svätého Cyrila a svätého Metoda", :regions => [:sk]}],
22
22
  8 => [{:mday => 29, :name => "Výročie Slovenského národného povstania", :regions => [:sk]}],
23
- 9 => [{:mday => 1, :name => "Deň Ústavy Slovenskej republiky", :regions => [:sk]},
24
- {:mday => 15, :name => "Sedembolestná Panna Mária", :regions => [:sk]}],
25
- 11 => [{:mday => 1, :name => "Sviatok všetkých svätých", :regions => [:sk]},
26
- {:mday => 17, :name => "Deň boja za slobodu a demokraciu", :regions => [:sk]}],
23
+ 9 => [{:mday => 15, :name => "Sedembolestná Panna Mária", :regions => [:sk]}],
24
+ 11 => [{:mday => 1, :name => "Sviatok všetkých svätých", :regions => [:sk]}],
27
25
  12 => [{:mday => 24, :name => "Štedrý deň", :regions => [:sk]},
28
26
  {:mday => 25, :name => "1. sviatok vianočný", :regions => [:sk]},
29
27
  {:mday => 26, :name => "2. sviatok vianočný", :regions => [:sk]}]
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+ module Holidays
3
+ # This file is generated by the Ruby Holidays gem.
4
+ #
5
+ # Definitions loaded: definitions/tsx.yaml
6
+ #
7
+ # All the definitions are available at https://github.com/holidays/holidays
8
+ module TSX # :nodoc:
9
+ def self.defined_regions
10
+ [:tsx]
11
+ end
12
+
13
+ def self.holidays_by_month
14
+ {
15
+ 0 => [{:function => "easter(year)", :function_arguments => [:year], :function_modifier => -2, :name => "Good Friday", :regions => [:tsx]}],
16
+ 1 => [{:mday => 1, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "New Year's Day", :regions => [:tsx]}],
17
+ 2 => [{:wday => 1, :week => 3, :year_ranges => { :from => 2008 },:name => "Family Day", :regions => [:tsx]}],
18
+ 5 => [{:function => "ca_victoria_day(year)", :function_arguments => [:year], :name => "Victoria Day", :regions => [:tsx]}],
19
+ 7 => [{:mday => 1, :observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Canada Day", :regions => [:tsx]}],
20
+ 8 => [{:wday => 1, :week => 1, :name => "Civic Holiday", :regions => [:tsx]}],
21
+ 9 => [{:wday => 1, :week => 1, :name => "Labour Day", :regions => [:tsx]}],
22
+ 10 => [{:wday => 1, :week => 2, :name => "Thanksgiving", :regions => [:tsx]}],
23
+ 12 => [{:mday => 25, :year_ranges => { :until => 2020 },:observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Christmas Day", :regions => [:tsx]},
24
+ {:mday => 25, :year_ranges => { :from => 2020 },:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Christmas Day", :regions => [:tsx]},
25
+ {:mday => 26, :year_ranges => { :until => 2020 },:observed => "to_monday_if_weekend(date)", :observed_arguments => [:date], :name => "Boxing Day", :regions => [:tsx]},
26
+ {:mday => 26, :year_ranges => { :from => 2020 },:observed => "to_weekday_if_boxing_weekend(date)", :observed_arguments => [:date], :name => "Boxing Day", :regions => [:tsx]}]
27
+ }
28
+ end
29
+
30
+ def self.custom_methods
31
+ {
32
+ "ca_victoria_day(year)" => Proc.new { |year|
33
+ date = Date.civil(year,5,24)
34
+ if date.wday > 1
35
+ date -= (date.wday - 1)
36
+ elsif date.wday == 0
37
+ date -= 6
38
+ end
39
+ date
40
+ },
41
+
42
+
43
+ }
44
+ end
45
+ end
46
+ end
@@ -12,7 +12,8 @@ module Holidays
12
12
 
13
13
  def self.holidays_by_month
14
14
  {
15
- 1 => [{:mday => 1, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "New Year's Day", :regions => [:ups]}],
15
+ 1 => [{:mday => 1, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "New Year's Day", :regions => [:ups]},
16
+ {:wday => 1, :week => 3, :name => "Birthday of Martin Luther King, Jr", :regions => [:ups]}],
16
17
  5 => [{:wday => 1, :week => -1, :name => "Memorial Day", :regions => [:ups]}],
17
18
  7 => [{:mday => 4, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Independence Day", :regions => [:ups]}],
18
19
  9 => [{:wday => 1, :week => 1, :name => "Labor Day", :regions => [:ups]}],
@@ -7,15 +7,15 @@ 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_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]
10
+ [:us_fl, :us_al, :us_la, :us, :us_ct, :us_de, :us_gu, :us_hi, :us_in, :us_ky, :us_nj, :us_nc, :us_nd, :us_pa, :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_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_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
14
14
  {
15
15
  0 => [{:function => "easter(year)", :function_arguments => [:year], :function_modifier => -47, :name => "Shrove Tuesday", :regions => [:us_fl]},
16
- {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -47, :name => "Mardi Gras Day", :regions => [:us_la]},
16
+ {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -47, :name => "Mardi Gras Day", :regions => [:us_al, :us_la]},
17
17
  {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -2, :type => :informal, :name => "Good Friday", :regions => [:us]},
18
- {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -2, :name => "Good Friday", :regions => [:us_ct, :us_de, :us_gu, :us_hi, :us_in, :us_ky, :us_la, :us_nj, :us_nc, :us_nd, :us_pr, :us_tn]},
18
+ {:function => "easter(year)", :function_arguments => [:year], :function_modifier => -2, :name => "Good Friday", :regions => [:us_ct, :us_de, :us_gu, :us_hi, :us_in, :us_ky, :us_la, :us_nj, :us_nc, :us_nd, :us_pa, :us_pr, :us_tn]},
19
19
  {:function => "easter(year)", :function_arguments => [:year], :type => :informal, :name => "Easter Sunday", :regions => [:us]}],
20
20
  1 => [{:mday => 1, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "New Year's Day", :regions => [:us]},
21
21
  {:wday => 1, :week => 3, :name => "Martin Luther King's and Robert E. Lee's Birthdays", :regions => [:us_ms]},
@@ -37,10 +37,11 @@ module Holidays
37
37
  4 => [{:mday => 16, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Emancipation Day", :regions => [:us_dc]},
38
38
  {:wday => 1, :week => 3, :name => "Patriots' Day", :regions => [:us_me, :us_ma]},
39
39
  {:mday => 21, :name => "San Jacinto Day", :regions => [:us_tx]},
40
- {:wday => 1, :week => -1, :name => "Confederate Memorial Day", :regions => [:us_al, :us_ms]},
40
+ {:wday => 1, :week => -1, :name => "Confederate Memorial Day", :regions => [:us_ms]},
41
+ {:wday => 1, :week => 4, :name => "Confederate Memorial Day", :regions => [:us_al]},
41
42
  {:mday => 26, :observed => "to_monday_if_sunday(date)", :observed_arguments => [:date], :name => "Confederate Memorial Day", :regions => [:us_fl]},
42
43
  {:function => "georgia_state_holiday(year, month)", :function_arguments => [:year, :month], :name => "State Holiday", :regions => [:us_ga]},
43
- {:mday => 28, :name => "Arbor Day", :regions => [:us_ne]},
44
+ {:wday => 5, :week => -1, :name => "Arbor Day", :regions => [:us_ne]},
44
45
  {:mday => 1, :type => :informal, :name => "April Fool's Day", :regions => [:us, :ca]},
45
46
  {:mday => 22, :type => :informal, :name => "Earth Day", :regions => [:us, :ca]}],
46
47
  5 => [{:mday => 8, :name => "Truman Day", :regions => [:us_mo]},
@@ -72,6 +73,7 @@ module Holidays
72
73
  {:wday => 5, :week => -1, :name => "Nevada Day", :regions => [:us_nv]},
73
74
  {:mday => 31, :type => :informal, :name => "Halloween", :regions => [:us, :ca]}],
74
75
  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]},
76
+ {:function => "even_year_election_day(year)", :function_arguments => [:year], :name => "Election Day", :regions => [:us_la]},
75
77
  {:mday => 11, :observed => "to_weekday_if_weekend(date)", :observed_arguments => [:date], :name => "Veterans Day", :regions => [:us]},
76
78
  {:wday => 4, :week => 4, :name => "Thanksgiving", :regions => [:us]},
77
79
  {:function => "day_after_thanksgiving(year)", :function_arguments => [:year], :name => "Family Day", :regions => [:us_nv]},
@@ -138,6 +140,12 @@ king_day.downto(beginning_of_month).find {|date| date if date.wday == 5 }
138
140
  Holidays::Factory::DateCalculator.day_of_month_calculator.call(year, 11, 1, 1) + 1
139
141
  },
140
142
 
143
+ "even_year_election_day(year)" => Proc.new { |year|
144
+ if year % 2 == 0
145
+ Holidays::Factory::DateCalculator.day_of_month_calculator.call(year, 11, 1, 1) + 1
146
+ end
147
+ },
148
+
141
149
  "us_inauguration_day(year)" => Proc.new { |year|
142
150
  year % 4 == 1 ? 20 : nil
143
151
  },
@@ -340,18 +340,173 @@ module Holidays
340
340
  [355, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1].freeze
341
341
  ].freeze
342
342
 
343
+ # Source: https://github.com/hungtcs/traditional-chinese-calendar-database/blob/master/database/all.json
344
+ CHINESE_LUNAR_YEAR_INFO = [
345
+ [384, 1, 2, 1, 1, 2, 1, 2, 4, 2, 2, 1, 2].freeze, # 1900 unavailable, filled with data from Vietnamese calendar
346
+ [354, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1].freeze,
347
+ [355, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2].freeze,
348
+ [383, 1, 2, 1, 2, 3, 2, 1, 1, 2, 2, 1, 2].freeze,
349
+ [354, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1].freeze,
350
+ [355, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
351
+ [384, 1, 2, 2, 5, 1, 2, 1, 2, 1, 2, 1, 2].freeze,
352
+ [354, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1].freeze,
353
+ [355, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2].freeze,
354
+ [384, 1, 4, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2].freeze,
355
+ [354, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1].freeze,
356
+ [384, 2, 1, 2, 1, 1, 4, 1, 2, 2, 1, 2, 2].freeze,
357
+ [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2].freeze,
358
+ [354, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2].freeze,
359
+ [384, 2, 2, 1, 2, 5, 1, 2, 1, 1, 2, 1, 2].freeze,
360
+ [354, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1].freeze,
361
+ [355, 2, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1].freeze,
362
+ [384, 2, 3, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1].freeze,
363
+ [355, 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2].freeze,
364
+ [384, 1, 2, 1, 1, 2, 1, 5, 2, 1, 2, 2, 2].freeze,
365
+ [354, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2].freeze,
366
+ [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2].freeze,
367
+ [384, 2, 1, 2, 2, 3, 2, 1, 1, 2, 1, 2, 2].freeze,
368
+ [354, 1, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2].freeze,
369
+ [354, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1].freeze,
370
+ [385, 2, 1, 2, 5, 2, 1, 2, 2, 1, 2, 1, 2].freeze,
371
+ [354, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1].freeze,
372
+ [355, 2, 1, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2].freeze,
373
+ [384, 1, 4, 1, 2, 1, 1, 2, 1, 2, 2, 2, 2].freeze,
374
+ [354, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2].freeze,
375
+ [383, 1, 2, 2, 1, 1, 4, 1, 2, 1, 2, 2, 1].freeze,
376
+ [354, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1].freeze,
377
+ [355, 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2].freeze,
378
+ [384, 1, 2, 2, 1, 6, 1, 2, 1, 2, 1, 1, 2].freeze,
379
+ [355, 1, 2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2].freeze,
380
+ [354, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1].freeze,
381
+ [384, 2, 1, 5, 1, 1, 2, 2, 1, 2, 2, 2, 1].freeze,
382
+ [354, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1].freeze,
383
+ [384, 2, 2, 1, 1, 2, 1, 5, 1, 2, 2, 1, 2].freeze,
384
+ [354, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
385
+ [354, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1].freeze,
386
+ [384, 2, 2, 1, 2, 2, 5, 1, 1, 2, 1, 2, 1].freeze,
387
+ [355, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2].freeze,
388
+ [354, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1].freeze,
389
+ [385, 2, 1, 2, 5, 1, 2, 1, 2, 2, 1, 2, 2].freeze,
390
+ [354, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2].freeze,
391
+ [354, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2].freeze,
392
+ [384, 2, 4, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2].freeze,
393
+ [354, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
394
+ [384, 2, 1, 2, 2, 1, 2, 3, 2, 1, 2, 1, 2].freeze,
395
+ [354, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1].freeze, # 1950
396
+ [355, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2].freeze,
397
+ [384, 1, 2, 1, 2, 5, 1, 2, 2, 1, 2, 1, 2].freeze,
398
+ [354, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1].freeze,
399
+ [355, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2].freeze,
400
+ [384, 1, 2, 5, 1, 1, 2, 1, 2, 1, 2, 2, 2].freeze,
401
+ [354, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2].freeze,
402
+ [383, 2, 1, 2, 1, 2, 1, 1, 4, 2, 1, 2, 1].freeze,
403
+ [355, 2, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
404
+ [354, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1].freeze,
405
+ [384, 2, 1, 2, 1, 2, 4, 2, 1, 2, 1, 2, 1].freeze,
406
+ [355, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2].freeze,
407
+ [354, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1].freeze,
408
+ [384, 2, 1, 2, 3, 2, 1, 2, 1, 2, 2, 2, 1].freeze,
409
+ [355, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2].freeze,
410
+ [353, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1].freeze,
411
+ [384, 2, 2, 4, 2, 1, 1, 2, 1, 1, 2, 2, 1].freeze,
412
+ [355, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
413
+ [384, 1, 2, 1, 2, 2, 1, 4, 2, 1, 2, 1, 2].freeze,
414
+ [354, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1].freeze,
415
+ [355, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2].freeze,
416
+ [384, 1, 2, 1, 1, 4, 2, 1, 2, 2, 2, 1, 2].freeze,
417
+ [354, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2].freeze,
418
+ [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2].freeze,
419
+ [384, 2, 2, 1, 4, 1, 2, 1, 1, 2, 2, 1, 2].freeze,
420
+ [354, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2].freeze,
421
+ [384, 2, 2, 1, 2, 1, 2, 1, 4, 1, 2, 1, 2].freeze,
422
+ [354, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1].freeze,
423
+ [355, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1].freeze,
424
+ [384, 2, 1, 1, 2, 1, 6, 1, 2, 2, 1, 2, 1].freeze,
425
+ [355, 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2].freeze,
426
+ [354, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2].freeze,
427
+ [384, 2, 1, 2, 3, 2, 1, 1, 2, 1, 2, 2, 2].freeze,
428
+ [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2].freeze,
429
+ [384, 2, 1, 2, 2, 1, 1, 2, 1, 1, 4, 2, 2].freeze,
430
+ [354, 1, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2].freeze,
431
+ [354, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1].freeze,
432
+ [384, 2, 1, 2, 1, 2, 4, 2, 2, 1, 2, 1, 1].freeze,
433
+ [355, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1].freeze,
434
+ [355, 2, 1, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2].freeze,
435
+ [384, 1, 2, 1, 1, 4, 1, 2, 1, 2, 2, 2, 2].freeze,
436
+ [354, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2].freeze,
437
+ [354, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2].freeze,
438
+ [383, 1, 2, 4, 2, 1, 2, 1, 1, 2, 1, 2, 1].freeze,
439
+ [355, 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2].freeze,
440
+ [384, 1, 2, 2, 1, 2, 1, 2, 4, 1, 2, 1, 2].freeze,
441
+ [354, 1, 2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 1].freeze,
442
+ [355, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1].freeze,
443
+ [384, 2, 1, 1, 2, 3, 2, 2, 1, 2, 2, 1, 2].freeze,
444
+ [354, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1].freeze,
445
+ [354, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1].freeze, # 2000
446
+ [384, 2, 2, 1, 4, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
447
+ [354, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1].freeze,
448
+ [355, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2].freeze,
449
+ [384, 1, 4, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2].freeze,
450
+ [354, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1].freeze,
451
+ [385, 2, 1, 2, 1, 2, 1, 4, 2, 2, 1, 2, 2].freeze,
452
+ [354, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2].freeze,
453
+ [354, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2].freeze,
454
+ [384, 2, 2, 1, 1, 4, 1, 2, 1, 2, 1, 2, 2].freeze,
455
+ [354, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
456
+ [354, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1].freeze,
457
+ [384, 2, 1, 2, 4, 2, 1, 2, 1, 2, 1, 2, 1].freeze,
458
+ [355, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2].freeze,
459
+ [384, 1, 2, 1, 2, 1, 2, 1, 2, 4, 2, 1, 2].freeze,
460
+ [354, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 1].freeze,
461
+ [355, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2].freeze,
462
+ [384, 1, 2, 1, 2, 1, 5, 1, 2, 1, 2, 2, 2].freeze,
463
+ [354, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2].freeze,
464
+ [354, 2, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2].freeze,
465
+ [384, 1, 2, 2, 4, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
466
+ [354, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1].freeze,
467
+ [355, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2].freeze,
468
+ [384, 1, 4, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2].freeze,
469
+ [354, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1].freeze,
470
+ [384, 2, 1, 2, 1, 1, 4, 2, 1, 2, 2, 2, 1].freeze,
471
+ [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1].freeze,
472
+ [354, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1].freeze,
473
+ [384, 2, 2, 2, 1, 4, 1, 2, 1, 1, 2, 2, 1].freeze,
474
+ [355, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 2].freeze,
475
+ [354, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1].freeze,
476
+ [384, 1, 2, 4, 2, 1, 2, 2, 1, 2, 1, 2, 1].freeze,
477
+ [355, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2].freeze,
478
+ [384, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 4, 2].freeze,
479
+ [354, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2].freeze,
480
+ [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2].freeze,
481
+ [384, 2, 2, 1, 2, 1, 5, 1, 1, 2, 1, 2, 2].freeze,
482
+ [354, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2].freeze,
483
+ [354, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1].freeze,
484
+ [384, 2, 2, 1, 2, 4, 2, 1, 2, 1, 2, 1, 1].freeze,
485
+ [355, 2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 1].freeze,
486
+ [355, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2].freeze,
487
+ [384, 1, 4, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2].freeze,
488
+ [354, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2].freeze,
489
+ [384, 2, 1, 2, 1, 1, 2, 3, 2, 1, 2, 2, 2].freeze,
490
+ [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2].freeze,
491
+ [354, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2].freeze,
492
+ [384, 2, 1, 2, 2, 5, 1, 2, 1, 1, 2, 1, 2].freeze,
493
+ [354, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1].freeze,
494
+ [355, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1].freeze, # 2049
495
+ ].freeze
496
+
343
497
  MAX_YEAR_NUMBER = 150
344
498
 
345
- # Given the region, CALENDAR_YEAR_INFO_MAP looks up the date
499
+ # Given the region, CALENDAR_YEAR_INFO_MAP looks up the date
346
500
  # table and uses it in the calculation
347
501
  CALENDAR_YEAR_INFO_MAP = {
348
502
  kr: KOREAN_LUNAR_YEAR_INFO,
349
- vi: VIETNAMESE_LUNAR_YEAR_INFO
503
+ vi: VIETNAMESE_LUNAR_YEAR_INFO,
504
+ hk: CHINESE_LUNAR_YEAR_INFO,
350
505
  }.freeze
351
506
 
352
- # Provides number of days per lunar month type. Lunar months
353
- # can be either 29 or 30 days long (29.5 days, rounded up or down).
354
- # Keys 3 - 6 provide data for intercalary (leap month) occurrences.
507
+ # Provides number of days per lunar month type. Lunar months
508
+ # can be either 29 or 30 days long (29.5 days, rounded up or down).
509
+ # Keys 3 - 6 provide data for intercalary (leap month) occurrences.
355
510
  # Format: [TOTAL, NORMAL, LEAP]
356
511
  LUNARDAYS_FOR_MONTHTYPE = {
357
512
  1 => [29, 29, 0],
@@ -17,6 +17,14 @@ module Holidays
17
17
  to_next_weekday(date)
18
18
  end
19
19
 
20
+ def to_the_weekday_after(date)
21
+ to_monday_if_sunday(to_monday_if_sunday(date) + 1)
22
+ end
23
+
24
+ def to_the_second_weekday_after(date)
25
+ to_monday_if_sunday(to_the_weekday_after(date) + 1)
26
+ end
27
+
20
28
  # Move Boxing Day if it falls on a weekend, leaving room for Christmas.
21
29
  # Used as a callback function.
22
30
  def to_weekday_if_boxing_weekend(date)
@@ -75,6 +83,11 @@ module Holidays
75
83
 
76
84
  date
77
85
  end
86
+
87
+ def to_previous_day_if_leap_year(date)
88
+ date -= 1 if ::Date.gregorian_leap?(date.year)
89
+ date
90
+ end
78
91
  end
79
92
  end
80
93
  end
@@ -62,7 +62,7 @@ module Holidays
62
62
  month_strings = generate_month_definition_strings(rules_by_month, custom_methods)
63
63
 
64
64
  # Build the custom methods string
65
- custom_method_string = ''
65
+ custom_method_string = +''
66
66
  custom_methods.each do |key, code|
67
67
  custom_method_string << @custom_method_source_decorator.call(code) + ",\n\n"
68
68
  end
@@ -140,7 +140,7 @@ module Holidays
140
140
  month_string = " #{month.to_s} => ["
141
141
  rule_strings = []
142
142
  rules.each do |rule|
143
- string = '{'
143
+ string = +'{'
144
144
  if rule[:mday]
145
145
  string << ":mday => #{rule[:mday]}, "
146
146
  end
@@ -47,7 +47,8 @@ EOF
47
47
  end
48
48
  end
49
49
 
50
- lookup
50
+ pairs = lookup.map { |k, v| "#{k}: :#{v}" }.join(", ")
51
+ "{#{pairs}}"
51
52
  end
52
53
  end
53
54
  end
@@ -37,7 +37,7 @@ EndOfTests
37
37
  end
38
38
 
39
39
  def decorate(tests)
40
- out = ""
40
+ out = +""
41
41
 
42
42
  tests.each do |t|
43
43
  out << "\n " + @decorator.call(t)
@@ -36,7 +36,10 @@ module Holidays
36
36
  end
37
37
  end
38
38
 
39
- holidays
39
+ holidays.sort_by.with_index do |h, i|
40
+ direct = h[:regions].any? { |r| regions.include?(r) } ? 0 : 1
41
+ [direct, i]
42
+ end
40
43
  end
41
44
 
42
45
  private
@@ -21,7 +21,10 @@ module Holidays
21
21
  "calculate_day_of_month(year, month, day, wday)" => day_of_month_calculator.method(:call).to_proc,
22
22
  "to_weekday_if_boxing_weekend_from_year_or_to_tuesday_if_monday(year)" => weekend_modifier.method(:to_weekday_if_boxing_weekend_from_year_or_to_tuesday_if_monday).to_proc,
23
23
  "to_tuesday_if_sunday_or_monday_if_saturday(date)" => weekend_modifier.method(:to_tuesday_if_sunday_or_monday_if_saturday).to_proc,
24
- "lunar_to_solar(year, month, day, region)" => lunar_date.method(:to_solar).to_proc,
24
+ "lunar_to_solar(year, month, day, region)" => lunar_date.method(:to_solar).to_proc,
25
+ "to_the_weekday_after(date)" => weekend_modifier.method(:to_the_weekday_after).to_proc,
26
+ "to_the_second_weekday_after(date)" => weekend_modifier.method(:to_the_second_weekday_after).to_proc,
27
+ "to_previous_day_if_leap_year(date)" => weekend_modifier.method(:to_previous_day_if_leap_year).to_proc,
25
28
  }
26
29
 
27
30
  Factory::Definition.custom_methods_repository.add(global_methods)
@@ -1,3 +1,3 @@
1
1
  module Holidays
2
- VERSION = '8.8.0'
2
+ VERSION = '9.1.0'
3
3
  end
@@ -11,13 +11,13 @@ class BgDefinitionTests < Test::Unit::TestCase # :nodoc:
11
11
 
12
12
  assert_equal "Liberation Day", (Holidays.on(Date.civil(2015, 3, 3), [:bg_en])[0] || {})[:name]
13
13
 
14
- assert_equal "Good Friday", (Holidays.on(Date.civil(2015, 3, 28), [:bg_en])[0] || {})[:name]
14
+ assert_equal "Good Friday", (Holidays.on(Date.civil(2015, 4, 10), [:bg_en])[0] || {})[:name]
15
15
 
16
- assert_equal "Holy Saturday", (Holidays.on(Date.civil(2015, 3, 29), [:bg_en])[0] || {})[:name]
16
+ assert_equal "Holy Saturday", (Holidays.on(Date.civil(2015, 4, 11), [:bg_en])[0] || {})[:name]
17
17
 
18
- assert_equal "Easter Sunday", (Holidays.on(Date.civil(2015, 3, 30), [:bg_en])[0] || {})[:name]
18
+ assert_equal "Easter Sunday", (Holidays.on(Date.civil(2015, 4, 12), [:bg_en])[0] || {})[:name]
19
19
 
20
- assert_equal "Easter Monday", (Holidays.on(Date.civil(2015, 3, 31), [:bg_en])[0] || {})[:name]
20
+ assert_equal "Easter Monday", (Holidays.on(Date.civil(2015, 4, 13), [:bg_en])[0] || {})[:name]
21
21
 
22
22
  assert_equal "Labour Day", (Holidays.on(Date.civil(2015, 5, 1), [:bg_en])[0] || {})[:name]
23
23
 
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+ require File.expand_path(File.dirname(__FILE__)) + '/../test_helper'
3
+
4
+ # This file is generated by the Ruby Holiday gem.
5
+ #
6
+ # Definitions loaded: definitions/cy.yaml
7
+ class CyDefinitionTests < Test::Unit::TestCase # :nodoc:
8
+
9
+ def test_cy
10
+ assert_equal "Πρωτοχρονιά", (Holidays.on(Date.civil(2011, 1, 1), [:cy], [:informal])[0] || {})[:name]
11
+
12
+ assert_equal "Θεοφάνεια", (Holidays.on(Date.civil(2011, 1, 6), [:cy], [:informal])[0] || {})[:name]
13
+
14
+ assert_equal "Μεγάλη Παρασκευή", (Holidays.on(Date.civil(2011, 4, 22), [:cy], [:informal])[0] || {})[:name]
15
+
16
+ assert_equal "Μεγάλο Σάββατο", (Holidays.on(Date.civil(1970, 4, 25), [:cy], [:informal])[0] || {})[:name]
17
+
18
+ assert_equal "Κυριακή του Πάσχα", (Holidays.on(Date.civil(1985, 4, 14), [:cy], [:informal])[0] || {})[:name]
19
+
20
+ assert_equal "Κυριακή του Πάσχα", (Holidays.on(Date.civil(2011, 4, 24), [:cy], [:informal])[0] || {})[:name]
21
+
22
+ assert_equal "Κυριακή του Πάσχα", (Holidays.on(Date.civil(2027, 5, 2), [:cy], [:informal])[0] || {})[:name]
23
+
24
+ assert_equal "Δευτέρα του Πάσχα", (Holidays.on(Date.civil(2046, 4, 30), [:cy], [:informal])[0] || {})[:name]
25
+
26
+ assert_equal "Πρωτομαγιά", (Holidays.on(Date.civil(2011, 5, 1), [:cy], [:informal])[0] || {})[:name]
27
+
28
+ assert_equal "Αγίου Πνεύματος", (Holidays.on(Date.civil(2011, 6, 13), [:cy], [:informal])[0] || {})[:name]
29
+
30
+ assert_equal "Αγίου Πνεύματος", (Holidays.on(Date.civil(2012, 6, 4), [:cy], [:informal])[0] || {})[:name]
31
+
32
+ assert_equal "Καθαρά Δευτέρα", (Holidays.on(Date.civil(2011, 3, 7), [:cy], [:informal])[0] || {})[:name]
33
+
34
+ assert_equal "Καθαρά Δευτέρα", (Holidays.on(Date.civil(2012, 2, 27), [:cy], [:informal])[0] || {})[:name]
35
+
36
+ assert_equal "Χριστούγεννα", (Holidays.on(Date.civil(2011, 12, 25), [:cy], [:informal])[0] || {})[:name]
37
+
38
+ assert_equal "Δεύτερη ημέρα των Χριστουγέννων", (Holidays.on(Date.civil(2011, 12, 26), [:cy], [:informal])[0] || {})[:name]
39
+
40
+ end
41
+ end