holidays 0.25__py3-none-any.whl → 0.27__py3-none-any.whl

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 (331) hide show
  1. holidays/__init__.py +1 -1
  2. holidays/calendars/__init__.py +9 -7
  3. holidays/calendars/buddhist.py +445 -0
  4. holidays/calendars/chinese.py +1238 -431
  5. holidays/calendars/custom.py +1 -3
  6. holidays/calendars/hebrew.py +2 -2
  7. holidays/calendars/hindu.py +445 -0
  8. holidays/calendars/islamic.py +1347 -1347
  9. holidays/calendars/thai.py +229 -38
  10. holidays/countries/__init__.py +8 -0
  11. holidays/countries/albania.py +6 -17
  12. holidays/countries/andorra.py +2 -6
  13. holidays/countries/angola.py +53 -39
  14. holidays/countries/argentina.py +25 -35
  15. holidays/countries/armenia.py +1 -0
  16. holidays/countries/aruba.py +109 -48
  17. holidays/countries/australia.py +31 -69
  18. holidays/countries/austria.py +1 -0
  19. holidays/countries/azerbaijan.py +44 -71
  20. holidays/countries/bahrain.py +7 -7
  21. holidays/countries/bangladesh.py +1 -3
  22. holidays/countries/belarus.py +2 -3
  23. holidays/countries/belize.py +128 -0
  24. holidays/countries/bolivia.py +2 -6
  25. holidays/countries/bosnia_and_herzegovina.py +5 -17
  26. holidays/countries/botswana.py +37 -44
  27. holidays/countries/brazil.py +4 -7
  28. holidays/countries/brunei.py +427 -0
  29. holidays/countries/bulgaria.py +3 -6
  30. holidays/countries/burkina_faso.py +141 -0
  31. holidays/countries/burundi.py +2 -5
  32. holidays/countries/cambodia.py +323 -0
  33. holidays/countries/cameroon.py +183 -0
  34. holidays/countries/canada.py +20 -28
  35. holidays/countries/chad.py +133 -0
  36. holidays/countries/chile.py +6 -13
  37. holidays/countries/china.py +21 -25
  38. holidays/countries/colombia.py +18 -15
  39. holidays/countries/costa_rica.py +25 -27
  40. holidays/countries/cuba.py +28 -15
  41. holidays/countries/curacao.py +100 -46
  42. holidays/countries/cyprus.py +3 -6
  43. holidays/countries/czechia.py +4 -12
  44. holidays/countries/denmark.py +2 -3
  45. holidays/countries/dominican_republic.py +2 -3
  46. holidays/countries/ecuador.py +55 -54
  47. holidays/countries/egypt.py +2 -5
  48. holidays/countries/el_salvador.py +101 -0
  49. holidays/countries/eswatini.py +34 -44
  50. holidays/countries/ethiopia.py +7 -14
  51. holidays/countries/finland.py +2 -3
  52. holidays/countries/france.py +1 -0
  53. holidays/countries/gabon.py +139 -0
  54. holidays/countries/georgia.py +1 -0
  55. holidays/countries/germany.py +1 -0
  56. holidays/countries/greece.py +7 -6
  57. holidays/countries/honduras.py +17 -13
  58. holidays/countries/hongkong.py +117 -126
  59. holidays/countries/hungary.py +93 -92
  60. holidays/countries/iceland.py +1 -0
  61. holidays/countries/india.py +4 -11
  62. holidays/countries/indonesia.py +178 -142
  63. holidays/countries/ireland.py +5 -15
  64. holidays/countries/isle_of_man.py +23 -5
  65. holidays/countries/israel.py +12 -24
  66. holidays/countries/italy.py +6 -7
  67. holidays/countries/jamaica.py +10 -18
  68. holidays/countries/japan.py +11 -16
  69. holidays/countries/kazakhstan.py +7 -22
  70. holidays/countries/kenya.py +44 -26
  71. holidays/countries/kyrgyzstan.py +2 -5
  72. holidays/countries/latvia.py +2 -6
  73. holidays/countries/lesotho.py +52 -32
  74. holidays/countries/liechtenstein.py +1 -0
  75. holidays/countries/lithuania.py +4 -12
  76. holidays/countries/madagascar.py +3 -9
  77. holidays/countries/malawi.py +34 -26
  78. holidays/countries/malaysia.py +335 -343
  79. holidays/countries/marshall_islands.py +4 -9
  80. holidays/countries/mexico.py +2 -3
  81. holidays/countries/moldova.py +4 -6
  82. holidays/countries/monaco.py +17 -26
  83. holidays/countries/montenegro.py +34 -24
  84. holidays/countries/morocco.py +8 -5
  85. holidays/countries/mozambique.py +35 -31
  86. holidays/countries/namibia.py +54 -35
  87. holidays/countries/netherlands.py +1 -0
  88. holidays/countries/new_zealand.py +166 -134
  89. holidays/countries/nicaragua.py +27 -22
  90. holidays/countries/nigeria.py +6 -17
  91. holidays/countries/north_macedonia.py +3 -8
  92. holidays/countries/norway.py +2 -3
  93. holidays/countries/pakistan.py +73 -75
  94. holidays/countries/panama.py +25 -24
  95. holidays/countries/paraguay.py +55 -47
  96. holidays/countries/peru.py +1 -0
  97. holidays/countries/philippines.py +6 -2
  98. holidays/countries/poland.py +4 -9
  99. holidays/countries/portugal.py +4 -11
  100. holidays/countries/romania.py +4 -5
  101. holidays/countries/russia.py +1 -0
  102. holidays/countries/san_marino.py +26 -27
  103. holidays/countries/saudi_arabia.py +8 -22
  104. holidays/countries/serbia.py +22 -31
  105. holidays/countries/singapore.py +181 -189
  106. holidays/countries/slovakia.py +2 -4
  107. holidays/countries/south_africa.py +60 -62
  108. holidays/countries/south_korea.py +59 -26
  109. holidays/countries/spain.py +7 -10
  110. holidays/countries/sweden.py +2 -3
  111. holidays/countries/switzerland.py +1 -0
  112. holidays/countries/taiwan.py +20 -20
  113. holidays/countries/thailand.py +36 -82
  114. holidays/countries/turkey.py +1 -3
  115. holidays/countries/ukraine.py +7 -18
  116. holidays/countries/united_arab_emirates.py +23 -31
  117. holidays/countries/united_kingdom.py +124 -116
  118. holidays/countries/united_states.py +42 -72
  119. holidays/countries/uruguay.py +1 -0
  120. holidays/countries/vatican_city.py +64 -32
  121. holidays/countries/venezuela.py +9 -6
  122. holidays/countries/vietnam.py +6 -20
  123. holidays/countries/zambia.py +63 -33
  124. holidays/countries/zimbabwe.py +56 -37
  125. holidays/financial/european_central_bank.py +15 -16
  126. holidays/financial/ny_stock_exchange.py +80 -86
  127. holidays/groups/__init__.py +18 -0
  128. holidays/groups/buddhist.py +71 -0
  129. holidays/groups/chinese.py +235 -0
  130. holidays/groups/christian.py +483 -0
  131. holidays/groups/hindu.py +71 -0
  132. holidays/groups/international.py +157 -0
  133. holidays/groups/islamic.py +288 -0
  134. holidays/groups/thai.py +157 -0
  135. holidays/helpers.py +20 -0
  136. holidays/holiday_base.py +54 -76
  137. holidays/holiday_groups.py +11 -1053
  138. holidays/locale/am/LC_MESSAGES/ET.mo +0 -0
  139. holidays/locale/am/LC_MESSAGES/ET.po +20 -15
  140. holidays/locale/ar/LC_MESSAGES/CA.mo +0 -0
  141. holidays/locale/ar/LC_MESSAGES/CA.po +184 -0
  142. holidays/locale/ar/LC_MESSAGES/ET.mo +0 -0
  143. holidays/locale/ar/LC_MESSAGES/ET.po +92 -0
  144. holidays/locale/ar/LC_MESSAGES/UA.mo +0 -0
  145. holidays/locale/ar/LC_MESSAGES/UA.po +97 -0
  146. holidays/locale/be/LC_MESSAGES/BY.po +11 -13
  147. holidays/locale/bg/LC_MESSAGES/BG.po +13 -15
  148. holidays/locale/da/LC_MESSAGES/DK.po +13 -12
  149. holidays/locale/de/LC_MESSAGES/AT.po +14 -14
  150. holidays/locale/de/LC_MESSAGES/CH.po +91 -56
  151. holidays/locale/de/LC_MESSAGES/DE.po +32 -32
  152. holidays/locale/de/LC_MESSAGES/LI.po +23 -23
  153. holidays/locale/el/LC_MESSAGES/CY.po +16 -16
  154. holidays/locale/el/LC_MESSAGES/GR.mo +0 -0
  155. holidays/locale/el/LC_MESSAGES/GR.po +21 -17
  156. holidays/locale/en/LC_MESSAGES/CA.po +43 -43
  157. holidays/locale/en_US/LC_MESSAGES/AM.mo +0 -0
  158. holidays/locale/en_US/LC_MESSAGES/AM.po +20 -20
  159. holidays/locale/en_US/LC_MESSAGES/AR.mo +0 -0
  160. holidays/locale/en_US/LC_MESSAGES/AR.po +34 -33
  161. holidays/locale/en_US/LC_MESSAGES/AT.po +13 -13
  162. holidays/locale/en_US/LC_MESSAGES/AW.mo +0 -0
  163. holidays/locale/en_US/LC_MESSAGES/AW.po +87 -0
  164. holidays/locale/en_US/LC_MESSAGES/BG.po +13 -15
  165. holidays/locale/en_US/LC_MESSAGES/BN.mo +0 -0
  166. holidays/locale/en_US/LC_MESSAGES/BN.po +96 -0
  167. holidays/locale/en_US/LC_MESSAGES/BY.po +11 -13
  168. holidays/locale/en_US/LC_MESSAGES/CA.mo +0 -0
  169. holidays/locale/en_US/LC_MESSAGES/CA.po +70 -37
  170. holidays/locale/en_US/LC_MESSAGES/CH.po +91 -56
  171. holidays/locale/en_US/LC_MESSAGES/CL.po +39 -38
  172. holidays/locale/en_US/LC_MESSAGES/CO.mo +0 -0
  173. holidays/locale/en_US/LC_MESSAGES/CO.po +27 -27
  174. holidays/locale/en_US/LC_MESSAGES/CR.mo +0 -0
  175. holidays/locale/en_US/LC_MESSAGES/CR.po +19 -19
  176. holidays/locale/en_US/LC_MESSAGES/CU.po +10 -10
  177. holidays/locale/en_US/LC_MESSAGES/CW.mo +0 -0
  178. holidays/locale/en_US/LC_MESSAGES/CW.po +82 -0
  179. holidays/locale/en_US/LC_MESSAGES/CY.po +16 -16
  180. holidays/locale/en_US/LC_MESSAGES/DE.po +30 -30
  181. holidays/locale/en_US/LC_MESSAGES/DK.po +12 -11
  182. holidays/locale/en_US/LC_MESSAGES/DO.po +12 -12
  183. holidays/locale/en_US/LC_MESSAGES/EC.po +11 -12
  184. holidays/locale/en_US/LC_MESSAGES/ET.mo +0 -0
  185. holidays/locale/en_US/LC_MESSAGES/ET.po +20 -15
  186. holidays/locale/en_US/LC_MESSAGES/FI.po +15 -15
  187. holidays/locale/en_US/LC_MESSAGES/FR.po +27 -24
  188. holidays/locale/en_US/LC_MESSAGES/GE.po +23 -27
  189. holidays/locale/en_US/LC_MESSAGES/GR.mo +0 -0
  190. holidays/locale/en_US/LC_MESSAGES/GR.po +21 -17
  191. holidays/locale/en_US/LC_MESSAGES/HN.mo +0 -0
  192. holidays/locale/en_US/LC_MESSAGES/HN.po +17 -12
  193. holidays/locale/en_US/LC_MESSAGES/HU.mo +0 -0
  194. holidays/locale/en_US/LC_MESSAGES/HU.po +109 -0
  195. holidays/locale/en_US/LC_MESSAGES/IS.po +17 -17
  196. holidays/locale/en_US/LC_MESSAGES/JP.po +25 -25
  197. holidays/locale/en_US/LC_MESSAGES/KH.mo +0 -0
  198. holidays/locale/en_US/LC_MESSAGES/KH.po +139 -0
  199. holidays/locale/en_US/LC_MESSAGES/LI.po +22 -22
  200. holidays/locale/en_US/LC_MESSAGES/MC.mo +0 -0
  201. holidays/locale/en_US/LC_MESSAGES/MC.po +27 -27
  202. holidays/locale/en_US/LC_MESSAGES/MD.po +13 -13
  203. holidays/locale/en_US/LC_MESSAGES/MX.po +9 -12
  204. holidays/locale/en_US/LC_MESSAGES/NI.mo +0 -0
  205. holidays/locale/en_US/LC_MESSAGES/NI.po +15 -15
  206. holidays/locale/en_US/LC_MESSAGES/NL.po +12 -12
  207. holidays/locale/en_US/LC_MESSAGES/NO.po +13 -13
  208. holidays/locale/en_US/LC_MESSAGES/PE.po +30 -30
  209. holidays/locale/en_US/LC_MESSAGES/PL.po +38 -21
  210. holidays/locale/en_US/LC_MESSAGES/PT.po +39 -36
  211. holidays/locale/en_US/LC_MESSAGES/PY.po +16 -16
  212. holidays/locale/en_US/LC_MESSAGES/RO.po +12 -12
  213. holidays/locale/en_US/LC_MESSAGES/RS.mo +0 -0
  214. holidays/locale/en_US/LC_MESSAGES/RS.po +17 -19
  215. holidays/locale/en_US/LC_MESSAGES/RU.po +11 -10
  216. holidays/locale/en_US/LC_MESSAGES/SE.po +19 -19
  217. holidays/locale/en_US/LC_MESSAGES/SK.po +17 -18
  218. holidays/locale/en_US/LC_MESSAGES/TH.po +41 -41
  219. holidays/locale/en_US/LC_MESSAGES/UA.po +18 -19
  220. holidays/locale/en_US/LC_MESSAGES/UY.po +15 -15
  221. holidays/locale/en_US/LC_MESSAGES/VE.po +16 -16
  222. holidays/locale/es/LC_MESSAGES/AR.mo +0 -0
  223. holidays/locale/es/LC_MESSAGES/AR.po +34 -33
  224. holidays/locale/es/LC_MESSAGES/CL.po +39 -38
  225. holidays/locale/es/LC_MESSAGES/CO.mo +0 -0
  226. holidays/locale/es/LC_MESSAGES/CO.po +24 -24
  227. holidays/locale/es/LC_MESSAGES/CR.mo +0 -0
  228. holidays/locale/es/LC_MESSAGES/CR.po +19 -19
  229. holidays/locale/es/LC_MESSAGES/CU.po +10 -10
  230. holidays/locale/es/LC_MESSAGES/DO.po +12 -12
  231. holidays/locale/es/LC_MESSAGES/EC.po +11 -12
  232. holidays/locale/es/LC_MESSAGES/HN.mo +0 -0
  233. holidays/locale/es/LC_MESSAGES/HN.po +17 -12
  234. holidays/locale/es/LC_MESSAGES/MX.po +9 -12
  235. holidays/locale/es/LC_MESSAGES/NI.po +12 -12
  236. holidays/locale/es/LC_MESSAGES/PE.po +30 -30
  237. holidays/locale/es/LC_MESSAGES/PY.po +16 -16
  238. holidays/locale/es/LC_MESSAGES/UY.po +15 -15
  239. holidays/locale/es/LC_MESSAGES/VE.po +16 -16
  240. holidays/locale/fi/LC_MESSAGES/FI.po +16 -16
  241. holidays/locale/fr/LC_MESSAGES/CA.po +43 -43
  242. holidays/locale/fr/LC_MESSAGES/CH.po +91 -56
  243. holidays/locale/fr/LC_MESSAGES/FR.po +27 -24
  244. holidays/locale/fr/LC_MESSAGES/MC.po +23 -23
  245. holidays/locale/hu/LC_MESSAGES/HU.mo +0 -0
  246. holidays/locale/hu/LC_MESSAGES/HU.po +109 -0
  247. holidays/locale/hy/LC_MESSAGES/AM.po +16 -16
  248. holidays/locale/is/LC_MESSAGES/IS.po +18 -18
  249. holidays/locale/it/LC_MESSAGES/CH.po +91 -56
  250. holidays/locale/ja/LC_MESSAGES/JP.po +25 -25
  251. holidays/locale/ka/LC_MESSAGES/GE.po +23 -27
  252. holidays/locale/km/LC_MESSAGES/KH.mo +0 -0
  253. holidays/locale/km/LC_MESSAGES/KH.po +139 -0
  254. holidays/locale/ms/LC_MESSAGES/BN.mo +0 -0
  255. holidays/locale/ms/LC_MESSAGES/BN.po +96 -0
  256. holidays/locale/nl/LC_MESSAGES/AW.mo +0 -0
  257. holidays/locale/nl/LC_MESSAGES/AW.po +87 -0
  258. holidays/locale/nl/LC_MESSAGES/CW.mo +0 -0
  259. holidays/locale/nl/LC_MESSAGES/CW.po +82 -0
  260. holidays/locale/nl/LC_MESSAGES/NL.po +13 -13
  261. holidays/locale/no/LC_MESSAGES/NO.po +14 -14
  262. holidays/locale/pap/LC_MESSAGES/AW.mo +0 -0
  263. holidays/locale/pap/LC_MESSAGES/AW.po +87 -0
  264. holidays/locale/pap/LC_MESSAGES/CW.mo +0 -0
  265. holidays/locale/pap/LC_MESSAGES/CW.po +82 -0
  266. holidays/locale/pl/LC_MESSAGES/PL.po +38 -21
  267. holidays/locale/pt_PT/LC_MESSAGES/PT.po +39 -36
  268. holidays/locale/ro/LC_MESSAGES/MD.po +14 -15
  269. holidays/locale/ro/LC_MESSAGES/RO.po +13 -14
  270. holidays/locale/ru/LC_MESSAGES/RU.po +11 -9
  271. holidays/locale/sk/LC_MESSAGES/SK.po +17 -18
  272. holidays/locale/sr/LC_MESSAGES/RS.mo +0 -0
  273. holidays/locale/sr/LC_MESSAGES/RS.po +15 -17
  274. holidays/locale/sv/LC_MESSAGES/FI.po +16 -16
  275. holidays/locale/sv/LC_MESSAGES/SE.po +20 -20
  276. holidays/locale/th/LC_MESSAGES/BN.mo +0 -0
  277. holidays/locale/th/LC_MESSAGES/BN.po +96 -0
  278. holidays/locale/th/LC_MESSAGES/CA.po +42 -42
  279. holidays/locale/th/LC_MESSAGES/KH.mo +0 -0
  280. holidays/locale/th/LC_MESSAGES/KH.po +145 -0
  281. holidays/locale/th/LC_MESSAGES/TH.po +41 -41
  282. holidays/locale/uk/LC_MESSAGES/AR.mo +0 -0
  283. holidays/locale/uk/LC_MESSAGES/AR.po +35 -35
  284. holidays/locale/uk/LC_MESSAGES/AT.po +15 -16
  285. holidays/locale/uk/LC_MESSAGES/AW.mo +0 -0
  286. holidays/locale/uk/LC_MESSAGES/AW.po +87 -0
  287. holidays/locale/uk/LC_MESSAGES/CH.po +92 -58
  288. holidays/locale/uk/LC_MESSAGES/CL.po +40 -40
  289. holidays/locale/uk/LC_MESSAGES/CO.mo +0 -0
  290. holidays/locale/uk/LC_MESSAGES/CO.po +28 -29
  291. holidays/locale/uk/LC_MESSAGES/CR.mo +0 -0
  292. holidays/locale/uk/LC_MESSAGES/CR.po +20 -21
  293. holidays/locale/uk/LC_MESSAGES/CU.po +11 -12
  294. holidays/locale/uk/LC_MESSAGES/CW.mo +0 -0
  295. holidays/locale/uk/LC_MESSAGES/CW.po +82 -0
  296. holidays/locale/uk/LC_MESSAGES/DE.po +33 -34
  297. holidays/locale/uk/LC_MESSAGES/DK.po +14 -14
  298. holidays/locale/uk/LC_MESSAGES/DO.po +13 -14
  299. holidays/locale/uk/LC_MESSAGES/EC.po +12 -14
  300. holidays/locale/uk/LC_MESSAGES/FI.po +17 -18
  301. holidays/locale/uk/LC_MESSAGES/FR.po +28 -26
  302. holidays/locale/uk/LC_MESSAGES/HN.mo +0 -0
  303. holidays/locale/uk/LC_MESSAGES/HN.po +18 -14
  304. holidays/locale/uk/LC_MESSAGES/HU.mo +0 -0
  305. holidays/locale/uk/LC_MESSAGES/HU.po +109 -0
  306. holidays/locale/uk/LC_MESSAGES/IS.po +19 -20
  307. holidays/locale/uk/LC_MESSAGES/LI.po +24 -25
  308. holidays/locale/uk/LC_MESSAGES/MC.po +27 -28
  309. holidays/locale/uk/LC_MESSAGES/MD.po +14 -15
  310. holidays/locale/uk/LC_MESSAGES/MX.po +10 -14
  311. holidays/locale/uk/LC_MESSAGES/NI.mo +0 -0
  312. holidays/locale/uk/LC_MESSAGES/NI.po +16 -17
  313. holidays/locale/uk/LC_MESSAGES/NL.po +14 -15
  314. holidays/locale/uk/LC_MESSAGES/NO.po +15 -16
  315. holidays/locale/uk/LC_MESSAGES/PE.po +31 -32
  316. holidays/locale/uk/LC_MESSAGES/PL.po +38 -21
  317. holidays/locale/uk/LC_MESSAGES/PY.po +17 -18
  318. holidays/locale/uk/LC_MESSAGES/RO.po +13 -14
  319. holidays/locale/uk/LC_MESSAGES/SE.po +21 -22
  320. holidays/locale/uk/LC_MESSAGES/SK.po +18 -20
  321. holidays/locale/uk/LC_MESSAGES/UA.po +17 -17
  322. holidays/locale/uk/LC_MESSAGES/UY.po +16 -17
  323. holidays/locale/uk/LC_MESSAGES/VE.po +17 -18
  324. holidays/registry.py +21 -12
  325. holidays/utils.py +87 -17
  326. {holidays-0.25.dist-info → holidays-0.27.dist-info}/METADATA +282 -265
  327. holidays-0.27.dist-info/RECORD +449 -0
  328. holidays-0.25.dist-info/RECORD +0 -390
  329. {holidays-0.25.dist-info → holidays-0.27.dist-info}/LICENSE +0 -0
  330. {holidays-0.25.dist-info → holidays-0.27.dist-info}/WHEEL +0 -0
  331. {holidays-0.25.dist-info → holidays-0.27.dist-info}/top_level.txt +0 -0
