holidays 0.26__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 (256) hide show
  1. holidays/__init__.py +1 -1
  2. holidays/calendars/__init__.py +5 -7
  3. holidays/calendars/buddhist.py +1 -3
  4. holidays/calendars/chinese.py +1 -3
  5. holidays/calendars/custom.py +1 -3
  6. holidays/calendars/hindu.py +1 -3
  7. holidays/calendars/islamic.py +1341 -1345
  8. holidays/calendars/thai.py +217 -26
  9. holidays/countries/__init__.py +4 -0
  10. holidays/countries/albania.py +6 -17
  11. holidays/countries/andorra.py +2 -6
  12. holidays/countries/angola.py +53 -39
  13. holidays/countries/argentina.py +13 -24
  14. holidays/countries/aruba.py +109 -48
  15. holidays/countries/australia.py +31 -69
  16. holidays/countries/azerbaijan.py +30 -38
  17. holidays/countries/bahrain.py +5 -5
  18. holidays/countries/bangladesh.py +1 -3
  19. holidays/countries/belarus.py +1 -3
  20. holidays/countries/belize.py +4 -16
  21. holidays/countries/bolivia.py +2 -6
  22. holidays/countries/bosnia_and_herzegovina.py +5 -17
  23. holidays/countries/botswana.py +9 -18
  24. holidays/countries/brazil.py +2 -5
  25. holidays/countries/brunei.py +427 -0
  26. holidays/countries/bulgaria.py +2 -6
  27. holidays/countries/burkina_faso.py +141 -0
  28. holidays/countries/burundi.py +2 -5
  29. holidays/countries/cambodia.py +323 -0
  30. holidays/countries/cameroon.py +71 -77
  31. holidays/countries/canada.py +19 -28
  32. holidays/countries/chad.py +133 -0
  33. holidays/countries/chile.py +4 -11
  34. holidays/countries/china.py +1 -2
  35. holidays/countries/colombia.py +17 -15
  36. holidays/countries/costa_rica.py +2 -6
  37. holidays/countries/curacao.py +100 -46
  38. holidays/countries/cyprus.py +2 -6
  39. holidays/countries/czechia.py +4 -12
  40. holidays/countries/denmark.py +1 -3
  41. holidays/countries/dominican_republic.py +1 -3
  42. holidays/countries/ecuador.py +54 -54
  43. holidays/countries/egypt.py +2 -5
  44. holidays/countries/eswatini.py +34 -44
  45. holidays/countries/ethiopia.py +5 -14
  46. holidays/countries/finland.py +1 -3
  47. holidays/countries/gabon.py +49 -53
  48. holidays/countries/greece.py +1 -2
  49. holidays/countries/honduras.py +16 -13
  50. holidays/countries/hongkong.py +7 -8
  51. holidays/countries/hungary.py +93 -92
  52. holidays/countries/india.py +4 -11
  53. holidays/countries/indonesia.py +120 -114
  54. holidays/countries/ireland.py +5 -15
  55. holidays/countries/isle_of_man.py +9 -4
  56. holidays/countries/israel.py +6 -18
  57. holidays/countries/italy.py +1 -2
  58. holidays/countries/jamaica.py +10 -18
  59. holidays/countries/japan.py +10 -16
  60. holidays/countries/kazakhstan.py +7 -22
  61. holidays/countries/kenya.py +1 -3
  62. holidays/countries/kyrgyzstan.py +2 -5
  63. holidays/countries/latvia.py +2 -6
  64. holidays/countries/lesotho.py +52 -32
  65. holidays/countries/lithuania.py +4 -12
  66. holidays/countries/madagascar.py +3 -9
  67. holidays/countries/malawi.py +34 -26
  68. holidays/countries/malaysia.py +223 -248
  69. holidays/countries/marshall_islands.py +4 -9
  70. holidays/countries/mexico.py +1 -3
  71. holidays/countries/moldova.py +3 -6
  72. holidays/countries/monaco.py +16 -26
  73. holidays/countries/montenegro.py +23 -19
  74. holidays/countries/morocco.py +2 -5
  75. holidays/countries/mozambique.py +35 -31
  76. holidays/countries/namibia.py +54 -35
  77. holidays/countries/new_zealand.py +11 -21
  78. holidays/countries/nicaragua.py +26 -22
  79. holidays/countries/nigeria.py +6 -17
  80. holidays/countries/north_macedonia.py +3 -8
  81. holidays/countries/norway.py +1 -3
  82. holidays/countries/pakistan.py +71 -72
  83. holidays/countries/panama.py +25 -24
  84. holidays/countries/paraguay.py +54 -47
  85. holidays/countries/philippines.py +6 -2
  86. holidays/countries/poland.py +3 -9
  87. holidays/countries/portugal.py +3 -11
  88. holidays/countries/romania.py +3 -5
  89. holidays/countries/saudi_arabia.py +8 -22
  90. holidays/countries/serbia.py +19 -29
  91. holidays/countries/singapore.py +70 -74
  92. holidays/countries/slovakia.py +1 -4
  93. holidays/countries/south_africa.py +60 -62
  94. holidays/countries/south_korea.py +14 -23
  95. holidays/countries/spain.py +2 -5
  96. holidays/countries/sweden.py +1 -3
  97. holidays/countries/taiwan.py +2 -5
  98. holidays/countries/thailand.py +34 -81
  99. holidays/countries/turkey.py +1 -3
  100. holidays/countries/ukraine.py +6 -18
  101. holidays/countries/united_arab_emirates.py +21 -29
  102. holidays/countries/united_kingdom.py +47 -67
  103. holidays/countries/united_states.py +42 -72
  104. holidays/countries/vatican_city.py +1 -3
  105. holidays/countries/venezuela.py +8 -6
  106. holidays/countries/vietnam.py +6 -18
  107. holidays/countries/zambia.py +63 -33
  108. holidays/countries/zimbabwe.py +56 -37
  109. holidays/financial/european_central_bank.py +1 -3
  110. holidays/financial/ny_stock_exchange.py +31 -48
  111. holidays/groups/__init__.py +18 -0
  112. holidays/groups/buddhist.py +71 -0
  113. holidays/groups/chinese.py +235 -0
  114. holidays/groups/christian.py +483 -0
  115. holidays/groups/hindu.py +71 -0
  116. holidays/groups/international.py +157 -0
  117. holidays/groups/islamic.py +288 -0
  118. holidays/groups/thai.py +157 -0
  119. holidays/helpers.py +20 -0
  120. holidays/holiday_base.py +49 -75
  121. holidays/holiday_groups.py +11 -1190
  122. holidays/locale/am/LC_MESSAGES/ET.po +18 -15
  123. holidays/locale/ar/LC_MESSAGES/CA.po +43 -43
  124. holidays/locale/ar/LC_MESSAGES/ET.po +18 -15
  125. holidays/locale/ar/LC_MESSAGES/UA.po +16 -14
  126. holidays/locale/be/LC_MESSAGES/BY.po +9 -8
  127. holidays/locale/bg/LC_MESSAGES/BG.po +14 -12
  128. holidays/locale/da/LC_MESSAGES/DK.po +7 -6
  129. holidays/locale/el/LC_MESSAGES/CY.po +5 -3
  130. holidays/locale/el/LC_MESSAGES/GR.po +13 -13
  131. holidays/locale/en/LC_MESSAGES/CA.po +43 -43
  132. holidays/locale/en_US/LC_MESSAGES/AR.po +26 -25
  133. holidays/locale/en_US/LC_MESSAGES/AW.mo +0 -0
  134. holidays/locale/en_US/LC_MESSAGES/AW.po +87 -0
  135. holidays/locale/en_US/LC_MESSAGES/BG.po +14 -12
  136. holidays/locale/en_US/LC_MESSAGES/BN.mo +0 -0
  137. holidays/locale/en_US/LC_MESSAGES/BN.po +96 -0
  138. holidays/locale/en_US/LC_MESSAGES/BY.po +9 -8
  139. holidays/locale/en_US/LC_MESSAGES/CA.po +43 -43
  140. holidays/locale/en_US/LC_MESSAGES/CL.po +18 -18
  141. holidays/locale/en_US/LC_MESSAGES/CO.po +19 -19
  142. holidays/locale/en_US/LC_MESSAGES/CR.po +6 -5
  143. holidays/locale/en_US/LC_MESSAGES/CW.mo +0 -0
  144. holidays/locale/en_US/LC_MESSAGES/CW.po +82 -0
  145. holidays/locale/en_US/LC_MESSAGES/CY.po +5 -3
  146. holidays/locale/en_US/LC_MESSAGES/DK.po +7 -6
  147. holidays/locale/en_US/LC_MESSAGES/DO.po +12 -12
  148. holidays/locale/en_US/LC_MESSAGES/EC.po +11 -12
  149. holidays/locale/en_US/LC_MESSAGES/ET.po +18 -15
  150. holidays/locale/en_US/LC_MESSAGES/FI.po +13 -13
  151. holidays/locale/en_US/LC_MESSAGES/GR.po +13 -13
  152. holidays/locale/en_US/LC_MESSAGES/HN.mo +0 -0
  153. holidays/locale/en_US/LC_MESSAGES/HN.po +13 -13
  154. holidays/locale/en_US/LC_MESSAGES/HU.mo +0 -0
  155. holidays/locale/en_US/LC_MESSAGES/HU.po +109 -0
  156. holidays/locale/en_US/LC_MESSAGES/JP.po +19 -17
  157. holidays/locale/en_US/LC_MESSAGES/KH.mo +0 -0
  158. holidays/locale/en_US/LC_MESSAGES/KH.po +139 -0
  159. holidays/locale/en_US/LC_MESSAGES/MC.mo +0 -0
  160. holidays/locale/en_US/LC_MESSAGES/MC.po +16 -15
  161. holidays/locale/en_US/LC_MESSAGES/MD.po +5 -5
  162. holidays/locale/en_US/LC_MESSAGES/MX.po +3 -2
  163. holidays/locale/en_US/LC_MESSAGES/NI.mo +0 -0
  164. holidays/locale/en_US/LC_MESSAGES/NI.po +13 -13
  165. holidays/locale/en_US/LC_MESSAGES/NO.po +1 -1
  166. holidays/locale/en_US/LC_MESSAGES/PL.po +23 -21
  167. holidays/locale/en_US/LC_MESSAGES/PT.po +31 -31
  168. holidays/locale/en_US/LC_MESSAGES/PY.po +13 -11
  169. holidays/locale/en_US/LC_MESSAGES/RO.po +4 -3
  170. holidays/locale/en_US/LC_MESSAGES/RS.po +10 -10
  171. holidays/locale/en_US/LC_MESSAGES/SE.po +1 -1
  172. holidays/locale/en_US/LC_MESSAGES/SK.po +14 -14
  173. holidays/locale/en_US/LC_MESSAGES/TH.po +41 -41
  174. holidays/locale/en_US/LC_MESSAGES/UA.po +16 -14
  175. holidays/locale/en_US/LC_MESSAGES/VE.po +6 -6
  176. holidays/locale/es/LC_MESSAGES/AR.po +26 -25
  177. holidays/locale/es/LC_MESSAGES/CL.po +18 -18
  178. holidays/locale/es/LC_MESSAGES/CO.po +19 -19
  179. holidays/locale/es/LC_MESSAGES/CR.po +6 -5
  180. holidays/locale/es/LC_MESSAGES/DO.po +12 -12
  181. holidays/locale/es/LC_MESSAGES/EC.po +11 -12
  182. holidays/locale/es/LC_MESSAGES/HN.po +12 -12
  183. holidays/locale/es/LC_MESSAGES/MX.po +3 -2
  184. holidays/locale/es/LC_MESSAGES/NI.po +10 -10
  185. holidays/locale/es/LC_MESSAGES/PY.po +13 -11
  186. holidays/locale/es/LC_MESSAGES/VE.po +6 -6
  187. holidays/locale/fi/LC_MESSAGES/FI.po +13 -13
  188. holidays/locale/fr/LC_MESSAGES/CA.po +43 -43
  189. holidays/locale/fr/LC_MESSAGES/MC.po +15 -14
  190. holidays/locale/hu/LC_MESSAGES/HU.mo +0 -0
  191. holidays/locale/hu/LC_MESSAGES/HU.po +109 -0
  192. holidays/locale/ja/LC_MESSAGES/JP.po +19 -17
  193. holidays/locale/km/LC_MESSAGES/KH.mo +0 -0
  194. holidays/locale/km/LC_MESSAGES/KH.po +139 -0
  195. holidays/locale/ms/LC_MESSAGES/BN.mo +0 -0
  196. holidays/locale/ms/LC_MESSAGES/BN.po +96 -0
  197. holidays/locale/nl/LC_MESSAGES/AW.mo +0 -0
  198. holidays/locale/nl/LC_MESSAGES/AW.po +87 -0
  199. holidays/locale/nl/LC_MESSAGES/CW.mo +0 -0
  200. holidays/locale/nl/LC_MESSAGES/CW.po +82 -0
  201. holidays/locale/no/LC_MESSAGES/NO.po +1 -1
  202. holidays/locale/pap/LC_MESSAGES/AW.mo +0 -0
  203. holidays/locale/pap/LC_MESSAGES/AW.po +87 -0
  204. holidays/locale/pap/LC_MESSAGES/CW.mo +0 -0
  205. holidays/locale/pap/LC_MESSAGES/CW.po +82 -0
  206. holidays/locale/pl/LC_MESSAGES/PL.po +23 -21
  207. holidays/locale/pt_PT/LC_MESSAGES/PT.po +31 -31
  208. holidays/locale/ro/LC_MESSAGES/MD.po +5 -5
  209. holidays/locale/ro/LC_MESSAGES/RO.po +4 -3
  210. holidays/locale/sk/LC_MESSAGES/SK.po +14 -14
  211. holidays/locale/sr/LC_MESSAGES/RS.po +10 -10
  212. holidays/locale/sv/LC_MESSAGES/FI.po +13 -13
  213. holidays/locale/sv/LC_MESSAGES/SE.po +1 -1
  214. holidays/locale/th/LC_MESSAGES/BN.mo +0 -0
  215. holidays/locale/th/LC_MESSAGES/BN.po +96 -0
  216. holidays/locale/th/LC_MESSAGES/CA.po +43 -43
  217. holidays/locale/th/LC_MESSAGES/KH.mo +0 -0
  218. holidays/locale/th/LC_MESSAGES/KH.po +145 -0
  219. holidays/locale/th/LC_MESSAGES/TH.po +41 -41
  220. holidays/locale/uk/LC_MESSAGES/AR.po +26 -25
  221. holidays/locale/uk/LC_MESSAGES/AW.mo +0 -0
  222. holidays/locale/uk/LC_MESSAGES/AW.po +87 -0
  223. holidays/locale/uk/LC_MESSAGES/CL.po +18 -18
  224. holidays/locale/uk/LC_MESSAGES/CO.po +19 -19
  225. holidays/locale/uk/LC_MESSAGES/CR.po +6 -5
  226. holidays/locale/uk/LC_MESSAGES/CW.mo +0 -0
  227. holidays/locale/uk/LC_MESSAGES/CW.po +82 -0
  228. holidays/locale/uk/LC_MESSAGES/DK.po +7 -6
  229. holidays/locale/uk/LC_MESSAGES/DO.po +12 -12
  230. holidays/locale/uk/LC_MESSAGES/EC.po +11 -12
  231. holidays/locale/uk/LC_MESSAGES/FI.po +13 -13
  232. holidays/locale/uk/LC_MESSAGES/HN.mo +0 -0
  233. holidays/locale/uk/LC_MESSAGES/HN.po +13 -13
  234. holidays/locale/uk/LC_MESSAGES/HU.mo +0 -0
  235. holidays/locale/uk/LC_MESSAGES/HU.po +109 -0
  236. holidays/locale/uk/LC_MESSAGES/MC.po +15 -14
  237. holidays/locale/uk/LC_MESSAGES/MD.po +5 -5
  238. holidays/locale/uk/LC_MESSAGES/MX.po +3 -2
  239. holidays/locale/uk/LC_MESSAGES/NI.mo +0 -0
  240. holidays/locale/uk/LC_MESSAGES/NI.po +13 -13
  241. holidays/locale/uk/LC_MESSAGES/NO.po +1 -1
  242. holidays/locale/uk/LC_MESSAGES/PL.po +23 -21
  243. holidays/locale/uk/LC_MESSAGES/PY.po +13 -11
  244. holidays/locale/uk/LC_MESSAGES/RO.po +4 -3
  245. holidays/locale/uk/LC_MESSAGES/SE.po +1 -1
  246. holidays/locale/uk/LC_MESSAGES/SK.po +14 -14
  247. holidays/locale/uk/LC_MESSAGES/UA.po +16 -14
  248. holidays/locale/uk/LC_MESSAGES/VE.po +6 -6
  249. holidays/registry.py +7 -11
  250. holidays/utils.py +5 -15
  251. {holidays-0.26.dist-info → holidays-0.27.dist-info}/METADATA +25 -7
  252. holidays-0.27.dist-info/RECORD +449 -0
  253. holidays-0.26.dist-info/RECORD +0 -402
  254. {holidays-0.26.dist-info → holidays-0.27.dist-info}/LICENSE +0 -0
  255. {holidays-0.26.dist-info → holidays-0.27.dist-info}/WHEEL +0 -0
  256. {holidays-0.26.dist-info → holidays-0.27.dist-info}/top_level.txt +0 -0
