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
@@ -14,8 +14,7 @@ from datetime import timedelta as td
14
14
  from gettext import gettext as tr
15
15
 
16
16
  from holidays.calendars import _get_nth_weekday_from, _get_nth_weekday_of_month
17
- from holidays.constants import FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT
18
- from holidays.constants import SUN, MON
17
+ from holidays.constants import FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, SUN, MON
19
18
  from holidays.holiday_base import HolidayBase
20
19
  from holidays.holiday_groups import ChristianHolidays, InternationalHolidays
21
20
 
@@ -38,6 +37,7 @@ class Canada(HolidayBase, ChristianHolidays, InternationalHolidays):
38
37
  "SK",
39
38
  "YT",
40
39
  )
40
+ supported_languages = ("ar", "en", "en_US", "fr", "th")
41
41
 
42
42
  def __init__(self, *args, **kwargs):
43
43
  # Default subdivision to ON; prov for backwards compatibility
@@ -52,17 +52,13 @@ class Canada(HolidayBase, ChristianHolidays, InternationalHolidays):
52
52
  1 if self._is_friday(dt) or self._is_weekend(dt) else -1, MON, dt
53
53
  )
54
54
 
55
- def _add_observed(self, hol_date: date, include_sat: bool = True) -> None:
55
+ def _add_observed(self, dt: date, include_sat: bool = True, days: int = +1) -> None:
56
56
  if not self.observed:
57
57
  return None
58
- if self._is_sunday(hol_date) or (
59
- self._is_saturday(hol_date) and include_sat
60
- ):
61
- obs_date = _get_nth_weekday_from(1, MON, hol_date)
62
- if obs_date in self:
63
- obs_date += td(days=+1)
58
+ if self._is_sunday(dt) or (include_sat and self._is_saturday(dt)):
64
59
  self._add_holiday(
65
- self.tr("%s (Observed)") % self[hol_date], obs_date
60
+ self.tr("%s (Observed)") % self[dt],
61
+ dt + td(days=+2 if self._is_saturday(dt) else days),
66
62
  )
67
63
 
68
64
  def _populate(self, year):
@@ -90,14 +86,17 @@ class Canada(HolidayBase, ChristianHolidays, InternationalHolidays):
90
86
  _get_nth_weekday_of_month(1, MON, SEP, self._year),
91
87
  )
92
88
 
93
- # Christmas Day.
94
- dec_25 = self._add_christmas_day(tr("Christmas Day"))
95
-
96
- # Boxing Day.
97
- dec_26 = self._add_christmas_day_two(tr("Boxing Day"))
89
+ self._add_observed(
90
+ # Christmas Day.
91
+ self._add_christmas_day(tr("Christmas Day")),
92
+ days=+2,
93
+ )
98
94
 
99
- self._add_observed(dec_25)
100
- self._add_observed(dec_26)
95
+ self._add_observed(
96
+ # Boxing Day.
97
+ self._add_christmas_day_two(tr("Boxing Day")),
98
+ days=+2,
99
+ )
101
100
 
102
101
  def _add_family_day(self):
103
102
  self._add_holiday(
@@ -171,9 +170,7 @@ class Canada(HolidayBase, ChristianHolidays, InternationalHolidays):
171
170
 
172
171
  def _add_subdiv_bc_holidays(self):
173
172
  if self._year >= 2013:
174
- dt = _get_nth_weekday_of_month(
175
- 3 if self._year >= 2019 else 2, MON, FEB, self._year
176
- )
173
+ dt = _get_nth_weekday_of_month(3 if self._year >= 2019 else 2, MON, FEB, self._year)
177
174
  self._add_holiday(tr("Family Day"), dt)
178
175
 
179
176
  if self._year >= 1953:
@@ -226,9 +223,7 @@ class Canada(HolidayBase, ChristianHolidays, InternationalHolidays):
226
223
  # Civic Holiday.
227
224
  else tr("Civic Holiday")
228
225
  )