@@ -10,27 +10,39 @@
10
10
  # License: MIT (see LICENSE file)
11
11
 
12
12
  from datetime import timedelta as td
13
- from typing import Dict, Tuple
14
13
 
15
- from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP
16
- from holidays.constants import OCT, NOV, DEC
14
+ from holidays.calendars import (
15
+ _CustomBuddhistCalendar,
16
+ _CustomChineseCalendar,
17
+ _CustomIslamicCalendar,
18
+ _CustomHinduCalendar,
19
+ )
20
+ from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
17
21
  from holidays.holiday_base import HolidayBase
18
- from holidays.holiday_groups import ChineseCalendarHolidays, ChristianHolidays
19
- from holidays.holiday_groups import InternationalHolidays, IslamicHolidays
22
+ from holidays.holiday_groups import (
23
+ BuddhistCalendarHolidays,
24
+ ChineseCalendarHolidays,
25
+ ChristianHolidays,
26
+ HinduCalendarHolidays,
27
+ InternationalHolidays,
28
+ IslamicHolidays,
29
+ )
20
30
 
21
31
 
22
32
  class Singapore(
23
33
  HolidayBase,
34
+ BuddhistCalendarHolidays,
24
35
  ChineseCalendarHolidays,
25
36
  ChristianHolidays,
37
+ HinduCalendarHolidays,
26
38
  InternationalHolidays,
27
39
  IslamicHolidays,
28
40
  ):