@@ -12,11 +12,10 @@
12
12
  from datetime import date
13
13
  from datetime import timedelta as td
14
14
  from gettext import gettext as tr
15
- from typing import Optional
16
15
 
17
16
  from holidays.calendars import JULIAN_CALENDAR
18
- from holidays.constants import JAN, FEB, NOV
19
- from holidays.holiday_base import DateLike, HolidayBase
17
+ from holidays.constants import FEB
18
+ from holidays.holiday_base import HolidayBase
20
19
  from holidays.holiday_groups import ChristianHolidays, InternationalHolidays
21
20
 
22
21
 
@@ -37,48 +36,39 @@ class Serbia(HolidayBase, ChristianHolidays, InternationalHolidays):
37
36
  InternationalHolidays.__init__(self)
38
37
  super().__init__(*args, **kwargs)
39
38
 
40
- def _add_observed_holiday(
41
- self, name: str, *dt: DateLike
42
- ) -> Optional[date]:
43
- return self._add_holiday(
44
- self.tr("%s (слободан дан)") % self.tr(name), *dt
45
- )
39
+ def _add_observed(self, dt: date, days: int = +1) -> None:
40
+ if self.observed and self._is_sunday(dt):
41
+ self._add_holiday(self.tr("%s (слободан дан)") % self[dt], dt + td(days))
46
42
 
