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
@@ -12,14 +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, MAY, JUL, SEP, DEC, MON
16
+ from holidays.constants import JUL, SEP, MON
19
17
  from holidays.holiday_base import HolidayBase
18
+ from holidays.holiday_groups import ChristianHolidays, InternationalHolidays
20
19
 
21
20
 
22
- class Botswana(HolidayBase):
21
+ class Botswana(HolidayBase, ChristianHolidays, InternationalHolidays):
23
22
  """
24
23
  https://www.gov.bw/public-holidays
25
24
  https://publicholidays.africa/botswana/2021-dates/
@@ -28,60 +27,54 @@ class Botswana(HolidayBase):
28
27
  """
29
28
 
30
29
  country = "BW"
31
- special_holidays = {2019: ((JUL, 2, "Public Holiday"),)}
32
-
33
- def _populate(self, year: int):
34
- def _add_with_observed(
35
- hol_date: date, hol_name1: str, hol_name2: str = None
36
- ) -> None:
37
- self[hol_date] = hol_name1
38
- if hol_name2:
39
- self[hol_date + td(days=+1)] = hol_name2
40
-
41
- if self.observed and year >= 1995:
42
- if self._is_saturday(hol_date) and hol_name2:
43
- self[hol_date + td(days=+2)] = f"{hol_name2} (Observed)"
44
- elif self._is_sunday(hol_date):
45
- self[
46
- hol_date + td(days=+2 if hol_name2 else +1)
47
- ] = f"{hol_name1} (Observed)"
30
+ special_holidays = {2019: (JUL, 2, "Public Holiday")}
31
+
32
+ def __init__(self, *args, **kwargs) -> None:
33
+ ChristianHolidays.__init__(self)
34
+ InternationalHolidays.__init__(self)
35
+ super().__init__(*args, **kwargs)
48
36
 
37
+ def _add_observed(self, dt: date, days: int = +1) -> None:
38
+ if self.observed and self._is_sunday(dt) and self._year >= 1995:
39
+ self._add_holiday("%s (Observed)" % self[dt], dt + td(days=days))
40
+
41
+ def _populate(self, year):
49
42
  if year <= 1965:
50
43
  return None
51
44
 
52
45
  super()._populate(year)
53
46
 
54
- _add_with_observed(
55
- date(year, JAN, 1), "New Year's Day", "New Year's Day Holiday"
56
- )
47
+ self._add_observed(self._add_new_years_day("New Year's Day"), days=+2)
48
+ self._add_observed(self._add_new_years_day_two("New Year's Day Holiday"))
57
49
 
58
50
  # Easter and easter related calculations
59
- easter_date = easter(year)
60
- self[easter_date + td(days=-2)] = "Good Friday"
61
- self[easter_date + td(days=-1)] = "Holy Saturday"
62
- self[easter_date + td(days=+1)] = "Easter Monday"
63
- self[easter_date + td(days=+39)] = "Ascension Day"
51
+ self._add_good_friday("Good Friday")
52
+ self._add_holy_saturday("Holy Saturday")
53
+ self._add_easter_monday("Easter Monday")
54
+ self._add_ascension_thursday("Ascension Day")
64
55
 
65
- _add_with_observed(date(year, MAY, 1), "Labour Day")
66
- if self.observed and year >= 2016 and self._is_saturday(MAY, 1):
67
- self[date(year, MAY, 1) + td(days=+2)] = "Labour Day Holiday"
56
+ may_1 = self._add_labor_day("Labour Day")
57
+ self._add_observed(may_1)
58
+ if self.observed and year >= 2016 and self._is_saturday(may_1):
59
+ self._add_holiday("Labour Day Holiday", may_1 + td(days=+2))
68
60
 
69
- _add_with_observed(date(year, JUL, 1), "Sir Seretse Khama Day")
61
+ self._add_observed(self._add_holiday("Sir Seretse Khama Day", JUL, 1))
70
62
 
