holidays 0.41__py3-none-any.whl → 0.43__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 (306) hide show
  1. holidays/__init__.py +1 -1
  2. holidays/countries/__init__.py +2 -0
  3. holidays/countries/algeria.py +9 -8
  4. holidays/countries/angola.py +2 -4
  5. holidays/countries/argentina.py +2 -2
  6. holidays/countries/armenia.py +1 -1
  7. holidays/countries/aruba.py +2 -4
  8. holidays/countries/austria.py +82 -9
  9. holidays/countries/bahrain.py +8 -11
  10. holidays/countries/belarus.py +1 -1
  11. holidays/countries/belgium.py +2 -2
  12. holidays/countries/bosnia_and_herzegovina.py +16 -16
  13. holidays/countries/cambodia.py +1 -4
  14. holidays/countries/canada.py +1 -1
  15. holidays/countries/chile.py +5 -5
  16. holidays/countries/china.py +15 -2
  17. holidays/countries/colombia.py +3 -3
  18. holidays/countries/costa_rica.py +20 -16
  19. holidays/countries/croatia.py +15 -7
  20. holidays/countries/cuba.py +2 -2
  21. holidays/countries/denmark.py +1 -2
  22. holidays/countries/djibouti.py +2 -2
  23. holidays/countries/dominican_republic.py +1 -1
  24. holidays/countries/ecuador.py +1 -1
  25. holidays/countries/egypt.py +27 -29
  26. holidays/countries/ethiopia.py +4 -3
  27. holidays/countries/georgia.py +1 -1
  28. holidays/countries/germany.py +0 -1
  29. holidays/countries/ghana.py +97 -0
  30. holidays/countries/greece.py +14 -6
  31. holidays/countries/guatemala.py +10 -10
  32. holidays/countries/honduras.py +1 -1
  33. holidays/countries/hungary.py +1 -2
  34. holidays/countries/indonesia.py +4 -3
  35. holidays/countries/iran.py +1 -1
  36. holidays/countries/ireland.py +27 -23
  37. holidays/countries/isle_of_man.py +4 -0
  38. holidays/countries/jersey.py +234 -0
  39. holidays/countries/laos.py +4 -4
  40. holidays/countries/latvia.py +1 -1
  41. holidays/countries/liechtenstein.py +2 -2
  42. holidays/countries/lithuania.py +3 -3
  43. holidays/countries/madagascar.py +1 -1
  44. holidays/countries/moldova.py +5 -5
  45. holidays/countries/monaco.py +4 -4
  46. holidays/countries/morocco.py +1 -1
  47. holidays/countries/nicaragua.py +1 -1
  48. holidays/countries/norway.py +1 -1
  49. holidays/countries/peru.py +4 -4
  50. holidays/countries/poland.py +5 -4
  51. holidays/countries/portugal.py +2 -2
  52. holidays/countries/romania.py +1 -1
  53. holidays/countries/saudi_arabia.py +1 -1
  54. holidays/countries/serbia.py +3 -3
  55. holidays/countries/slovakia.py +1 -2
  56. holidays/countries/spain.py +1 -1
  57. holidays/countries/switzerland.py +289 -43
  58. holidays/countries/taiwan.py +114 -24
  59. holidays/countries/tanzania.py +1 -0
  60. holidays/countries/thailand.py +10 -18
  61. holidays/countries/timor_leste.py +1 -0
  62. holidays/countries/tunisia.py +3 -3
  63. holidays/countries/turkey.py +2 -1
  64. holidays/countries/ukraine.py +3 -3
  65. holidays/countries/united_arab_emirates.py +36 -28
  66. holidays/countries/united_kingdom.py +28 -0
  67. holidays/holiday_base.py +32 -14
  68. holidays/locale/am/LC_MESSAGES/ET.po +4 -3
  69. holidays/locale/ar/LC_MESSAGES/AE.po +3 -3
  70. holidays/locale/ar/LC_MESSAGES/BH.po +4 -4
  71. holidays/locale/ar/LC_MESSAGES/CA.po +1 -1
  72. holidays/locale/ar/LC_MESSAGES/DJ.mo +0 -0
  73. holidays/locale/ar/LC_MESSAGES/DJ.po +8 -8
  74. holidays/locale/ar/LC_MESSAGES/DZ.po +5 -5
  75. holidays/locale/ar/LC_MESSAGES/EG.po +19 -19
  76. holidays/locale/ar/LC_MESSAGES/ET.po +4 -3
  77. holidays/locale/ar/LC_MESSAGES/MA.po +1 -1
  78. holidays/locale/ar/LC_MESSAGES/SA.po +1 -1
  79. holidays/locale/ar/LC_MESSAGES/TN.po +3 -3
  80. holidays/locale/ar/LC_MESSAGES/UA.po +3 -3
  81. holidays/locale/be/LC_MESSAGES/BY.po +1 -1
  82. holidays/locale/bs/LC_MESSAGES/BA.po +5 -5
  83. holidays/locale/da/LC_MESSAGES/DK.po +1 -1
  84. holidays/locale/de/LC_MESSAGES/AT.mo +0 -0
  85. holidays/locale/de/LC_MESSAGES/AT.po +25 -1
  86. holidays/locale/de/LC_MESSAGES/BE.po +2 -2
  87. holidays/locale/de/LC_MESSAGES/CH.mo +0 -0
  88. holidays/locale/de/LC_MESSAGES/CH.po +6 -14
  89. holidays/locale/de/LC_MESSAGES/DE.po +0 -1
  90. holidays/locale/de/LC_MESSAGES/LI.mo +0 -0
  91. holidays/locale/de/LC_MESSAGES/LI.po +5 -5
  92. holidays/locale/de/LC_MESSAGES/LU.mo +0 -0
  93. holidays/locale/de/LC_MESSAGES/LU.po +3 -3
  94. holidays/locale/el/LC_MESSAGES/GR.po +3 -3
  95. holidays/locale/en_CA/LC_MESSAGES/CA.po +1 -1
  96. holidays/locale/en_US/LC_MESSAGES/AE.mo +0 -0
  97. holidays/locale/en_US/LC_MESSAGES/AE.po +8 -8
  98. holidays/locale/en_US/LC_MESSAGES/AM.mo +0 -0
  99. holidays/locale/en_US/LC_MESSAGES/AM.po +7 -7
  100. holidays/locale/en_US/LC_MESSAGES/AR.mo +0 -0
  101. holidays/locale/en_US/LC_MESSAGES/AR.po +7 -7
  102. holidays/locale/en_US/LC_MESSAGES/AT.mo +0 -0
  103. holidays/locale/en_US/LC_MESSAGES/AT.po +25 -1
  104. holidays/locale/en_US/LC_MESSAGES/BA.mo +0 -0
  105. holidays/locale/en_US/LC_MESSAGES/BA.po +13 -13
  106. holidays/locale/en_US/LC_MESSAGES/BE.mo +0 -0
  107. holidays/locale/en_US/LC_MESSAGES/BE.po +7 -7
  108. holidays/locale/en_US/LC_MESSAGES/BH.po +4 -4
  109. holidays/locale/en_US/LC_MESSAGES/BY.po +1 -1
  110. holidays/locale/en_US/LC_MESSAGES/CA.po +1 -1
  111. holidays/locale/en_US/LC_MESSAGES/CH.mo +0 -0
  112. holidays/locale/en_US/LC_MESSAGES/CH.po +7 -15
  113. holidays/locale/en_US/LC_MESSAGES/CL.mo +0 -0
  114. holidays/locale/en_US/LC_MESSAGES/CL.po +12 -12
  115. holidays/locale/en_US/LC_MESSAGES/CN.mo +0 -0
  116. holidays/locale/en_US/LC_MESSAGES/CN.po +8 -4
  117. holidays/locale/en_US/LC_MESSAGES/CO.mo +0 -0
  118. holidays/locale/en_US/LC_MESSAGES/CO.po +11 -11
  119. holidays/locale/en_US/LC_MESSAGES/CR.mo +0 -0
  120. holidays/locale/en_US/LC_MESSAGES/CR.po +5 -5
  121. holidays/locale/en_US/LC_MESSAGES/CU.mo +0 -0
  122. holidays/locale/en_US/LC_MESSAGES/CU.po +6 -6
  123. holidays/locale/en_US/LC_MESSAGES/CZ.mo +0 -0
  124. holidays/locale/en_US/LC_MESSAGES/CZ.po +1 -1
  125. holidays/locale/en_US/LC_MESSAGES/DE.po +0 -1
  126. holidays/locale/en_US/LC_MESSAGES/DJ.mo +0 -0
  127. holidays/locale/en_US/LC_MESSAGES/DJ.po +5 -5
  128. holidays/locale/en_US/LC_MESSAGES/DK.po +1 -1
  129. holidays/locale/en_US/LC_MESSAGES/DO.mo +0 -0
  130. holidays/locale/en_US/LC_MESSAGES/DO.po +5 -5
  131. holidays/locale/en_US/LC_MESSAGES/DZ.po +5 -5
  132. holidays/locale/en_US/LC_MESSAGES/EC.mo +0 -0
  133. holidays/locale/en_US/LC_MESSAGES/EC.po +5 -5
  134. holidays/locale/en_US/LC_MESSAGES/EG.mo +0 -0
  135. holidays/locale/en_US/LC_MESSAGES/EG.po +25 -25
  136. holidays/locale/en_US/LC_MESSAGES/ES.mo +0 -0
  137. holidays/locale/en_US/LC_MESSAGES/ES.po +3 -3
  138. holidays/locale/en_US/LC_MESSAGES/ET.mo +0 -0
  139. holidays/locale/en_US/LC_MESSAGES/ET.po +10 -9
  140. holidays/locale/en_US/LC_MESSAGES/GE.mo +0 -0
  141. holidays/locale/en_US/LC_MESSAGES/GE.po +5 -5
  142. holidays/locale/en_US/LC_MESSAGES/GR.mo +0 -0
  143. holidays/locale/en_US/LC_MESSAGES/GR.po +5 -5
  144. holidays/locale/en_US/LC_MESSAGES/GT.mo +0 -0
  145. holidays/locale/en_US/LC_MESSAGES/GT.po +16 -16
  146. holidays/locale/en_US/LC_MESSAGES/HN.mo +0 -0
  147. holidays/locale/en_US/LC_MESSAGES/HN.po +4 -4
  148. holidays/locale/en_US/LC_MESSAGES/HR.mo +0 -0
  149. holidays/locale/en_US/LC_MESSAGES/HR.po +17 -15
  150. holidays/locale/en_US/LC_MESSAGES/ID.mo +0 -0
  151. holidays/locale/en_US/LC_MESSAGES/ID.po +10 -9
  152. holidays/locale/en_US/LC_MESSAGES/IL.mo +0 -0
  153. holidays/locale/en_US/LC_MESSAGES/IL.po +1 -0
  154. holidays/locale/en_US/LC_MESSAGES/IR.po +1 -1
  155. holidays/locale/en_US/LC_MESSAGES/LA.mo +0 -0
  156. holidays/locale/en_US/LC_MESSAGES/LA.po +3 -3
  157. holidays/locale/en_US/LC_MESSAGES/LI.mo +0 -0
  158. holidays/locale/en_US/LC_MESSAGES/LI.po +5 -5
  159. holidays/locale/en_US/LC_MESSAGES/LT.mo +0 -0
  160. holidays/locale/en_US/LC_MESSAGES/LT.po +7 -7
  161. holidays/locale/en_US/LC_MESSAGES/LV.mo +0 -0
  162. holidays/locale/en_US/LC_MESSAGES/LV.po +5 -5
  163. holidays/locale/en_US/LC_MESSAGES/MA.po +1 -1
  164. holidays/locale/en_US/LC_MESSAGES/MC.mo +0 -0
  165. holidays/locale/en_US/LC_MESSAGES/MC.po +10 -10
  166. holidays/locale/en_US/LC_MESSAGES/MD.mo +0 -0
  167. holidays/locale/en_US/LC_MESSAGES/MD.po +10 -10
  168. holidays/locale/en_US/LC_MESSAGES/MG.po +1 -0
  169. holidays/locale/en_US/LC_MESSAGES/MX.mo +0 -0
  170. holidays/locale/en_US/LC_MESSAGES/MX.po +4 -4
  171. holidays/locale/en_US/LC_MESSAGES/NI.mo +0 -0
  172. holidays/locale/en_US/LC_MESSAGES/NI.po +4 -4
  173. holidays/locale/en_US/LC_MESSAGES/NO.po +1 -1
  174. holidays/locale/en_US/LC_MESSAGES/PE.mo +0 -0
  175. holidays/locale/en_US/LC_MESSAGES/PE.po +8 -8
  176. holidays/locale/en_US/LC_MESSAGES/PL.mo +0 -0
  177. holidays/locale/en_US/LC_MESSAGES/PL.po +13 -12
  178. holidays/locale/en_US/LC_MESSAGES/PT.mo +0 -0
  179. holidays/locale/en_US/LC_MESSAGES/PT.po +2 -2
  180. holidays/locale/en_US/LC_MESSAGES/RO.mo +0 -0
  181. holidays/locale/en_US/LC_MESSAGES/RO.po +5 -5
  182. holidays/locale/en_US/LC_MESSAGES/RS.mo +0 -0
  183. holidays/locale/en_US/LC_MESSAGES/RS.po +10 -9
  184. holidays/locale/en_US/LC_MESSAGES/SA.po +1 -1
  185. holidays/locale/en_US/LC_MESSAGES/SI.mo +0 -0
  186. holidays/locale/en_US/LC_MESSAGES/SI.po +1 -1
  187. holidays/locale/en_US/LC_MESSAGES/SK.po +1 -0
  188. holidays/locale/en_US/LC_MESSAGES/TH.mo +0 -0
  189. holidays/locale/en_US/LC_MESSAGES/TH.po +4 -4
  190. holidays/locale/en_US/LC_MESSAGES/TL.po +1 -0
  191. holidays/locale/en_US/LC_MESSAGES/TN.po +3 -3
  192. holidays/locale/en_US/LC_MESSAGES/TR.po +2 -1
  193. holidays/locale/en_US/LC_MESSAGES/TW.mo +0 -0
  194. holidays/locale/en_US/LC_MESSAGES/TW.po +14 -5
  195. holidays/locale/en_US/LC_MESSAGES/TZ.po +1 -0
  196. holidays/locale/en_US/LC_MESSAGES/UA.mo +0 -0
  197. holidays/locale/en_US/LC_MESSAGES/UA.po +7 -7
  198. holidays/locale/es/LC_MESSAGES/AR.po +2 -2
  199. holidays/locale/es/LC_MESSAGES/CL.po +5 -5
  200. holidays/locale/es/LC_MESSAGES/CO.po +3 -3
  201. holidays/locale/es/LC_MESSAGES/CU.po +2 -2
  202. holidays/locale/es/LC_MESSAGES/DO.po +1 -1
  203. holidays/locale/es/LC_MESSAGES/EC.po +1 -1
  204. holidays/locale/es/LC_MESSAGES/ES.po +1 -1
  205. holidays/locale/es/LC_MESSAGES/GT.po +10 -10
  206. holidays/locale/es/LC_MESSAGES/HN.po +1 -1
  207. holidays/locale/es/LC_MESSAGES/NI.po +1 -1
  208. holidays/locale/es/LC_MESSAGES/PE.po +4 -4
  209. holidays/locale/fa/LC_MESSAGES/IR.po +1 -1
  210. holidays/locale/fr/LC_MESSAGES/BE.po +2 -2
  211. holidays/locale/fr/LC_MESSAGES/CA.po +1 -1
  212. holidays/locale/fr/LC_MESSAGES/CH.mo +0 -0
  213. holidays/locale/fr/LC_MESSAGES/CH.po +6 -14
  214. holidays/locale/fr/LC_MESSAGES/DJ.po +2 -2
  215. holidays/locale/fr/LC_MESSAGES/DZ.po +5 -5
  216. holidays/locale/fr/LC_MESSAGES/MA.po +1 -1
  217. holidays/locale/fr/LC_MESSAGES/MC.po +4 -4
  218. holidays/locale/hr/LC_MESSAGES/HR.mo +0 -0
  219. holidays/locale/hr/LC_MESSAGES/HR.po +12 -10
  220. holidays/locale/hy/LC_MESSAGES/AM.po +1 -1
  221. holidays/locale/id/LC_MESSAGES/ID.po +4 -3
  222. holidays/locale/it/LC_MESSAGES/CH.mo +0 -0
  223. holidays/locale/it/LC_MESSAGES/CH.po +6 -14
  224. holidays/locale/ka/LC_MESSAGES/GE.po +1 -1
  225. holidays/locale/lo/LC_MESSAGES/LA.po +1 -1
  226. holidays/locale/lt/LC_MESSAGES/LT.po +3 -3
  227. holidays/locale/lv/LC_MESSAGES/LV.po +1 -1
  228. holidays/locale/mg/LC_MESSAGES/MG.po +1 -0
  229. holidays/locale/nl/LC_MESSAGES/BE.po +2 -2
  230. holidays/locale/no/LC_MESSAGES/NO.po +1 -1
  231. holidays/locale/pl/LC_MESSAGES/PL.po +5 -4
  232. holidays/locale/pt_PT/LC_MESSAGES/PT.po +1 -1
  233. holidays/locale/pt_TL/LC_MESSAGES/TL.po +1 -0
  234. holidays/locale/ro/LC_MESSAGES/MD.po +5 -5
  235. holidays/locale/ro/LC_MESSAGES/RO.po +1 -1
  236. holidays/locale/sk/LC_MESSAGES/SK.po +1 -0
  237. holidays/locale/sr/LC_MESSAGES/BA.po +5 -5
  238. holidays/locale/sr/LC_MESSAGES/RS.po +3 -3
  239. holidays/locale/sw/LC_MESSAGES/TZ.po +1 -0
  240. holidays/locale/tet/LC_MESSAGES/TL.po +1 -0
  241. holidays/locale/th/LC_MESSAGES/CA.po +1 -1
  242. holidays/locale/th/LC_MESSAGES/CN.mo +0 -0
  243. holidays/locale/th/LC_MESSAGES/CN.po +8 -4
  244. holidays/locale/th/LC_MESSAGES/LA.po +1 -1
  245. holidays/locale/th/LC_MESSAGES/TH.po +1 -1
  246. holidays/locale/th/LC_MESSAGES/TW.mo +0 -0
  247. holidays/locale/th/LC_MESSAGES/TW.po +14 -5
  248. holidays/locale/tr/LC_MESSAGES/TR.po +2 -1
  249. holidays/locale/uk/LC_MESSAGES/AR.po +2 -2
  250. holidays/locale/uk/LC_MESSAGES/AT.mo +0 -0
  251. holidays/locale/uk/LC_MESSAGES/AT.po +25 -1
  252. holidays/locale/uk/LC_MESSAGES/BA.po +5 -5
  253. holidays/locale/uk/LC_MESSAGES/BE.po +2 -2
  254. holidays/locale/uk/LC_MESSAGES/CH.mo +0 -0
  255. holidays/locale/uk/LC_MESSAGES/CH.po +6 -14
  256. holidays/locale/uk/LC_MESSAGES/CL.mo +0 -0
  257. holidays/locale/uk/LC_MESSAGES/CL.po +6 -6
  258. holidays/locale/uk/LC_MESSAGES/CO.mo +0 -0
  259. holidays/locale/uk/LC_MESSAGES/CO.po +4 -4
  260. holidays/locale/uk/LC_MESSAGES/CU.po +2 -2
  261. holidays/locale/uk/LC_MESSAGES/DE.po +0 -1
  262. holidays/locale/uk/LC_MESSAGES/DK.po +1 -1
  263. holidays/locale/uk/LC_MESSAGES/DO.po +1 -1
  264. holidays/locale/uk/LC_MESSAGES/EC.po +1 -1
  265. holidays/locale/uk/LC_MESSAGES/ES.po +1 -1
  266. holidays/locale/uk/LC_MESSAGES/FR.mo +0 -0
  267. holidays/locale/uk/LC_MESSAGES/FR.po +6 -6
  268. holidays/locale/uk/LC_MESSAGES/GE.po +1 -1
  269. holidays/locale/uk/LC_MESSAGES/GR.po +3 -3
  270. holidays/locale/uk/LC_MESSAGES/HN.po +1 -1
  271. holidays/locale/uk/LC_MESSAGES/HR.mo +0 -0
  272. holidays/locale/uk/LC_MESSAGES/HR.po +14 -12
  273. holidays/locale/uk/LC_MESSAGES/ID.po +4 -3
  274. holidays/locale/uk/LC_MESSAGES/LI.mo +0 -0
  275. holidays/locale/uk/LC_MESSAGES/LI.po +5 -5
  276. holidays/locale/uk/LC_MESSAGES/LT.po +3 -3
  277. holidays/locale/uk/LC_MESSAGES/LV.po +1 -1
  278. holidays/locale/uk/LC_MESSAGES/MC.mo +0 -0
  279. holidays/locale/uk/LC_MESSAGES/MC.po +7 -7
  280. holidays/locale/uk/LC_MESSAGES/MD.po +5 -5
  281. holidays/locale/uk/LC_MESSAGES/MG.po +1 -0
  282. holidays/locale/uk/LC_MESSAGES/NI.po +1 -1
  283. holidays/locale/uk/LC_MESSAGES/NO.po +1 -1
  284. holidays/locale/uk/LC_MESSAGES/PE.po +4 -4
  285. holidays/locale/uk/LC_MESSAGES/PL.mo +0 -0
  286. holidays/locale/uk/LC_MESSAGES/PL.po +11 -10
  287. holidays/locale/uk/LC_MESSAGES/PT.po +1 -1
  288. holidays/locale/uk/LC_MESSAGES/RO.po +1 -1
  289. holidays/locale/uk/LC_MESSAGES/SK.po +1 -0
  290. holidays/locale/uk/LC_MESSAGES/TR.po +2 -1
  291. holidays/locale/uk/LC_MESSAGES/UA.po +3 -3
  292. holidays/locale/zh_CN/LC_MESSAGES/CN.mo +0 -0
  293. holidays/locale/zh_CN/LC_MESSAGES/CN.po +8 -4
  294. holidays/locale/zh_CN/LC_MESSAGES/TW.mo +0 -0
  295. holidays/locale/zh_CN/LC_MESSAGES/TW.po +15 -6
  296. holidays/locale/zh_TW/LC_MESSAGES/CN.mo +0 -0
  297. holidays/locale/zh_TW/LC_MESSAGES/CN.po +8 -4
  298. holidays/locale/zh_TW/LC_MESSAGES/TW.mo +0 -0
  299. holidays/locale/zh_TW/LC_MESSAGES/TW.po +14 -5
  300. holidays/registry.py +2 -0
  301. holidays/utils.py +2 -2
  302. {holidays-0.41.dist-info → holidays-0.43.dist-info}/METADATA +23 -10
  303. {holidays-0.41.dist-info → holidays-0.43.dist-info}/RECORD +306 -304
  304. {holidays-0.41.dist-info → holidays-0.43.dist-info}/LICENSE +0 -0
  305. {holidays-0.41.dist-info → holidays-0.43.dist-info}/WHEEL +0 -0
  306. {holidays-0.41.dist-info → holidays-0.43.dist-info}/top_level.txt +0 -0