29
41
  country = "SG"
30
42
  special_holidays = {
31
- 2001: ((NOV, 3, "Polling Day"),),
32
- 2006: ((MAY, 6, "Polling Day"),),
33
- 2011: ((MAY, 7, "Polling Day"),),
43
+ 2001: (NOV, 3, "Polling Day"),
44
+ 2006: (MAY, 6, "Polling Day"),
45
+ 2011: (MAY, 7, "Polling Day"),
34
46
  2015: (
35
47
  # SG50 Public holiday
36
48
  # Announced on 14 March 2015
@@ -38,7 +50,7 @@ class Singapore(
38
50
  (AUG, 7, "SG50 Public Holiday"),
39
51
  (SEP, 11, "Polling Day"),
40
52
  ),
41
- 2020: ((JUL, 10, "Polling Day"),),
53
+ 2020: (JUL, 10, "Polling Day"),
42
54
  }
43
55
 
44
56
  def __init__(self, *args, **kwargs) -> None:
@@ -75,10 +87,16 @@ class Singapore(
75
87
 
76
88
  See parameters and usage in :py:class:`HolidayBase`.
77
89
  """
78
- ChineseCalendarHolidays.__init__(self)
90
+ BuddhistCalendarHolidays.__init__(
91
+ self, calendar=SingaporeBuddhistCalendar(), show_estimated=True
92
+ )
93
+ ChineseCalendarHolidays.__init__(
94
+ self, calendar=SingaporeChineseCalendar(), show_estimated=True
95
+ )
79
96
  ChristianHolidays.__init__(self)
97
+ HinduCalendarHolidays.__init__(self, calendar=SingaporeHinduCalendar())
80
98
  InternationalHolidays.__init__(self)
81
- IslamicHolidays.__init__(self)
99
+ IslamicHolidays.__init__(self, calendar=SingaporeIslamicCalendar())
82
100
  super().__init__(*args, **kwargs)
83
101
 
84
102
  def _populate(self, year) -> None:
@@ -90,98 +108,16 @@ class Singapore(
90
108
 
91
109
  # Chinese New Year (two days)
92
110
  name = "Chinese New Year"
93
- observed_dates.add(self._add_chinese_new_years_day(name))
94
- observed_dates.add(self._add_chinese_new_years_day_two(name))
95
-
96
- # Hari Raya Puasa
97
- # aka Eid al-Fitr
98
- # Date of observance is announced yearly.
99
- # An Islamic holiday could fall twice in the same Gregorian year.
100
- dates_fixed_multiple_obs: Dict[int, Tuple[Tuple[int, int], ...]] = {
101
- 2001: ((DEC, 16),),
102
- 2002: ((DEC, 6),),
103
- 2003: ((NOV, 25),),
104
- 2004: ((NOV, 14),),
105
- 2005: ((NOV, 3),),
106
- 2006: ((OCT, 24),),
107
- 2007: ((OCT, 13),),
108
- 2008: ((OCT, 1),),
109
- 2009: ((SEP, 20),),
110
- 2010: ((SEP, 10),),
111
- 2011: ((AUG, 30),),
112
- 2012: ((AUG, 19),),
113
- 2013: ((AUG, 8),),
114
- 2014: ((JUL, 28),),
115
- 2015: ((JUL, 17),),
116
- 2016: ((JUL, 6),),
117
- 2017: ((JUN, 25),),
118
- 2018: ((JUN, 15),),
119
- 2019: ((JUN, 5),),
120
- 2020: ((MAY, 24),),
121
- 2021: ((MAY, 13),),
122
- 2022: ((MAY, 3),),
123
- 2023: ((APR, 22),),
124
- }
125
- if year in dates_fixed_multiple_obs:
126
- for hol_date in dates_fixed_multiple_obs[year]:
127
- observed_dates.add(
128
- self._add_holiday( # type: ignore[arg-type]
129
- "Hari Raya Puasa", *hol_date
130
- )
131
- )
132
- # Second day of Hari Raya Puasa (up to and including 1968)
133
- # Removed since we don't have Hari Raya Puasa dates for the
134
- # the years <= 1968.
135
- else:
136
- observed_dates.update(
137
- self._add_eid_al_fitr_day("Hari Raya Puasa* (*estimated)")
138
- )
139
- # Second day of Hari Raya Puasa (up to and including 1968)
140
- if year <= 1968:
141
- self._add_eid_al_fitr_day_two(
142
- "Second day of Hari Raya Puasa* (*estimated)"
143
- )
111
+ observed_dates.add(self._add_chinese_new_years_day(name)) # type: ignore[arg-type]
112
+ observed_dates.add(self._add_chinese_new_years_day_two(name)) # type: ignore[arg-type]
144
113
 
145
- # Hari Raya Haji
146
- # aka Eid al-Adha
147
- # Date of observance is announced yearly.
148
- # An Islamic holiday could fall twice in the same Gregorian year.
149
- dates_fixed_multiple_obs = {
150
- 2001: ((MAR, 6),),
151
- 2002: ((FEB, 23),),
152
- 2003: ((FEB, 12),),
153
- 2004: ((FEB, 1),),
154
- 2005: ((JAN, 21),),
155
- 2006: ((JAN, 10), (DEC, 31)),
156
- 2007: ((DEC, 20),),
157
- 2008: ((DEC, 8),),
158
- 2009: ((NOV, 27),),
159
- 2010: ((NOV, 17),),
160
- 2011: ((NOV, 6),),
161
- 2012: ((OCT, 26),),
162
- 2013: ((OCT, 15),),
163
- 2014: ((OCT, 5),),
164
- 2015: ((SEP, 24),),
165
- 2016: ((SEP, 12),),
166
- 2017: ((SEP, 1),),
167
- 2018: ((AUG, 22),),
168
- 2019: ((AUG, 11),),
169
- 2020: ((JUL, 31),),
170
- 2021: ((JUL, 20),),
171
- 2022: ((JUL, 10),),
172
- 2023: ((JUN, 29),),
173
- }
174
- if year in dates_fixed_multiple_obs:
175
- for hol_date in dates_fixed_multiple_obs[year]:
176
- observed_dates.add(
177
- self._add_holiday( # type: ignore[arg-type]
178
- "Hari Raya Haji", *hol_date
179
- )
180
- )
181
- else:
182
- observed_dates.update(
183
- self._add_eid_al_adha_day("Hari Raya Haji* (*estimated)")
184
- )
114
+ # Hari Raya Puasa (Eid al-Fitr)
115
+ observed_dates.update(self._add_eid_al_fitr_day("Hari Raya Puasa"))
116
+ if year <= 1968:
117
+ self._add_eid_al_fitr_day_two("Second day of Hari Raya Puasa")
118
+
119
+ # Hari Raya Haji (Eid al-Adha)
120
+ observed_dates.update(self._add_eid_al_adha_day("Hari Raya Haji"))
185
121
 
186
122
  # Good Friday
187
123
  self._add_good_friday("Good Friday")
@@ -197,94 +133,13 @@ class Singapore(
197
133
  observed_dates.add(self._add_labor_day("Labour Day"))
198
134
 
199
135
  # Vesak Day
200
- # date of observance is announced yearly
201
- # https://en.wikipedia.org/wiki/Vesak#Dates_of_observance
202
- dates_fixed_obs: Dict[int, Tuple[int, int]] = {
203
- 2001: (MAY, 7),
204
- 2002: (MAY, 26),
205
- 2003: (MAY, 15),
206
- 2004: (JUN, 2),
207
- 2005: (MAY, 22),
208
- 2006: (MAY, 12),
209
- 2007: (MAY, 31),
210
- 2008: (MAY, 19),
211
- 2009: (MAY, 9),
212
- 2010: (MAY, 28),
213
- 2011: (MAY, 17),
214
- 2012: (MAY, 5),
215
- 2013: (MAY, 24),
216
- 2014: (MAY, 13),
217
- 2015: (JUN, 1),
218
- 2016: (MAY, 21),
219
- 2017: (MAY, 10),
220
- 2018: (MAY, 29),
221
- 2019: (MAY, 19),
222
- 2020: (MAY, 7),
223
- 2021: (MAY, 26),
224
- 2022: (MAY, 15),
225
- # 2023 date revised by MOM on 29-sep-22
226
- # https://www.mom.gov.sg/newsroom/press-releases/2022/0929-revised-date-for-vesak-day-2023
227
- 2023: (JUN, 2),
228
- }
229
- if year in dates_fixed_obs:
230
- observed_dates.add(
231
- self._add_holiday( # type: ignore[arg-type]
232
- "Vesak Day", *dates_fixed_obs[year]
233
- )
234
- )
235
- else:
236
- observed_dates.add(
237
- self._add_chinese_calendar_holiday(
238
- "Vesak Day* (*estimated)", 4, 15
239
- )
240
- )
136
+ observed_dates.add(self._add_vesak("Vesak Day")) # type: ignore[arg-type]
241
137
 
242
138
  # National Day
243
- observed_dates.add(
244
- self._add_holiday("National Day", AUG, 9) # type: ignore[arg-type]
245
- )
139
+ observed_dates.add(self._add_holiday("National Day", AUG, 9)) # type: ignore[arg-type]
246
140
 
247
- # Deepavali
248
- # aka Diwali
249
- # date of observance is announced yearly
250
- dates_fixed_obs = {
251
- 2001: (NOV, 14),
252
- 2002: (NOV, 3),
253
- 2003: (OCT, 23),
254
- 2004: (NOV, 11),
255
- 2005: (NOV, 1),
256
- 2006: (OCT, 21),
257
- 2007: (NOV, 8),
258
- 2008: (OCT, 27),
259
- 2009: (NOV, 15),
260
- 2010: (NOV, 5),
261
- 2011: (OCT, 26),
262
- 2012: (NOV, 13),
263
- 2013: (NOV, 2),
264
- 2014: (OCT, 22),
265
- 2015: (NOV, 10),
266
- 2016: (OCT, 29),
267
- 2017: (OCT, 18),
268
- 2018: (NOV, 6),
269
- 2019: (OCT, 27),
270
- 2020: (NOV, 14),
271
- 2021: (NOV, 4),
272
- 2022: (OCT, 24),
273
- 2023: (NOV, 12),
274
- }
275
- if year in dates_fixed_obs:
276
- observed_dates.add(
277
- self._add_holiday( # type: ignore[arg-type]
278
- "Deepavali", *dates_fixed_obs[year]
279
- )
280
- )
281
- else:
282
- observed_dates.add(
283
- self._add_holiday( # type: ignore[arg-type]
284
- "Deepavali* (*estimated)",
285
- self._convert_chinese_to_gre(10, 1) + td(days=-2),
286
- )
287
- )
141
+ # Deepavali (Diwali)
142
+ observed_dates.add(self._add_diwali("Deepavali")) # type: ignore[arg-type]
288
143
 
289
144
  # Christmas Day
290
145
  observed_dates.add(self._add_christmas_day("Christmas Day"))
@@ -305,8 +160,7 @@ class Singapore(
305
160
  continue
306
161
  self._add_holiday(
307
162
  "%s (Observed)" % self[dt],
308
- dt
309
- + td(days=2 if dt + td(days=+1) in observed_dates else 1),
163
+ dt + td(days=2 if dt + td(days=+1) in observed_dates else 1),
310
164
  )
311
165
 
312
166
  # special case (observed from previous year)
@@ -320,3 +174,141 @@ class SG(Singapore):
320
174
 
321
175
  class SGP(Singapore):
322
176
  pass
177
+
178
+
179
+ class SingaporeBuddhistCalendar(_CustomBuddhistCalendar):
180
+ VESAK_DATES = {
181
+ 2001: (MAY, 7),
182
+ 2002: (MAY, 26),
183
+ 2003: (MAY, 15),
184
+ 2004: (JUN, 2),
185
+ 2005: (MAY, 22),
186
+ 2006: (MAY, 12),
187
+ 2007: (MAY, 31),
188
+ 2008: (MAY, 19),
189
+ 2009: (MAY, 9),
190
+ 2010: (MAY, 28),
191
+ 2011: (MAY, 17),
192
+ 2012: (MAY, 5),
193
+ 2013: (MAY, 24),
194
+ 2014: (MAY, 13),
195
+ 2015: (JUN, 1),
196
+ 2016: (MAY, 21),
197
+ 2017: (MAY, 10),
198
+ 2018: (MAY, 29),
199
+ 2019: (MAY, 19),
200
+ 2020: (MAY, 7),
201
+ 2021: (MAY, 26),
202
+ 2022: (MAY, 15),
203
+ 2023: (JUN, 2),
204
+ }
205
+
206
+
207
+ class SingaporeChineseCalendar(_CustomChineseCalendar):
208
+ LUNAR_NEW_YEAR_DATES = {
209
+ 2001: (JAN, 24),
210
+ 2002: (FEB, 12),
211
+ 2003: (FEB, 1),
212
+ 2004: (JAN, 22),
213
+ 2005: (FEB, 9),
214
+ 2006: (JAN, 30),
215
+ 2007: (FEB, 19),
216
+ 2008: (FEB, 7),
217
+ 2009: (JAN, 26),
218
+ 2010: (FEB, 14),
219
+ 2011: (FEB, 3),
220
+ 2012: (JAN, 23),
221
+ 2013: (FEB, 10),
222
+ 2014: (JAN, 31),
223
+ 2015: (FEB, 19),
224
+ 2016: (FEB, 8),
225
+ 2017: (JAN, 28),
226
+ 2018: (FEB, 16),
227
+ 2019: (FEB, 5),
228
+ 2020: (JAN, 25),
229
+ 2021: (FEB, 12),
230
+ 2022: (FEB, 1),
231
+ 2023: (JAN, 22),
232
+ }
233
+
234
+
235
+ class SingaporeHinduCalendar(_CustomHinduCalendar):
236
+ DIWALI_DATES = {
237
+ 2001: (NOV, 14),
238
+ 2002: (NOV, 3),
239
+ 2003: (OCT, 23),
240
+ 2004: (NOV, 11),
241
+ 2005: (NOV, 1),
242
+ 2006: (OCT, 21),
243
+ 2007: (NOV, 8),
244
+ 2008: (OCT, 27),
245
+ 2009: (NOV, 15),
246
+ 2010: (NOV, 5),
247
+ 2011: (OCT, 26),
248
+ 2012: (NOV, 13),
249
+ 2013: (NOV, 2),
250
+ 2014: (OCT, 22),
251
+ 2015: (NOV, 10),
252
+ 2016: (OCT, 29),
253
+ 2017: (OCT, 18),
254
+ 2018: (NOV, 6),
255
+ 2019: (OCT, 27),
256
+ 2020: (NOV, 14),
257
+ 2021: (NOV, 4),
258
+ 2022: (OCT, 24),
259
+ 2023: (NOV, 12),
260
+ }
261
+
262
+
263
+ class SingaporeIslamicCalendar(_CustomIslamicCalendar):
264
+ EID_AL_ADHA_DATES = {
265
+ 2001: (MAR, 6),
266
+ 2002: (FEB, 23),
267
+ 2003: (FEB, 12),
268
+ 2004: (FEB, 1),
269
+ 2005: (JAN, 21),
270
+ 2006: ((JAN, 10), (DEC, 31)),
271
+ 2007: (DEC, 20),
272
+ 2008: (DEC, 8),
273
+ 2009: (NOV, 27),
274
+ 2010: (NOV, 17),
275
+ 2011: (NOV, 6),
276
+ 2012: (OCT, 26),
277
+ 2013: (OCT, 15),
278
+ 2014: (OCT, 5),
279
+ 2015: (SEP, 24),
280
+ 2016: (SEP, 12),
281
+ 2017: (SEP, 1),
282
+ 2018: (AUG, 22),
283
+ 2019: (AUG, 11),
284
+ 2020: (JUL, 31),
285
+ 2021: (JUL, 20),
286
+ 2022: (JUL, 10),
287
+ 2023: (JUN, 29),
288
+ }
289
+
290
+ EID_AL_FITR_DATES = {
291
+ 2001: (DEC, 16),
292
+ 2002: (DEC, 6),
293
+ 2003: (NOV, 25),
294
+ 2004: (NOV, 14),
295
+ 2005: (NOV, 3),
296
+ 2006: (OCT, 24),
297
+ 2007: (OCT, 13),
298
+ 2008: (OCT, 1),
299
+ 2009: (SEP, 20),
300
+ 2010: (SEP, 10),
301
+ 2011: (AUG, 30),
302
+ 2012: (AUG, 19),
303
+ 2013: (AUG, 8),
304
+ 2014: (JUL, 28),
305
+ 2015: (JUL, 17),
306
+ 2016: (JUL, 6),
307
+ 2017: (JUN, 25),
308
+ 2018: (JUN, 15),
309
+ 2019: (JUN, 5),
310
+ 2020: (MAY, 24),
311
+ 2021: (MAY, 13),
312
+ 2022: (MAY, 3),
313
+ 2023: (APR, 22),
314
+ }
@@ -36,6 +36,7 @@ class Slovakia(HolidayBase, ChristianHolidays, InternationalHolidays):
36
36
  ),
37
37
  )
38
38
  }
39
+ supported_languages = ("en_US", "sk", "uk")
39
40
 
40
41
  def __init__(self, *args, **kwargs):
41
42
  ChristianHolidays.__init__(self)
@@ -53,10 +54,7 @@ class Slovakia(HolidayBase, ChristianHolidays, InternationalHolidays):
53
54
 
54
55
  # Epiphany.
55
56
  self._add_epiphany_day(
56
- tr(
57
- "Zjavenie Pána (Traja králi a "
58
- "vianočnýsviatok pravoslávnych kresťanov)"
59
- )
57
+ tr("Zjavenie Pána (Traja králi a vianočnýsviatok pravoslávnych kresťanov)")
60
58
  )
61
59
 
62
60
  # Good Friday.
@@ -12,15 +12,13 @@
12
12
  from datetime import date
13
13
  from datetime import timedelta as td
14
14
 
15
- from dateutil.easter import easter
16
-
17
15
  from holidays.calendars import _get_nth_weekday_of_month
18
- from holidays.constants import JAN, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT
19
- from holidays.constants import NOV, DEC, MON, FRI
16
+ from holidays.constants import JAN, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC, MON, FRI
20
17
  from holidays.holiday_base import HolidayBase
18
+ from holidays.holiday_groups import ChristianHolidays, InternationalHolidays
21
19
 
22
20
 
23
- class SouthAfrica(HolidayBase):
21
+ class SouthAfrica(HolidayBase, ChristianHolidays, InternationalHolidays):
24
22
  """
25
23
  http://www.gov.za/about-sa/public-holidays
26
24
  https://en.wikipedia.org/wiki/Public_holidays_in_South_Africa
@@ -32,46 +30,48 @@ class SouthAfrica(HolidayBase):
32
30
  (JUN, 2, "National and provincial government elections"),
33
31
  (DEC, 31, "Y2K changeover"),
34
32
  ),
35
- 2000: ((JAN, 2, "Y2K changeover"),),
36
- 2004: ((APR, 14, "National and provincial government elections"),),
37
- 2006: ((MAR, 1, "Local government elections"),),
38
- 2008: ((MAY, 2, "Public holiday by presidential decree"),),
39
- 2009: ((APR, 22, "National and provincial government elections"),),
33
+ 2000: (JAN, 2, "Y2K changeover"),
34
+ 2004: (APR, 14, "National and provincial government elections"),
35
+ 2006: (MAR, 1, "Local government elections"),
36
+ 2008: (MAY, 2, "Public holiday by presidential decree"),
37
+ 2009: (APR, 22, "National and provincial government elections"),
40
38
  2011: (
41
39
  (MAY, 18, "Local government elections"),
42
40
  (DEC, 27, "Public holiday by presidential decree"),
43
41
  ),
44
- 2014: ((MAY, 7, "National and provincial government elections"),),
42
+ 2014: (MAY, 7, "National and provincial government elections"),
45
43
  2016: (
46
44
  (AUG, 3, "Local government elections"),
47
45
  (DEC, 27, "Public holiday by presidential decree"),
48
46
  ),
49
- 2019: ((MAY, 8, "National and provincial government elections"),),
50
- 2021: ((NOV, 1, "Municipal elections"),),
51
- 2022: ((DEC, 27, "Public holiday by presidential decree"),),
47
+ 2019: (MAY, 8, "National and provincial government elections"),
48
+ 2021: (NOV, 1, "Municipal elections"),
49
+ 2022: (DEC, 27, "Public holiday by presidential decree"),
52
50
  }