47
43
  def _populate(self, year):
48
44
  super()._populate(year)
49
45
 
50
46
  # New Year's Day.
51
47
  name = tr("Нова година")
52
- self._add_new_years_day(name)
53
- self._add_new_years_day_two(name)
54
- if self.observed and self._is_weekend(JAN, 1):
55
- self._add_observed_holiday(name, JAN, 3)
48
+ self._add_observed(self._add_new_years_day(name), days=+2)
49
+ self._add_observed(self._add_new_years_day_two(name))
56
50
 
57
51
  # Orthodox Christmas.
58
52
  self._add_christmas_day(tr("Божић"))
59
53
 
60
54
  # Statehood Day.
61
55
  name = tr("Дан државности Србије")
62
- self._add_holiday(name, FEB, 15)
63
- self._add_holiday(name, FEB, 16)
64
- if self.observed and self._is_weekend(FEB, 15):
65
- self._add_observed_holiday(name, FEB, 17)
56
+ self._add_observed(self._add_holiday(name, FEB, 15), days=+2)
57
+ self._add_observed(self._add_holiday(name, FEB, 16))
66
58
 
67
59
  # International Workers' Day.
68
60
  name = tr("Празник рада")
69
61
  may_1 = self._add_labor_day(name)
70
- may_2 = self._add_holiday(name, may_1 + td(days=+1))
71
- if self.observed and self._is_weekend(may_1):
72
- self._add_observed_holiday(
73
- name,
74
- may_2 + td(days=+2 if may_2 == self._easter_sunday else +1),
75
- )
76
-
77
- # Armistice Day.
78
- name = tr("Дан примирја у Првом светском рату")
79
- nov_11 = self._add_holiday(name, NOV, 11)
80
- if self.observed and self._is_sunday(nov_11):
81
- self._add_holiday(name, nov_11 + td(days=+1))
62
+ self._add_observed(may_1, days=+2)
63
+ self._add_observed(
64
+ self._add_holiday(name, may_1 + td(days=+1)),
65
+ days=+2 if may_1 + td(days=+1) == self._easter_sunday else +1,
66
+ )
67
+
68
+ self._add_observed(
69
+ # Armistice Day.
70
+ self._add_remembrance_day(tr("Дан примирја у Првом светском рату"))
71
+ )
82
72
 