@@ -9,68 +9,86 @@
9
9
  # Website: https://github.com/dr-prodigy/python-holidays
10
10
  # License: MIT (see LICENSE file)
11
11
 
12
+ from datetime import date
12
13
  from gettext import gettext as tr
14
+ from typing import Set
13
15
 
14
- from holidays.groups import ChineseCalendarHolidays, InternationalHolidays
16
+ from holidays.calendars.gregorian import JAN, FEB, MAR, APR, MAY, JUN, SEP, OCT, DEC
17
+ from holidays.groups import ChineseCalendarHolidays, InternationalHolidays, StaticHolidays
15
18
  from holidays.observed_holiday_base import (
16
19
  ObservedHolidayBase,
20
+ ObservedRule,
17
21
  SAT_TO_PREV_WORKDAY,
18
22
  SUN_TO_NEXT_WORKDAY,
23
+ SAT_SUN_TO_NEXT_WORKDAY,
19
24
  )
20
25
 
21
26
 
22
- class Taiwan(ObservedHolidayBase, ChineseCalendarHolidays, InternationalHolidays):
27
+ class Taiwan(ObservedHolidayBase, ChineseCalendarHolidays, InternationalHolidays, StaticHolidays):
23
28
  """
24
29
  References:
25
- - https://www.dgpa.gov.tw/information?uid=353&pid=10659
26
30
  - https://en.wikipedia.org/wiki/Public_holidays_in_Taiwan
27
31
  - https://www.officeholidays.com/countries/taiwan
28
-
29
- If a public holiday falls on Tuesday or Thursday, government establishes an "extended holiday",
30
- although this will be compensated by making Saturday a working day.
31
- It's not supported yet.
32
+ - `2024 <https://www.dgpa.gov.tw/en/information?uid=353&pid=11402>`_
33
+ - `2023 <https://www.dgpa.gov.tw/en/information?uid=353&pid=11016>`_
34
+ - `2022 <https://www.dgpa.gov.tw/en/information?uid=353&pid=10659>`_
35
+ - `2021 <https://www.dgpa.gov.tw/en/information?uid=353&pid=10181>`_
36
+ - `2020 <https://www.dgpa.gov.tw/en/information?uid=353&pid=9724>`_
37
+ - `2019 <https://www.dgpa.gov.tw/en/information?uid=353&pid=8178>`_
38
+ - `2018 <https://www.dgpa.gov.tw/en/information?uid=353&pid=7730>`_
39
+ - `2017 <https://www.dgpa.gov.tw/en/information?uid=353&pid=6178>`_
40
+ - `2016 <https://www.dgpa.gov.tw/en/information?uid=353&pid=6180>`_
41
+ - `2015 <https://www.dgpa.gov.tw/en/information?uid=353&pid=6182>`_
42
+ - `2014 <https://www.dgpa.gov.tw/en/information?uid=353&pid=6183>`_
43
+ - `2013 <https://www.dgpa.gov.tw/en/information?uid=353&pid=6186>`_
44
+ - `2012 <https://www.dgpa.gov.tw/en/information?uid=353&pid=6187>`_
45
+ - `2011 <https://www.dgpa.gov.tw/en/information?uid=353&pid=6188>`_
46
+ - `2010 <https://www.dgpa.gov.tw/en/information?uid=353&pid=6189>`_
32
47
  """
