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
@@ -11,15 +11,24 @@
11
11
 
12
12
  from datetime import date
13
13
  from datetime import timedelta as td
14
+ from typing import Optional
14
15
 
15
- from dateutil.easter import easter
16
-
17
- from holidays.calendars import _ChineseLuniSolar, _get_nth_weekday_of_month
18
- from holidays.constants import JAN, APR, MAY, JUN, JUL, AUG, SEP, OCT, DEC, MON
16
+ from holidays.calendars import _get_nth_weekday_of_month
17
+ from holidays.constants import JUN, JUL, AUG, SEP, OCT, MON
19
18
  from holidays.holiday_base import HolidayBase
20
-
21
-
22
- class HongKong(HolidayBase):
19
+ from holidays.holiday_groups import (
20
+ ChineseCalendarHolidays,
21
+ ChristianHolidays,
22
+ InternationalHolidays,
23
+ )
24
+
25
+
26
+ class HongKong(
27
+ HolidayBase,
28
+ ChineseCalendarHolidays,
29
+ ChristianHolidays,
30
+ InternationalHolidays,
31
+ ):
23
32
  """
24
33
  https://en.wikipedia.org/wiki/Public_holidays_in_Hong_Kong
25
34
  Holidays for 2007–2023 (government source):
@@ -28,9 +37,13 @@ class HongKong(HolidayBase):
28
37
 
29
38
  country = "HK"
30
39
  special_holidays = {
31
- # Special holiday on 2015 - The 70th anniversary day of the victory
32
- # of the Chinese people's war of resistance against Japanese
33
- # aggression.
40
+ 1997: (
41
+ (
42
+ JUL,
43
+ 2,
44
+ "Hong Kong Special Administrative Region Establishment Day",
45
+ ),
46
+ ),
34
47
  2015: (
35
48
  (
36
49
  SEP,
@@ -41,9 +54,20 @@ class HongKong(HolidayBase):
41
54
  ),
42
55
  }
43
56
 
44
- def __init__(self, **kwargs):
45
- self.cnls = _ChineseLuniSolar()
46
- HolidayBase.__init__(self, **kwargs)
57
+ def __init__(self, *args, **kwargs):
58
+ ChineseCalendarHolidays.__init__(self)
59
+ ChristianHolidays.__init__(self)
60
+ InternationalHolidays.__init__(self)
61
+ super().__init__(*args, **kwargs)
62
+
63
+ def _add_holiday(self, *args) -> Optional[date]:
64
+ name, dt = self._parse_holiday(*args)
65
+ if self.observed and (self._is_sunday(dt) or dt in self):
66
+ while self._is_sunday(dt) or dt in self:
67
+ dt += td(days=+1)
68
+ name = self.tr("The day following %s") % self.tr(name)
69
+ self[dt] = self.tr(name)
70
+ return dt
47
71
 
48
72
  def _populate(self, year):
49
73
  # Current set of holidays actually valid since 1946
@@ -55,13 +79,7 @@ class HongKong(HolidayBase):
55
79
  day_following = "The day following "
56
80
 
57
81
  # The first day of January
58
- first_date = date(year, JAN, 1)
59
- if self.observed and self._is_sunday(first_date):
60
- self[first_date + td(days=+1)] = (
61
- day_following + "the first day of January"
62
- )
63
- else:
64
- self[first_date] = "The first day of January"
82
+ self._add_new_years_day("The first day of January")
65
83
 
66
84
  # Lunar New Year
67
85
  name = "Lunar New Year's Day"
@@ -69,97 +87,75 @@ class HongKong(HolidayBase):
69
87
  second_day_lunar = "The second day of Lunar New Year"
70
88
  third_day_lunar = "The third day of Lunar New Year"
71
89
  fourth_day_lunar = "The fourth day of Lunar New Year"
72
- new_year_date = self.cnls.lunar_n_y_date(year)
90
+ new_year_date = self._chinese_new_year
73
91
  if self.observed:
74
92
  if self._is_sunday(new_year_date):
75
93
  if year in {2006, 2007, 2010}:
76
- self[new_year_date + td(days=-1)] = preceding_day_lunar
94
+ self._add_chinese_new_years_eve(preceding_day_lunar)
77
95
  else:
78
- self[new_year_date + td(days=+3)] = fourth_day_lunar
96
+ self._add_chinese_new_years_day_four(fourth_day_lunar)
79
97
  else:
80
- self[new_year_date] = name
98
+ self._add_chinese_new_years_day(name)
81
99
  if self._is_saturday(new_year_date):
82
- self[new_year_date + td(days=+3)] = fourth_day_lunar
100
+ self._add_chinese_new_years_day_four(fourth_day_lunar)
83
101
  else:
84
- self[new_year_date + td(days=+1)] = second_day_lunar
102
+ self._add_chinese_new_years_day_two(second_day_lunar)
85
103
  if self._is_friday(new_year_date):
86
- self[new_year_date + td(days=+3)] = fourth_day_lunar
104
+ self._add_chinese_new_years_day_four(fourth_day_lunar)
87
105
  else:
88
- self[new_year_date + td(days=+2)] = third_day_lunar
106
+ self._add_chinese_new_years_day_three(third_day_lunar)
89
107
  else:
90
- self[new_year_date] = name
91
- self[new_year_date + td(days=+1)] = second_day_lunar
92
- self[new_year_date + td(days=+2)] = third_day_lunar
108
+ self._add_chinese_new_years_day(name)
109
+ self._add_chinese_new_years_day_two(second_day_lunar)
110
+ self._add_chinese_new_years_day_three(third_day_lunar)
93
111
 
94
- easter_date = easter(year)
95
- easter_monday_date = easter_date + td(days=+1)
112
+ easter_monday_date = self._easter_sunday + td(days=+1)
96
113
 
97
114
  # Ching Ming Festival
98
115
  name = "Ching Ming Festival"
99
- if self._is_leap_year(year) or (
100
- year > 2008 and self._is_leap_year(year - 1)
101
- ):
102
- ching_ming_date = date(year, APR, 4)
103
- else:
104
- ching_ming_date = date(year, APR, 5)
105
- if self.observed and (
106
- self._is_sunday(ching_ming_date)
107
- or ching_ming_date == easter_monday_date
108
- ):
109
- self[ching_ming_date + td(days=+1)] = day_following + name
110
- else:
111
- self[ching_ming_date] = name
116
+ ching_ming_date = self._qingming_date
117
+ if self.observed and ching_ming_date == easter_monday_date:
118
+ self._add_holiday(f"{day_following}{name}", ching_ming_date + td(days=+1))
119
+ elif ching_ming_date not in {
120
+ self._easter_sunday + td(days=-2),
121
+ self._easter_sunday + td(days=-1),
122
+ }:
123
+ self._add_holiday(name, ching_ming_date)
112
124
 
113
125
  # Easter Holiday
114
126
  good_friday = "Good Friday"
115
127
  easter_monday = "Easter Monday"
116
- self[easter_date + td(days=-2)] = good_friday
117
- self[easter_date + td(days=-1)] = day_following + good_friday
118
- if self.observed and self.get(easter_monday_date):
119
- self[easter_monday_date + td(days=+1)] = (
120
- day_following + easter_monday
121
- )
122
- else:
123
- self[easter_monday_date] = easter_monday
124
-
125
- # The Birthday of the Buddha
126
- if year >= 1998:
127
- name = "The Birthday of the Buddha"
128
- buddha_date = self.cnls.lunar_to_gre(year, 4, 8)
129
- if self.observed and self._is_sunday(buddha_date):
130
- self[buddha_date + td(days=+1)] = day_following + name
131
- else:
132
- self[buddha_date] = name
133
-
134
- # Labour Day
135
- if year >= 1998:
136
- name = "Labour Day"
137
- labour_date = date(year, MAY, 1)
138
- if self.observed and self._is_sunday(labour_date):
139
- self[labour_date + td(days=+1)] = day_following + name
140
- else:
141
- self[labour_date] = name
128
+ self._add_good_friday(good_friday)
129
+ self._add_holy_saturday(f"{day_following}{good_friday}")
130
+ self._add_easter_monday(easter_monday)
131
+
132
+ if ching_ming_date in {
133
+ self._easter_sunday + td(days=-2),
134
+ self._easter_sunday + td(days=-1),
135
+ }:
136
+ super()._add_holiday(name, ching_ming_date)
137
+
138
+ if year >= 1999:
139
+ # The Birthday of the Buddha
140
+ self._add_chinese_birthday_of_buddha("The Birthday of the Buddha")
141
+
142
+ # Labour Day
143
+ self._add_labor_day("Labour Day")
142
144
 
143
145
  # Tuen Ng Festival
144
- name = "Tuen Ng Festival"
145
- tuen_ng_date = self.cnls.lunar_to_gre(year, 5, 5)
146
- if self.observed and self._is_sunday(tuen_ng_date):
147
- self[tuen_ng_date + td(days=+1)] = day_following + name
148
- else:
149
- self[tuen_ng_date] = name
146
+ self._add_dragon_boat_festival("Tuen Ng Festival")
150
147
 
151
148
  # Hong Kong Special Administrative Region Establishment Day
152
149
  if year >= 1997:
153
- name = "Hong Kong Special Administrative Region Establishment Day"
154
- hksar_date = date(year, JUL, 1)
155
- if self.observed and self._is_sunday(hksar_date):
156
- self[hksar_date + td(days=+1)] = day_following + name
157
- else:
158
- self[hksar_date] = name
150
+ self._add_holiday(
151
+ "Hong Kong Special Administrative Region Establishment Day",
152
+ JUL,
153
+ 1,
154
+ )
159
155
 
160
156
  # Chinese Mid-Autumn Festival
161
157
  name = "Chinese Mid-Autumn Festival"
162
- mid_autumn_date = self.cnls.lunar_to_gre(year, 8, 15)
158
+ mid_autumn_date = self._mid_autumn_festival
163
159
  if self.observed:
164
160
  # if Chinese Mid-Autumn Festival lies on Saturday
165
161
  # before 1983 public holiday lies on Monday
@@ -167,72 +163,67 @@ class HongKong(HolidayBase):
167
163
  # since 2011 public holiday lies on Monday
168
164
  if self._is_saturday(mid_autumn_date):
169
165
  if 1983 <= year <= 2010:
170
- self[mid_autumn_date] = name
166
+ self._add_mid_autumn_festival(name)
171
167
  else:
172
- self[mid_autumn_date + td(days=+2)] = (
173
- "The second day of the " + name + " (Monday)"
168
+ self._add_holiday(
169
+ f"The second day of the {name} (Monday)",
170
+ mid_autumn_date + td(days=+2),
174
171
  )
175
172
  else:
176
- self[mid_autumn_date + td(days=+1)] = (
177
- day_following + "the " + name
178
- )
173
+ self._add_mid_autumn_festival_day_two(f"The day following the {name}")
179
174
  else:
180
- self[mid_autumn_date] = name
175
+ self._add_mid_autumn_festival_day_two(name)
176
+
177
+ # Chung Yeung Festival
178
+ self._add_double_ninth_festival("Chung Yeung Festival")
181
179
 
182
180
  # National Day
183
181
  if year >= 1997:
184
- name = "National Day"
185
- national_date = date(year, OCT, 1)
186
- if self.observed and (
187
- self._is_sunday(national_date) or self.get(national_date)
188
- ):
189
- self[national_date + td(days=+1)] = day_following + name
190
- else:
191
- self[national_date] = name
182
+ self._add_holiday("National Day", OCT, 1)
192
183
 
193
- # Chung Yeung Festival
194
- name = "Chung Yeung Festival"
195
- chung_yeung_date = self.cnls.lunar_to_gre(year, 9, 9)
196
- if self.observed and self._is_sunday(chung_yeung_date):
197
- self[chung_yeung_date + td(days=+1)] = day_following + name
198
- else:
199
- self[chung_yeung_date] = name
184
+ if year <= 1998:
185
+ self._add_holiday("National Day", OCT, 2)
200
186
 
201
187
  # Christmas Day
202
188
  name = "Christmas Day"
203
- first_after_christmas = "The first weekday after " + name
204
- second_after_christmas = "The second weekday after " + name
205
- christmas_date = date(year, DEC, 25)
189
+ first_after_christmas = f"The first weekday after {name}"
190
+ second_after_christmas = f"The second weekday after {name}"
191
+ christmas_date = self._christmas_day
206
192
  if self.observed:
207
193
  if self._is_sunday(christmas_date):
208
- self[christmas_date + td(days=+1)] = first_after_christmas
209
- self[christmas_date + td(days=+2)] = second_after_christmas
194
+ self._add_christmas_day_two(first_after_christmas)
195
+ self._add_christmas_day_three(second_after_christmas)
210
196
  elif self._is_saturday(christmas_date):
211
- self[christmas_date] = name
212
- self[christmas_date + td(days=+2)] = first_after_christmas
197
+ self._add_christmas_day(name)
198
+ self._add_christmas_day_three(first_after_christmas)
213
199
  else:
214
- self[christmas_date] = name
215
- self[christmas_date + td(days=+1)] = first_after_christmas
200
+ self._add_christmas_day(name)
201
+ self._add_christmas_day_two(first_after_christmas)
216
202
  else:
217
- self[christmas_date] = name
218
- self[christmas_date + td(days=+1)] = day_following + name
203
+ self._add_christmas_day(name)
204
+ self._add_christmas_day_two(first_after_christmas)
219
205
 
220
206
  # Previous holidays
221
207
  if 1952 <= year <= 1997:
222
208
  # Queen's Birthday (June 2nd Monday)
223
- self[
224
- _get_nth_weekday_of_month(2, MON, JUN, year)
225
- ] = "Queen's Birthday"
209
+ self._add_holiday(
210
+ "Queen's Birthday",
211
+ _get_nth_weekday_of_month(2, MON, JUN, year),
212
+ )
226
213
 
227
214
  if year <= 1996:
228
215
  # Anniversary of the liberation of Hong Kong (August last Monday)
229
- dt = _get_nth_weekday_of_month(-1, MON, AUG, year)
230
- self[dt] = "Anniversary of the liberation of Hong Kong"
216
+ self._add_holiday(
217
+ "Anniversary of the liberation of Hong Kong",
218
+ _get_nth_weekday_of_month(-1, MON, AUG, year),
219
+ )
231
220
 
221
+ if year <= 1998:
232
222
  # Anniversary of the victory in the Second Sino-Japanese War
233
- self[
234
- dt + td(days=-1)
235
- ] = "Anniversary of the victory in the Second Sino-Japanese War"
223
+ super()._add_holiday(
224
+ "Anniversary of the victory in the Second Sino-Japanese War",
225
+ _get_nth_weekday_of_month(-1, MON, AUG, year) + td(days=-1),
226
+ )
236
227
 
237
228
 
238
229
  class HK(HongKong):
@@ -11,14 +11,14 @@
11
11
 
12
12
  from datetime import date
13
13
  from datetime import timedelta as td
14
+ from gettext import gettext as tr
14
15
 
15
- from dateutil.easter import easter
16
-
17
- from holidays.constants import JAN, MAR, APR, MAY, AUG, OCT, NOV, DEC
16
+ from holidays.constants import MAR, APR, AUG, OCT, NOV, DEC
18
17
  from holidays.holiday_base import HolidayBase
18
+ from holidays.holiday_groups import ChristianHolidays, InternationalHolidays
19
19
 
20
20
 
21
- class Hungary(HolidayBase):
21
+ class Hungary(HolidayBase, ChristianHolidays, InternationalHolidays):
22
22
  """