83
73
  # Good Friday.
84
74
  self._add_good_friday(tr("Велики петак"))
@@ -11,15 +11,22 @@
11
11
 
12
12
  from datetime import timedelta as td
13
13
 
14
- from holidays.calendars import _CustomBuddhistCalendar, _CustomChineseCalendar
15
- from holidays.calendars import _CustomIslamicCalendar, _CustomHinduCalendar
16
- from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP
17
- from holidays.constants import OCT, NOV, DEC
14
+ from holidays.calendars import (
15
+ _CustomBuddhistCalendar,
16
+ _CustomChineseCalendar,
17
+ _CustomIslamicCalendar,
18
+ _CustomHinduCalendar,
19
+ )
20
+ from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
18
21
  from holidays.holiday_base import HolidayBase
19
- from holidays.holiday_groups import BuddhistCalendarHolidays
20
- from holidays.holiday_groups import ChineseCalendarHolidays, ChristianHolidays
21
- from holidays.holiday_groups import HinduCalendarHolidays
22
- from holidays.holiday_groups import InternationalHolidays, IslamicHolidays
22
+ from holidays.holiday_groups import (
23
+ BuddhistCalendarHolidays,
24
+ ChineseCalendarHolidays,
25
+ ChristianHolidays,
26
+ HinduCalendarHolidays,
27
+ InternationalHolidays,
28
+ IslamicHolidays,
29
+ )
23
30
 
24
31
 