53
51
 
54
- def _populate(self, year):
55
- def _add_with_observed(hol_date: date, hol_name: str) -> None:
56
- # As of 1995/1/1, whenever a public holiday falls on a Sunday,
57
- # it rolls over to the following Monday
58
- self[hol_date] = hol_name
59
- if self.observed and self._is_sunday(hol_date) and year >= 1995:
60
- self[hol_date + td(days=+1)] = f"{hol_name} (Observed)"
52
+ def __init__(self, *args, **kwargs):
53
+ ChristianHolidays.__init__(self)
54
+ InternationalHolidays.__init__(self)
55
+ super().__init__(*args, **kwargs)
56
+
57
+ def _add_observed(self, dt: date) -> None:
58
+ # As of 1995/1/1, whenever a public holiday falls on a Sunday,
59
+ # it rolls over to the following Monday
60
+ if self.observed and self._is_sunday(dt) and self._year >= 1995:
61
+ self._add_holiday("%s (Observed)" % self[dt], dt + td(days=+1))
61
62
 
63
+ def _populate(self, year):
62
64
  # Observed since 1910, with a few name changes
63
65
  if year <= 1909:
64
66
  return None
65
67
 
66
68
  super()._populate(year)
67
69
 
68
- _add_with_observed(date(year, JAN, 1), "New Year's Day")
70
+ self._add_observed(self._add_new_years_day("New Year's Day"))
69
71
 