23
23
  https://en.wikipedia.org/wiki/Public_holidays_in_Hungary
24
24
  Codification dates:
@@ -27,126 +27,127 @@ class Hungary(HolidayBase):
27
27
  """
28
28
 
29
29
  country = "HU"
30
+ default_language = "hu"
31
+ supported_languages = ("en_US", "hu", "uk")
30
32
 
31
- def _add_with_observed_day_off(
33
+ def _add_observed(
32
34
  self,
33
35
  dt: date,
34
- name: str,
35
36
  since: int = 2010,
36
37
  before: bool = True,
37
38
  after: bool = True,
38
39
  ) -> None:
39
- # Swapped days off were in place earlier but
40
- # I haven't found official record yet.
41
- self._add_holiday(name, dt)
42
- # TODO: should it be a separate flag?
43
- if self.observed and since <= dt.year:
44
- if self._is_tuesday(dt) and before:
45
- self._add_holiday(f"{name} előtti pihenőnap", dt + td(days=-1))
46
- elif self._is_thursday(dt) and after:
47
- self._add_holiday(f"{name} utáni pihenőnap", dt + td(days=+1))
48
-
49
- def _populate(self, year: int) -> None:
50
- super()._populate(year)
51
-
52
- # New year's Day.
53
- self._add_with_observed_day_off(
54
- date(year, JAN, 1), "Újév", before=False, since=2014
55
- )
56
-
57
- # National Day.
58
- if 1945 <= year <= 1950 or 1989 <= year:
59
- self._add_with_observed_day_off(
60
- date(year, MAR, 15), "Nemzeti ünnep"
40
+ if not self.observed or dt.year < since:
41
+ return None
42
+ if self._is_tuesday(dt) and before:
43
+ self._add_holiday(
44
+ # Day off before
45
+ self.tr("%s előtti pihenőnap") % self[dt],
46
+ dt + td(days=-1),
61
47
  )
62
-
63
- # Soviet era.
64
- if 1950 <= year <= 1989:
65
- # Proclamation of Soviet socialist governing system.
48
+ elif self._is_thursday(dt) and after:
66
49
  self._add_holiday(
67
- "A Tanácsköztársaság kikiáltásának ünnepe", MAR, 21
50
+ # Day off after
51
+ self.tr("%s utáni pihenőnap") % self[dt],
52
+ dt + td(days=+1),
68
53
  )
69
54
 
70
- # Liberation Day.
71
- self._add_holiday("A felszabadulás ünnepe", APR, 4)
55
+ def __init__(self, *args, **kwargs):
56
+ ChristianHolidays.__init__(self)
57
+ InternationalHolidays.__init__(self)
58
+ super().__init__(*args, **kwargs)
72
59
 
73
- # Memorial day of The Great October Soviet Socialist Revolution.
74
- if year not in {1956, 1989}:
75
- self._add_holiday(
76
- "A nagy októberi szocialista forradalom ünnepe", NOV, 7
77
- )
60
+ def _populate(self, year):
61
+ super()._populate(year)
62
+
63
+ # New Year's Day.
64
+ name = self.tr("Újév")
65
+ self._add_observed(self._add_new_years_day(name), before=False, since=2014)
78
66
 
79
- easter_date = easter(year)
67
+ # The last day of the year is an observed day off if New Year's Day
68
+ # falls on a Tuesday.
69
+ if self.observed and self._is_monday(DEC, 31) and year >= 2014:
70
+ self._add_holiday(self.tr("%s előtti pihenőnap") % name, DEC, 31)
80
71
 
81
- # Good Friday.
82
- if 2017 <= year:
83
- self._add_holiday("Nagypéntek", easter_date + td(days=-2))
72
+ if 1945 <= year <= 1950 or year >= 1989:
73
+ # National Day.
74
+ self._add_observed(self._add_holiday(tr("Nemzeti ünnep"), MAR, 15))
75
+
76
+ if year >= 2017:
77
+ # Good Friday.
78
+ self._add_good_friday(tr("Nagypéntek"))
84
79
 
85
80
  # Easter.
86
- self._add_holiday("Húsvét", easter_date)
81
+ self._add_easter_sunday(tr("Húsvét"))
87
82
 
88
- # Second Easter Day.
89
83
  if year != 1955:
90
- self._add_holiday("Húsvét Hétfő", easter_date + td(days=+1))
84
+ # Easter Monday.
85
+ self._add_easter_monday(tr("Húsvét Hétfő"))
91
86
 
92
- # Pentecost.
93
- self._add_holiday("Pünkösd", easter_date + td(days=+49))
87
+ # Whit Sunday.
88
+ self._add_whit_sunday(tr("Pünkösd"))
94
89
 
95
- # Pentecost Monday.
96
- if year <= 1952 or 1992 <= year:
97
- self._add_holiday("Pünkösdhétfő", easter_date + td(days=+50))
90
+ if year <= 1952 or year >= 1992:
91
+ # Whit Monday.
92
+ self._add_whit_monday(tr("Pünkösdhétfő"))
98
93
 
99
- # International Workers' Day.
100
- if 1946 <= year:
101
- self._add_with_observed_day_off(
102
- date(year, MAY, 1), "A Munka ünnepe"
103
- )
104
- if 1950 <= year <= 1953:
105
- self._add_holiday("A Munka ünnepe", MAY, 2)
94
+ if year >= 1946:
95
+ # Labor Day.
96
+ name = tr("A Munka ünnepe")
97
+ may_1 = self._add_labor_day(name)
98
+ self._add_observed(may_1)
99
+ if 1950 <= year <= 1953:
100
+ self._add_holiday(name, may_1 + td(days=+1))
106
101
 
107
- # State Foundation Day.
108
- if 1950 <= year <= 1989:
109
- self._add_holiday("A kenyér ünnepe", AUG, 20)
110
- else:
111
- self._add_with_observed_day_off(
112
- date(year, AUG, 20), "Az államalapítás ünnepe"
113
- )
114
-
115
- # National Day.
116
- if 1991 <= year:
117
- self._add_with_observed_day_off(
118
- date(year, OCT, 23), "Nemzeti ünnep"
102
+ self._add_observed(
103
+ self._add_holiday(
104
+ # Bread Day.
105
+ tr("A kenyér ünnepe") if 1950 <= year <= 1989 else
106
+ # State Foundation Day.
107
+ tr("Az államalapítás ünnepe"),
108
+ AUG,
109
+ 20,
119
110
  )
111
+ )
120
112
 
121
- # All Saints' Day.
122
- if 1999 <= year:
123
- self._add_with_observed_day_off(
124
- date(year, NOV, 1), "Mindenszentek"
125
- )
113
+ if year >= 1991:
114
+ # National Day.
115
+ self._add_observed(self._add_holiday(tr("Nemzeti ünnep"), OCT, 23))
126
116
 
127
- # Christmas Eve is not endorsed officially
128
- # but nowadays it is usually a day off work
129
- if self.observed and 2010 <= year and not self._is_weekend(DEC, 24):
130
- self._add_holiday("Szenteste", DEC, 24)
117
+ if year >= 1999:
118
+ # All Saints' Day.
119
+ self._add_observed(self._add_all_saints_day(tr("Mindenszentek")))
131
120
 
132
- # Christmas First Day.
133
- self._add_holiday("Karácsony", DEC, 25)
121
+ # Christmas Day.
122
+ self._add_christmas_day(tr("Karácsony"))
134
123
 
135
- # Christmas Second Day.
136
124
  if year != 1955:
137
- self._add_with_observed_day_off(
138
- date(year, DEC, 26),
139
- "Karácsony másnapja",
125
+ self._add_observed(
126
+ # Second Day of Christmas.
127
+ self._add_christmas_day_two(tr("Karácsony másnapja")),
140
128
  since=2013,
141
129
  before=False,
142
130
  )
143
131
 
144
- # New Year's Eve.
145
- # Since 2014, the last day of the year is an observed day off if New
146
- # Year's Day falls on a Tuesday.
147
- dec_31 = date(year, DEC, 31)
148
- if self.observed and 2014 <= year and self._is_monday(dec_31):
149
- self._add_holiday("Szilveszter", dec_31)
132
+ # Soviet era.
133
+ if 1950 <= year <= 1989:
134
+ self._add_holiday(
135
+ # Proclamation of Soviet Republic Day.
136
+ tr("A Tanácsköztársaság kikiáltásának ünnepe"),
137
+ MAR,
138
+ 21,
139
+ )
140
+
141
+ # Liberation Day.
142
+ self._add_holiday(tr("A felszabadulás ünnepe"), APR, 4)
143
+
144
+ if year not in {1956, 1989}:
145
+ self._add_holiday(
146
+ # Great October Socialist Revolution Day.
147
+ tr("A nagy októberi szocialista forradalom ünnepe"),
148
+ NOV,
149
+ 7,
150
+ )
150
151
 
151
152
 
152
153
  class HU(Hungary):
@@ -26,6 +26,7 @@ class Iceland(HolidayBase, ChristianHolidays, InternationalHolidays):
26
26
 
27
27
  country = "IS"
28
28
  default_language = "is"
29
+ supported_languages = ("en_US", "is", "uk")
29
30
 
30
31
  def __init__(self, *args, **kwargs):
31
32
  ChristianHolidays.__init__(self)
@@ -13,13 +13,10 @@ import warnings
13
13
 
14
14
  from holidays.constants import JAN, MAR, APR, MAY, JUN, AUG, OCT, NOV
15
15
  from holidays.holiday_base import HolidayBase
16
- from holidays.holiday_groups import ChristianHolidays, InternationalHolidays
17
- from holidays.holiday_groups import IslamicHolidays
16
+ from holidays.holiday_groups import ChristianHolidays, InternationalHolidays, IslamicHolidays
18
17
 
19
18
 
20
- class India(
21
- HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHolidays
22
- ):
19
+ class India(HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHolidays):
23
20
  """
