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
@@ -0,0 +1,141 @@
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 BurkinaFaso(HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHolidays):
22
+ """
23
+ References:
24
+ - https://en.wikipedia.org/wiki/Public_holidays_in_Burkina_Faso
25
+ """
26
+
27
+ country = "BF"
28
+
29
+ def __init__(self, *args, **kwargs) -> None:
30
+ ChristianHolidays.__init__(self)
31
+ InternationalHolidays.__init__(self)
32
+ IslamicHolidays.__init__(self, calendar=BurkinaFasoIslamicCalendar())
33
+ super().__init__(*args, **kwargs)
34
+
35
+ def _add_observed(self, dt: date) -> None:
36
+ if self.observed and self._is_sunday(dt):
37
+ self._add_holiday("%s (Observed)" % self[dt], dt + td(days=+1))
38
+
39
+ def _populate(self, year):
40
+ # On 5 August 1960, Burkina Faso (Republic of Upper Volta at that time)
41
+ # gained independence from France.
42
+ if year <= 1960:
43
+ return None
44
+
45
+ super()._populate(year)
46
+
47
+ # New Year's Day.
48
+ self._add_observed(self._add_new_years_day("New Year's Day"))
49
+
50
+ if year >= 1967:
51
+ # Revolution Day.
52
+ self._add_observed(self._add_holiday("Revolution Day", JAN, 3))
53
+
54
+ # International Women's Day.
55
+ self._add_observed(self._add_womens_day("International Women's Day"))
56
+
57
+ # Easter Monday.
58
+ self._add_easter_monday("Easter Monday")
59
+
60
+ # Labour Day.
61
+ self._add_observed(self._add_labor_day("Labour Day"))
62
+
63
+ # Ascension Day.
64
+ self._add_ascension_thursday("Ascension Day")
65
+
66
+ # Independence Day.
67
+ self._add_observed(self._add_holiday("Independence Day", AUG, 5))
68
+
69
+ # Assumption Day.
70
+ self._add_observed(self._add_assumption_of_mary_day("Assumption Day"))
71
+
72
+ if year >= 2016:
73
+ # Martyrs' Day.
74
+ self._add_observed(self._add_holiday("Martyrs' Day", OCT, 31))
75
+
76
+ # All Saints' Day.
77
+ self._add_observed(self._add_all_saints_day("All Saints' Day"))
78
+
79
+ self._add_observed(
80
+ # Proclamation of Independence Day.
81
+ self._add_holiday("Proclamation of Independence Day", DEC, 11)
82
+ )
83
+
84
+ # Christmas Day.
85
+ self._add_observed(self._add_christmas_day("Christmas Day"))
86
+
87
+ # Eid al-Fitr.
88
+ self._add_eid_al_fitr_day("Eid al-Fitr")
89
+
90
+ # Eid al-Adha.
91
+ self._add_eid_al_adha_day("Eid al-Adha")
92
+
93
+ # Mawlid.
94
+ self._add_mawlid_day("Mawlid")
95
+
96
+
97
+ class BF(BurkinaFaso):
98
+ pass
99
+
100
+
101
+ class BFA(BurkinaFaso):
102
+ pass
103
+
104
+
105
+ class BurkinaFasoIslamicCalendar(_CustomIslamicCalendar):
106
+ EID_AL_ADHA_DATES = {
107
+ 2014: (OCT, 5),
108
+ 2015: (SEP, 24),
109
+ 2016: (SEP, 13),
110
+ 2017: (SEP, 2),
111
+ 2018: (AUG, 21),
112
+ 2019: (AUG, 11),
113
+ 2020: (JUL, 31),
114
+ 2021: (JUL, 20),
115
+ 2022: (JUL, 9),
116
+ }
117
+
118
+ EID_AL_FITR_DATES = {
119
+ 2014: (JUL, 29),
120
+ 2015: (JUL, 18),
121
+ 2016: (JUL, 7),
122
+ 2017: (JUN, 26),
123
+ 2018: (JUN, 15),
124
+ 2019: (JUN, 4),
125
+ 2020: (MAY, 24),
126
+ 2021: (MAY, 13),
127
+ 2022: (MAY, 2),
128
+ 2023: (APR, 21),
129
+ }
130
+
131
+ MAWLID_DATES = {
132
+ 2014: (JAN, 14),
133
+ 2015: ((JAN, 3), (DEC, 24)),
134
+ 2016: (DEC, 12),
135
+ 2017: (DEC, 1),
136
+ 2018: (NOV, 21),
137
+ 2019: (NOV, 10),
138
+ 2020: (OCT, 29),
139
+ 2021: (OCT, 19),
140
+ 2022: (OCT, 9),
141
+ }
@@ -15,13 +15,10 @@ from typing import Optional
15
15
 
