holidays 3.3.0 → 4.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 (188) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +44 -0
  3. data/CONTRIBUTING.md +37 -0
  4. data/README.md +16 -25
  5. data/REFERENCES +4 -1
  6. data/Rakefile +38 -8
  7. data/benchmark.rb +8 -0
  8. data/definitions/README.md +187 -8
  9. data/definitions/ar.yaml +2 -1
  10. data/definitions/at.yaml +17 -13
  11. data/definitions/au.yaml +65 -60
  12. data/definitions/be_fr.yaml +14 -10
  13. data/definitions/be_nl.yaml +8 -4
  14. data/definitions/bg.yaml +12 -6
  15. data/definitions/br.yaml +6 -3
  16. data/definitions/ca.yaml +8 -6
  17. data/definitions/ch.yaml +21 -15
  18. data/definitions/cl.yaml +4 -2
  19. data/definitions/cr.yaml +5 -3
  20. data/definitions/cz.yaml +4 -2
  21. data/definitions/de.yaml +25 -14
  22. data/definitions/dk.yaml +26 -17
  23. data/definitions/ecb_target.yaml +4 -2
  24. data/definitions/el.yaml +23 -18
  25. data/definitions/es.yaml +31 -28
  26. data/definitions/federal_reserve.yaml +12 -12
  27. data/definitions/fedex.yaml +6 -6
  28. data/definitions/fi.yaml +26 -25
  29. data/definitions/fr.yaml +8 -4
  30. data/definitions/gb.yaml +9 -7
  31. data/definitions/hr.yaml +8 -6
  32. data/definitions/hu.yaml +8 -6
  33. data/definitions/ie.yaml +17 -16
  34. data/definitions/index.yaml +1 -1
  35. data/definitions/is.yaml +29 -19
  36. data/definitions/it.yaml +10 -9
  37. data/definitions/jp.yaml +92 -44
  38. data/definitions/li.yaml +25 -20
  39. data/definitions/lt.yaml +2 -1
  40. data/definitions/ma.yaml +7 -7
  41. data/definitions/mx.yaml +11 -11
  42. data/definitions/nerc.yaml +6 -6
  43. data/definitions/nl.yaml +22 -18
  44. data/definitions/no.yaml +19 -11
  45. data/definitions/north_america_informal.yaml +6 -6
  46. data/definitions/nyse.yaml +9 -8
  47. data/definitions/nz.yaml +33 -29
  48. data/definitions/ph.yaml +15 -8
  49. data/definitions/pl.yaml +27 -17
  50. data/definitions/pt.yaml +4 -2
  51. data/definitions/ro.yaml +21 -18
  52. data/definitions/se.yaml +24 -18
  53. data/definitions/sg.yaml +10 -9
  54. data/definitions/si.yaml +4 -2
  55. data/definitions/sk.yaml +4 -2
  56. data/definitions/united_nations.yaml +12 -12
  57. data/definitions/ups.yaml +6 -6
  58. data/definitions/us.yaml +12 -11
  59. data/definitions/ve.yaml +8 -4
  60. data/definitions/vi.yaml +6 -6
  61. data/definitions/za.yaml +26 -24
  62. data/holidays.gemspec +3 -1
  63. data/lib/generated_definitions/MANIFEST +1 -1
  64. data/lib/generated_definitions/ar.rb +8 -6
  65. data/lib/generated_definitions/at.rb +11 -9
  66. data/lib/generated_definitions/au.rb +75 -99
  67. data/lib/generated_definitions/be.rb +12 -10
  68. data/lib/generated_definitions/be_fr.rb +12 -10
  69. data/lib/generated_definitions/be_nl.rb +12 -10
  70. data/lib/generated_definitions/bg.rb +14 -13
  71. data/lib/generated_definitions/br.rb +11 -9
  72. data/lib/generated_definitions/ca.rb +20 -20
  73. data/lib/generated_definitions/ch.rb +41 -44
  74. data/lib/generated_definitions/cl.rb +9 -7
  75. data/lib/generated_definitions/cr.rb +9 -7
  76. data/lib/generated_definitions/cz.rb +9 -6
  77. data/lib/generated_definitions/de.rb +25 -25
  78. data/lib/generated_definitions/dk.rb +17 -15
  79. data/lib/generated_definitions/ecb_target.rb +9 -7
  80. data/lib/generated_definitions/el.rb +13 -11
  81. data/lib/generated_definitions/es.rb +35 -33
  82. data/lib/generated_definitions/europe.rb +234 -247
  83. data/lib/generated_definitions/federal_reserve.rb +11 -9
  84. data/lib/generated_definitions/fedex.rb +42 -0
  85. data/lib/generated_definitions/fi.rb +32 -36
  86. data/lib/generated_definitions/fr.rb +12 -10
  87. data/lib/generated_definitions/gb.rb +15 -13
  88. data/lib/generated_definitions/hr.rb +10 -8
  89. data/lib/generated_definitions/hu.rb +9 -7
  90. data/lib/generated_definitions/ie.rb +17 -17
  91. data/lib/generated_definitions/is.rb +26 -26
  92. data/lib/generated_definitions/it.rb +9 -7
  93. data/lib/generated_definitions/jp.rb +112 -89
  94. data/lib/generated_definitions/li.rb +14 -12
  95. data/lib/generated_definitions/lt.rb +9 -7
  96. data/lib/generated_definitions/ma.rb +7 -5
  97. data/lib/generated_definitions/mx.rb +7 -5
  98. data/lib/generated_definitions/nerc.rb +10 -8
  99. data/lib/generated_definitions/nl.rb +15 -13
  100. data/lib/generated_definitions/no.rb +16 -14
  101. data/lib/generated_definitions/north_america.rb +34 -37
  102. data/lib/generated_definitions/nyse.rb +10 -8
  103. data/lib/generated_definitions/nz.rb +40 -40
  104. data/lib/generated_definitions/ph.rb +17 -13
  105. data/lib/generated_definitions/pl.rb +25 -27
  106. data/lib/generated_definitions/pt.rb +10 -8
  107. data/lib/generated_definitions/ro.rb +11 -9
  108. data/lib/generated_definitions/scandinavia.rb +92 -102
  109. data/lib/generated_definitions/se.rb +25 -27
  110. data/lib/generated_definitions/sg.rb +11 -9
  111. data/lib/generated_definitions/si.rb +10 -8
  112. data/lib/generated_definitions/sk.rb +9 -7
  113. data/lib/generated_definitions/united_nations.rb +7 -5
  114. data/lib/generated_definitions/ups.rb +13 -12
  115. data/lib/generated_definitions/us.rb +20 -21
  116. data/lib/generated_definitions/ve.rb +11 -9
  117. data/lib/generated_definitions/vi.rb +7 -5
  118. data/lib/generated_definitions/za.rb +19 -17
  119. data/lib/holidays.rb +20 -83
  120. data/lib/holidays/date_calculator/weekend_modifier.rb +22 -5
  121. data/lib/holidays/definition/context/generator.rb +67 -29
  122. data/lib/holidays/definition/context/merger.rb +8 -8
  123. data/lib/holidays/definition/decorator/custom_method_proc.rb +28 -0
  124. data/lib/holidays/definition/decorator/custom_method_source.rb +30 -0
  125. data/lib/holidays/definition/entity/custom_method.rb +11 -0
  126. data/lib/holidays/definition/parser/custom_method.rb +69 -0
  127. data/lib/holidays/definition/repository/custom_methods.rb +27 -0
  128. data/lib/holidays/definition/repository/holidays_by_month.rb +1 -1
  129. data/lib/holidays/definition/repository/{proc_cache.rb → proc_result_cache.rb} +19 -4
  130. data/lib/holidays/definition/validator/custom_method.rb +31 -0
  131. data/lib/holidays/definition_factory.rb +42 -6
  132. data/lib/holidays/errors.rb +6 -0
  133. data/lib/holidays/load_all_definitions.rb +57 -0
  134. data/lib/holidays/option/context/parse_options.rb +26 -16
  135. data/lib/holidays/option_factory.rb +1 -0
  136. data/lib/holidays/use_case/context/between.rb +41 -14
  137. data/lib/holidays/use_case_factory.rb +2 -1
  138. data/lib/holidays/version.rb +1 -1
  139. data/test/data/test_single_custom_holiday_with_custom_procs.yaml +24 -0
  140. data/test/defs/test_defs_at.rb +1 -1
  141. data/test/defs/test_defs_au.rb +3 -2
  142. data/test/defs/test_defs_cr.rb +1 -0
  143. data/test/defs/test_defs_cz.rb +1 -0
  144. data/test/defs/test_defs_dk.rb +2 -2
  145. data/test/defs/test_defs_el.rb +7 -6
  146. data/test/defs/test_defs_europe.rb +40 -33
  147. data/test/defs/test_defs_fedex.rb +24 -0
  148. data/test/defs/test_defs_fi.rb +4 -3
  149. data/test/defs/test_defs_hr.rb +2 -2
  150. data/test/defs/test_defs_hu.rb +2 -2
  151. data/test/defs/test_defs_is.rb +2 -1
  152. data/test/defs/test_defs_it.rb +2 -1
  153. data/test/defs/test_defs_jp.rb +1 -1
  154. data/test/defs/test_defs_li.rb +1 -1
  155. data/test/defs/test_defs_ma.rb +2 -1
  156. data/test/defs/test_defs_mx.rb +4 -3
  157. data/test/defs/test_defs_nl.rb +7 -6
  158. data/test/defs/test_defs_no.rb +1 -0
  159. data/test/defs/test_defs_north_america.rb +4 -3
  160. data/test/defs/test_defs_nyse.rb +2 -1
  161. data/test/defs/test_defs_pl.rb +1 -0
  162. data/test/defs/test_defs_ro.rb +11 -11
  163. data/test/defs/test_defs_scandinavia.rb +12 -8
  164. data/test/defs/test_defs_se.rb +3 -2
  165. data/test/defs/test_defs_sg.rb +2 -1
  166. data/test/defs/test_defs_vi.rb +1 -1
  167. data/test/defs/test_defs_za.rb +3 -2
  168. data/test/holidays/date_calculator/test_weekend_modifier.rb +11 -0
  169. data/test/holidays/definition/context/test_generator.rb +64 -5
  170. data/test/holidays/definition/context/test_merger.rb +5 -2
  171. data/test/holidays/definition/decorator/test_custom_method_proc.rb +113 -0
  172. data/test/holidays/definition/decorator/test_custom_method_source.rb +96 -0
  173. data/test/holidays/definition/parser/test_custom_method.rb +79 -0
  174. data/test/holidays/definition/repository/test_custom_methods.rb +43 -0
  175. data/test/holidays/definition/repository/test_holidays_by_month.rb +0 -32
  176. data/test/holidays/definition/repository/test_proc_result_cache.rb +84 -0
  177. data/test/holidays/definition/validator/test_custom_method.rb +89 -0
  178. data/test/holidays/option/context/test_parse_options.rb +5 -0
  179. data/test/holidays/test_definition_factory.rb +17 -2
  180. data/test/holidays/use_case/context/test_between.rb +2 -0
  181. data/test/test_all_regions.rb +7 -49
  182. data/test/test_custom_holidays.rb +8 -2
  183. data/test/test_helper.rb +9 -2
  184. data/test/test_holidays.rb +9 -29
  185. metadata +46 -11
  186. data/lib/generated_definitions/fed_ex.rb +0 -41
  187. data/test/holidays/definition/repository/test_proc_cache.rb +0 -29
  188. data/test/test_parse_definitions.rb +0 -30