33
48
 
34
49
  country = "TW"
35
50
  # %s (observed).
36
- observed_label = tr("%s (慶祝)")
51
+ observed_label = tr("%s(慶祝)")
37
52
  default_language = "zh_TW"
38
53
  supported_languages = ("en_US", "th", "zh_CN", "zh_TW")
39
54
 
40
55
  def __init__(self, *args, **kwargs):
41
56
  ChineseCalendarHolidays.__init__(self)
42
57
  InternationalHolidays.__init__(self)
58
+ StaticHolidays.__init__(self, TaiwanStaticHolidays)
43
59
  kwargs.setdefault("observed_rule", SAT_TO_PREV_WORKDAY + SUN_TO_NEXT_WORKDAY)
44
- kwargs.setdefault("observed_since", 2015)
45
60
  super().__init__(*args, **kwargs)
46
61
 
62
+ def _populate_observed(
63
+ self, dts: Set[date], rule: ObservedRule = None, since: int = 2015
64
+ ) -> None:
65
+ if self._year < since:
66
+ return None
67
+ for dt in sorted(dts):
68
+ for name in self.get_list(dt):
69
+ self._add_observed(dt, name, rule)
70
+
47
71
  def _populate_public_holidays(self):
48
72
  if self._year <= 1911:
49
73
  return None