16
16
  from holidays.constants import FEB, APR, JUN, JUL, OCT
17
17
  from holidays.holiday_base import HolidayBase
18
- from holidays.holiday_groups import ChristianHolidays, IslamicHolidays
19
- from holidays.holiday_groups import InternationalHolidays
18
+ from holidays.holiday_groups import ChristianHolidays, IslamicHolidays, InternationalHolidays
20
19
 
21
20
 
22
- class Burundi(
23
- HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHolidays
24
- ):
21
+ class Burundi(HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHolidays):
25
22
  """
26
23
  Burundian holidays
27
24
  Note that holidays falling on a sunday maybe observed
@@ -0,0 +1,323 @@
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 timedelta as td
13
+ from gettext import gettext as tr
14
+
15
+ from holidays.calendars import KHMER_CALENDAR
16
+ from holidays.constants import JAN, APR, MAY, JUN, AUG, SEP, OCT, NOV, DEC
17
+ from holidays.holiday_base import HolidayBase
18
+ from holidays.holiday_groups import InternationalHolidays, ThaiCalendarHolidays
19
+
20
+
21
+ class Cambodia(HolidayBase, InternationalHolidays, ThaiCalendarHolidays):
22
+ """
23
+ A subclass of :py:class:`HolidayBase` representing public holidays
24
+ in Cambodia.
25
+
26
+ References:
27
+
28
+ - Based on: https://www.nbc.gov.kh/english/news_and_events/official_holiday.php
29
+ https://www.nbc.gov.kh/news_and_events/official_holiday.php
30
+ https://en.wikipedia.org/wiki/Public_holidays_in_Cambodia
31
+
32
+ - Checked with: https://asean.org/wp-content/uploads/2021/12/ASEAN-National-Holidays-2022.pdf # noqa: E501
33
+ https://asean.org/wp-content/uploads/2022/12/ASEAN-Public-Holidays-2023.pdf # noqa: E501
34
+ https://www.timeanddate.com/holidays/cambodia/
35
+
36
+ Limitations:
37
+
38
+ - Cambodian holidays only works from 1993 onwards.
39
+
40
+ - Exact Public Holidays as per Cambodia's Official Gazette are only
41
+ available from 2015 onwards.
42
+
43
+ - Cambodian Lunar Calendar Holidays only work from 1941 (B.E. 2485) onwards
44
+ until 2057 (B.E. 2601) as we only have Thai year-type data for
45
+ cross-checking until then for Cambodian Buddhist Holidays.
46
+
47
+
48
+ Country created by: `PPsyrius <https://github.com/PPsyrius>`__
49
+
50
+ Country maintained by: `PPsyrius <https://github.com/PPsyrius>`__
51
+ """
52
+
53
+ country = "KH"
54
+ default_language = "km"
55
+
56
+ # Special Cases.
57
+
58
+ sangkranta_in_lieu_covid = tr(
59
+ # Khmer New Year's Replacement Holiday
60
+ "ថ្ងៃឈប់សម្រាកសងជំនួសឲ្យពិធីបុណ្យចូលឆ្នាំថ្មីប្រពៃណីជាតិ"
61
+ )
62
+ # Special Public Holiday
63
+ special_in_lieu_holidays = tr("ថ្ងៃឈប់សម្រាកសងជំនួស")
64
+
65
+ special_holidays = {
66
+ 2016: (
67
+ (MAY, 2, special_in_lieu_holidays),
68
+ (MAY, 16, special_in_lieu_holidays),
69
+ ),
70
+ 2018: (MAY, 21, special_in_lieu_holidays),
71
+ 2019: (SEP, 30, special_in_lieu_holidays),
72
+ 2020: (
73
+ (MAY, 11, special_in_lieu_holidays),
74
+ (AUG, 17, sangkranta_in_lieu_covid),
75
+ (AUG, 18, sangkranta_in_lieu_covid),
76
+ (AUG, 19, sangkranta_in_lieu_covid),
77
+ (AUG, 20, sangkranta_in_lieu_covid),
78
+ (AUG, 21, sangkranta_in_lieu_covid),
79
+ ),
80
+ }
81
+ supported_languages = ("en_US", "km", "th")
82
+
83
+ def __init__(self, *args, **kwargs):
84
+ InternationalHolidays.__init__(self)
85
+ ThaiCalendarHolidays.__init__(self, KHMER_CALENDAR)
86
+ super().__init__(*args, **kwargs)
87
+
88
+ def _populate(self, year):
89
+ # Available post-Independence from 1993 afterwards
90
+ if year <= 1992:
91
+ return None
92
+
93
+ super()._populate(year)
94
+
95
+ # Fixed Holidays
96
+
97
+ # ទិវាចូលឆ្នាំសាកល
98
+ # Status: In-Use.
99
+
100
+ # International New Year Day.
101
+ self._add_new_years_day(tr("ទិវាចូលឆ្នាំសាកល"))
102
+
103
+ # ទិវាជ័យជម្នះលើរបបប្រល័យពូជសាសន៍
104
+ # Status: In-Use.
105
+ # Commemorates the end of the Khmer Rouge regime in 1979
106
+
107
+ # Day of Victory over the Genocidal Regime.
108
+ self._add_holiday(tr("ទិវាជ័យជម្នះលើរបបប្រល័យពូជសាសន៍"), JAN, 7)
109
+
110
+ # ទិវាអន្តរជាតិនារី
111
+ # Status: In-Use.
112
+
113
+ # International Women's Rights Day
114
+ self._add_womens_day(tr("ទិវាអន្តរជាតិនារី"))
115
+
116
+ # ពិធីបុណ្យចូលឆ្នាំថ្មីប្រពៃណីជាតិ
117
+ # Status: In-Use.
118
+ # Usually falls on April 13th except for 2017-2018 and 2021-2023
119
+ # for years 2001-2050.
120
+
121
+ if year != 2020:
122
+ # Khmer New Year's Day
123
+ sangkranta = tr("ពិធីបុណ្យចូលឆ្នាំថ្មីប្រពៃណីជាតិ")
124
+ sangkranta_years_apr14 = {2017, 2018, 2021, 2022, 2023}
125
+ dt = self._add_holiday(sangkranta, APR, 14 if year in sangkranta_years_apr14 else 13)
126
+ self._add_holiday(sangkranta, dt + td(days=+1))
127
+ self._add_holiday(sangkranta, dt + td(days=+2))
128
+
129
+ # ទិវាពលកម្មអន្តរជាតិ
130
+ # Status: In-Use.
131
+
132
+ # International Labor Day
133
+ self._add_labor_day(tr("ទិវាពលកម្មអន្តរជាតិ"))
134
+
135
+ # ព្រះរាជពិធីបុណ្យចម្រើនព្រះជន្ម ព្រះករុណា ព្រះបាទសម្តេចព្រះបរមនាថ
136
+ # នរោត្តម សីហមុនី
137
+ # Status: In-Use.
138
+ # Assumed to start in 2005. Was celebrated for 3 days until 2020.
139
+
140
+ if year >= 2005:
141
+ king_sihamoni_bday = tr(
142
+ # Birthday of His Majesty Preah Bat Samdech Preah Boromneath
143
+ # NORODOM SIHAMONI, King of Cambodia
144
+ "ព្រះរាជពិធីបុណ្យចម្រើនព្រះជន្ម ព្រះករុណា "
145
+ "ព្រះបាទសម្តេចព្រះបរមនាថ នរោត្តម សីហមុនី"
146
+ )
147
+ dt = self._add_holiday(king_sihamoni_bday, MAY, 14)
148
+ if year <= 2019:
149
+ self._add_holiday(king_sihamoni_bday, MAY, 13)
150
+ self._add_holiday(king_sihamoni_bday, MAY, 15)
151
+
152
+ # ទិវាជាតិនៃការចងចាំ
153
+ # Status: Defunct.
154
+ # Active between 2018-2019 as Public Holiday.
155
+ # Was ទិវាចងកំហឹង (National Day of Anger) between 1983-2000.
156
+ # Its celebration was put onhold by UN administration with
157
+ # its name changed to present one in 2001.
158
+
159
+ if 2018 <= year <= 2019:
160
+ # National Day of Remembrance
161
+ self._add_holiday(tr("ទិវាជាតិនៃការចងចាំ"), MAY, 20)
162
+
163
+ # ទិវាកុមារអន្តរជាតិ
164
+ # Status: Defunct.
165
+ # Assumed to start in 1993, defunct from 2020 onwards.
166
+
167
+ if year <= 2019:
168
+ # International Children Day
169
+ self._add_childrens_day(tr("ទិវាកុមារអន្តរជាតិ"))
170
+
171
+ # ព្រះរាជពិធីបុណ្យចម្រើនព្រះជន្ម សម្តេចព្រះមហាក្សត្រី ព្រះវររាជមាតា
172
+ # នរោត្តម មុនិនាថ​ សីហនុ
173
+ # Status: In-Use.
174
+ # Assumed to start in 1994. A public holiday since 2015 at least.
175
+
176
+ if year >= 1994:
177
+ self._add_holiday(
178
+ # Birthday of Her Majesty the Queen-Mother NORODOM MONINEATH
179
+ # SIHANOUK of Cambodia
180
+ tr(
181
+ "ព្រះរាជពិធីបុណ្យចម្រើនព្រះជន្ម សម្តេចព្រះមហាក្សត្រី "
182
+ "ព្រះវររាជមាតា នរោត្តម មុនិនាថ​ សីហនុ"
183
+ ),
184
+ JUN,
185
+ 18,
186
+ )
187
+
188
+ # ទិវាប្រកាសរដ្ឋធម្មនុញ្ញ
189
+ # Status: In-Use.
190
+ # Starts in 1993
191
+
192
+ # Constitution Day
193
+ self._add_holiday(tr("ទិវាប្រកាសរដ្ឋធម្មនុញ្ញ"), SEP, 24)
194
+
195
+ # ទិវាប្រារព្ឋពិធីគោរពព្រះវិញ្ញាណក្ខន្ឋ ព្រះករុណា ព្រះបាទសម្តេចព្រះ
196
+ # នរោត្តម សីហនុ ព្រះមហាវីរក្សត្រ ព្រះវររាជបិតាឯករាជ្យ បូរណភាពទឹកដី
197
+ # និងឯកភាពជាតិខ្មែរ ព្រះបរមរតនកោដ្ឋ
198
+ # Status: In-Use.
199
+ # Starts in 2012.
200
+
201
+ if year >= 2012:
202
+ self._add_holiday(
203
+ # Mourning Day of the Late King-Father
204
+ # NORODOM SIHANOUK of Cambodia
205
+ tr(
206
+ "ទិវាប្រារព្ឋពិធីគោរពព្រះវិញ្ញាណក្ខន្ឋ ព្រះករុណា "
207
+ "ព្រះបាទសម្តេចព្រះ នរោត្តម សីហនុ ព្រះមហាវីរក្សត្រ "
208
+ "ព្រះវររាជបិតាឯករាជ្យ បូរណភាពទឹកដី និងឯកភាពជាតិខ្មែរ "
209
+ "ព្រះបរមរតនកោដ្ឋ"
210
+ ),
211
+ OCT,
212
+ 15,
213
+ )
214
+
215
+ # ទិវារំលឹកសន្ធិសញ្ញាសន្តិភាពទីក្រុងប៉ារីស
216
+ # Status: Defunct.
217
+ # Assumed to start in 1993, defunct from 2020 onwards.
218
+
219
+ if year <= 2019:
220
+ self._add_holiday(
221
+ # Paris Peace Agreement's Day
222
+ tr("ទិវារំលឹកសន្ធិសញ្ញាសន្តិភាពទីក្រុងប៉ារីស"),
223
+ OCT,
224
+ 23,
225
+ )
226
+
227
+ # ព្រះរាជពិធីគ្រងព្រះបរមរាជសម្បត្តិ របស់ ព្រះករុណា
228
+ # ព្រះបាទសម្តេចព្រះបរមនាថ នរោត្តម សីហមុនី
229
+ # ព្រះមហាក្សត្រនៃព្រះរាជាណាចក្រកម្ពុជា
230
+ # Status: In-Use.
231
+ # Starts in 2004.
232
+
233
+ if year >= 2004:
234
+ self._add_holiday(
235
+ # Coronation Day of His Majesty Preah Bat Samdech Preah
236
+ # Boromneath NORODOM SIHAMONI, King of Cambodia
237
+ tr(
238
+ "ព្រះរាជពិធីគ្រងព្រះបរមរាជសម្បត្តិ របស់ ព្រះករុណា "
239
+ "ព្រះបាទសម្តេចព្រះបរមនាថ នរោត្តម សីហមុនី "
240
+ "ព្រះមហាក្សត្រនៃព្រះរាជាណាចក្រកម្ពុជា"
241
+ ),
242
+ OCT,
243
+ 29,
244
+ )
245
+
246
+ # ពិធីបុណ្យឯករាជ្យជាតិ
247
+ # Status: In-Use.
248
+ # Starts in 1953
249
+
250
+ # National Independence Day
251
+ self._add_holiday(tr("ពិធីបុណ្យឯករាជ្យជាតិ"), NOV, 9)
252
+
253
+ # ទិវាសិទ្ធិមនុស្សអន្តរជាតិ
254
+ # Status: Defunct.
255
+ # Assumed to start in 1993, defunct from 2020 onwards.
256
+
257
+ if year <= 2019:
258
+ # International Human Rights Day
259
+ self._add_holiday(tr("ទិវាសិទ្ធិមនុស្សអន្តរជាតិ"), DEC, 10)
260
+
261
+ # Cambodian Lunar Calendar Holidays
262
+ # See `_ThaiLunisolar` in holidays/utils.py for more details.
263
+ # Cambodian Lunar Calendar Holidays only work from 1941 to 2057.
264
+
265
+ # ពិធីបុណ្យមាឃបូជា
266
+ # Status: Defunct.
267
+ # 15th Waxing Day of Month 3.
268
+ # Defunct from 2020 onwards.
269
+
270
+ if year <= 2019:
271
+ # Meak Bochea Day
272
+ self._add_makha_bucha(tr("ពិធីបុណ្យមាឃបូជា"))
273
+
274
+ # ពិធីបុណ្យវិសាខបូជា
275
+ # Status: In-Use.
276
+ # 15th Waxing Day of Month 6.
277
+ # This utilizes Thai calendar as a base, though are calculated to
278
+ # always happen in the Traditional Visakhamas month (May).
279
+
280
+ # Visaka Bochea Day
281
+ self._add_visakha_bucha(tr("ពិធីបុណ្យវិសាខបូជា"))
282
+
283
+ # ព្រះរាជពិធីច្រត់ព្រះនង្គ័ល
284
+ # Status: In-Use.
285
+ # 4th Waning Day of Month 6.
286
+ # Unlike Thai ones, Cambodian Royal Ploughing Ceremony is always fixed.
287
+
288
+ # Royal Ploughing Ceremony
289
+ self._add_preah_neangkoal(tr("ព្រះរាជពិធីច្រត់ព្រះនង្គ័ល"))
290
+
291
+ # ពិធីបុណ្យភ្ផុំបិណ្ឌ
292
+ # Status: In-Use.
293
+ # 14th Waning Day of Month 10 - 1st Waxing Day of Month 11.
294
+ # The 3rd day is added as a public holiday from 2017 onwards.
295
+
296
+ # Pchum Ben Day
297
+ pchum_ben = tr("ពិធីបុណ្យភ្ផុំបិណ្ឌ")
298
+ pchum_ben_date = self._add_pchum_ben(pchum_ben)
299
+ if pchum_ben_date:
300
+ self._add_holiday(pchum_ben, pchum_ben_date + td(days=-1))
301
+ if year >= 2017:
302
+ self._add_holiday(pchum_ben, pchum_ben_date + td(days=+1))
303
+
304
+ # ព្រះរាជពិធីបុណ្យអុំទូក បណ្តែតប្រទីប និងសំពះព្រះខែអកអំបុក
305
+ # Status: In-Use.
306
+ # 14th Waxing Day of Month 12 - 1st Waning Day of Month 12.
307
+
308
+ bon_om_touk = tr(
309
+ # Water Festival
310
+ "ព្រះរាជពិធីបុណ្យអុំទូក បណ្តែតប្រទីប និងសំពះព្រះខែអកអំបុក"
311
+ )
312
+ bon_om_touk_date = self._add_loy_krathong(bon_om_touk)
313
+ if bon_om_touk_date:
314
+ self._add_holiday(bon_om_touk, bon_om_touk_date + td(days=-1))
315
+ self._add_holiday(bon_om_touk, bon_om_touk_date + td(days=+1))
316
+
317
+
318
+ class KH(Cambodia):
319
+ pass
320
+
321
+
322
+ class KHM(Cambodia):
323
+ pass
@@ -0,0 +1,183 @@
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 timedelta as td
13
+
14
+ from holidays.calendars import _CustomIslamicCalendar
15
+ from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
16
+ from holidays.holiday_base import HolidayBase
17
+ from holidays.holiday_groups import ChristianHolidays, InternationalHolidays, IslamicHolidays
18
+
19
+
20
+ class Cameroon(HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHolidays):
21
+ """
22
+ References:
23
+ - https://en.wikipedia.org/wiki/Public_holidays_in_Cameroon
24
+ - https://www.timeanddate.com/holidays/cameroon
25
+ - https://www.officeholidays.com/countries/cameroon
26
+ """
27
+
28
+ country = "CM"
29
+ special_holidays = {
30
+ 2021: (
31
+ (MAY, 14, "Public Holiday"),
32
+ (JUL, 19, "Public Holiday"),
33
+ ),
34
+ }
35
+
36
+ def __init__(self, *args, **kwargs) -> None:
37
+ ChristianHolidays.__init__(self)
38
+ InternationalHolidays.__init__(self)
39
+ IslamicHolidays.__init__(self, calendar=CameroonIslamicCalendar())
40
+ super().__init__(*args, **kwargs)
41
+
42
+ def _populate(self, year):
43
+ # On 1 January 1960, French Cameroun gained independence from France.
44
+ if year <= 1959:
45
+ return None
46
+
47
+ super()._populate(year)
48
+ observed_dates = set()
49
+
50
+ # New Year's Day.
51
+ observed_dates.add(self._add_new_years_day("New Year's Day"))
52
+
53
+ # Youth Day.
54
+ if year >= 1966:
55
+ observed_dates.add(self._add_holiday("Youth Day", FEB, 11))
56
+
57
+ # Good Friday.
58
+ self._add_good_friday("Good Friday")
59
+
60
+ # Labour Day.
61
+ observed_dates.add(self._add_labor_day("Labour Day"))
62
+
63
+ # National Day.
64
+ if year >= 1972:
65
+ observed_dates.add(self._add_holiday("National Day", MAY, 20))
66
+
67
+ # Ascension Day.
68
+ self._add_ascension_thursday("Ascension Day")
69
+
70
+ # Assumption Day.
71
+ observed_dates.add(self._add_assumption_of_mary_day("Assumption Day"))
72
+
73
+ # Christmas Day.
74
+ observed_dates.add(self._add_christmas_day("Christmas Day"))
75
+
76
+ # Eid al-Fitr.
77
+ observed_dates.update(self._add_eid_al_fitr_day("Eid al-Fitr"))
78
+
79
+ # Eid al-Adha.
80
+ observed_dates.update(self._add_eid_al_adha_day("Eid al-Adha"))
81
+
82
+ # Mawlid.
83
+ observed_dates.update(self._add_mawlid_day("Mawlid"))
84
+
85
+ if self.observed:
86
+ for dt in sorted(observed_dates):
87
+ if not self._is_sunday(dt):
88
+ continue
89
+ obs_date = dt + td(days=+1)
90
+ while obs_date in observed_dates:
91
+ obs_date += td(days=+1)
92
+ for hol_name in self.get_list(dt):
93
+ observed_dates.add(self._add_holiday("%s (Observed)" % hol_name, obs_date))
94
+
95
+ # observed holidays special cases
96
+ if year == 2007:
97
+ self._add_holiday("Eid al-Adha (Observed)", JAN, 2)
98
+
99
+
100
+ class CM(Cameroon):
101
+ pass
102
+
103
+
104
+ class CMR(Cameroon):
105
+ pass
106
+
107
+
108
+ class CameroonIslamicCalendar(_CustomIslamicCalendar):
109
+ EID_AL_ADHA_DATES = {
110
+ 2001: (MAR, 6),
111
+ 2002: (FEB, 23),
112
+ 2003: (FEB, 12),
113
+ 2004: (FEB, 2),
114
+ 2005: (JAN, 21),
115
+ 2006: ((JAN, 10), (DEC, 31)),
116
+ 2007: (DEC, 20),
117
+ 2008: (DEC, 9),
118
+ 2009: (NOV, 28),
119
+ 2010: (NOV, 17),
120
+ 2011: (NOV, 7),
121
+ 2012: (OCT, 26),
122
+ 2013: (OCT, 15),
123
+ 2014: (OCT, 5),
124
+ 2015: (SEP, 24),
125
+ 2016: (SEP, 13),
126
+ 2017: (SEP, 2),
127
+ 2018: (AUG, 21),
128
+ 2019: (AUG, 11),
129
+ 2020: (JUL, 31),
130
+ 2021: (JUL, 20),
131
+ 2022: (JUL, 9),
132
+ }
133
+
134
+ EID_AL_FITR_DATES = {
135
+ 2001: (DEC, 17),
136
+ 2002: (DEC, 6),
137
+ 2003: (NOV, 26),
138
+ 2004: (NOV, 14),
139
+ 2005: (NOV, 4),
140
+ 2006: (OCT, 24),
141
+ 2007: (OCT, 13),
142
+ 2008: (OCT, 2),
143
+ 2009: (SEP, 21),
144
+ 2010: (SEP, 10),
145
+ 2011: (AUG, 31),
146
+ 2012: (AUG, 19),
147
+ 2013: (AUG, 8),
148
+ 2014: (JUL, 28),
149
+ 2015: (JUL, 18),
150
+ 2016: (JUL, 7),
151
+ 2017: (JUN, 26),
152
+ 2018: (JUN, 15),
153
+ 2019: (JUN, 4),
154
+ 2020: (MAY, 24),
155
+ 2021: (MAY, 13),
156
+ 2022: (MAY, 2),
157
+ 2023: (APR, 21),
158
+ }
159
+
160
+ MAWLID_DATES = {
161
+ 2001: (JUN, 4),
162
+ 2002: (MAY, 24),
163
+ 2003: (MAY, 14),
164
+ 2004: (MAY, 2),
165
+ 2005: (APR, 21),
166
+ 2006: (APR, 11),
167
+ 2007: (MAR, 31),
168
+ 2008: (MAR, 20),
169
+ 2009: (MAR, 9),
170
+ 2010: (FEB, 26),
171
+ 2011: (FEB, 16),
172
+ 2012: (FEB, 5),
173
+ 2013: (JAN, 24),
174
+ 2014: (JAN, 14),
175
+ 2015: ((JAN, 3), (DEC, 24)),
176
+ 2016: (DEC, 12),
177
+ 2017: (DEC, 1),
178
+ 2018: (NOV, 21),
179
+ 2019: (NOV, 10),
180
+ 2020: (OCT, 29),
181
+ 2021: (OCT, 19),
182
+ 2022: (OCT, 8),
183
+ }