24
21
  https://www.india.gov.in/calendar
25
22
  https://www.india.gov.in/state-and-ut-holiday-calendar
@@ -100,9 +97,7 @@ class India(
100
97
  # https://github.com/facebook/prophet/blob/main/python/prophet/hdays.py
101
98
  # Warnings kept in place so that users are aware
102
99
  if year < 2001 or year > 2030:
103
- warning_msg = (
104
- "Diwali and Holi holidays available from 2001 to 2030 only"
105
- )
100
+ warning_msg = "Diwali and Holi holidays available from 2001 to 2030 only"
106
101
  warnings.warn(warning_msg, Warning)
107
102
 
108
103
  # https://www.timeanddate.com/holidays/india/diwali
@@ -255,9 +250,7 @@ class India(
255
250
  def _add_subdiv_or_holidays(self):
256
251
  self._add_holiday("Odisha Day (Utkala Dibasa)", APR, 1)
257
252
  self._add_holiday("Dr. B. R. Ambedkar's Jayanti", APR, 14)
258
- self._add_holiday(
259
- "Maha Vishuva Sankranti / Pana" " Sankranti", APR, 15
260
- )
253
+ self._add_holiday("Maha Vishuva Sankranti / Pana Sankranti", APR, 15)
261
254
 
262
255
  # Rajasthan.
263
256
  def _add_subdiv_rj_holidays(self):