@@ -3,7 +3,7 @@
3
3
  # Updated: 2012-08-29.
4
4
  # Sources:
5
5
  # http://en.wikipedia.org/wiki/Public_holidays_in_Croatia
6
- ---
6
+ ---
7
7
  months:
8
8
  0:
9
9
  - name: Uskrs
@@ -11,10 +11,12 @@ months:
11
11
  function: easter(year)
12
12
  - name: Uskrsni ponedjeljak
13
13
  regions: [hr]
14
- function: easter(year)+1
14
+ function: easter(year)
15
+ function_modifier: 1
15
16
  - name: Tijelovo
16
17
  regions: [hr]
17
- function: easter(year)+60
18
+ function: easter(year)
19
+ function_modifier: 60
18
20
  1:
19
21
  - name: Nova godina
20
22
  regions: [hr]
@@ -56,8 +58,8 @@ months:
56
58
  regions: [hr]
57
59
  mday: 26
58
60
  tests: |
59
- {Date.civil(2012,1,1) => 'Nova godina',
60
- Date.civil(2012,1,6) => 'Sveta tri kralja',
61
+ {Date.civil(2012,1,1) => 'Nova godina',
62
+ Date.civil(2012,1,6) => 'Sveta tri kralja',
61
63
  Date.civil(2012,5,1) => 'Međunarodni praznik rada',
62
64
  Date.civil(2012,6,22) => 'Dan antifašističke borbe',
63
65
  Date.civil(2012,6,25) => 'Dan državnosti',
@@ -69,7 +71,7 @@ tests: |
69
71
  Date.civil(2012,12,26) => 'Sveti Stjepan'}.each do |date, name|
70
72
  assert_equal name, (Holidays.on(date, :hr, :informal)[0] || {})[:name]
71
73
  end
72
-
74
+
73
75
  # Tijelovo
74
76
  [Date.civil(2008,5,22), Date.civil(2009,6,11), Date.civil(2010,6,3),
75
77
  Date.civil(2012,6,7), Date.civil(2013,5,30), Date.civil(2014,6,19)].each do |date|
@@ -1,15 +1,17 @@
1
1
  # Hungarian holiday definitions for the Ruby Holiday gem.
2
2
  #
3
3
  # Updated: 2012-03-01 by spap
4
- ---
4
+ ---
5
5
  months:
6
- 0:
6
+ 0:
7
7
  - name: Húsvét hétfő
8
8
  regions: [hu]
9
- function: easter(year)+1
9
+ function: easter(year)
10
+ function_modifier: 1
10
11
  - name: Pünkösd hétfő
11
12
  regions: [hu]
12
- function: easter(year)+50
13
+ function: easter(year)
14
+ function_modifier: 50
13
15
  1:
14
16
  - name: Újév
15
17
  regions: [hu]
@@ -42,8 +44,8 @@ months:
42
44
  regions: [hu]
43
45
  mday: 26
44
46
  tests: |
45
- {Date.civil(2012,1,1) => 'Újév',
46
- Date.civil(2011,1,1) => 'Újév',
47
+ {Date.civil(2012,1,1) => 'Újév',
48
+ Date.civil(2011,1,1) => 'Újév',
47
49
  Date.civil(2012,3,15) => '1848/49-es forradalom és szabadságharc ünnepe',
48
50
  Date.civil(2011,4,25) => 'Húsvét hétfő',
49
51
  Date.civil(2012,4,9) => 'Húsvét hétfő',
@@ -5,23 +5,24 @@
5
5
  # - http://en.wikipedia.org/wiki/Public_holidays_in_the_Republic_of_Ireland
6
6
  # - http://www.citizensinformation.ie/categories/employment/employment-rights-and-conditions/leave-and-holidays/public-holidays-in-ireland
7
7
  # While there is mention that Jan 2 2012 was not officially a bank holiday, in reality very few businesses will not observe that date as a bank holiday
8
- ---
8
+ ---
9
9
  months:
10
- 0:
10
+ 0:
11
11
  - name: Easter Monday
12
12
  regions: [ie]
13
- function: easter(year)+1
14
- 1:
13
+ function: easter(year)
14
+ function_modifier: 1
15
+ 1:
15
16
  - name: New Year's Day
16
17
  regions: [ie]
17
18
  mday: 1
18
- observed: to_monday_if_weekend
19
- 3:
19
+ observed: to_monday_if_weekend(date)
20
+ 3:
20
21
  - name: St. Patrick's Day
21
22
  regions: [ie]
22
23
  mday: 17
23
- observed: to_monday_if_weekend
24
- 5:
24
+ observed: to_monday_if_weekend(date)
25
+ 5:
25
26
  - name: May Day
26
27
  regions: [ie]
27
28
  week: 1
@@ -31,35 +32,35 @@ months:
31
32
  regions: [ie]
32
33
  week: 1
33
34
  wday: 1
34
- 8:
35
+ 8:
35
36
  - name: August Bank Holiday
36
37
  regions: [ie]
37
38
  week: 1
38
39
  wday: 1
39
- 10:
40
+ 10:
40
41
  - name: October Bank Holiday
41
42
  regions: [ie]
42
43
  week: -1
43
44
  wday: 1
44
- 12:
45
+ 12:
45
46
  - name: Christmas Day
46
47
  regions: [ie]
47
48
  mday: 25
48
- observed: to_monday_if_weekend
49
+ observed: to_monday_if_weekend(date)
49
50
  - name: St. Stephen's Day
50
51
  regions: [ie]
51
52
  mday: 26
52
- observed: ie_st_stephens_day
53
+ observed: ie_st_stephens_day(date)
53
54
  methods:
54
- ie_st_stephens_day: |
55
+ ie_st_stephens_day:
55
56
  # Ireland - Stephens Day is always the day after christmas day
56
- def self.ie_st_stephens_day(date)
57
+ arguments: date
58
+ source: |
57
59
  case date.wday
58
60
  when 6, 0 then date + 2
59
61
  when 1 then date + 1
60
62
  else date
61
63
  end
62
- end
63
64
  tests: |
64
65
  {Date.civil(2008,1,1) => 'New Year\'s Day',
65
66
  Date.civil(2008,3,17) => 'St. Patrick\'s Day',
@@ -19,7 +19,7 @@ defs:
19
19
  EL: ['el.yaml']
20
20
  ES: ['es.yaml']
21
21
  Federal_Reserve: ['federal_reserve.yaml']
22
- Fed_Ex: ['fedex.yaml']
22
+ FedEx: ['fedex.yaml']
23
23
  FI: ['fi.yaml']
24
24
  FR: ['fr.yaml']
25
25
  GB: ['gb.yaml']
@@ -6,43 +6,53 @@
6
6
  # - http://www.iceland.is/history-and-culture/Traditions/IcelandicHolidays/
7
7
  # - http://en.wikipedia.org/wiki/Public_holidays_in_Iceland
8
8
  # - http://www.qppstudio.net/publicholidays2007/iceland.htm
9
- ---
9
+ ---
10
10
  months:
11
- 0:
11
+ 0:
12
12
  - name: Bolludagur
13
13
  regions: [is]
14
- function: easter(year)-48
14
+ function: easter(year)
15
+ function_modifier: -48
15
16
  - name: Sprengidagur
16
17
  regions: [is]
17
- function: easter(year)-47
18
+ function: easter(year)
19
+ function_modifier: -47
18
20
  - name: Öskudagur
19
21
  regions: [is]
20
- function: easter(year)-46
22
+ function: easter(year)
23
+ function_modifier: -46
21
24
  - name: Pálmasunnudagur
22
25
  regions: [is]
23
- function: easter(year)-7
26
+ function: easter(year)
27
+ function_modifier: -7
24
28
  - name: Skírdagur
25
29
  regions: [is]
26
- function: easter(year)-3
30
+ function: easter(year)
31
+ function_modifier: -3
27
32
  - name: Föstudaginn langi
28
33
  regions: [is]
29
- function: easter(year)-2
34
+ function: easter(year)
35
+ function_modifier: -2
30
36
  - name: Páskadagur
31
37
  regions: [is]
32
38
  function: easter(year)
33
39
  - name: Annar í páskum
34
40
  regions: [is]
35
- function: easter(year)+1
41
+ function: easter(year)
42
+ function_modifier: 1
36
43
  - name: Uppstigningardagur
37
44
  regions: [is]
38
- function: easter(year)+39
45
+ function: easter(year)
46
+ function_modifier: 39
39
47
  - name: Hvítasunnudagur
40
48
  regions: [is]
41
- function: easter(year)+49
49
+ function: easter(year)
50
+ function_modifier: 49
42
51
  - name: Annar í hvítasunnu
43
52
  regions: [is]
44
- function: easter(year)+50
45
- 1:
53
+ function: easter(year)
54
+ function_modifier: 50
55
+ 1:
46
56
  - name: Nýársdagur
47
57
  regions: [is]
48
58
  mday: 1
@@ -57,7 +67,7 @@ months:
57
67
  - name: Konudagur
58
68
  regions: [is]
59
69
  mday: 18
60
- type: informal
70
+ type: informal
61
71
  4:
62
72
  - name: Sumardagurinn fyrsti
63
73
  regions: [is]
@@ -100,9 +110,10 @@ months:
100
110
  regions: [is]
101
111
  mday: 31
102
112
  methods:
103
- is_sumardagurinn_fyrsti: |
113
+ is_sumardagurinn_fyrsti:
104
114
  # Iceland: first day of summer (Thursday after 18 April)
105
- def self.is_sumardagurinn_fyrsti(year)
115
+ arguments: year
116
+ source: |
106
117
  date = Date.civil(year,4,18)
107
118
  if date.wday < 4
108
119
  date += (4 - date.wday)
@@ -110,9 +121,8 @@ methods:
110
121
  date += (11 - date.wday)
111
122
  end
112
123
  date
113
- end
114
124
  tests: |
115
- {Date.civil(2007,1,1) => 'Nýársdagur',
125
+ {Date.civil(2007,1,1) => 'Nýársdagur',
116
126
  Date.civil(2007,1,6) => 'Þrettándinn',
117
127
  Date.civil(2007,1,19) => 'Bóndadagur',
118
128
  Date.civil(2007,2,18) => 'Konudagur',
@@ -133,4 +143,4 @@ tests: |
133
143
  Date.civil(2007,12,26) => 'Jól',
134
144
  Date.civil(2007,12,31) => 'Gamlárskvöld'}.each do |date, name|
135
145
  assert_equal name, (Holidays.on(date, :is, :informal)[0] || {})[:name]
136
- end
146
+ end
@@ -3,16 +3,17 @@
3
3
  # Updated: 2008-11-23.
4
4
  # Sources:
5
5
  # - http://en.wikipedia.org/wiki/Holidays_in_Italy
6
- ---
6
+ ---
7
7
  months:
8
- 0:
8
+ 0:
9
9
  - name: Pasqua
10
10
  regions: [it]
11
11
  function: easter(year)
12
12
  - name: Lunedì dell'Angelo
13
13
  regions: [it]
14
- function: easter(year)+1
15
- 1:
14
+ function: easter(year)
15
+ function_modifier: 1
16
+ 1:
16
17
  - name: Capodanno
17
18
  regions: [it]
18
19
  mday: 1
@@ -23,7 +24,7 @@ months:
23
24
  - name: Festa della Liberazione
24
25
  regions: [it]
25
26
  mday: 25
26
- 5:
27
+ 5:
27
28
  - name: Festa dei Lavoratori
28
29
  regions: [it]
29
30
  mday: 1
@@ -31,11 +32,11 @@ months:
31
32
  - name: Festa della Repubblica
32
33
  regions: [it]
33
34
  mday: 2
34
- 8:
35
+ 8:
35
36
  - name: Assunzione
36
37
  regions: [it]
37
38
  mday: 15
38
- 11:
39
+ 11:
39
40
  - name: Ognissanti
40
41
  regions: [it]
41
42
  mday: 1
@@ -50,7 +51,7 @@ months:
50
51
  regions: [it]
51
52
  mday: 26
52
53
  tests: |
53
- {Date.civil(2007,1,1) => 'Capodanno',
54
+ {Date.civil(2007,1,1) => 'Capodanno',
54
55
  Date.civil(2007,1,6) => 'Epifania',
55
56
  Date.civil(2007,4,8) => 'Pasqua',
56
57
  Date.civil(2007,4,9) => 'Lunedì dell\'Angelo',
@@ -63,4 +64,4 @@ tests: |
63
64
  Date.civil(2007,12,25) => 'Natale',
64
65
  Date.civil(2007,12,26) => 'Santo Stefano'}.each do |date, name|
65
66
  assert_equal name, (Holidays.on(date, :it, :informal)[0] || {})[:name]
66
- end
67
+ end
@@ -2,6 +2,10 @@
2
2
  # Reference:
3
3
  # - http://www.h3.dion.ne.jp/~sakatsu/holiday_topic.htm
4
4
  # - http://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html
5
+ # - https://en.wikipedia.org/wiki/Public_holidays_in_Japan
6
+ #
7
+ # For Japanese/English translations of each holiday:
8
+ # - http://www.japanesecalendar.net/holidays/2016/
5
9
  #
6
10
  # This definition can calculate current Japanese holidays,
7
11
  # don't compat with past changes of Japan Holiday Act.
@@ -11,7 +15,13 @@
11
15
  # 2014-11-09: Added substitute holiday by Yoshiyuki Hirano <yoshiyuki.hirano@henteco-labs.com>
12
16
  # 2015-05-10: Non-Monday substitute holidays by Shuhei Kagawa <shuhei.kagawa@gmail.com>
13
17
  # 2015-12-15: Added mountain day by Tsuyoshi Sano <ttwo32@gmail.com>
18
+ # 2016-03-26: Updated to match new custom method signature. See below for more. Phil Trimble <philtrimble@gmail.com>
14
19
  #
20
+ # NOTE: This is the most complex set of custom date methods in the entire
21
+ # project, mainly surrounding the idea of 'substitute' holidays. Since this is
22
+ # the only one that is this complex I have settled on a less-than-ideal solution.
23
+ # It is overly verbose and not easy to follow. It will be a target for refactoring
24
+ # in the near future.
15
25
  ---
16
26
  months:
17
27
  1:
@@ -24,28 +34,31 @@ months:
24
34
  week: 2
25
35
  - name: 振替休日
26
36
  regions: [jp]
27
- function: jp_substitute_holiday(year, 1, 1)
37
+ mday: 1
38
+ function: jp_substitute_holiday(year, month, day)
28
39
  2:
29
40
  - name: 建国記念日
30
41
  regions: [jp]
31
42
  mday: 11
32
43
  - name: 振替休日
33
44
  regions: [jp]
34
- function: jp_substitute_holiday(year, 2, 11)
45
+ mday: 11
46
+ function: jp_substitute_holiday(year, month, day)
35
47
  3:
36
48
  - name: 春分の日
37
49
  regions: [jp]
38
50
  function: jp_vernal_equinox_day(year)
39
51
  - name: 振替休日
40
52
  regions: [jp]
41
- function: jp_substitute_holiday(Holidays.jp_vernal_equinox_day(year))
53
+ function: jp_vernal_equinox_day_substitute(year)
42
54
  4:
43
55
  - name: 昭和の日
44
56
  regions: [jp]
45
57
  mday: 29
46
58
  - name: 振替休日
47
59
  regions: [jp]
48
- function: jp_substitute_holiday(year, 4, 29)
60
+ mday: 29
61
+ function: jp_substitute_holiday(year, month, day)
49
62
  5:
50
63
  - name: 憲法記念日
51
64
  regions: [jp]
@@ -58,30 +71,33 @@ months:
58
71
  mday: 5
59
72
  - name: 振替休日
60
73
  regions: [jp]
61
- function: jp_substitute_holiday(year, 5, 3)
74
+ mday: 3
75
+ function: jp_substitute_holiday(year, month, day)
62
76
  - name: 振替休日
63
77
  regions: [jp]
64
- function: jp_substitute_holiday(year, 5, 4)
78
+ mday: 4
79
+ function: jp_substitute_holiday(year, month, day)
65
80
  - name: 振替休日
66
81
  regions: [jp]
67
- function: jp_substitute_holiday(year, 5, 5)
82
+ mday: 5
83
+ function: jp_substitute_holiday(year, month, day)
68
84
  7:
69
85
  - name: 海の日
70
86
  regions: [jp]
71
87
  mday: 20
72
88
  year_ranges:
73
89
  - between: 1996..2002
74
- - name: 振替休日
75
- regions: [jp]
76
- function: jp_substitute_holiday(year, 7, 20)
77
- year_ranges:
78
- - between: 1996..2002
79
90
  - name: 海の日
80
91
  regions: [jp]
81
92
  wday: 1
82
93
  week: 3
83
94
  year_ranges:
84
95
  - after: 2003
96
+ - name: 振替休日
97
+ regions: [jp]
98
+ function: jp_marine_day_substitute(year)
99
+ year_ranges:
100
+ - between: 1996..2002
85
101
  8:
86
102
  - name: 山の日
87
103
  regions: [jp]
@@ -92,7 +108,7 @@ months:
92
108
  regions: [jp]
93
109
  year_ranges:
94
110
  - after: 2016
95
- function: jp_substitute_holiday(Holidays.jp_mountain_holiday(year))
111
+ function: jp_mountain_holiday_substitute(year)
96
112
  9:
97
113
  - name: 敬老の日
98
114
  regions: [jp]
@@ -100,16 +116,16 @@ months:
100
116
  week: 3
101
117
  - name: 振替休日
102
118
  regions: [jp]
103
- function: jp_substitute_holiday(year, 9, Holidays.calculate_day_of_month(year, 9, 3, 1))
119
+ function: jp_respect_for_aged_holiday_substitute(year)
104
120
  - name: 国民の休日
105
121
  regions: [jp]
106
- function: jp_citizons_holiday(year)
122
+ function: jp_citizens_holiday(year)
107
123
  - name: 秋分の日
108
124
  regions: [jp]
109
125
  function: jp_national_culture_day(year)
110
126
  - name: 振替休日
111
127
  regions: [jp]
112
- function: jp_substitute_holiday(Holidays.jp_national_culture_day(year))
128
+ function: jp_national_culture_day_substitute(year)
113
129
  10:
114
130
  - name: 体育の日
115
131
  regions: [jp]
@@ -117,30 +133,39 @@ months:
117
133
  week: 2
118
134
  - name: 振替休日
119
135
  regions: [jp]
120
- function: jp_substitute_holiday(year, 10, Holidays.calculate_day_of_month(year, 10, 2, 1))
136
+ function: jp_health_sports_day_substitute(year)
121
137
  11:
122
138
  - name: 文化の日
123
139
  regions: [jp]
124
140
  mday: 3
125
141
  - name: 振替休日
126
142
  regions: [jp]
127
- function: jp_substitute_holiday(year, 11, 3)
143
+ mday: 3
144
+ function: jp_substitute_holiday(year, month, day)
128
145
  - name: 勤労感謝の日
129
146
  regions: [jp]
130
147
  mday: 23
131
148
  - name: 振替休日
132
149
  regions: [jp]
133
- function: jp_substitute_holiday(year, 11, 23)
150
+ mday: 23
151
+ function: jp_substitute_holiday(year, month, day)
134
152
  12:
135
153
  - name: 天皇誕生日
136
154
  regions: [jp]
137
155
  mday: 23
138
156
  - name: 振替休日
139
157
  regions: [jp]
140
- function: jp_substitute_holiday(year, 12, 23)
158
+ mday: 23
159
+ function: jp_substitute_holiday(year, month, day)
160
+
141
161
  methods:
142
- jp_vernal_equinox_day: |
143
- def self.jp_vernal_equinox_day(year)
162
+ jp_health_sports_day_substitute:
163
+ arguments: year
164
+ source: |
165
+ Holidays::DefinitionFactory.custom_methods_repository.find("jp_substitute_holiday(year, month, day)").call(year, 10, Holidays::DateCalculatorFactory.day_of_month_calculator.call(year, 10, 2, 1))
166
+ jp_vernal_equinox_day:
167
+ arguments: year
168
+ source: |
144
169
  day =
145
170
  case year
146
171
  when 1851..1899
@@ -157,9 +182,18 @@ methods:
157
182
  day += 0.242194 * (year - 1980) - ((year - 1980)/4).floor
158
183
  day = day.floor
159
184
  Date.civil(year, 3, day)
160
- end
161
- jp_national_culture_day: |
162
- def self.jp_national_culture_day(year)
185
+ jp_vernal_equinox_day_substitute:
186
+ arguments: year
187
+ source: |
188
+ date = Holidays::DefinitionFactory.custom_methods_repository.find("jp_vernal_equinox_day(year)").call(year)
189
+ Holidays::DefinitionFactory.custom_methods_repository.find("jp_substitute_holiday(year, month, day)").call(year, date.month, date.mday)
190
+ jp_marine_day_substitute:
191
+ arguments: year
192
+ source: |
193
+ Holidays::DefinitionFactory.custom_methods_repository.find("jp_substitute_holiday(year, month, day)").call(year, 7, Holidays::DateCalculatorFactory.day_of_month_calculator.call(year, 7, 3, 1))
194
+ jp_national_culture_day:
195
+ arguments: year
196
+ source: |
163
197
  day =
164
198
  case year
165
199
  when 1851..1899
@@ -176,34 +210,48 @@ methods:
176
210
  day += 0.242194 * (year - 1980) - ((year - 1980)/4).floor
177
211
  day = day.floor
178
212
  Date.civil(year, 9, day)
179
- end
180
- jp_citizons_holiday: |
181
- def self.jp_citizons_holiday(year)
213
+ jp_national_culture_day_substitute:
214
+ arguments: year
215
+ source: |
216
+ date = Holidays::DefinitionFactory.custom_methods_repository.find("jp_national_culture_day(year)").call(year)
217
+ Holidays::DefinitionFactory.custom_methods_repository.find("jp_substitute_holiday(year, month, day)").call(year, date.month, date.mday)
218
+ jp_citizens_holiday:
219
+ arguments: year
220
+ source: |
182
221
  year < 2003 and return nil
183
- ncd = Holidays.jp_national_culture_day(year)
222
+ ncd = Holidays::DefinitionFactory.custom_methods_repository.find("jp_national_culture_day(year)").call(year)
184
223
  if ncd.wday == 3
185
224
  ncd - 1
186
225
  else
187
226
  nil
188
227
  end
189
- end
190
- jp_mountain_holiday: |
191
- def self.jp_mountain_holiday(year)
228
+ jp_mountain_holiday:
229
+ arguments: year
230
+ source: |
231
+ return nil if year < 2016
192
232
  Date.civil(year, 8, 11)
193
- end
194
- jp_substitute_holiday: |
195
- def self.jp_substitute_holiday(*date)
196
- return nil unless date[0]
197
- date = date[0].kind_of?(Date) ? date.first : Date.civil(*date)
198
- date.wday == 0 ? Holidays.jp_next_weekday(date+1) : nil
199
- end
200
- jp_next_weekday(date): |
201
- def self.jp_next_weekday(date)
233
+ jp_mountain_holiday_substitute:
234
+ arguments: year
235
+ source: |
236
+ date = Holidays::DefinitionFactory.custom_methods_repository.find("jp_mountain_holiday(year)").call(year)
237
+ Holidays::DefinitionFactory.custom_methods_repository.find("jp_substitute_holiday(year, month, day)").call(year, date.month, date.mday)
238
+ jp_respect_for_aged_holiday_substitute:
239
+ arguments: year
240
+ source: |
241
+ Holidays::DefinitionFactory.custom_methods_repository.find("jp_substitute_holiday(year, month, day)").call(year, 9, Holidays::DateCalculatorFactory.day_of_month_calculator.call(year, 9, 3, 1))
242
+ jp_substitute_holiday:
243
+ arguments: year, month, day
244
+ source: |
245
+ date = Date.civil(year, month, day)
246
+ date.wday == 0 ? (Holidays::DefinitionFactory.custom_methods_repository.find("jp_next_weekday(date)").call(date+1)) : nil
247
+ jp_next_weekday:
248
+ arguments: date
249
+ source: |
202
250
  is_holiday = Holidays::JP.holidays_by_month[date.month].any? do |holiday|
203
251
  holiday[:mday] == date.day
204
252
  end
205
- date.wday == 0 || is_holiday ? Holidays.jp_next_weekday(date+1) : date
206
- end
253
+ date.wday == 0 || is_holiday ? (Holidays::DefinitionFactory.custom_methods_repository.find("jp_next_weekday(date)").call(date+1)) : date
254
+
207
255
  tests: |
208
256
  {Date.civil(2008,1,1) => '元日',
209
257
  Date.civil(2010,1,11) => '成人の日',
@@ -265,4 +313,4 @@ tests: |
265
313
  end
266
314
 
267
315
  # before 2016, there is no mountain holiday.
268
- assert_nil Date.civil(2015,8,11).holidays(:jp)[0]
316
+ assert_nil Holidays.on(Date.civil(2015,8,11), :jp)[0]