50
74
 
51
75
  dts_observed = set()
76
+ dts_observed_forward = set()
52
77
 
53
78
  # Founding Day of the Republic of China.
54
79
  name = tr("中華民國開國紀念日")
55
80
  dts_observed.add(self._add_new_years_day(name))
56
- self._add_observed(self._next_year_new_years_day, name=name)
81
+ if self._year >= 2015:
82
+ self._add_observed(self._next_year_new_years_day, name=name)
57
83
 
58
84
  # Chinese New Year's Eve.
59
- self._add_chinese_new_years_eve(tr("農曆除夕"))
85
+ dts_observed_forward.add(self._add_chinese_new_years_eve(tr("農曆除夕")))
60
86
 
61
87
  # Chinese New Year.
62
88
  name = tr("春節")
63
- dt = self._add_chinese_new_years_day(name)
64
- self._add_chinese_new_years_day_two(name)
65
- self._add_chinese_new_years_day_three(name)
66
- if self.observed and self._year >= 2015:
67
- if self._is_monday(dt):
68
- self._add_chinese_new_years_day_four(name)
69
- elif self._is_thursday(dt):
70
- self._add_chinese_new_years_day_five(name)
71
- elif self._is_friday(dt) or self._is_weekend(dt):
72
- self._add_chinese_new_years_day_four(name)
73
- self._add_chinese_new_years_day_five(name)
89
+ dts_observed_forward.add(self._add_chinese_new_years_day(name))
90
+ dts_observed_forward.add(self._add_chinese_new_years_day_two(name))
91
+ dts_observed_forward.add(self._add_chinese_new_years_day_three(name))
74
92
 