25
32
  class Singapore(
@@ -33,9 +40,9 @@ class Singapore(
33
40
  ):
34
41
  country = "SG"
35
42
  special_holidays = {
36
- 2001: ((NOV, 3, "Polling Day"),),
37
- 2006: ((MAY, 6, "Polling Day"),),
38
- 2011: ((MAY, 7, "Polling Day"),),
43
+ 2001: (NOV, 3, "Polling Day"),
44
+ 2006: (MAY, 6, "Polling Day"),
45
+ 2011: (MAY, 7, "Polling Day"),
39
46
  2015: (
40
47
  # SG50 Public holiday
41
48
  # Announced on 14 March 2015
@@ -43,7 +50,7 @@ class Singapore(
43
50
  (AUG, 7, "SG50 Public Holiday"),
44
51
  (SEP, 11, "Polling Day"),
45
52
  ),
46
- 2020: ((JUL, 10, "Polling Day"),),
53
+ 2020: (JUL, 10, "Polling Day"),
47
54
  }
48
55
 
49
56
  def __init__(self, *args, **kwargs) -> None:
@@ -101,12 +108,8 @@ class Singapore(
101
108
 
102
109
  # Chinese New Year (two days)
103
110
  name = "Chinese New Year"
104
- observed_dates.add(
105
- self._add_chinese_new_years_day(name) # type: ignore[arg-type]
106
- )
107
- observed_dates.add(
108
- self._add_chinese_new_years_day_two(name) # type: ignore[arg-type]
109
- )
111
+ observed_dates.add(self._add_chinese_new_years_day(name)) # type: ignore[arg-type]
112
+ observed_dates.add(self._add_chinese_new_years_day_two(name)) # type: ignore[arg-type]
110
113
 
111
114
  # Hari Raya Puasa (Eid al-Fitr)
112
115
  observed_dates.update(self._add_eid_al_fitr_day("Hari Raya Puasa"))
@@ -130,19 +133,13 @@ class Singapore(
130
133
  observed_dates.add(self._add_labor_day("Labour Day"))
131
134
 
132
135
  # Vesak Day
133
- observed_dates.add(
134
- self._add_vesak("Vesak Day") # type: ignore[arg-type]
135
- )
136
+ observed_dates.add(self._add_vesak("Vesak Day")) # type: ignore[arg-type]
136
137
 
137
138
  # National Day
138
- observed_dates.add(
139
- self._add_holiday("National Day", AUG, 9) # type: ignore[arg-type]
140
- )
139
+ observed_dates.add(self._add_holiday("National Day", AUG, 9)) # type: ignore[arg-type]
141
140
 
142
141
  # Deepavali (Diwali)
143
- observed_dates.add(
144
- self._add_diwali("Deepavali") # type: ignore[arg-type]
145
- )
142
+ observed_dates.add(self._add_diwali("Deepavali")) # type: ignore[arg-type]
146
143
 
147
144
  # Christmas Day
148
145
  observed_dates.add(self._add_christmas_day("Christmas Day"))
@@ -163,8 +160,7 @@ class Singapore(
163
160
  continue
164
161
  self._add_holiday(
165
162
  "%s (Observed)" % self[dt],
166
- dt
167
- + td(days=2 if dt + td(days=+1) in observed_dates else 1),
163
+ dt + td(days=2 if dt + td(days=+1) in observed_dates else 1),
168
164
  )
169
165
 
170
166
  # special case (observed from previous year)
@@ -266,53 +262,53 @@ class SingaporeHinduCalendar(_CustomHinduCalendar):
266
262
 
267
263
  class SingaporeIslamicCalendar(_CustomIslamicCalendar):
268
264
  EID_AL_ADHA_DATES = {
269
- 2001: ((MAR, 6),),
270
- 2002: ((FEB, 23),),
271
- 2003: ((FEB, 12),),
272
- 2004: ((FEB, 1),),
273
- 2005: ((JAN, 21),),
265
+ 2001: (MAR, 6),
266
+ 2002: (FEB, 23),
267
+ 2003: (FEB, 12),
268
+ 2004: (FEB, 1),
269
+ 2005: (JAN, 21),
274
270
  2006: ((JAN, 10), (DEC, 31)),
275
- 2007: ((DEC, 20),),
276
- 2008: ((DEC, 8),),
277
- 2009: ((NOV, 27),),
278
- 2010: ((NOV, 17),),
279
- 2011: ((NOV, 6),),
280
- 2012: ((OCT, 26),),
281
- 2013: ((OCT, 15),),
282
- 2014: ((OCT, 5),),
283
- 2015: ((SEP, 24),),
284
- 2016: ((SEP, 12),),
285
- 2017: ((SEP, 1),),
286
- 2018: ((AUG, 22),),
287
- 2019: ((AUG, 11),),
288
- 2020: ((JUL, 31),),
289
- 2021: ((JUL, 20),),
290
- 2022: ((JUL, 10),),
291
- 2023: ((JUN, 29),),
271
+ 2007: (DEC, 20),
272
+ 2008: (DEC, 8),
273
+ 2009: (NOV, 27),
274
+ 2010: (NOV, 17),
275
+ 2011: (NOV, 6),
276
+ 2012: (OCT, 26),
277
+ 2013: (OCT, 15),
278
+ 2014: (OCT, 5),
279
+ 2015: (SEP, 24),
280
+ 2016: (SEP, 12),
281
+ 2017: (SEP, 1),
282
+ 2018: (AUG, 22),
283
+ 2019: (AUG, 11),
284
+ 2020: (JUL, 31),
285
+ 2021: (JUL, 20),
286
+ 2022: (JUL, 10),
287
+ 2023: (JUN, 29),
292
288
  }
293
289
 
294
290
  EID_AL_FITR_DATES = {
295
- 2001: ((DEC, 16),),
296
- 2002: ((DEC, 6),),
297
- 2003: ((NOV, 25),),
298
- 2004: ((NOV, 14),),
299
- 2005: ((NOV, 3),),
300
- 2006: ((OCT, 24),),
301
- 2007: ((OCT, 13),),
302
- 2008: ((OCT, 1),),
303
- 2009: ((SEP, 20),),
304
- 2010: ((SEP, 10),),
305
- 2011: ((AUG, 30),),
306
- 2012: ((AUG, 19),),
307
- 2013: ((AUG, 8),),
308
- 2014: ((JUL, 28),),
309
- 2015: ((JUL, 17),),
310
- 2016: ((JUL, 6),),
311
- 2017: ((JUN, 25),),
312
- 2018: ((JUN, 15),),
313
- 2019: ((JUN, 5),),
314
- 2020: ((MAY, 24),),
315
- 2021: ((MAY, 13),),
316
- 2022: ((MAY, 3),),
317
- 2023: ((APR, 22),),
291
+ 2001: (DEC, 16),
292
+ 2002: (DEC, 6),
293
+ 2003: (NOV, 25),
294
+ 2004: (NOV, 14),
295
+ 2005: (NOV, 3),
296
+ 2006: (OCT, 24),
297
+ 2007: (OCT, 13),
298
+ 2008: (OCT, 1),
299
+ 2009: (SEP, 20),
300
+ 2010: (SEP, 10),
301
+ 2011: (AUG, 30),
302
+ 2012: (AUG, 19),
303
+ 2013: (AUG, 8),
304
+ 2014: (JUL, 28),
305
+ 2015: (JUL, 17),
306
+ 2016: (JUL, 6),
307
+ 2017: (JUN, 25),
308
+ 2018: (JUN, 15),
309
+ 2019: (JUN, 5),
310
+ 2020: (MAY, 24),
311
+ 2021: (MAY, 13),
312
+ 2022: (MAY, 3),
313
+ 2023: (APR, 22),
318
314
  }
@@ -54,10 +54,7 @@ class Slovakia(HolidayBase, ChristianHolidays, InternationalHolidays):
54
54
 
55
55
  # Epiphany.
56
56
  self._add_epiphany_day(
57
- tr(
58
- "Zjavenie Pána (Traja králi a "
59
- "vianočnýsviatok pravoslávnych kresťanov)"
60
- )
57
+ tr("Zjavenie Pána (Traja králi a vianočnýsviatok pravoslávnych kresťanov)")
61
58
  )
62
59
 
63
60
  # Good Friday.
@@ -12,15 +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, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT
19
- from holidays.constants import NOV, DEC, MON, FRI
16
+ from holidays.constants import JAN, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC, MON, FRI
20
17
  from holidays.holiday_base import HolidayBase
18
+ from holidays.holiday_groups import ChristianHolidays, InternationalHolidays
21
19
 
22
20
 
23
- class SouthAfrica(HolidayBase):
21
+ class SouthAfrica(HolidayBase, ChristianHolidays, InternationalHolidays):
24
22
  """
25
23
  http://www.gov.za/about-sa/public-holidays
26
24
  https://en.wikipedia.org/wiki/Public_holidays_in_South_Africa
@@ -32,46 +30,48 @@ class SouthAfrica(HolidayBase):
32
30
  (JUN, 2, "National and provincial government elections"),
33
31
  (DEC, 31, "Y2K changeover"),
34
32
  ),
35
- 2000: ((JAN, 2, "Y2K changeover"),),
36
- 2004: ((APR, 14, "National and provincial government elections"),),
37
- 2006: ((MAR, 1, "Local government elections"),),
38
- 2008: ((MAY, 2, "Public holiday by presidential decree"),),
39
- 2009: ((APR, 22, "National and provincial government elections"),),
33
+ 2000: (JAN, 2, "Y2K changeover"),
34
+ 2004: (APR, 14, "National and provincial government elections"),
35
+ 2006: (MAR, 1, "Local government elections"),
36
+ 2008: (MAY, 2, "Public holiday by presidential decree"),
37
+ 2009: (APR, 22, "National and provincial government elections"),
40
38
  2011: (
41
39
  (MAY, 18, "Local government elections"),
42
40
  (DEC, 27, "Public holiday by presidential decree"),
43
41
  ),
44
- 2014: ((MAY, 7, "National and provincial government elections"),),
42
+ 2014: (MAY, 7, "National and provincial government elections"),
45
43
  2016: (
46
44
  (AUG, 3, "Local government elections"),
47
45
  (DEC, 27, "Public holiday by presidential decree"),
48
46
  ),
49
- 2019: ((MAY, 8, "National and provincial government elections"),),
50
- 2021: ((NOV, 1, "Municipal elections"),),
51
- 2022: ((DEC, 27, "Public holiday by presidential decree"),),
47
+ 2019: (MAY, 8, "National and provincial government elections"),
48
+ 2021: (NOV, 1, "Municipal elections"),
49
+ 2022: (DEC, 27, "Public holiday by presidential decree"),
52
50
  }
53
51
 
54
- def _populate(self, year):
55
- def _add_with_observed(hol_date: date, hol_name: str) -> None:
56
- # As of 1995/1/1, whenever a public holiday falls on a Sunday,
57
- # it rolls over to the following Monday
58
- self[hol_date] = hol_name
59
- if self.observed and self._is_sunday(hol_date) and year >= 1995:
60
- self[hol_date + td(days=+1)] = f"{hol_name} (Observed)"
52
+ def __init__(self, *args, **kwargs):
53
+ ChristianHolidays.__init__(self)
54
+ InternationalHolidays.__init__(self)
55
+ super().__init__(*args, **kwargs)
56
+
57
+ def _add_observed(self, dt: date) -> None:
58
+ # As of 1995/1/1, whenever a public holiday falls on a Sunday,
59
+ # it rolls over to the following Monday
60
+ if self.observed and self._is_sunday(dt) and self._year >= 1995:
61
+ self._add_holiday("%s (Observed)" % self[dt], dt + td(days=+1))
61
62
 
63
+ def _populate(self, year):
62
64
  # Observed since 1910, with a few name changes
63
65
  if year <= 1909:
64
66
  return None
65
67
 
66
68
  super()._populate(year)
67
69
 
68
- _add_with_observed(date(year, JAN, 1), "New Year's Day")
70
+ self._add_observed(self._add_new_years_day("New Year's Day"))
69
71
 
70
- easter_date = easter(year)
71
- self[easter_date + td(days=-2)] = "Good Friday"
72
- self[easter_date + td(days=+1)] = (
73
- "Family Day" if year >= 1980 else "Easter Monday"
74
- )
72
+ self._add_good_friday("Good Friday")
73
+
74
+ self._add_easter_monday("Family Day" if year >= 1980 else "Easter Monday")
75
75
 
76
76
  if year <= 1951:
77
77
  name = "Dingaan's Day"
@@ -81,72 +81,70 @@ class SouthAfrica(HolidayBase):
81
81
  name = "Day of the Vow"
82
82
  else:
83
83
  name = "Day of Reconciliation"
84
- _add_with_observed(date(year, DEC, 16), name)
84
+ self._add_observed(self._add_holiday(name, DEC, 16))
85
85
 
86
- self[date(year, DEC, 25)] = "Christmas Day"
86
+ self._add_christmas_day("Christmas Day")
87
87
 
88
- _add_with_observed(
89
- date(year, DEC, 26),
90
- "Day of Goodwill" if year >= 1980 else "Boxing Day",
88
+ self._add_observed(
89
+ self._add_christmas_day_two(
90
+ "Day of Goodwill" if year >= 1980 else "Boxing Day",
91
+ )
91
92
  )
92
93
 
93
- # Observed since 1995/1/1
94
94
  if year >= 1995:
95
- _add_with_observed(date(year, MAR, 21), "Human Rights Day")
96
- _add_with_observed(date(year, APR, 27), "Freedom Day")
97
- _add_with_observed(date(year, MAY, 1), "Workers' Day")
98
- _add_with_observed(date(year, JUN, 16), "Youth Day")
99
- _add_with_observed(date(year, AUG, 9), "National Women's Day")
100
- _add_with_observed(date(year, SEP, 24), "Heritage Day")
95
+ self._add_observed(self._add_holiday("Human Rights Day", MAR, 21))
96
+
97
+ self._add_observed(self._add_holiday("Freedom Day", APR, 27))
98
+
99
+ self._add_observed(self._add_labor_day("Workers' Day"))
100
+
101
+ self._add_observed(self._add_holiday("Youth Day", JUN, 16))
102
+
103
+ self._add_observed(self._add_holiday("National Women's Day", AUG, 9))
104
+
105
+ self._add_observed(self._add_holiday("Heritage Day", SEP, 24))
101
106
 
102
107
  # Special holiday http://tiny.cc/za_y2k
103
108
  if self.observed and year == 2000:
104
- self[date(2000, JAN, 3)] = "Y2K changeover (Observed)"
109
+ self._add_holiday("Y2K changeover (Observed)", JAN, 3)
105
110
 
106
111
  # Historic public holidays no longer observed
107
112
  if 1952 <= year <= 1973:
108
- self[date(year, APR, 6)] = "Van Riebeeck's Day"
113
+ self._add_holiday("Van Riebeeck's Day", APR, 6)
109
114
  elif 1980 <= year <= 1994:
110
- self[date(year, APR, 6)] = "Founder's Day"
115
+ self._add_holiday("Founder's Day", APR, 6)
111
116
 
112
117
  if 1987 <= year <= 1989:
113
- # observed on first Friday in May
114
- self[_get_nth_weekday_of_month(1, FRI, MAY, year)] = "Workers' Day"
118
+ self._add_holiday("Workers' Day", _get_nth_weekday_of_month(1, FRI, MAY, year))
115
119
 
116
120
  if year <= 1993:
117
- self[easter_date + td(days=+40)] = "Ascension Day"
121
+ self._add_ascension_thursday("Ascension Day")
118
122
 
119
123
  if year <= 1951:
120
- self[date(year, MAY, 24)] = "Empire Day"
124
+ self._add_holiday("Empire Day", MAY, 24)
121
125
 
122
126
  if year <= 1960:
123
- self[date(year, MAY, 31)] = "Union Day"
127
+ self._add_holiday("Union Day", MAY, 31)
124
128
  elif year <= 1993:
125
- self[date(year, MAY, 31)] = "Republic Day"
129
+ self._add_holiday("Republic Day", MAY, 31)
126
130
 
127
131
  if 1952 <= year <= 1960:
128
- # observed on second Monday in July
129
- self[
130
- _get_nth_weekday_of_month(2, MON, JUL, year)
131
- ] = "Queen's Birthday"
132
+ self._add_holiday(
133
+ "Queen's Birthday",
134
+ _get_nth_weekday_of_month(2, MON, JUL, year),
135
+ )
132
136
 
133
137
  if 1961 <= year <= 1973:
134
- self[date(year, JUL, 10)] = "Family Day"
138
+ self._add_holiday("Family Day", JUL, 10)
135
139
 
136
140
  if year <= 1951:
137
- # observed on first Monday in August
138
- self[
139
- _get_nth_weekday_of_month(1, MON, AUG, year)
140
- ] = "King's Birthday"
141
+ self._add_holiday("King's Birthday", _get_nth_weekday_of_month(1, MON, AUG, year))
141
142
 
142
143
  if 1952 <= year <= 1979:
143
- # observed on first Monday in September
144
- self[
145
- _get_nth_weekday_of_month(1, MON, SEP, year)
146
- ] = "Settlers' Day"
144
+ self._add_holiday("Settlers' Day", _get_nth_weekday_of_month(1, MON, SEP, year))
147
145
 
148
146
  if 1952 <= year <= 1993:
149
- self[date(year, OCT, 10)] = "Kruger Day"
147
+ self._add_holiday("Kruger Day", OCT, 10)
150
148
 
151
149
 
152
150
  class ZA(SouthAfrica):
@@ -14,12 +14,14 @@ import warnings
14
14
  from datetime import date
15
15
  from datetime import timedelta as td
16
16
 
17
- from holidays.calendars import _ChineseLunisolar, _CustomCalendar
18
- from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP
19
- from holidays.constants import OCT, SAT, SUN
17
+ from holidays.calendars import _CustomChineseCalendar
18
+ from holidays.constants import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, SAT, SUN
20
19
  from holidays.holiday_base import HolidayBase
21
- from holidays.holiday_groups import ChineseCalendarHolidays, ChristianHolidays
22
- from holidays.holiday_groups import InternationalHolidays
20
+ from holidays.holiday_groups import (
21
+ ChineseCalendarHolidays,
22
+ ChristianHolidays,
23
+ InternationalHolidays,
24
+ )
23
25
 
24
26
 
25
27
  class SouthKorea(
@@ -50,9 +52,7 @@ class SouthKorea(
50
52
  }
51
53
 
52
54
  def __init__(self, *args, **kwargs):
53
- ChineseCalendarHolidays.__init__(
54
- self, calendar=SouthKoreaLunisolarCalendar()
55
- )
55
+ ChineseCalendarHolidays.__init__(self, calendar=SouthKoreaLunisolarCalendar())
56
56
  ChristianHolidays.__init__(self)
57
57
  InternationalHolidays.__init__(self)
58
58
  super().__init__(*args, **kwargs)
@@ -94,8 +94,7 @@ class SouthKorea(
94
94
  if include_sat:
95
95
  target_weekday.add(SAT)
96
96
  if (
97
- hol_date.weekday() in target_weekday
98
- or len(self.get_list(hol_date)) > 1
97
+ hol_date.weekday() in target_weekday or len(self.get_list(hol_date)) > 1
99
98
  ) and hol_date.year >= since:
100
99
  hol_date += td(days=+1)
101
100
  while hol_date.weekday() in target_weekday or hol_date in self:
@@ -129,9 +128,7 @@ class SouthKorea(
129
128
  )
130
129
 
131
130
  # Independence Movement Day
132
- self._add_with_alt_holiday(
133
- "Independence Movement Day", date(year, MAR, 1)
134
- )
131
+ self._add_with_alt_holiday("Independence Movement Day", date(year, MAR, 1))
135
132
 
136
133
  # Tree Planting Day
137
134
  # removed from holiday since 2006
@@ -149,9 +146,7 @@ class SouthKorea(
149
146
 
150
147
  # Children's Day
151
148
  if year >= 1975:
152
- self._add_with_alt_holiday(
153
- "Children's Day", date(year, MAY, 5), since=2015
154
- )
149
+ self._add_with_alt_holiday("Children's Day", date(year, MAY, 5), since=2015)
155
150
 
156
151
  # Labour Day
157
152
  name = "Labour Day"
@@ -187,9 +182,7 @@ class SouthKorea(
187
182
  )
188
183
 
189
184
  # National Foundation Day
190
- self._add_with_alt_holiday(
191
- "National Foundation Day", date(year, OCT, 3)
192
- )
185
+ self._add_with_alt_holiday("National Foundation Day", date(year, OCT, 3))
193
186
 
194
187
  # Hangeul Day
195
188
  if year <= 1990 or year >= 2013:
@@ -197,9 +190,7 @@ class SouthKorea(
197
190
 
198
191
  # Christmas Day
199
192
  name = "Christmas Day"
200
- self._add_with_alt_holiday(
201
- name, self._add_christmas_day(name), add_hol=False, since=2023
202
- )
193
+ self._add_with_alt_holiday(name, self._add_christmas_day(name), add_hol=False, since=2023)
203
194
 
204
195
 
205
196
  class Korea(SouthKorea):
@@ -220,7 +211,7 @@ class KOR(SouthKorea):
220
211
  pass
221
212
 
222
213
 
223
- class SouthKoreaLunisolarCalendar(_CustomCalendar, _ChineseLunisolar):
214
+ class SouthKoreaLunisolarCalendar(_CustomChineseCalendar):
224
215
  BUDDHA_BIRTHDAY_DATES = {
225
216
  1931: (MAY, 25),
226
217
  1968: (MAY, 5),
@@ -15,13 +15,10 @@ from typing import Optional
15
15
 
16
16
  from holidays.constants import FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, DEC
17
17
  from holidays.holiday_base import HolidayBase
18
- from holidays.holiday_groups import ChristianHolidays, IslamicHolidays
19
- from holidays.holiday_groups import InternationalHolidays
18
+ from holidays.holiday_groups import ChristianHolidays, IslamicHolidays, InternationalHolidays
20
19
 
21
20
 
22
- class Spain(
23
- HolidayBase, ChristianHolidays, IslamicHolidays, InternationalHolidays
24
- ):
21
+ class Spain(HolidayBase, ChristianHolidays, IslamicHolidays, InternationalHolidays):
25
22
  """
26
23
  References:
27
24
  - https://administracion.gob.es/pag_Home/atencionCiudadana/calendarios.html # noqa: E501
@@ -127,9 +127,7 @@ class Sweden(HolidayBase, ChristianHolidays, InternationalHolidays):
127
127
  # Optionally add all Sundays of the year.
128
128
  begin = _get_nth_weekday_from(1, SUN, date(year, JAN, 1))
129
129
  end = date(year, DEC, 31)
130
- for dt in (
131
- begin + td(days=n) for n in range(0, (end - begin).days + 1, 7)
132
- ):
130
+ for dt in (begin + td(days=n) for n in range(0, (end - begin).days + 1, 7)):
133
131
  # Sunday.
134
132
  self._add_holiday(tr("Söndag"), dt)
135
133
 
@@ -11,8 +11,7 @@
11
11
 
12
12
  from holidays.constants import FEB, APR, OCT
13
13
  from holidays.holiday_base import HolidayBase
14
- from holidays.holiday_groups import ChineseCalendarHolidays
15
- from holidays.holiday_groups import InternationalHolidays
14
+ from holidays.holiday_groups import ChineseCalendarHolidays, InternationalHolidays
16
15
 
17
16
 
18
17
  class Taiwan(HolidayBase, ChineseCalendarHolidays, InternationalHolidays):
@@ -33,9 +32,7 @@ class Taiwan(HolidayBase, ChineseCalendarHolidays, InternationalHolidays):
33
32
  super()._populate(year)
34
33
 
35
34
  # New Year's Day
36
- self._add_new_years_day(
37
- "Founding of the Republic of China (New Year's Day)"
38
- )
35
+ self._add_new_years_day("Founding of the Republic of China (New Year's Day)")
39
36
 
40
37
  self._add_chinese_new_years_eve("Chinese New Year's Eve")
41
38