holidays 3.3.0 → 4.0.0

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