75
93
  if self._year >= 1997:
76
94
  # Peace Memorial Day.
@@ -78,7 +96,9 @@ class Taiwan(ObservedHolidayBase, ChineseCalendarHolidays, InternationalHolidays
78
96
 
79
97
  if 1990 <= self._year <= 1999 or self._year >= 2011:
80
98
  # Children's Day.
81
- dts_observed.add(self._add_holiday_apr_4(tr("兒童節")))
99
+ apr_4 = self._add_holiday_apr_4(tr("兒童節"))
100
+ if self._year != 2021:
101
+ dts_observed.add(apr_4)
82
102
 
83
103
  if self._year >= 1972:
84
104
  # Tomb Sweeping Day.
@@ -94,7 +114,8 @@ class Taiwan(ObservedHolidayBase, ChineseCalendarHolidays, InternationalHolidays
94
114
  dts_observed.add(self._add_holiday_oct_10(tr("中華民國國慶日")))
95
115
 
96
116
  if self.observed:
97
- self._populate_observed(dts_observed, multiple=True)
117
+ self._populate_observed(dts_observed)
118
+ self._populate_observed(dts_observed_forward, rule=SAT_SUN_TO_NEXT_WORKDAY, since=2010)
98
119
 
99
120
 
100
121
  class TW(Taiwan):
@@ -103,3 +124,72 @@ class TW(Taiwan):
103
124
 
104
125
  class TWN(Taiwan):
105
126
  pass
127
+
128
+
129
+ class TaiwanStaticHolidays:
130
+ # Date format (see strftime() Format Codes).
131
+ substituted_date_format = tr("%Y-%m-%d")
132
+ # Day off (substituted from %s).
133
+ substituted_label = tr("休息日(%s日起取代)")
134
+
135
+ childrens_day = tr("兒童節")
136
+
137
+ special_public_holidays = {
138
+ 2010: (FEB, 19, FEB, 6),
139
+ 2012: (
140
+ (JAN, 27, FEB, 4),
141
+ (FEB, 27, MAR, 3),
142
+ (DEC, 31, DEC, 22),
143
+ ),
144
+ 2013: (
145
+ (FEB, 15, FEB, 23),
146
+ (SEP, 20, SEP, 14),
147
+ ),
148
+ 2015: (JAN, 2, DEC, 27, 2014),
149
+ 2016: (
150
+ (FEB, 12, JAN, 30),
151
+ (JUN, 10, JUN, 4),
152
+ (SEP, 16, SEP, 10),
153
+ ),
154
+ 2017: (
155
+ (FEB, 27, FEB, 18),
156
+ (MAY, 29, JUN, 3),
157
+ (OCT, 9, SEP, 30),
158
+ ),
159
+ 2018: (
160
+ (APR, 6, MAR, 31),
161
+ (DEC, 31, DEC, 22),
162
+ ),
163
+ 2019: (
164
+ (FEB, 8, JAN, 19),
165
+ (MAR, 1, FEB, 23),
166
+ (OCT, 11, OCT, 5),
167
+ ),
168
+ 2020: (
169
+ (JAN, 23, FEB, 15),
170
+ (JUN, 26, JUN, 20),
171
+ (OCT, 2, SEP, 26),
172
+ ),
173
+ 2021: (
174
+ (FEB, 10, FEB, 20),
175
+ (SEP, 20, SEP, 11),
176
+ ),
177
+ 2022: (FEB, 4, JAN, 22),
178
+ 2023: (
179
+ (JAN, 20, JAN, 7),
180
+ (JAN, 27, FEB, 4),
181
+ (FEB, 27, FEB, 18),
182
+ (APR, 3, MAR, 25),
183
+ (JUN, 23, JUN, 17),
184
+ (OCT, 9, SEP, 23),
185
+ ),
186
+ 2024: (FEB, 8, FEB, 17),
187
+ }
188
+
189
+ special_public_holidays_observed = {
190
+ 2013: (APR, 5, childrens_day),
191
+ 2016: (APR, 5, childrens_day),
192
+ 2017: (APR, 3, childrens_day),
193
+ 2021: (APR, 2, childrens_day),
194
+ 2024: (APR, 5, childrens_day),
195
+ }
@@ -60,6 +60,7 @@ class Tanzania(
60
60
  country = "TZ"
61
61
  supported_categories = (BANK, PUBLIC)
62
62
  default_language = "sw"
63
+ # %s (estimated).
63
64
  estimated_label = tr("%s (makisio)")
64
65
  supported_languages = ("en_US", "sw")
65
66
 
@@ -237,7 +237,7 @@ class Thailand(ObservedHolidayBase, InternationalHolidays, StaticHolidays, ThaiC
237
237
  # *** NOTE: only observed by financial and private sectors.
238
238
 
239
239
  if self._year >= 1974:
240
- # National Labour day.
240
+ # National Labor Day.
241
241
  self._add_observed(self._add_labor_day(tr("วันแรงงานแห่งชาติ")))
242
242
 
243
243
  # วันชาติ
@@ -338,8 +338,7 @@ class Thailand(ObservedHolidayBase, InternationalHolidays, StaticHolidays, ThaiC
338
338
  elif self._year >= 2019:
339
339
  # Anniversary for the Death of King Bhumibol Adulyadej the Great.
340
340
  k_bhumibol_memorial = tr(
341
- "วันคล้ายวันสวรรคตพระบาทสมเด็จพระบรมชนกาธิเบศร "
342
- "มหาภูมิพลอดุลยเดชมหาราช บรมนาถบพิตร"
341
+ "วันคล้ายวันสวรรคตพระบาทสมเด็จพระบรมชนกาธิเบศร มหาภูมิพลอดุลยเดชมหาราช บรมนาถบพิตร"
343
342
  )
344
343
  else:
345
344
  # Anniversary for the Death of King Bhumibol Adulyadej.
@@ -375,10 +374,7 @@ class Thailand(ObservedHolidayBase, InternationalHolidays, StaticHolidays, ThaiC
375
374
  elif self._year >= 2016:
376
375
  k_bhumibol_bday = (
377
376
  # HM King Bhumibol Adulyadej Birthday Anniversary.
378
- tr(
379
- "วันคล้ายวันเฉลิมพระชนมพรรษา"
380
- "พระบาทสมเด็จพระปรมินทรมหาภูมิพลอดุลยเดช บรมนาถบพิตร"
381
- )
377
+ tr("วันคล้ายวันเฉลิมพระชนมพรรษาพระบาทสมเด็จพระปรมินทรมหาภูมิพลอดุลยเดช บรมนาถบพิตร")
382
378
  )
383
379
  else:
384
380
  k_bhumibol_bday = (
@@ -504,10 +500,7 @@ class Thailand(ObservedHolidayBase, InternationalHolidays, StaticHolidays, ThaiC
504
500
  if self._year <= 2021:
505
501
  self._add_holiday_apr_1(
506
502
  # Additional Closing Day for Bank for Agriculture and Agricultural Cooperatives
507
- tr(
508
- "วันหยุดเพิ่มเติมสำหรับการปิดบัญชีประจำปีของ"
509
- "ธนาคารเพื่อการเกษตรและสหกรณ์การเกษตร"
510
- ),
503
+ tr("วันหยุดเพิ่มเติมสำหรับการปิดบัญชีประจำปีของธนาคารเพื่อการเกษตรและสหกรณ์การเกษตร"),
511
504
  )
512
505
 
513
506
  # วันหยุดภาคครึ่งปีของสถาบันการเงินและสถาบันการเงินเฉพาะกิจ
@@ -728,13 +721,9 @@ class ThailandStaticHolidays:
728
721
  # Day of Mourning for HM King Bhumibol Adulyadej.
729
722
  rama_ix_mourning = tr("วันหยุดพิเศษ (ร่วมถวายอาลัย ส่งดวงพระวิญญาณพระบรมศพ)")
730
723
  # HM King Bhumibol Adulyadej's Royal Cremation Ceremony.
731
- rama_ix_cremation = tr(
732
- "วันพระราชพิธีถวายพระเพลิงพระบรมศพพระบาทสมเด็จพระปรมินทรมหาภูมิพลอดุลยเดช"
733
- )
724
+ rama_ix_cremation = tr("วันพระราชพิธีถวายพระเพลิงพระบรมศพพระบาทสมเด็จพระปรมินทรมหาภูมิพลอดุลยเดช")
734
725
  # HM King Maha Vajiralongkorn's Coronation Celebrations.
735
- rama_x_coronation_celebrations = tr(
736
- "พระราชพิธีบรมราชาภิเษก พระบาทสมเด็จพระวชิรเกล้าเจ้าอยู่หัว"
737
- )
726
+ rama_x_coronation_celebrations = tr("พระราชพิธีบรมราชาภิเษก พระบาทสมเด็จพระวชิรเกล้าเจ้าอยู่หัว")
738
727
  # Songkran Festival.
739
728
  songkran_festival = tr("วันสงกรานต์")
740
729
 
@@ -840,7 +829,10 @@ class ThailandStaticHolidays:
840
829
  (JUL, 31, thai_bridge_public_holiday),
841
830
  (DEC, 29, thai_bridge_public_holiday),
842
831
  ),
843
- 2024: (DEC, 30, thai_bridge_public_holiday),
832
+ 2024: (
833
+ (APR, 12, thai_bridge_public_holiday),
834
+ (DEC, 30, thai_bridge_public_holiday),
835
+ ),
844
836
  }
845
837
  special_workday_holidays = {1999: (MAY, 14, tr("วันพืชมงคล"))}
846
838
 
@@ -43,6 +43,7 @@ class TimorLeste(
43
43
  country = "TL"
44
44
  supported_categories = (GOVERNMENT, PUBLIC, WORKDAY)
45
45
  default_language = "pt_TL"
46
+ # %s (estimated).
46
47
  estimated_label = tr("%s (aproximada)")
47
48
  supported_languages = ("en_US", "pt_TL", "tet")
48
49
 
@@ -21,7 +21,7 @@ class Tunisia(HolidayBase, InternationalHolidays, IslamicHolidays):
21
21
 
22
22
  country = "TN"
23
23
  default_language = "ar"
24
- # Estimated label.
24
+ # %s (estimated).
25
25
  estimated_label = tr("(تقدير) %s")
26
26
  supported_languages = ("ar", "en_US")
27
27
 
@@ -68,14 +68,14 @@ class Tunisia(HolidayBase, InternationalHolidays, IslamicHolidays):
68
68
  # Eid al-Adha.
69
69
  name = tr("عيد الأضحى")
70
70
  self._add_eid_al_adha_day(name)
71
- # Eid al-Adha Holiday
71
+ # Eid al-Adha Holiday.
72
72
  self._add_eid_al_adha_day_two(tr("عطلة عيد الأضحى"))
73
73
  self._add_eid_al_adha_day_three(tr("عطلة عيد الأضحى"))
74
74
 
75
75
  # Islamic New Year.
76
76
  self._add_islamic_new_year_day(tr("رأس السنة الهجرية"))
77
77
 
78
- # Prophet Muhammad's Birthday.
78
+ # Prophet's Birthday.
79
79
  self._add_mawlid_day(tr("عيد المولد النبوي"))
80
80
 
81
81
 
@@ -30,7 +30,7 @@ class Turkey(HolidayBase, InternationalHolidays, IslamicHolidays, StaticHolidays
30
30
 
31
31
  country = "TR"
32
32
  default_language = "tr"
33
- # Estimated label.
33
+ # %s (estimated).
34
34
  estimated_label = tr("%s (tahmini)")
35
35
  supported_categories = (HALF_DAY, PUBLIC)
36
36
  supported_languages = ("en_US", "tr", "uk")
@@ -105,6 +105,7 @@ class Turkey(HolidayBase, InternationalHolidays, IslamicHolidays, StaticHolidays
105
105
  if self._year <= 1935:
106
106
  return None
107
107
 
108
+ # %s (from 1pm).
108
109
  begin_time_label = self.tr("%s (saat 13.00'ten)")
109
110
 
110
111
  # Republic Day.
@@ -79,7 +79,7 @@ class Ukraine(ObservedHolidayBase, ChristianHolidays, InternationalHolidays, Sta
79
79
  dts_observed.add(self._add_new_years_day(tr("Новий рік")))
80
80
 
81
81
  dts_observed.add(
82
- # Christmas (Julian calendar).
82
+ # Christmas Day (Julian calendar).
83
83
  self._add_christmas_day(tr("Різдво Христове (за юліанським календарем)"))
84
84
  )
85
85
 
@@ -97,7 +97,7 @@ class Ukraine(ObservedHolidayBase, ChristianHolidays, InternationalHolidays, Sta
97
97
  dts_observed.add(self._add_whit_sunday(tr("Трійця")))
98
98
 
99
99
  name = (
100
- # Labour Day.
100
+ # Labor Day.
101
101
  tr("День праці")
102
102
  if self._year >= 2018
103
103
  # International Workers' Solidarity Day.
@@ -146,7 +146,7 @@ class Ukraine(ObservedHolidayBase, ChristianHolidays, InternationalHolidays, Sta
146
146
  if self._year >= 2017:
147
147
  dts_observed.add(
148
148
  self._add_christmas_day(
149
- # Christmas (Gregorian calendar).
149
+ # Christmas Day (Gregorian calendar).
150
150
  tr("Різдво Христове (за григоріанським календарем)"),
151
151
  GREGORIAN_CALENDAR,
152
152
  )
@@ -12,37 +12,26 @@
12
12
  from gettext import gettext as tr
13
13
 
14
14
  from holidays.calendars import _CustomIslamicHolidays
15
- from holidays.calendars.gregorian import APR, MAY, JUN, JUL, AUG, SEP, NOV, FRI, SAT
15
+ from holidays.calendars.gregorian import APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, FRI, SAT
16
16
  from holidays.groups import InternationalHolidays, IslamicHolidays
17
17
  from holidays.holiday_base import HolidayBase
18
18
 
19
19
 
20
20
  class UnitedArabEmirates(HolidayBase, InternationalHolidays, IslamicHolidays):
21
21
  """
22
- Holidays are regulated by the Article 74
23
- of Federal Law No. 08 for the year 1980:
22
+ Holidays are regulated by the Article 74 of Federal Law No. 08 for the year 1980:
24
23
  https://www.ilo.org/dyn/natlex/docs/ELECTRONIC/11956/69376/F417089305/ARE11956.pdf
25
- However the law is not applied literally,
26
- and was amended often in the past few years.
24
+ However the law is not applied literally, and was amended often in the past few years.
27
25
  Sources:
28
26
  2017: https://www.khaleejtimes.com/nation/uae-official-public-holidays-list-2017
29
27
  2018: https://www.thenational.ae/uae/government/uae-public-holidays-2018-announced-by-abu-dhabi-government-1.691393 # noqa: E501
30
28
  2019: https://www.thenational.ae/uae/government/uae-public-holidays-for-2019-and-2020-announced-by-cabinet-1.833425 # noqa: E501
31
29
  2020: https://u.ae/en/information-and-services/public-holidays-and-religious-affairs/public-holidays # noqa: E501
32
-
33
- Holidays based on the Islamic Calendar are estimated (and so denoted),
34
- as are announced each year and based on moon sightings:
35
- - Eid al-Fitr
36
- - Eid al-Adha
37
- - Arafat (Hajj) Day
38
- - Al-Hijra (Islamic New Year
39
- - Mawlud al-Nabi (Prophet Mohammad's Birthday)
40
- - Leilat al-Miraj (Ascension of the Prophet), suspended after 2018.
41
30
  """
42
31
 
43
32
  country = "AE"
44
33
  default_language = "ar"
45
- # Estimated label.
34
+ # %s (estimated).
46
35
  estimated_label = tr("(تقدير) %s")
47
36
  supported_languages = ("ar", "en_US")
48
37
  weekend = {FRI, SAT}
@@ -56,7 +45,7 @@ class UnitedArabEmirates(HolidayBase, InternationalHolidays, IslamicHolidays):
56
45
  # New Year's Day.
57
46
  self._add_new_years_day(tr("رأس السنة الميلادية"))
58
47
 
59
- if self._year >= 2015:
48
+ if 2015 <= self._year <= 2022:
60
49
  # Commemoration Day.
61
50
  name = tr("يوم الشهيد")
62
51
  if self._year >= 2019:
@@ -65,34 +54,40 @@ class UnitedArabEmirates(HolidayBase, InternationalHolidays, IslamicHolidays):
65
54
  self._add_holiday_nov_30(name)
66
55
 
67
56
  # National Day.
68
- self._add_holiday_dec_2(tr("اليوم الوطني"))
69
- self._add_holiday_dec_3(tr("اليوم الوطني"))
57
+ national_day = tr("اليوم الوطني")
58
+ self._add_holiday_dec_2(national_day)
59
+ self._add_holiday_dec_3(national_day)
70
60
 
71
61
  # Eid al-Fitr.
72
62
  self._add_eid_al_fitr_day(tr("عيد الفطر"))
63
+
73
64
  # Eid al-Fitr Holiday.
74
- self._add_eid_al_fitr_day_two(tr("عطلة عيد الفطر"))
75
- self._add_eid_al_fitr_day_three(tr("عطلة عيد الفطر"))
65
+ eid_al_fitr_holiday = tr("عطلة عيد الفطر")
66
+ self._add_eid_al_fitr_day_two(eid_al_fitr_holiday)
67
+ self._add_eid_al_fitr_day_three(eid_al_fitr_holiday)
68
+ if self._year >= 2019:
69
+ self._add_eid_al_fitr_eve(eid_al_fitr_holiday)
76
70
 
77
71
  # Arafat Day.
78
72
  self._add_arafah_day(tr("وقفة عرفة"))
79
73
 
80
74
  # Eid al-Adha.
81
75
  self._add_eid_al_adha_day(tr("عيد الأضحى"))
76
+
82
77
  # Eid al-Adha Holiday.
83
- self._add_eid_al_adha_day_two(tr("عطلة عيد الأضحى"))
84
- self._add_eid_al_adha_day_three(tr("عطلة عيد الأضحى"))
78
+ eid_al_adha_holiday = tr("عطلة عيد الأضحى")
79
+ self._add_eid_al_adha_day_two(eid_al_adha_holiday)
80
+ self._add_eid_al_adha_day_three(eid_al_adha_holiday)
85
81
 
86
82
  # Islamic New Year.
87
83
  self._add_islamic_new_year_day(tr("رأس السنة الهجرية"))
88
84
 
89
- # Leilat al-Miraj.
90
- if self._year <= 2018: # The UAE government removed this starting 2019.
85
+ if self._year <= 2018:
86
+ # Isra' and Mi'raj.
91
87
  self._add_isra_and_miraj_day(tr("ليلة المعراج"))
92
88
 
93
- # Prophet Muhammad's Birthday.
94
- if self._year <= 2019: # The UAE government removed this starting 2020.
95
- self._add_mawlid_day(tr("عيد المولد النبوي"))
89
+ # Prophet's Birthday.
90
+ self._add_mawlid_day(tr("عيد المولد النبوي"))
96
91
 
97
92
 
98
93
  class AE(UnitedArabEmirates):
@@ -109,13 +104,19 @@ class UnitedArabEmiratesIslamicHolidays(_CustomIslamicHolidays):
109
104
  2018: (AUG, 21),
110
105
  2019: (AUG, 11),
111
106
  2020: (JUL, 31),
107
+ 2021: (JUL, 20),
108
+ 2022: (JUL, 9),
109
+ 2023: (JUN, 28),
112
110
  }
113
111
 
114
112
  EID_AL_FITR_DATES = {
115
113
  2017: (JUN, 25),
116
114
  2018: (JUN, 14),
117
- 2019: (JUN, 3),
115
+ 2019: (JUN, 4),
118
116
  2020: (MAY, 24),
117
+ 2021: (MAY, 13),
118
+ 2022: (MAY, 2),
119
+ 2023: (APR, 21),
119
120
  }
120
121
 
121
122
  HIJRI_NEW_YEAR_DATES = {
@@ -123,6 +124,9 @@ class UnitedArabEmiratesIslamicHolidays(_CustomIslamicHolidays):
123
124
  2018: (SEP, 11),
124
125
  2019: (AUG, 31),
125
126
  2020: (AUG, 23),
127
+ 2021: (AUG, 12),
128
+ 2022: (JUL, 30),
129
+ 2023: (JUL, 21),
126
130
  }
127
131
 
128
132
  ISRA_AND_MIRAJ_DATES = {
@@ -134,4 +138,8 @@ class UnitedArabEmiratesIslamicHolidays(_CustomIslamicHolidays):
134
138
  2017: (NOV, 30),
135
139
  2018: (NOV, 19),
136
140
  2019: (NOV, 9),
141
+ 2020: (OCT, 29),
142
+ 2021: (OCT, 21),
143
+ 2022: (OCT, 8),
144
+ 2023: (SEP, 29),
137
145
  }
@@ -25,8 +25,14 @@ class UnitedKingdom(ObservedHolidayBase, ChristianHolidays, InternationalHoliday
25
25
  """
26
26
  References:
27
27
  - https://en.wikipedia.org/wiki/Public_holidays_in_the_United_Kingdom
28
+ - https://archive.org/details/treatiseonbanki00walk/page/334/mode/2up
28
29
  - https://www.gov.uk/bank-holidays
29
30
  - https://www.timeanddate.com/holidays/uk/
31
+
32
+ The Anniversary of the Battle of the Boyne bank holiday is proclaimed annually by the
33
+ Secretary of State for Northern Ireland.
34
+
35
+ In-Lieu observance was first provided in the Bank Holidays Extension Act 1875.
30
36
  """
31
37
 
32
38
  country = "GB"
@@ -51,9 +57,15 @@ class UnitedKingdom(ObservedHolidayBase, ChristianHolidays, InternationalHoliday
51
57
  InternationalHolidays.__init__(self)
52
58
  StaticHolidays.__init__(self, UnitedKingdomStaticHolidays)
53
59
  kwargs.setdefault("observed_rule", SAT_SUN_TO_NEXT_MON)
60
+ # Bank Holidays Extension Act 1875
61
+ kwargs.setdefault("observed_since", 1875)
54
62
  super().__init__(*args, **kwargs)
55
63
 
56
64
  def _populate_public_holidays(self) -> None:
65
+ # Bank Holidays Act 1871
66
+ if self._year <= 1871:
67
+ return None
68
+
57
69
  # Good Friday
58
70
  self._add_good_friday("Good Friday")
59
71
 
@@ -88,6 +100,10 @@ class UnitedKingdom(ObservedHolidayBase, ChristianHolidays, InternationalHoliday
88
100
  self._populate_subdiv_wls_public_holidays()
89
101
 
90
102
  def _populate_subdiv_holidays(self):
103
+ # Bank Holidays Act 1871
104
+ if self._year <= 1871:
105
+ return None
106
+
91
107
  if self.subdiv not in {"SCT", "Scotland"}:
92
108
  # New Year's Day
93
109
  if self._year >= 1975:
@@ -109,6 +125,10 @@ class UnitedKingdom(ObservedHolidayBase, ChristianHolidays, InternationalHoliday
109
125
  # Easter Monday
110
126
  self._add_easter_monday("Easter Monday")
111
127
 
128
+ # Whit Monday.
129
+ if self._year <= 1970:
130
+ self._add_whit_monday("Whit Monday")
131
+
112
132
  # Late Summer bank holiday (last Monday in August)
113
133
  if self._year >= 1971:
114
134
  self._add_holiday_last_mon_of_aug("Late Summer Bank Holiday")
@@ -121,6 +141,10 @@ class UnitedKingdom(ObservedHolidayBase, ChristianHolidays, InternationalHoliday
121
141
  # Easter Monday
122
142
  self._add_easter_monday("Easter Monday")
123
143
 
144
+ # Whit Monday.
145
+ if self._year <= 1970:
146
+ self._add_whit_monday("Whit Monday")
147
+
124
148
  # Battle of the Boyne
125
149
  self._add_observed(self._add_holiday_jul_12("Battle of the Boyne"))
126
150
 
@@ -161,6 +185,10 @@ class UnitedKingdom(ObservedHolidayBase, ChristianHolidays, InternationalHoliday
161
185
  # Easter Monday
162
186
  self._add_easter_monday("Easter Monday")
163
187
 
188
+ # Whit Monday.
189
+ if self._year <= 1970:
190
+ self._add_whit_monday("Whit Monday")
191
+
164
192
  # Late Summer bank holiday (last Monday in August)
165
193
  if self._year >= 1971:
166
194
  self._add_holiday_last_mon_of_aug("Late Summer Bank Holiday")
holidays/holiday_base.py CHANGED
@@ -209,6 +209,9 @@ class HolidayBase(Dict[date, str]):
209
209
  """The market's ISO 3166-1 alpha-2 code."""
210
210
  subdivisions: Tuple[str, ...] = ()
211
211
  """The subdivisions supported for this country (see documentation)."""
212
+ subdivisions_aliases: Dict[str, str] = {}
213
+ """Aliases for the ISO 3166-2 subdivision codes with the key as alias and
214
+ the value the ISO 3166-2 subdivision code."""
212
215
  years: Set[int]
213
216
  """The years calculated."""
214
217
  expand: bool
@@ -217,7 +220,7 @@ class HolidayBase(Dict[date, str]):
217
220
  observed: bool
218
221
  """Whether dates when public holiday are observed are included."""
219
222
  subdiv: Optional[str] = None
220
- """The subdiv requested."""
223
+ """The subdiv requested as ISO 3166-2 code or one of the aliases."""
221
224
  special_holidays: Dict[int, Union[SpecialHoliday, SubstitutedHoliday]] = {}
222
225
  """A list of the country-wide special (as opposite to regular) holidays for
223
226
  a specific year."""
@@ -262,8 +265,8 @@ class HolidayBase(Dict[date, str]):
262
265
  following Monday). This doesn't work for all countries.
263
266
 
264
267
  :param subdiv:
265
- The subdivision (e.g. state or province); not implemented for all
266
- countries (see documentation).
268
+ The subdivision (e.g. state or province) as a ISO 3166-2 code
269
+ or its alias; not implemented for all countries (see documentation).
267
270
 
268
271
  :param prov:
269
272
  *deprecated* use subdiv instead.
@@ -304,10 +307,10 @@ class HolidayBase(Dict[date, str]):
304
307
  if isinstance(subdiv, int):
305
308
  subdiv = str(subdiv)
306
309
 
310
+ subdivisions_aliases = tuple(sorted(self.subdivisions_aliases))
307
311
  # Unsupported subdivisions.
308
- if (
309
- not isinstance(self, HolidaySum)
310
- and subdiv not in self.subdivisions + self._deprecated_subdivisions
312
+ if not isinstance(self, HolidaySum) and subdiv not in (
313
+ self.subdivisions + subdivisions_aliases + self._deprecated_subdivisions
311
314
  ):
312
315
  raise NotImplementedError(
313
316
  f"Entity `{self._entity_code}` does not have subdivision {subdiv}"
@@ -326,7 +329,9 @@ class HolidayBase(Dict[date, str]):
326
329
  warnings.warn(
327
330
  "This subdivision is deprecated and will be removed after "
328
331
  "Dec, 1 2023. The list of supported subdivisions: "
329
- f"{', '.join(sorted(self.subdivisions))}.",
332
+ f"{', '.join(sorted(self.subdivisions))}; "
333
+ "the list of supported subdivisions aliases: "
334
+ f"{', '.join(subdivisions_aliases)}.",
330
335
  DeprecationWarning,
331
336
  )
332
337
 
@@ -657,19 +662,32 @@ class HolidayBase(Dict[date, str]):
657
662
 
658
663
  @cached_property
659
664
  def _normalized_subdiv(self):
660
- return self.subdiv.translate(
661
- str.maketrans(
662
- {
663
- "-": "_",
664
- " ": "_",
665
- }
665
+ return (
666
+ self.subdivisions_aliases.get(self.subdiv, self.subdiv)
667
+ .translate(
668
+ str.maketrans(
669
+ {
670
+ "-": "_",
671
+ " ": "_",
672
+ }
673
+ )
666
674
  )
667
- ).lower()
675
+ .lower()
676
+ )
668
677
 
669
678
  @cached_property
670
679
  def _sorted_categories(self):
671
680
  return sorted(self.categories)
672
681
 
682
+ @classmethod
683
+ def get_subdivision_aliases(cls) -> Dict[str, List]:
684
+ """Get subdivision aliases."""
685
+ subdivision_aliases: Dict[str, List[str]] = {s: [] for s in cls.subdivisions}
686
+ for alias, subdivision in cls.subdivisions_aliases.items():
687
+ subdivision_aliases[subdivision].append(alias)
688
+
689
+ return subdivision_aliases
690
+
673
691
  def _is_leap_year(self) -> bool:
674
692
  """
675
693
  Returns True if the year is leap. Returns False otherwise.