71
- # 3rd Monday of July = "President's Day"
72
- dt = _get_nth_weekday_of_month(3, MON, JUL, year)
73
-
74
- self[dt] = "President's Day"
75
- self[dt + td(days=+1)] = "President's Day Holiday"
76
-
77
- _add_with_observed(
78
- date(year, SEP, 30), "Botswana Day", "Botswana Day Holiday"
63
+ july_3rd_monday = self._add_holiday(
64
+ "President's Day", _get_nth_weekday_of_month(3, MON, JUL, year)
79
65
  )
66
+ self._add_holiday("President's Day Holiday", july_3rd_monday + td(days=+1))
67
+
68
+ sep_30 = self._add_holiday("Botswana Day", SEP, 30)
69
+ self._add_observed(sep_30, days=+2)
70
+ self._add_observed(self._add_holiday("Botswana Day Holiday", sep_30 + td(days=+1)))
80
71
 
81
- _add_with_observed(date(year, DEC, 25), "Christmas Day", "Boxing Day")
72
+ self._add_observed(self._add_christmas_day("Christmas Day"), days=+2)
73
+ dec_26 = self._add_christmas_day_two("Boxing Day")
74
+ self._add_observed(dec_26)
82
75
 
83
- if self.observed and year >= 2016 and self._is_saturday(DEC, 26):
84
- self[date(year, DEC, 26) + td(days=+2)] = "Boxing Day Holiday"
76
+ if self.observed and year >= 2016 and self._is_saturday(dec_26):
77
+ self._add_holiday("Boxing Day Holiday", dec_26 + td(days=+2))
85
78
 
86
79
 
87
80
  class BW(Botswana):
@@ -13,8 +13,7 @@ from datetime import timedelta as td
13
13
  from datetime import date
14
14
 
15
15
  from holidays.calendars import _get_nth_weekday_from, _get_nth_weekday_of_month
16
- from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP
17
- from holidays.constants import OCT, NOV, DEC, FRI, SUN
16
+ from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC, FRI, SUN
18
17
  from holidays.holiday_base import HolidayBase
19
18
  from holidays.holiday_groups import ChristianHolidays, InternationalHolidays
20
19
 
@@ -150,9 +149,7 @@ class Brazil(HolidayBase, ChristianHolidays, InternationalHolidays):
150
149
  def get_movable_acre(*args) -> date:
151
150
  dt = date(self._year, *args)
152
151
  if self._year >= 2009 and (
153
- self._is_tuesday(dt)
154
- or self._is_wednesday(dt)
155
- or self._is_thursday(dt)
152
+ self._is_tuesday(dt) or self._is_wednesday(dt) or self._is_thursday(dt)
156
153
  ):
157
154
  dt = _get_nth_weekday_from(1, FRI, dt)
158
155
  return dt
@@ -215,7 +212,7 @@ class Brazil(HolidayBase, ChristianHolidays, InternationalHolidays):
215
212
 
216
213
  if self._year >= 2012:
217
214
  # Saint James' Day.
218
- self._add_holiday("São Tiago", JUL, 25)
215
+ self._add_saint_james_day("São Tiago")
219
216
 
220
217
  # Creation of the Federal Territory.
221
218
  self._add_holiday("Criação do Território Federal", SEP, 13)
@@ -309,7 +306,7 @@ class Brazil(HolidayBase, ChristianHolidays, InternationalHolidays):
309
306
  def _add_subdiv_rj_holidays(self):
310
307
  if self._year >= 2008:
311
308
  # Saint George's Day.
312
- self._add_holiday("São Jorge", APR, 23)
309
+ self._add_saint_georges_day("São Jorge")
313
310
 
314
311
  if self._year >= 2002:
315
312
  self._add_holiday("Consciência Negra", NOV, 20)
@@ -0,0 +1,427 @@
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
+ from gettext import gettext as tr
15
+
16
+ from holidays.calendars import _CustomIslamicCalendar
17
+ from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
18
+ from holidays.holiday_base import HolidayBase
19
+ from holidays.holiday_groups import (
20
+ ChineseCalendarHolidays,
21
+ ChristianHolidays,
22
+ InternationalHolidays,
23
+ IslamicHolidays,
24
+ )
25
+
26
+
27
+ class Brunei(
28
+ HolidayBase,
29
+ ChineseCalendarHolidays,
30
+ ChristianHolidays,
31
+ InternationalHolidays,
32
+ IslamicHolidays,
33
+ ):
34
+ """
35
+ A subclass of :py:class:`HolidayBase` representing public holidays
36
+ in Brunei Darussalam.
37
+
38
+
39
+ References:
40
+
41
+ - Based on: http://www.labour.gov.bn/Lists/Upcomming%20events/AllItems.aspx
42
+ http://www.labour.gov.bn/Download/GUIDE%20TO%20BRUNEI%20EMPLOYMENT%20LAWS%20-%20english%20version-3.pdf # noqa: E501
43
+ - Checked with: https://asean.org/wp-content/uploads/2021/12/ASEAN-National-Holidays-2022.pdf # noqa: E501
44
+ https://asean.org/wp-content/uploads/2022/12/ASEAN-Public-Holidays-2023.pdf # noqa: E501
45
+ https://www.timeanddate.com/holidays/brunei/
46
+ - [Jubli Emas Sultan Hassanal Bolkiah]
47
+ https://www.brudirect.com/news.php?id=28316
48
+
49
+ Limitations:
50
+
51
+ - Brunei Darussalam holidays only works from 1984 onwards
52
+ - Islamic holidays
53
+
54
+
55
+ Country created by: `PPsyrius <https://github.com/PPsyrius>`__
56
+
57
+ Country maintained by: `PPsyrius <https://github.com/PPsyrius>`__
58
+ """
59
+
60
+ country = "BN"
61
+ default_language = "ms"
62
+ estimated_label = tr("%s* (*anggaran)")
63
+ supported_languages = ("en_US", "ms", "th")
64
+
65
+ special_holidays = {
66
+ # Sultan Hassanal Bolkiah's Golden Jubilee celebration
67
+ 2017: (OCT, 5, tr("Jubli Emas Sultan Hassanal Bolkiah")),
68
+ }
69
+
70
+ def __init__(self, *args, **kwargs):
71
+ ChineseCalendarHolidays.__init__(self)
72
+ ChristianHolidays.__init__(self)
73
+ InternationalHolidays.__init__(self)
74
+ IslamicHolidays.__init__(self, calendar=BruneiIslamicCalendar())
75
+
76
+ super().__init__(*args, **kwargs)
77
+
78
+ def _populate(self, year):
79
+ # Available post-Independence from 1984 afterwards
80
+ if year <= 1983:
81
+ return None
82
+
83
+ def _add_observed(dt: date) -> None:
84
+ """
85
+ If Public Holiday falls on either Friday or Sunday, in-lieu
86
+ observance is given out on the following Saturday or Monday.
87
+ """
88
+ if self.observed and (self._is_friday(dt) or self._is_sunday(dt)):
89
+ for name in self.get_list(dt):
90
+ self._add_holiday(self.tr("%s - Diperhatikan") % name, dt + td(days=+1))
91
+
92
+ super()._populate(year)
93
+
94
+ # Awal Tahun Masihi
95
+ # Status: In-Use.
96
+
97
+ # New Year's Day
98
+ _add_observed(self._add_new_years_day(tr("Awal Tahun Masihi")))
99
+
100
+ # Tahun Baru Cina
101
+ # Status: In-Use.
102
+
103
+ # Lunar New Year
104
+ _add_observed(self._add_chinese_new_years_day(tr("Tahun Baru Cina")))
105
+
106
+ # Hari Kebangsaan
107
+ # Status: In-Use.
108
+ # Starts in 1984.
109
+
110
+ # National Day
111
+ _add_observed(self._add_holiday(tr("Hari Kebangsaan"), FEB, 23))
112
+
113
+ # Hari Angkatan Bersenjata Diraja Brunei
114
+ # Status: In-Use.
115
+ # Starts in 1984.
116
+ # Commemorates the formation of Royal Brunei Malay Regiment in 1961.
117
+
118
+ _add_observed(
119
+ self._add_holiday(
120
+ # Armed Forces Day
121
+ tr("Hari Angkatan Bersenjata Diraja Brunei"),
122
+ MAY,
123
+ 31,
124
+ )
125
+ )
126
+
127
+ # Hari Keputeraan KDYMM Sultan Brunei
128
+ # Status: In-Use.
129
+ # Started in 1968.
130
+
131
+ _add_observed(
132
+ self._add_holiday(
133
+ # Sultan Hassanal Bolkiah's Birthday
134
+ tr("Hari Keputeraan KDYMM Sultan Brunei"),
135
+ JUL,
136
+ 15,
137
+ )
138
+ )
139
+
140
+ # Hari Natal
141
+ # Status: In-Use.
142
+
143
+ # Christmas Day
144
+ _add_observed(self._add_christmas_day(tr("Hari Natal")))
145
+
146
+ # Islamic Holidays are placed after Gregorian holidays to prevent
147
+ # the duplication of observed tags. - see #1168
148
+
149
+ # Israk dan Mikraj
150
+ # Status: In-Use.
151
+
152
+ # Isra Mi'raj
153
+ for dt in self._add_isra_and_miraj_day(tr("Israk dan Mikraj")):
154
+ _add_observed(dt)
155
+
156
+ # Hari Pertama Berpuasa
157
+ # Status: In-Use.
158
+
159
+ # First Day of Ramadan
160
+ for dt in self._add_ramadan_beginning_day(tr("Hari Pertama Berpuasa")):
161
+ _add_observed(dt)
162
+
163
+ # Hari Nuzul Al-Quran
164
+ # Status: In-Use.
165
+
166
+ # Anniversary of the revelation of the Quran
167
+ for dt in self._add_nuzul_al_quran_day(tr("Hari Nuzul Al-Quran")):
168
+ _add_observed(dt)
169
+
170
+ # Hari Raya Aidil Fitri
171
+ # Status: In-Use.
172
+ # This is celebrate for three days in Brunei.
173
+ # Observed as 'Hari Raya Puasa' and only for 2 days at certain point.
174
+ # We utilizes a separate in-lieu trigger for this one.
175
+ # 1: If Wed-Thu-Fri -> Sat (+3)
176
+ # 2: If Thu-Fri-Sat -> Mon (+4)
177
+ # 3: If Fri-Sat-Sun -> Mon (+3)
178
+ # 4: If Sat-Sun-Mon -> Tue (+3)
179
+ # 5: If Sun-Mon-Tue -> Wed (+3)
180
+
181
+ # Eid al-Fitr
182
+ name = tr("Hari Raya Aidil Fitri")
183
+
184
+ al_fitr_dates = self._add_eid_al_fitr_day(name)
185
+ self._add_eid_al_fitr_day_two(name)
186
+ self._add_eid_al_fitr_day_three(name)
187
+
188
+ if self.observed:
189
+ for dt in al_fitr_dates:
190
+ obs_date = None
191
+ for delta in range(3):
192
+ hol_date = dt + td(days=delta)
193
+ if self._is_friday(hol_date) or self._is_sunday(hol_date):
194
+ obs_date = dt + td(days=+3)
195
+ if self._is_sunday(obs_date):
196
+ obs_date += td(days=+1)
197
+ break
198
+ if obs_date:
199
+ self._add_islamic_calendar_holiday(
200
+ self.tr("%s - Diperhatikan") % self[hol_date],
201
+ (
202
+ (
203
+ obs_date,
204
+ self._year not in BruneiIslamicCalendar.EID_AL_FITR_DATES,
205
+ ),
206
+ ),
207
+ )
208
+
209
+ # Hari Raya Aidil Adha
210
+ # Status: In-Use.
211
+
212
+ # Eid al-Adha
213
+ for dt in self._add_eid_al_adha_day(tr("Hari Raya Aidil Adha")):
214
+ _add_observed(dt)
215
+
216
+ # Awal Tahun Hijrah
217
+ # Status: In-Use.
218
+
219
+ # Islamic New Year
220
+ for dt in self._add_islamic_new_year_day(tr("Awal Tahun Hijrah")):
221
+ _add_observed(dt)
222
+
223
+ # Maulidur Rasul
224
+ # Status: In-Use.
225
+
226
+ # Birth of the Prophet
227
+ for dt in self._add_mawlid_day(tr("Maulidur Rasul")):
228
+ _add_observed(dt)
229
+
230
+
231
+ class BN(Brunei):
232
+ pass
233
+
234
+
235
+ class BRN(Brunei):
236
+ pass
237
+
238
+
239
+ class BruneiIslamicCalendar(_CustomIslamicCalendar):
240
+ EID_AL_ADHA_DATES = {
241
+ 2000: (MAR, 16),
242
+ 2001: (MAR, 6),
243
+ 2002: (FEB, 23),
244
+ 2003: (FEB, 12),
245
+ 2004: (FEB, 2),
246
+ 2005: (JAN, 21),
247
+ 2006: ((JAN, 10), (DEC, 31)),
248
+ 2007: (DEC, 20),
249
+ 2008: (DEC, 9),
250
+ 2009: (NOV, 28),
251
+ 2010: (NOV, 17),
252
+ 2011: (NOV, 7),
253
+ 2012: (OCT, 26),
254
+ 2013: (OCT, 15),
255
+ 2014: (OCT, 5),
256
+ 2015: (SEP, 24),
257
+ 2016: (SEP, 13),
258
+ 2017: (SEP, 2),
259
+ 2018: (AUG, 22),
260
+ 2019: (AUG, 11),
261
+ 2020: (AUG, 1),
262
+ 2021: (JUL, 20),
263
+ 2022: (JUL, 10),
264
+ 2023: (JUN, 29),
265
+ }
266
+
267
+ EID_AL_FITR_DATES = {
268
+ 2000: ((JAN, 8), (DEC, 28)),
269
+ 2001: (DEC, 17),
270
+ 2002: (DEC, 6),
271
+ 2003: (NOV, 26),
272
+ 2004: (NOV, 14),
273
+ 2005: (NOV, 3),
274
+ 2006: (OCT, 24),
275
+ 2007: (OCT, 13),
276
+ 2008: (OCT, 1),
277
+ 2009: (SEP, 20),
278
+ 2010: (SEP, 10),
279
+ 2011: (AUG, 31),
280
+ 2012: (AUG, 19),
281
+ 2013: (AUG, 8),
282
+ 2014: (JUL, 29),
283
+ 2015: (JUL, 18),
284
+ 2016: (JUL, 7),
285
+ 2017: (JUN, 26),
286
+ 2018: (JUN, 15),
287
+ 2019: (JUN, 5),
288
+ 2020: (MAY, 24),
289
+ 2021: (MAY, 13),
290
+ 2022: (MAY, 3),
291
+ 2023: (APR, 22),
292
+ }
293
+
294
+ HIJRI_NEW_YEAR_DATES = {
295
+ 2000: (APR, 6),
296
+ 2001: (MAR, 26),
297
+ 2002: (MAR, 15),
298
+ 2003: (MAR, 5),
299
+ 2004: (FEB, 22),
300
+ 2005: (FEB, 10),
301
+ 2006: (JAN, 31),
302
+ 2007: (JAN, 20),
303
+ 2008: ((JAN, 10), (DEC, 29)),
304
+ 2009: (DEC, 18),
305
+ 2010: (DEC, 8),
306
+ 2011: (NOV, 27),
307
+ 2012: (NOV, 15),
308
+ 2013: (NOV, 5),
309
+ 2014: (OCT, 25),
310
+ 2015: (OCT, 15),
311
+ 2016: (OCT, 3),
312
+ 2017: (SEP, 22),
313
+ 2018: (SEP, 12),
314
+ 2019: (SEP, 1),
315
+ 2020: (AUG, 20),
316
+ 2021: (AUG, 10),
317
+ 2022: (JUL, 30),
318
+ 2023: (JUL, 19),
319
+ }
320
+
321
+ ISRA_AND_MIRAJ_DATES = {
322
+ 2000: (OCT, 26),
323
+ 2001: (OCT, 15),
324
+ 2002: (OCT, 4),
325
+ 2003: (SEP, 24),
326
+ 2004: (SEP, 12),
327
+ 2005: (SEP, 1),
328
+ 2006: (AUG, 22),
329
+ 2007: (AUG, 11),
330
+ 2008: (JUL, 31),
331
+ 2009: (JUL, 20),
332
+ 2010: (JUL, 9),
333
+ 2011: (JUN, 29),
334
+ 2012: (JUN, 17),
335
+ 2013: (JUN, 6),
336
+ 2014: (MAY, 27),
337
+ 2015: (MAY, 16),
338
+ 2016: (MAY, 5),
339
+ 2017: (APR, 24),
340
+ 2018: (APR, 14),
341
+ 2019: (APR, 3),
342
+ 2020: (MAR, 22),
343
+ 2021: (MAR, 11),
344
+ 2022: (MAR, 1),
345
+ 2023: (FEB, 18),
346
+ }
347
+
348
+ MAWLID_DATES = {
349
+ 2000: (JUN, 15),
350
+ 2001: (JUN, 4),
351
+ 2002: (MAY, 24),
352
+ 2003: (MAY, 14),
353
+ 2004: (MAY, 2),
354
+ 2005: (APR, 21),
355
+ 2006: (APR, 11),
356
+ 2007: (MAR, 31),
357
+ 2008: (MAR, 20),
358
+ 2009: (MAR, 9),
359
+ 2010: (FEB, 26),
360
+ 2011: (FEB, 16),
361
+ 2012: (FEB, 5),
362
+ 2013: (JAN, 24),
363
+ 2014: (JAN, 14),
364
+ 2015: ((JAN, 3), (DEC, 24)),
365
+ 2016: (DEC, 12),
366
+ 2017: (DEC, 1),
367
+ 2018: (NOV, 21),
368
+ 2019: (NOV, 9),
369
+ 2020: (OCT, 29),
370
+ 2021: (OCT, 19),
371
+ 2022: (OCT, 8),
372
+ 2023: (SEP, 28),
373
+ }
374
+
375
+ NUZUL_AL_QURAN_DATES = {
376
+ 2000: (DEC, 14),
377
+ 2001: (DEC, 3),
378
+ 2002: (NOV, 22),
379
+ 2003: (NOV, 12),
380
+ 2004: (NOV, 1),
381
+ 2005: (OCT, 21),
382
+ 2006: (OCT, 10),
383
+ 2007: (SEP, 29),
384
+ 2008: (SEP, 18),
385
+ 2009: (SEP, 7),
386
+ 2010: (AUG, 27),
387
+ 2011: (AUG, 17),
388
+ 2012: (AUG, 5),
389
+ 2013: (JUL, 25),
390
+ 2014: (JUL, 15),
391
+ 2015: (JUL, 4),
392
+ 2016: (JUN, 23),
393
+ 2017: (JUN, 12),
394
+ 2018: (JUN, 2),
395
+ 2019: (MAY, 23),
396
+ 2020: (MAY, 10),
397
+ 2021: (APR, 29),
398
+ 2022: (APR, 19),
399
+ 2023: (APR, 8),
400
+ }
401
+
402
+ RAMADAN_BEGINNING_DATES = {
403
+ 2000: (NOV, 28),
404
+ 2001: (NOV, 17),
405
+ 2002: (NOV, 6),
406
+ 2003: (OCT, 27),
407
+ 2004: (OCT, 16),
408
+ 2005: (OCT, 5),
409
+ 2006: (SEP, 24),
410
+ 2007: (SEP, 13),
411
+ 2008: (SEP, 2),
412
+ 2009: (AUG, 22),
413
+ 2010: (AUG, 11),
414
+ 2011: (AUG, 1),
415
+ 2012: (JUL, 20),
416
+ 2013: (JUL, 9),
417
+ 2014: (JUN, 29),
418
+ 2015: (JUN, 18),
419
+ 2016: (JUN, 7),
420
+ 2017: (MAY, 27),
421
+ 2018: (MAY, 16),
422
+ 2019: (MAY, 6),
423
+ 2020: (APR, 25),
424
+ 2021: (APR, 13),
425
+ 2022: (APR, 3),
426
+ 2023: (MAR, 23),
427
+ }
@@ -41,6 +41,7 @@ class Bulgaria(HolidayBase):
41
41
 
42
42
  country = "BG"
43
43
  default_language = "bg"
44
+ supported_languages = ("bg", "en_US")
44
45
 
45
46
  def _populate(self, year):
46
47
  if year < 1990:
@@ -52,9 +53,7 @@ class Bulgaria(HolidayBase):
52
53
  self._add_holiday(tr("Нова година"), JAN, 1)
53
54
 
54
55
  # Liberation Day.
55
- self._add_holiday(
56
- tr("Ден на Освобождението на България от османско иго"), MAR, 3
57
- )
56
+ self._add_holiday(tr("Ден на Освобождението на България от османско иго"), MAR, 3)
58
57
 
59
58
  # International Workers' Day.
60
59
  self._add_holiday(
@@ -64,9 +63,7 @@ class Bulgaria(HolidayBase):
64
63
  )
65
64
 
66
65
  # Saint George's Day.
67
- self._add_holiday(
68
- tr("Гергьовден, Ден на храбростта и Българската армия"), MAY, 6
69
- )
66
+ self._add_holiday(tr("Гергьовден, Ден на храбростта и Българската армия"), MAY, 6)
70
67
 
71
68
  # Bulgarian Education and Culture and Slavonic Literature Day.
72
69
  self._add_holiday(