229
- self._add_holiday(
230
- name, _get_nth_weekday_of_month(1, MON, AUG, self._year)
231
- )
226
+ self._add_holiday(name, _get_nth_weekday_of_month(1, MON, AUG, self._year))
232
227
 
233
228
  if self._year >= 2021:
234
229
  self._add_holiday(
@@ -396,9 +391,7 @@ class Canada(HolidayBase, ChristianHolidays, InternationalHolidays):
396
391
 
397
392
  def _add_subdiv_pe_holidays(self):
398
393
  if self._year >= 2009:
399
- dt = _get_nth_weekday_of_month(
400
- 3 if self._year >= 2010 else 2, MON, FEB, self._year
401
- )
394
+ dt = _get_nth_weekday_of_month(3 if self._year >= 2010 else 2, MON, FEB, self._year)
402
395
  # Islander Day.
403
396
  self._add_holiday(tr("Islander Day"), dt)
404
397
 
@@ -464,8 +457,7 @@ class Canada(HolidayBase, ChristianHolidays, InternationalHolidays):
464
457
  if self._year >= 1974:
465
458
  self._add_holiday(
466
459
  tr("Heritage Day"),
467
- _get_nth_weekday_of_month(-1, SUN, FEB, self._year)
468
- + td(days=-2),
460
+ _get_nth_weekday_of_month(-1, SUN, FEB, self._year) + td(days=-2),
469
461
  )
470
462
 
471
463
  if self._year >= 1953:
@@ -0,0 +1,133 @@
1
+ # python-holidays
2
+ # ---------------
3
+ # A fast, efficient Python library for generating country, province and state
4
+ # specific sets of holidays on the fly. It aims to make determining whether a
5
+ # specific date is a holiday as fast and flexible as possible.
6
+ #
7
+ # Authors: dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
8
+ # ryanss <ryanssdev@icloud.com> (c) 2014-2017
9
+ # Website: https://github.com/dr-prodigy/python-holidays
10
+ # License: MIT (see LICENSE file)
11
+
12
+ from datetime import date
13
+ from datetime import timedelta as td
14
+
15
+ from holidays.calendars import _CustomIslamicCalendar
16
+ from holidays.constants import JAN, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
17
+ from holidays.holiday_base import HolidayBase
18
+ from holidays.holiday_groups import ChristianHolidays, InternationalHolidays, IslamicHolidays
19
+
20
+
21
+ class Chad(HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHolidays):
22
+ """
23
+ References:
24
+ - https://en.wikipedia.org/wiki/Public_holidays_in_Chad
25
+ - https://www.ilo.org/dyn/natlex/docs/ELECTRONIC/97323/115433/F-316075167/TCD-97323.pdf # noqa: E501
26
+ """
27
+
28
+ country = "TD"
29
+ special_holidays = {
30
+ 2021: (APR, 23, "Funeral of Idriss Déby Itno"),
31
+ }
32
+
33
+ def __init__(self, *args, **kwargs) -> None:
34
+ ChristianHolidays.__init__(self)
35
+ InternationalHolidays.__init__(self)
36
+ IslamicHolidays.__init__(self, calendar=ChadIslamicCalendar())
37
+ super().__init__(*args, **kwargs)
38
+
39
+ def _add_observed(self, dt: date) -> None:
40
+ if self.observed and self._is_sunday(dt):
41
+ self._add_holiday("%s (Observed)" % self[dt], dt + td(days=+1))
42
+
43
+ def _populate(self, year):
44
+ # On 11 August 1960, Chad gained independence from France.
45
+ if year <= 1960:
46
+ return None
47
+
48
+ super()._populate(year)
49
+
50
+ # New Year's Day.
51
+ self._add_observed(self._add_new_years_day("New Year's Day"))
52
+
53
+ # International Women's Day.
54
+ self._add_observed(self._add_womens_day("International Women's Day"))
55
+
56
+ # Easter Monday.
57
+ self._add_easter_monday("Easter Monday")
58
+
59
+ # Labour Day.
60
+ self._add_observed(self._add_labor_day("Labour Day"))
61
+
62
+ # Independence Day.
63
+ self._add_observed(self._add_holiday("Independence Day", AUG, 11))
64
+
65
+ # All Saints' Day.
66
+ self._add_all_saints_day("All Saints' Day")
67
+
68
+ self._add_observed(
69
+ # Republic Day.
70
+ self._add_holiday("Republic Day", NOV, 28)
71
+ )
72
+
73
+ if year >= 1991:
74
+ self._add_observed(
75
+ # Freedom and Democracy Day.
76
+ self._add_holiday("Freedom and Democracy Day", DEC, 1)
77
+ )
78
+
79
+ # Christmas Day.
80
+ self._add_christmas_day("Christmas Day")
81
+
82
+ # Eid al-Fitr.
83
+ self._add_eid_al_fitr_day("Eid al-Fitr")
84
+
85
+ # Eid al-Adha.
86
+ self._add_eid_al_adha_day("Eid al-Adha")
87
+
88
+ # Mawlid.
89
+ self._add_mawlid_day("Mawlid")
90
+
91
+
92
+ class TD(Chad):
93
+ pass
94
+
95
+
96
+ class TCD(Chad):
97
+ pass
98
+
99
+
100
+ class ChadIslamicCalendar(_CustomIslamicCalendar):
101
+ EID_AL_ADHA_DATES = {
102
+ 2015: (SEP, 24),
103
+ 2016: (SEP, 13),
104
+ 2017: (SEP, 2),
105
+ 2018: (AUG, 22),
106
+ 2019: (AUG, 11),
107
+ 2020: (JUL, 31),
108
+ 2021: (JUL, 20),
109
+ 2022: (JUL, 9),
110
+ }
111
+
112
+ EID_AL_FITR_DATES = {
113
+ 2015: (JUL, 18),
114
+ 2016: (JUL, 7),
115
+ 2017: (JUN, 26),
116
+ 2018: (JUN, 15),
117
+ 2019: (JUN, 4),
118
+ 2020: (MAY, 24),
119
+ 2021: (MAY, 13),
120
+ 2022: (MAY, 2),
121
+ 2023: (APR, 21),
122
+ }
123
+
124
+ MAWLID_DATES = {
125
+ 2015: ((JAN, 3), (DEC, 24)),
126
+ 2016: (DEC, 12),
127
+ 2017: (DEC, 1),
128
+ 2018: (NOV, 21),
129
+ 2019: (NOV, 9),
130
+ 2020: (OCT, 29),
131
+ 2021: (OCT, 18),
132
+ 2022: (OCT, 8),
133
+ }
@@ -28,11 +28,10 @@ class Chile(HolidayBase, ChristianHolidays, InternationalHolidays):
28
28
  """
29
29
 
30
30
  country = "CL"
31
+ default_language = "es"
31
32
  special_holidays = {
32
- 2022: ((SEP, 16, tr("Feriado nacional")),),
33
+ 2022: (SEP, 16, tr("Feriado nacional")),
33
34
  }
34
- default_language = "es"
35
- # ISO 3166-2 codes for the principal subdivisions, called regions
36
35
  subdivisions = (
37
36
  "AI",
38
37
  "AN",
@@ -51,6 +50,7 @@ class Chile(HolidayBase, ChristianHolidays, InternationalHolidays):
51
50
  "TA",
52
51
  "VS",
53
52
  )
53
+ supported_languages = ("en_US", "es", "uk")
54
54
 
55
55
  def __init__(self, *args, **kwargs):
56
56
  ChristianHolidays.__init__(self)
@@ -113,9 +113,7 @@ class Chile(HolidayBase, ChristianHolidays, InternationalHolidays):
113
113
 
114
114
  # Saint Peter and Saint Paul (Law 16.840, Law 18.432)
115
115
  if year <= 1967 or year >= 1986:
116
- self._add_holiday(
117
- tr("San Pedro y San Pablo"), _get_movable(date(year, JUN, 29))
118
- )
116
+ self._add_holiday(tr("San Pedro y San Pablo"), _get_movable(date(year, JUN, 29)))
119
117
 
120
118
  # Day of Virgin of Carmen (Law 20.148)
121
119
  if year >= 2007:
@@ -160,9 +158,7 @@ class Chile(HolidayBase, ChristianHolidays, InternationalHolidays):
160
158
  # Columbus day (Law 3.810).
161
159
  if year >= 1922 and year != 1973:
162
160
  self._add_holiday(
163
- tr("Día del Encuentro de dos Mundos")
164
- if year >= 2000
165
- else tr("Día de la Raza"),
161
+ tr("Día del Encuentro de dos Mundos") if year >= 2000 else tr("Día de la Raza"),
166
162
  _get_movable(date(year, OCT, 12)),
167
163
  )
168
164
 
@@ -205,10 +201,7 @@ class Chile(HolidayBase, ChristianHolidays, InternationalHolidays):
205
201
  if self._year >= 2014:
206
202
  # Región de Ñuble
207
203
  self._add_holiday(
208
- tr(
209
- "Nacimiento del Prócer de la Independencia "
210
- "(Chillán y Chillán Viejo)"
211
- ),
204
+ tr("Nacimiento del Prócer de la Independencia (Chillán y Chillán Viejo)"),
212
205
  AUG,
213
206
  20,
214
207
  )
@@ -9,60 +9,56 @@
9
9
  # Website: https://github.com/dr-prodigy/python-holidays
10
10
  # License: MIT (see LICENSE file)
11
11
 
12
- from datetime import date
13
12
  from datetime import timedelta as td
14
13
 
15
- from holidays.calendars import _ChineseLuniSolar
16
- from holidays.constants import JAN, APR, MAY, OCT
14
+ from holidays.constants import OCT
17
15
  from holidays.holiday_base import HolidayBase
16
+ from holidays.holiday_groups import ChineseCalendarHolidays, InternationalHolidays
18
17
 
19
18
 
20
- class China(HolidayBase):
19
+ class China(HolidayBase, ChineseCalendarHolidays, InternationalHolidays):
21
20
  """
22
21
  https://en.wikipedia.org/wiki/Public_holidays_in_China
23
22
  """
24
23
 
25
24
  country = "CN"
26
25
 
27
- def __init__(self, **kwargs):
28
- self.cnls = _ChineseLuniSolar()
29
- HolidayBase.__init__(self, **kwargs)
26
+ def __init__(self, *args, **kwargs):
27
+ ChineseCalendarHolidays.__init__(self)
28
+ InternationalHolidays.__init__(self)
29
+ super().__init__(*args, **kwargs)
30
30
 
31
31
  def _populate(self, year):
32
32
  if year <= 1949:
33
33
  return None
34
-
35
34
  super()._populate(year)
36
35
 
37
- self[date(year, JAN, 1)] = "New Year's Day"
36
+ self._add_new_years_day("New Year's Day")
38
37
 
39
38
  name = "Labour Day"
40
- dt = date(year, MAY, 1)
41
- self[dt] = name
39
+ may_1 = self._add_labor_day(name)
42
40
  if 2000 <= year <= 2007:
43
- self[dt + td(days=+1)] = name
44
- self[dt + td(days=+2)] = name
41
+ self._add_holiday(name, may_1 + td(days=+1))
42
+ self._add_holiday(name, may_1 + td(days=+2))
45
43
 
46
44
  name = "Chinese New Year (Spring Festival)"
47
- dt = self.cnls.lunar_n_y_date(year)
48
- self[dt] = name
49
- self[dt + td(days=+1)] = name
45
+ self._add_chinese_new_years_day(name)
46
+ self._add_chinese_new_years_day_two(name)
50
47
  if 2008 <= year <= 2013:
51
- self[dt + td(days=-1)] = name
48
+ self._add_chinese_new_years_eve(name)
52
49
  else:
53
- self[dt + td(days=+2)] = name
50
+ self._add_chinese_new_years_day_three(name)
54
51
 
55
52
  name = "National Day"
56
- dt = date(year, OCT, 1)
57
- self[dt] = name
58
- self[dt + td(days=+1)] = name
53
+ self._add_holiday(name, OCT, 1)
54
+ self._add_holiday(name, OCT, 2)
59
55
  if year >= 2000:
60
- self[dt + td(days=+2)] = name
56
+ self._add_holiday(name, OCT, 3)
61
57
 
62
58
  if year >= 2008:
63
- self[date(year, APR, 5)] = "Tomb-Sweeping Day"
64
- self[self.cnls.lunar_to_gre(year, 5, 5)] = "Dragon Boat Festival"
65
- self[self.cnls.lunar_to_gre(year, 8, 15)] = "Mid-Autumn Festival"
59
+ self._add_qingming_festival("Tomb-Sweeping Day")
60
+ self._add_dragon_boat_festival("Dragon Boat Festival")
61
+ self._add_mid_autumn_festival("Mid-Autumn Festival")
66
62
 
67
63
 
68
64
  class CN(China):
@@ -13,14 +13,13 @@ from datetime import date
13
13
  from datetime import timedelta as td
14
14
  from gettext import gettext as tr
15
15
 
16
- from dateutil.easter import easter
17
-
18
16
  from holidays.calendars import _get_nth_weekday_from
19
- from holidays.constants import JAN, MAR, MAY, JUN, JUL, AUG, OCT, NOV, DEC, MON
17
+ from holidays.constants import JAN, MAR, JUN, JUL, AUG, OCT, NOV, MON
20
18
  from holidays.holiday_base import HolidayBase
19
+ from holidays.holiday_groups import ChristianHolidays, InternationalHolidays
21
20
 
22
21
 
23
- class Colombia(HolidayBase):
22
+ class Colombia(HolidayBase, ChristianHolidays, InternationalHolidays):
24
23
  """
25
24
  Colombia has 18 holidays. The establishing of these are by:
26
25
  Ley 35 de 1939 (DEC 4): https://bit.ly/3PJwk7B
@@ -31,6 +30,12 @@ class Colombia(HolidayBase):
31
30
 
32
31
  country = "CO"
33
32
  default_language = "es"
33
+ supported_languages = ("en_US", "es", "uk")
34
+
35
+ def __init__(self, *args, **kwargs):
36
+ ChristianHolidays.__init__(self)
37
+ InternationalHolidays.__init__(self)
38
+ super().__init__(*args, **kwargs)
34
39
 
35
40
  def _add_with_bridge(self, dt: date, name: str) -> None:
36
41
  """
@@ -60,7 +65,7 @@ class Colombia(HolidayBase):
60
65
  super()._populate(year)
61
66
 
62
67
  # New Year's Day
63
- self._add_holiday(tr("Año Nuevo"), JAN, 1)
68
+ self._add_new_years_day(tr("Año Nuevo"))
64
69
 
65
70
  if year >= 1951:
66
71
  # Epiphany
@@ -76,7 +81,7 @@ class Colombia(HolidayBase):
76
81
  )
77
82
 
78
83
  # Labor Day
79
- self[date(year, MAY, 1)] = tr("Día del Trabajo")
84
+ self._add_labor_day(tr("Día del Trabajo"))
80
85
 
81
86
  if year >= 1951:
82
87
  # Saint Peter and Saint Paul's Day
@@ -119,36 +124,34 @@ class Colombia(HolidayBase):
119
124
 
120
125
  if year >= 1951:
121
126
  # Immaculate Conception
122
- self._add_holiday(tr("La Inmaculada Concepción"), DEC, 8)
127
+ self._add_immaculate_conception_day(tr("La Inmaculada Concepción"))
123
128
 
124
129
  # Christmas
125
- self._add_holiday(tr("Navidad"), DEC, 25)
126
-
127
- easter_date = easter(year)
130
+ self._add_christmas_day(tr("Navidad"))
128
131
 
129
132
  if year >= 1951:
130
133
  # Maundy Thursday
131
- self._add_holiday(tr("Jueves Santo"), easter_date + td(days=-3))
134
+ self._add_holy_thursday(tr("Jueves Santo"))
132
135
 
133
136
  # Good Friday
134
- self._add_holiday(tr("Viernes Santo"), easter_date + td(days=-2))
137
+ self._add_good_friday(tr("Viernes Santo"))
135
138
 
136
139
  # Ascension of Jesus
137
140
  self._add_with_bridge(
138
- easter_date + td(days=+39),
141
+ self._easter_sunday + td(days=+39),
139
142
  tr("Ascensión del señor"),
140
143
  )
141
144
 
142
145
  # Corpus Christi
143
146
  self._add_with_bridge(
144
- easter_date + td(days=+60),
147
+ self._easter_sunday + td(days=+60),
145
148
  tr("Corpus Christi"),
146
149
  )
147
150
 
148
151
  if year >= 1984:
149
152
  # Sacred Heart
150
153
  self._add_with_bridge(
151
- easter_date + td(days=+68),
154
+ self._easter_sunday + td(days=+68),
152
155
  tr("Sagrado Corazón"),
153
156
  )
154
157
 
@@ -26,6 +26,7 @@ class CostaRica(HolidayBase, ChristianHolidays, InternationalHolidays):
26
26
 
27
27
  country = "CR"
28
28
  default_language = "es"
29
+ supported_languages = ("en_US", "es", "uk")
29
30
 
30
31
  def __init__(self, *args, **kwargs):
31
32
  ChristianHolidays.__init__(self)
@@ -33,25 +34,24 @@ class CostaRica(HolidayBase, ChristianHolidays, InternationalHolidays):
33
34
  super().__init__(*args, **kwargs)
34
35
 
35
36
  def _populate(self, year):
36
- def _add_movable(hol_name: str, hol_date: date) -> None:
37
+ def add_movable_holiday(name: str, dt: date) -> None:
37
38
  # Law #9875 from 16.07.2020
38
39
  if self.observed:
39
- if not self._is_monday(hol_date):
40
- hol_name = self.tr("%s (Observado)") % self.tr(hol_name)
41
- if self._is_tuesday(hol_date) or self._is_wednesday(hol_date):
42
- hol_date = _get_nth_weekday_from(-1, MON, hol_date)
40
+ if not self._is_monday(dt):
41
+ name = self.tr("%s (Observado)") % self.tr(name)
42
+
43
+ if self._is_tuesday(dt) or self._is_wednesday(dt):
44
+ dt = _get_nth_weekday_from(-1, MON, dt)
43
45
  else:
44
- hol_date = _get_nth_weekday_from(1, MON, hol_date)
45
- self._add_holiday(hol_name, hol_date)
46
+ dt = _get_nth_weekday_from(1, MON, dt)
47
+ self._add_holiday(name, dt)
46
48
 
47
- def _add_observed(hol_name: str, hol_date: date) -> None:
49
+ def add_observed_holiday(name: str, dt: date) -> None:
48
50
  if self.observed:
49
- if not (
50
- self._is_monday(hol_date) or self._is_weekend(hol_date)
51
- ):
52
- hol_date = _get_nth_weekday_from(1, MON, hol_date)
53
- hol_name = self.tr("%s (Observado)") % self.tr(hol_name)
54
- self._add_holiday(hol_name, hol_date)
51
+ if not (self._is_monday(dt) or self._is_weekend(dt)):
52
+ dt = _get_nth_weekday_from(1, MON, dt)
53
+ name = self.tr("%s (Observado)") % self.tr(name)
54
+ self._add_holiday(name, dt)
55
55
 
56
56
  super()._populate(year)
57
57
 
@@ -70,16 +70,16 @@ class CostaRica(HolidayBase, ChristianHolidays, InternationalHolidays):
70
70
  # Juan Santamaría Day.
71
71
  name = tr("Día de Juan Santamaría")
72
72
  if 2006 <= year <= 2010:
73
- _add_observed(name, dt)
73
+ add_observed_holiday(name, dt)
74
74
  elif year in {2023, 2024}:
75
- _add_movable(name, dt)
75
+ add_movable_holiday(name, dt)
76
76
  else:
77
77
  self._add_holiday(name, dt)
78
78
 
79
79
  # International Labor Day.
80
80
  name = tr("Día Internacional del Trabajo")
81
81
  if year == 2021:
82
- _add_movable(name, date(year, MAY, 1))
82
+ add_movable_holiday(name, date(year, MAY, 1))
83
83
  else:
84
84
  self._add_labor_day(name)
85
85
 
@@ -89,9 +89,9 @@ class CostaRica(HolidayBase, ChristianHolidays, InternationalHolidays):
89
89
  # Annexation of the Party of Nicoya to Costa Rica.
90
90
  name = tr("Anexión del Partido de Nicoya a Costa Rica")
91
91
  if 2005 <= year <= 2008:
92
- _add_observed(name, dt)
92
+ add_observed_holiday(name, dt)
93
93
  elif 2020 <= year <= 2024:
94
- _add_movable(name, dt)
94
+ add_movable_holiday(name, dt)
95
95
  else:
96
96
  self._add_holiday(name, dt)
97
97
 
@@ -108,9 +108,9 @@ class CostaRica(HolidayBase, ChristianHolidays, InternationalHolidays):
108
108
  # Mother's Day.
109
109
  name = tr("Día de la Madre")
110
110
  if 2005 <= year <= 2007:
111
- _add_observed(name, dt)
111
+ add_observed_holiday(name, dt)
112
112
  elif year in {2020, 2023, 2024}:
113
- _add_movable(name, dt)
113
+ add_movable_holiday(name, dt)
114
114
  else:
115
115
  self._add_holiday(name, dt)
116
116
 
@@ -118,9 +118,7 @@ class CostaRica(HolidayBase, ChristianHolidays, InternationalHolidays):
118
118
  if year >= 2022:
119
119
  dt = date(year, AUG, 31)
120
120
  # Day of the Black Person and Afro-Costa Rican Culture.
121
- name = self.tr(
122
- "Día de la Persona Negra y la Cultura Afrocostarricense"
123
- )
121
+ name = self.tr("Día de la Persona Negra y la Cultura Afrocostarricense")
124
122
  if self.observed and year in {2022, 2023}:
125
123
  dt = _get_nth_weekday_from(1, SUN, dt)
126
124
  name = self.tr("%s (Observado)") % name
@@ -130,14 +128,14 @@ class CostaRica(HolidayBase, ChristianHolidays, InternationalHolidays):
130
128
  # Independence Day.
131
129
  name = tr("Día de la Independencia")
132
130
  if year in {2020, 2021, 2022, 2024}:
133
- _add_movable(name, dt)
131
+ add_movable_holiday(name, dt)
134
132
  else:
135
133
  self._add_holiday(name, dt)
136
134
 
137
135
  # Law #9803 from 19.05.2020
138
136
  if year <= 2019:
139
137
  # Cultures Day.
140
- _add_observed(tr("Día de las Culturas"), date(year, OCT, 12))
138
+ add_observed_holiday(tr("Día de las Culturas"), date(year, OCT, 12))
141
139
 
142
140
  # Law #9803 from 19.05.2020
143
141
  if year >= 2020:
@@ -145,7 +143,7 @@ class CostaRica(HolidayBase, ChristianHolidays, InternationalHolidays):
145
143
  # Army Abolition Day.
146
144
  name = tr("Día de la Abolición del Ejército")
147
145
  if year in {2020, 2021, 2022}:
148
- _add_movable(name, dt)
146
+ add_movable_holiday(name, dt)
149
147
  else:
150
148
  self._add_holiday(name, dt)
151
149
 
@@ -13,13 +13,12 @@ from datetime import date
13
13
  from datetime import timedelta as td
14
14
  from gettext import gettext as tr
15
15
 
16
- from dateutil.easter import easter
17
-
18
- from holidays.constants import JAN, MAY, JUL, OCT, DEC
16
+ from holidays.constants import JAN, JUL, OCT
19
17
  from holidays.holiday_base import HolidayBase
18
+ from holidays.holiday_groups import ChristianHolidays, InternationalHolidays
20
19
 
21
20
 
22
- class Cuba(HolidayBase):
21
+ class Cuba(HolidayBase, ChristianHolidays, InternationalHolidays):
23
22
  """
24
23
  Overview: https://en.wikipedia.org/wiki/Public_holidays_in_Cuba
25
24
  1984 (DEC 28): https://bit.ly/3okNBbt
@@ -36,8 +35,18 @@ class Cuba(HolidayBase):
36
35
 
37
36
  country = "CU"
38
37
  default_language = "es"
38
+ supported_languages = ("en_US", "es", "uk")
39
+
40
+ def __init__(self, *args, **kwargs):
41
+ ChristianHolidays.__init__(self)
42
+ InternationalHolidays.__init__(self)
43
+ super().__init__(*args, **kwargs)
39
44
 
40
45
  def _populate(self, year):
46
+ # This calendar only works from 1959 onwards.
47
+ if year <= 1958:
48
+ return None
49
+
41
50
  def _add_observed(hol_date: date) -> None:
42
51
  if self.observed and self._is_sunday(hol_date):
43
52
  self._add_holiday(
@@ -63,12 +72,12 @@ class Cuba(HolidayBase):
63
72
  # Permanently granted in 2013 decree for 2014 and onwards.
64
73
  if year >= 2012:
65
74
  # Good Friday.
66
- self._add_holiday(tr("Viernes Santo"), easter(year) + td(days=-2))
75
+ self._add_good_friday(tr("Viernes Santo"))
67
76
 
68
- # Labour Day.
69
- dt = date(year, MAY, 1)
70
- self._add_holiday(tr("Día Internacional de los Trabajadores"), dt)
71
- _add_observed(dt)
77
+ _add_observed(
78
+ # Labour Day.
79
+ self._add_labor_day(tr("Día Internacional de los Trabajadores"))
80
+ )
72
81
 
73
82
  # Commemoration of the Assault of the Moncada garrison.
74
83
  self._add_holiday(tr("Conmemoración del asalto a Moncada"), JUL, 25)
@@ -79,10 +88,14 @@ class Cuba(HolidayBase):
79
88
  # Commemoration of the Assault of the Moncada garrison.
80
89
  self._add_holiday(tr("Conmemoración del asalto a Moncada"), JUL, 27)
81
90
 
82
- dt = date(year, OCT, 10)
83
- # Independence Day.
84
- self._add_holiday(tr("Inicio de las Guerras de Independencia"), dt)
85
- _add_observed(dt)
91
+ _add_observed(
92
+ self._add_holiday(
93
+ # Independence Day.
94
+ tr("Inicio de las Guerras de Independencia"),
95
+ OCT,
96
+ 10,
97
+ )
98
+ )
86
99
 
87
100
  # In 1969, Christmas was cancelled for the sugar harvest but then was
88
101
  # cancelled for good:
@@ -94,12 +107,12 @@ class Cuba(HolidayBase):
94
107
  # https://bit.ly/3cyXj7F
95
108
  if year <= 1968 or year >= 1997:
96
109
  # Christmas Day.
97
- self._add_holiday(tr("Día de Navidad"), DEC, 25)
110
+ self._add_christmas_day(tr("Día de Navidad"))
98
111
 
99
112
  # Granted in 2007 decree.
100
113
  if year >= 2007:
101
114
  # New Year's Eve.
102
- self._add_holiday(tr("Fiesta de Fin de Año"), DEC, 31)
115
+ self._add_new_years_eve(tr("Fiesta de Fin de Año"))
103
116
 
104
117
 
105
118
  class CU(Cuba):