70
- easter_date = easter(year)
71
- self[easter_date + td(days=-2)] = "Good Friday"
72
- self[easter_date + td(days=+1)] = (
73
- "Family Day" if year >= 1980 else "Easter Monday"
74
- )
72
+ self._add_good_friday("Good Friday")
73
+
74
+ self._add_easter_monday("Family Day" if year >= 1980 else "Easter Monday")
75
75
 
76
76
  if year <= 1951:
77
77
  name = "Dingaan's Day"
@@ -81,72 +81,70 @@ class SouthAfrica(HolidayBase):
81
81
  name = "Day of the Vow"
82
82
  else:
83
83
  name = "Day of Reconciliation"
84
- _add_with_observed(date(year, DEC, 16), name)
84
+ self._add_observed(self._add_holiday(name, DEC, 16))
85
85
 
86
- self[date(year, DEC, 25)] = "Christmas Day"
86
+ self._add_christmas_day("Christmas Day")
87
87
 
88
- _add_with_observed(
89
- date(year, DEC, 26),
90
- "Day of Goodwill" if year >= 1980 else "Boxing Day",
88
+ self._add_observed(
89
+ self._add_christmas_day_two(
90
+ "Day of Goodwill" if year >= 1980 else "Boxing Day",
91
+ )
91
92
  )
92
93
 
93
- # Observed since 1995/1/1
94
94
  if year >= 1995:
95
- _add_with_observed(date(year, MAR, 21), "Human Rights Day")
96
- _add_with_observed(date(year, APR, 27), "Freedom Day")
97
- _add_with_observed(date(year, MAY, 1), "Workers' Day")
98
- _add_with_observed(date(year, JUN, 16), "Youth Day")
99
- _add_with_observed(date(year, AUG, 9), "National Women's Day")
100
- _add_with_observed(date(year, SEP, 24), "Heritage Day")
95
+ self._add_observed(self._add_holiday("Human Rights Day", MAR, 21))
96
+
97
+ self._add_observed(self._add_holiday("Freedom Day", APR, 27))
98
+
99
+ self._add_observed(self._add_labor_day("Workers' Day"))
100
+
101
+ self._add_observed(self._add_holiday("Youth Day", JUN, 16))
102
+
103
+ self._add_observed(self._add_holiday("National Women's Day", AUG, 9))
104
+
105
+ self._add_observed(self._add_holiday("Heritage Day", SEP, 24))
101
106
 
102
107
  # Special holiday http://tiny.cc/za_y2k
103
108
  if self.observed and year == 2000:
104
- self[date(2000, JAN, 3)] = "Y2K changeover (Observed)"
109
+ self._add_holiday("Y2K changeover (Observed)", JAN, 3)
105
110
 
106
111
  # Historic public holidays no longer observed
107
112
  if 1952 <= year <= 1973:
108
- self[date(year, APR, 6)] = "Van Riebeeck's Day"
113
+ self._add_holiday("Van Riebeeck's Day", APR, 6)
109
114
  elif 1980 <= year <= 1994:
110
- self[date(year, APR, 6)] = "Founder's Day"
115
+ self._add_holiday("Founder's Day", APR, 6)
111
116
 
112
117
  if 1987 <= year <= 1989:
113
- # observed on first Friday in May
114
- self[_get_nth_weekday_of_month(1, FRI, MAY, year)] = "Workers' Day"
118
+ self._add_holiday("Workers' Day", _get_nth_weekday_of_month(1, FRI, MAY, year))
115
119
 
116
120
  if year <= 1993:
117
- self[easter_date + td(days=+40)] = "Ascension Day"
121
+ self._add_ascension_thursday("Ascension Day")
118
122
 
119
123
  if year <= 1951:
120
- self[date(year, MAY, 24)] = "Empire Day"
124
+ self._add_holiday("Empire Day", MAY, 24)
121
125
 
122
126
  if year <= 1960:
123
- self[date(year, MAY, 31)] = "Union Day"
127
+ self._add_holiday("Union Day", MAY, 31)
124
128
  elif year <= 1993:
125
- self[date(year, MAY, 31)] = "Republic Day"
129
+ self._add_holiday("Republic Day", MAY, 31)
126
130
 
127
131
  if 1952 <= year <= 1960:
128
- # observed on second Monday in July
129
- self[
130
- _get_nth_weekday_of_month(2, MON, JUL, year)
131
- ] = "Queen's Birthday"
132
+ self._add_holiday(
133
+ "Queen's Birthday",
134
+ _get_nth_weekday_of_month(2, MON, JUL, year),
135
+ )
132
136
 
133
137
  if 1961 <= year <= 1973:
134
- self[date(year, JUL, 10)] = "Family Day"
138
+ self._add_holiday("Family Day", JUL, 10)
135
139
 
136
140
  if year <= 1951:
137
- # observed on first Monday in August
138
- self[
139
- _get_nth_weekday_of_month(1, MON, AUG, year)
140
- ] = "King's Birthday"
141
+ self._add_holiday("King's Birthday", _get_nth_weekday_of_month(1, MON, AUG, year))
141
142
 
142
143
  if 1952 <= year <= 1979:
143
- # observed on first Monday in September
144
- self[
145
- _get_nth_weekday_of_month(1, MON, SEP, year)
146
- ] = "Settlers' Day"
144
+ self._add_holiday("Settlers' Day", _get_nth_weekday_of_month(1, MON, SEP, year))
147
145
 
148
146
  if 1952 <= year <= 1993:
149
- self[date(year, OCT, 10)] = "Kruger Day"
147
+ self._add_holiday("Kruger Day", OCT, 10)
150
148
 
151
149
 
152
150
  class ZA(SouthAfrica):