holidays 0.73__py3-none-any.whl → 0.75__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 (251) hide show
  1. holidays/calendars/__init__.py +1 -1
  2. holidays/calendars/balinese_saka.py +1 -1
  3. holidays/calendars/hindu.py +26 -26
  4. holidays/calendars/islamic.py +161 -0
  5. holidays/calendars/thai.py +2 -2
  6. holidays/constants.py +9 -2
  7. holidays/countries/__init__.py +202 -176
  8. holidays/countries/afghanistan.py +2 -2
  9. holidays/countries/aland_islands.py +63 -0
  10. holidays/countries/albania.py +3 -3
  11. holidays/countries/algeria.py +3 -3
  12. holidays/countries/andorra.py +1 -1
  13. holidays/countries/angola.py +11 -11
  14. holidays/countries/anguilla.py +175 -0
  15. holidays/countries/antigua_and_barbuda.py +10 -10
  16. holidays/countries/argentina.py +107 -104
  17. holidays/countries/armenia.py +2 -2
  18. holidays/countries/aruba.py +7 -7
  19. holidays/countries/australia.py +18 -18
  20. holidays/countries/azerbaijan.py +14 -14
  21. holidays/countries/bahamas.py +9 -9
  22. holidays/countries/bahrain.py +3 -3
  23. holidays/countries/bangladesh.py +1 -1
  24. holidays/countries/barbados.py +7 -7
  25. holidays/countries/belarus.py +9 -9
  26. holidays/countries/belgium.py +3 -3
  27. holidays/countries/belize.py +3 -3
  28. holidays/countries/benin.py +199 -0
  29. holidays/countries/bermuda.py +152 -0
  30. holidays/countries/bolivia.py +8 -8
  31. holidays/countries/bosnia_and_herzegovina.py +4 -4
  32. holidays/countries/botswana.py +4 -4
  33. holidays/countries/brazil.py +4 -4
  34. holidays/countries/british_virgin_islands.py +205 -0
  35. holidays/countries/brunei.py +43 -43
  36. holidays/countries/bulgaria.py +3 -3
  37. holidays/countries/burkina_faso.py +1 -1
  38. holidays/countries/burundi.py +2 -2
  39. holidays/countries/cambodia.py +6 -6
  40. holidays/countries/cameroon.py +3 -3
  41. holidays/countries/canada.py +9 -9
  42. holidays/countries/chad.py +2 -2
  43. holidays/countries/chile.py +8 -8
  44. holidays/countries/china.py +31 -31
  45. holidays/countries/cocos_islands.py +6 -6
  46. holidays/countries/colombia.py +7 -7
  47. holidays/countries/congo.py +2 -2
  48. holidays/countries/cook_islands.py +148 -0
  49. holidays/countries/costa_rica.py +1 -1
  50. holidays/countries/croatia.py +1 -1
  51. holidays/countries/cuba.py +9 -9
  52. holidays/countries/curacao.py +2 -2
  53. holidays/countries/cyprus.py +1 -1
  54. holidays/countries/czechia.py +3 -3
  55. holidays/countries/denmark.py +2 -2
  56. holidays/countries/djibouti.py +1 -1
  57. holidays/countries/dominica.py +11 -11
  58. holidays/countries/dominican_republic.py +2 -2
  59. holidays/countries/ecuador.py +1 -1
  60. holidays/countries/egypt.py +1 -1
  61. holidays/countries/el_salvador.py +3 -3
  62. holidays/countries/equatorial_guinea.py +150 -0
  63. holidays/countries/eswatini.py +3 -3
  64. holidays/countries/ethiopia.py +6 -6
  65. holidays/countries/fiji.py +12 -12
  66. holidays/countries/finland.py +200 -36
  67. holidays/countries/france.py +1 -1
  68. holidays/countries/french_southern_territories.py +1 -5
  69. holidays/countries/gabon.py +4 -4
  70. holidays/countries/georgia.py +2 -2
  71. holidays/countries/germany.py +3 -3
  72. holidays/countries/ghana.py +2 -2
  73. holidays/countries/greece.py +1 -1
  74. holidays/countries/greenland.py +2 -2
  75. holidays/countries/grenada.py +1 -1
  76. holidays/countries/guatemala.py +4 -4
  77. holidays/countries/guernsey.py +31 -31
  78. holidays/countries/guinea.py +6 -6
  79. holidays/countries/guyana.py +279 -0
  80. holidays/countries/haiti.py +3 -3
  81. holidays/countries/honduras.py +2 -2
  82. holidays/countries/hongkong.py +4 -4
  83. holidays/countries/hungary.py +98 -16
  84. holidays/countries/iceland.py +1 -1
  85. holidays/countries/india.py +8 -8
  86. holidays/countries/indonesia.py +46 -46
  87. holidays/countries/iran.py +2 -2
  88. holidays/countries/ireland.py +1 -1
  89. holidays/countries/italy.py +1 -1
  90. holidays/countries/ivory_coast.py +6 -6
  91. holidays/countries/jamaica.py +1 -1
  92. holidays/countries/japan.py +1 -1
  93. holidays/countries/jersey.py +23 -23
  94. holidays/countries/jordan.py +3 -3
  95. holidays/countries/kazakhstan.py +45 -45
  96. holidays/countries/kenya.py +13 -13
  97. holidays/countries/kuwait.py +4 -4
  98. holidays/countries/kyrgyzstan.py +1 -1
  99. holidays/countries/laos.py +7 -7
  100. holidays/countries/latvia.py +2 -2
  101. holidays/countries/lesotho.py +2 -2
  102. holidays/countries/liechtenstein.py +1 -1
  103. holidays/countries/lithuania.py +1 -1
  104. holidays/countries/macau.py +19 -19
  105. holidays/countries/madagascar.py +2 -2
  106. holidays/countries/malawi.py +2 -2
  107. holidays/countries/malaysia.py +6 -6
  108. holidays/countries/maldives.py +3 -3
  109. holidays/countries/malta.py +6 -6
  110. holidays/countries/marshall_islands.py +2 -2
  111. holidays/countries/mauritania.py +2 -2
  112. holidays/countries/mexico.py +4 -4
  113. holidays/countries/micronesia.py +205 -0
  114. holidays/countries/monaco.py +1 -1
  115. holidays/countries/montenegro.py +3 -3
  116. holidays/countries/morocco.py +4 -4
  117. holidays/countries/namibia.py +85 -26
  118. holidays/countries/nauru.py +129 -0
  119. holidays/countries/nepal.py +16 -16
  120. holidays/countries/netherlands.py +1 -1
  121. holidays/countries/new_zealand.py +2 -2
  122. holidays/countries/nicaragua.py +2 -2
  123. holidays/countries/niger.py +320 -0
  124. holidays/countries/nigeria.py +1 -1
  125. holidays/countries/north_macedonia.py +268 -16
  126. holidays/countries/norway.py +38 -5
  127. holidays/countries/oman.py +12 -12
  128. holidays/countries/pakistan.py +7 -7
  129. holidays/countries/palau.py +7 -7
  130. holidays/countries/panama.py +5 -5
  131. holidays/countries/papua_new_guinea.py +15 -15
  132. holidays/countries/paraguay.py +7 -7
  133. holidays/countries/peru.py +1 -1
  134. holidays/countries/philippines.py +18 -18
  135. holidays/countries/poland.py +1 -1
  136. holidays/countries/portugal.py +5 -5
  137. holidays/countries/qatar.py +7 -7
  138. holidays/countries/romania.py +1 -1
  139. holidays/countries/russia.py +28 -28
  140. holidays/countries/saint_kitts_and_nevis.py +16 -16
  141. holidays/countries/saint_lucia.py +3 -3
  142. holidays/countries/samoa.py +3 -3
  143. holidays/countries/sao_tome_and_principe.py +2 -2
  144. holidays/countries/saudi_arabia.py +3 -3
  145. holidays/countries/senegal.py +193 -0
  146. holidays/countries/seychelles.py +15 -15
  147. holidays/countries/sierra_leone.py +5 -5
  148. holidays/countries/singapore.py +12 -8
  149. holidays/countries/slovakia.py +1 -1
  150. holidays/countries/slovenia.py +3 -3
  151. holidays/countries/solomon_islands.py +220 -0
  152. holidays/countries/south_africa.py +4 -4
  153. holidays/countries/south_korea.py +7 -7
  154. holidays/countries/spain.py +18 -18
  155. holidays/countries/sri_lanka.py +26 -26
  156. holidays/countries/suriname.py +5 -5
  157. holidays/countries/svalbard_and_jan_mayen.py +47 -0
  158. holidays/countries/sweden.py +2 -2
  159. holidays/countries/switzerland.py +1 -1
  160. holidays/countries/taiwan.py +41 -41
  161. holidays/countries/tanzania.py +15 -15
  162. holidays/countries/thailand.py +85 -85
  163. holidays/countries/timor_leste.py +106 -104
  164. holidays/countries/togo.py +3 -3
  165. holidays/countries/tonga.py +16 -16
  166. holidays/countries/trinidad_and_tobago.py +4 -4
  167. holidays/countries/tunisia.py +1 -1
  168. holidays/countries/turkey.py +4 -4
  169. holidays/countries/turks_and_caicos_islands.py +134 -0
  170. holidays/countries/tuvalu.py +7 -7
  171. holidays/countries/ukraine.py +51 -51
  172. holidays/countries/united_arab_emirates.py +22 -22
  173. holidays/countries/united_kingdom.py +2 -2
  174. holidays/countries/united_states.py +39 -39
  175. holidays/countries/uruguay.py +6 -6
  176. holidays/countries/uzbekistan.py +3 -3
  177. holidays/countries/vanuatu.py +2 -2
  178. holidays/countries/vatican_city.py +11 -11
  179. holidays/countries/venezuela.py +8 -8
  180. holidays/countries/vietnam.py +7 -7
  181. holidays/countries/yemen.py +207 -0
  182. holidays/countries/zambia.py +3 -3
  183. holidays/deprecations/v1_incompatibility.py +1 -1
  184. holidays/financial/__init__.py +5 -5
  185. holidays/financial/brasil_bolsa_balcao.py +9 -9
  186. holidays/financial/european_central_bank.py +3 -3
  187. holidays/financial/ice_futures_europe.py +2 -2
  188. holidays/financial/ny_stock_exchange.py +4 -5
  189. holidays/groups/__init__.py +1 -1
  190. holidays/groups/chinese.py +3 -3
  191. holidays/groups/christian.py +4 -4
  192. holidays/groups/international.py +9 -9
  193. holidays/groups/islamic.py +16 -6
  194. holidays/groups/sinhala.py +12 -12
  195. holidays/groups/thai.py +3 -3
  196. holidays/locale/ar/LC_MESSAGES/YE.mo +0 -0
  197. holidays/locale/en_AI/LC_MESSAGES/AI.mo +0 -0
  198. holidays/locale/en_BM/LC_MESSAGES/BM.mo +0 -0
  199. holidays/locale/en_CK/LC_MESSAGES/CK.mo +0 -0
  200. holidays/locale/en_FM/LC_MESSAGES/FM.mo +0 -0
  201. holidays/locale/en_GY/LC_MESSAGES/GY.mo +0 -0
  202. holidays/locale/en_NA/LC_MESSAGES/NA.mo +0 -0
  203. holidays/locale/en_NR/LC_MESSAGES/NR.mo +0 -0
  204. holidays/locale/en_TC/LC_MESSAGES/TC.mo +0 -0
  205. holidays/locale/en_US/LC_MESSAGES/AI.mo +0 -0
  206. holidays/locale/en_US/LC_MESSAGES/AX.mo +0 -0
  207. holidays/locale/en_US/LC_MESSAGES/BJ.mo +0 -0
  208. holidays/locale/en_US/LC_MESSAGES/BM.mo +0 -0
  209. holidays/locale/en_US/LC_MESSAGES/CK.mo +0 -0
  210. holidays/locale/en_US/LC_MESSAGES/FI.mo +0 -0
  211. holidays/locale/en_US/LC_MESSAGES/FM.mo +0 -0
  212. holidays/locale/en_US/LC_MESSAGES/GQ.mo +0 -0
  213. holidays/locale/en_US/LC_MESSAGES/GY.mo +0 -0
  214. holidays/locale/en_US/LC_MESSAGES/MK.mo +0 -0
  215. holidays/locale/en_US/LC_MESSAGES/NA.mo +0 -0
  216. holidays/locale/en_US/LC_MESSAGES/NE.mo +0 -0
  217. holidays/locale/en_US/LC_MESSAGES/NR.mo +0 -0
  218. holidays/locale/en_US/LC_MESSAGES/SJ.mo +0 -0
  219. holidays/locale/en_US/LC_MESSAGES/SN.mo +0 -0
  220. holidays/locale/en_US/LC_MESSAGES/TC.mo +0 -0
  221. holidays/locale/en_US/LC_MESSAGES/TH.mo +0 -0
  222. holidays/locale/en_US/LC_MESSAGES/VG.mo +0 -0
  223. holidays/locale/en_US/LC_MESSAGES/YE.mo +0 -0
  224. holidays/locale/en_VG/LC_MESSAGES/VG.mo +0 -0
  225. holidays/locale/es/LC_MESSAGES/GQ.mo +0 -0
  226. holidays/locale/fi/LC_MESSAGES/AX.mo +0 -0
  227. holidays/locale/fi/LC_MESSAGES/FI.mo +0 -0
  228. holidays/locale/fr_BJ/LC_MESSAGES/BJ.mo +0 -0
  229. holidays/locale/fr_NE/LC_MESSAGES/NE.mo +0 -0
  230. holidays/locale/fr_SN/LC_MESSAGES/SN.mo +0 -0
  231. holidays/locale/mk/LC_MESSAGES/MK.mo +0 -0
  232. holidays/locale/no/LC_MESSAGES/SJ.mo +0 -0
  233. holidays/locale/sv_FI/LC_MESSAGES/AX.mo +0 -0
  234. holidays/locale/sv_FI/LC_MESSAGES/FI.mo +0 -0
  235. holidays/locale/th/LC_MESSAGES/AX.mo +0 -0
  236. holidays/locale/th/LC_MESSAGES/FI.mo +0 -0
  237. holidays/locale/th/LC_MESSAGES/SJ.mo +0 -0
  238. holidays/locale/uk/LC_MESSAGES/AX.mo +0 -0
  239. holidays/locale/uk/LC_MESSAGES/FI.mo +0 -0
  240. holidays/locale/uk/LC_MESSAGES/MK.mo +0 -0
  241. holidays/locale/uk/LC_MESSAGES/NA.mo +0 -0
  242. holidays/locale/uk/LC_MESSAGES/SJ.mo +0 -0
  243. holidays/locale/uk/LC_MESSAGES/TH.mo +0 -0
  244. holidays/registry.py +16 -0
  245. holidays/version.py +1 -1
  246. {holidays-0.73.dist-info → holidays-0.75.dist-info}/METADATA +121 -10
  247. {holidays-0.73.dist-info → holidays-0.75.dist-info}/RECORD +251 -192
  248. {holidays-0.73.dist-info → holidays-0.75.dist-info}/WHEEL +1 -1
  249. {holidays-0.73.dist-info → holidays-0.75.dist-info}/licenses/CONTRIBUTORS +5 -0
  250. {holidays-0.73.dist-info → holidays-0.75.dist-info}/licenses/LICENSE +0 -0
  251. {holidays-0.73.dist-info → holidays-0.75.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,320 @@
1
+ # holidays
2
+ # --------
3
+ # A fast, efficient Python library for generating country, province and state
4
+ # specific sets of holidays on the fly. It aims to make determining whether a
5
+ # specific date is a holiday as fast and flexible as possible.
6
+ #
7
+ # Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
8
+ # dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
9
+ # ryanss <ryanssdev@icloud.com> (c) 2014-2017
10
+ # Website: https://github.com/vacanza/holidays
11
+ # License: MIT (see LICENSE file)
12
+
13
+ from gettext import gettext as tr
14
+
15
+ from holidays import OPTIONAL, PUBLIC
16
+ from holidays.calendars import _CustomIslamicHolidays
17
+ from holidays.calendars.gregorian import (
18
+ JAN,
19
+ FEB,
20
+ MAR,
21
+ APR,
22
+ MAY,
23
+ JUN,
24
+ JUL,
25
+ AUG,
26
+ SEP,
27
+ OCT,
28
+ NOV,
29
+ DEC,
30
+ SUN,
31
+ )
32
+ from holidays.groups import ChristianHolidays, InternationalHolidays, IslamicHolidays
33
+ from holidays.observed_holiday_base import ObservedHolidayBase, SUN_TO_NEXT_MON
34
+
35
+
36
+ class Niger(ObservedHolidayBase, ChristianHolidays, InternationalHolidays, IslamicHolidays):
37
+ """Niger holidays.
38
+
39
+ References:
40
+ * [Law No. 59-22 of December 24, 1959](https://web.archive.org/web/20241106023958/https://www.impots.gouv.ne/media/loi/1960.pdf)
41
+ * <https://web.archive.org/web/20110721063839/http://www.ais-asecna.org/pdf/gen/gen-2-1/12gen2-1-01.pdf>
42
+ * <https://web.archive.org/web/20250531032502/https://wageindicator.org/documents/decentworkcheck/africa/niger-french-2021.pdf>
43
+ * <https://en.wikipedia.org/wiki/Public_holidays_in_Niger>
44
+ * <https://web.archive.org/web/20250531032604/https://wageindicator.org/fr-ne/droit-du-travail/les-conges-et-les-jours-de-repos>
45
+ * <https://web.archive.org/web/20250206194155/https://www.rivermate.com/guides/niger/leave>
46
+ * [Eid al-Adha](https://web.archive.org/web/20250117013558/https://www.timeanddate.com/holidays/niger/eid-al-adha)
47
+ * [Eid al-Fitr](https://web.archive.org/web/20250114130118/https://www.timeanddate.com/holidays/niger/eid-al-fitr)
48
+ * [Laylat al-Qadr](https://web.archive.org/web/20250531033137/https://www.timeanddate.com/holidays/niger/laylat-al-qadr)
49
+ * [Islamic New Year](https://web.archive.org/web/20240723135601/https://www.timeanddate.com/holidays/niger/muharram-new-year)
50
+ * [Prophet's Birthday](https://web.archive.org/web/20250124122731/https://www.timeanddate.com/holidays/niger/prophet-birthday)
51
+
52
+ Notes:
53
+ After Law No. 97-020 of June 20, 1997 establishing public holidays came into
54
+ effect, holidays that fell on the mandatory weekly rest day (Sunday) were
55
+ observed on the next Monday.
56
+ """
57
+
58
+ country = "NE"
59
+ default_language = "fr_NE"
60
+ supported_languages = ("en_US", "fr_NE")
61
+ supported_categories = (OPTIONAL, PUBLIC)
62
+ # %s (observed).
63
+ observed_label = tr("%s (observé)")
64
+ # %s (estimated).
65
+ estimated_label = tr("%s (estimé)")
66
+ # %s (observed, estimated).
67
+ observed_estimated_label = tr("%s (observé, estimé)")
68
+ # Law No. 59-22.
69
+ start_year = 1960
70
+ weekend = {SUN}
71
+
72
+ def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
73
+ """
74
+ Args:
75
+ islamic_show_estimated:
76
+ Whether to add "estimated" label to Islamic holidays name
77
+ if holiday date is estimated.
78
+ """
79
+ ChristianHolidays.__init__(self)
80
+ InternationalHolidays.__init__(self)
81
+ IslamicHolidays.__init__(
82
+ self, cls=NigerIslamicHolidays, show_estimated=islamic_show_estimated
83
+ )
84
+ kwargs.setdefault("observed_rule", SUN_TO_NEXT_MON)
85
+ kwargs.setdefault("observed_since", 1998)
86
+ super().__init__(*args, **kwargs)
87
+
88
+ def _populate_public_holidays(self):
89
+ # New Year's Day.
90
+ self._add_observed(self._add_new_years_day(tr("Jour de l'An")))
91
+
92
+ # Easter Monday.
93
+ self._add_easter_monday(tr("Lundi de Pâques"))
94
+
95
+ if self._year >= 1995:
96
+ # National Concord Day.
97
+ self._add_observed(self._add_holiday_apr_24(tr("Fête nationale de la Concorde")))
98
+
99
+ # International Labor Day.
100
+ self._add_observed(self._add_labor_day(tr("Journée internationale du travail")))
101
+
102
+ if self._year >= 2024:
103
+ # Anniversary of the CNSP Coup.
104
+ self._add_observed(self._add_holiday_jul_26(tr("Anniversaire du coup d'État du CNSP")))
105
+
106
+ self._add_observed(
107
+ self._add_holiday_aug_3(
108
+ # Anniversary of the Proclamation of Independence.
109
+ tr("L'anniversaire de la proclamation de l'indépendance")
110
+ if self._year >= 1961
111
+ # Independence Day.
112
+ else tr("Jour de l'indépendance")
113
+ )
114
+ )
115
+
116
+ # National Day.
117
+ self._add_observed(self._add_holiday_dec_18(tr("Fête nationale")))
118
+
119
+ # Christmas Day.
120
+ self._add_observed(self._add_christmas_day(tr("Noël")))
121
+
122
+ # Islamic New Year.
123
+ for dt in self._add_islamic_new_year_day(tr("Jour de l'An musulman")):
124
+ self._add_observed(dt)
125
+
126
+ # Prophet's Birthday.
127
+ for dt in self._add_mawlid_day(tr("Mouloud")):
128
+ self._add_observed(dt)
129
+
130
+ # Laylat al-Qadr.
131
+ for dt in self._add_laylat_al_qadr_day(tr("Laylat al-Qadr")):
132
+ self._add_observed(dt)
133
+
134
+ # Eid al-Fitr.
135
+ for dt in self._add_eid_al_fitr_day(tr("Korité")):
136
+ self._add_observed(dt)
137
+
138
+ # Eid al-Adha.
139
+ self._add_eid_al_adha_day(tr("Tabaski"))
140
+
141
+ # Day after Eid al-Adha.
142
+ for dt in self._add_eid_al_adha_day_two(tr("Lendemain de la Tabaski")):
143
+ self._add_observed(dt)
144
+
145
+ def _populate_optional_holidays(self):
146
+ # Ascension Day.
147
+ self._add_ascension_thursday(tr("Ascension"))
148
+
149
+ # Whit Monday.
150
+ self._add_whit_monday(tr("Lundi de Pentecôte"))
151
+
152
+ # Assumption Day.
153
+ self._add_observed(self._add_assumption_of_mary_day(tr("Assomption")))
154
+
155
+ # All Saints' Day.
156
+ self._add_observed(self._add_all_saints_day(tr("Toussaint")))
157
+
158
+
159
+ class NigerIslamicHolidays(_CustomIslamicHolidays):
160
+ EID_AL_ADHA_DATES = {
161
+ 1998: (APR, 8),
162
+ 1999: (MAR, 28),
163
+ 2000: (MAR, 16),
164
+ 2001: (MAR, 6),
165
+ 2002: (FEB, 23),
166
+ 2003: (FEB, 12),
167
+ 2004: (FEB, 2),
168
+ 2005: (JAN, 21),
169
+ 2006: ((JAN, 10), (DEC, 31)),
170
+ 2007: (DEC, 20),
171
+ 2008: (DEC, 9),
172
+ 2009: (NOV, 28),
173
+ 2010: (NOV, 17),
174
+ 2011: (NOV, 7),
175
+ 2012: (OCT, 26),
176
+ 2013: (OCT, 15),
177
+ 2014: (OCT, 5),
178
+ 2016: (SEP, 13),
179
+ 2017: (SEP, 2),
180
+ 2018: (AUG, 22),
181
+ 2019: (AUG, 11),
182
+ 2020: (JUL, 31),
183
+ 2021: (JUL, 20),
184
+ 2022: (JUL, 10),
185
+ 2023: (JUN, 28),
186
+ 2024: (JUN, 16),
187
+ 2025: (JUN, 7),
188
+ }
189
+
190
+ EID_AL_FITR_DATES = {
191
+ 1998: (JAN, 30),
192
+ 1999: (JAN, 19),
193
+ 2000: ((JAN, 8), (DEC, 28)),
194
+ 2001: (DEC, 17),
195
+ 2002: (DEC, 6),
196
+ 2003: (NOV, 26),
197
+ 2004: (NOV, 14),
198
+ 2005: (NOV, 4),
199
+ 2006: (OCT, 24),
200
+ 2007: (OCT, 13),
201
+ 2008: (OCT, 2),
202
+ 2009: (SEP, 21),
203
+ 2010: (SEP, 10),
204
+ 2011: (AUG, 31),
205
+ 2012: (AUG, 19),
206
+ 2013: (AUG, 8),
207
+ 2014: (JUL, 29),
208
+ 2015: (JUL, 18),
209
+ 2016: (JUL, 7),
210
+ 2017: (JUN, 26),
211
+ 2018: (JUN, 15),
212
+ 2019: (JUN, 4),
213
+ 2020: (MAY, 23),
214
+ 2021: (MAY, 12),
215
+ 2022: (MAY, 1),
216
+ 2023: (APR, 21),
217
+ 2024: (APR, 9),
218
+ 2025: (MAR, 30),
219
+ }
220
+
221
+ HIJRI_NEW_YEAR_DATES = {
222
+ 1998: (APR, 28),
223
+ 1999: (APR, 17),
224
+ 2000: (APR, 6),
225
+ 2001: (MAR, 26),
226
+ 2002: (MAR, 15),
227
+ 2003: (MAR, 5),
228
+ 2004: (FEB, 22),
229
+ 2005: (FEB, 10),
230
+ 2006: (JAN, 31),
231
+ 2007: (JAN, 20),
232
+ 2008: ((JAN, 10), (DEC, 29)),
233
+ 2009: (DEC, 18),
234
+ 2010: (DEC, 8),
235
+ 2011: (NOV, 27),
236
+ 2012: (NOV, 15),
237
+ 2013: (NOV, 5),
238
+ 2014: (OCT, 25),
239
+ 2015: (OCT, 15),
240
+ 2016: (OCT, 3),
241
+ 2017: (SEP, 22),
242
+ 2018: (SEP, 12),
243
+ 2019: (AUG, 31),
244
+ 2020: (AUG, 21),
245
+ 2021: (AUG, 10),
246
+ 2022: (JUL, 30),
247
+ 2023: (JUL, 19),
248
+ 2024: (JUL, 6),
249
+ 2025: (JUN, 27),
250
+ }
251
+
252
+ LAYLAT_AL_QADR_DATES = {
253
+ 1998: (JAN, 26),
254
+ 1999: (JAN, 15),
255
+ 2000: ((JAN, 4), (DEC, 24)),
256
+ 2001: (DEC, 13),
257
+ 2002: (DEC, 2),
258
+ 2003: (NOV, 22),
259
+ 2004: (NOV, 11),
260
+ 2005: (OCT, 31),
261
+ 2006: (OCT, 20),
262
+ 2007: (OCT, 9),
263
+ 2008: (SEP, 28),
264
+ 2009: (SEP, 17),
265
+ 2010: (SEP, 6),
266
+ 2011: (AUG, 27),
267
+ 2012: (AUG, 15),
268
+ 2013: (AUG, 4),
269
+ 2014: (JUL, 25),
270
+ 2015: (JUL, 14),
271
+ 2016: (JUL, 2),
272
+ 2017: (JUN, 22),
273
+ 2018: (JUN, 11),
274
+ 2019: (JUN, 1),
275
+ 2020: (MAY, 20),
276
+ 2021: (MAY, 9),
277
+ 2022: (APR, 28),
278
+ 2023: (APR, 18),
279
+ 2024: (APR, 6),
280
+ 2025: (MAR, 27),
281
+ }
282
+
283
+ MAWLID_DATES = {
284
+ 1998: (JUL, 7),
285
+ 1999: (JUN, 26),
286
+ 2000: (JUN, 15),
287
+ 2001: (JUN, 4),
288
+ 2002: (MAY, 24),
289
+ 2003: (MAY, 14),
290
+ 2004: (MAY, 2),
291
+ 2005: (APR, 21),
292
+ 2006: (APR, 11),
293
+ 2007: (MAR, 31),
294
+ 2008: (MAR, 20),
295
+ 2009: (MAR, 9),
296
+ 2010: (FEB, 26),
297
+ 2011: (FEB, 16),
298
+ 2012: (FEB, 5),
299
+ 2013: (JAN, 24),
300
+ 2014: (JAN, 14),
301
+ 2015: ((JAN, 3), (DEC, 24)),
302
+ 2016: (DEC, 12),
303
+ 2017: (DEC, 1),
304
+ 2018: (NOV, 21),
305
+ 2019: (NOV, 10),
306
+ 2020: (OCT, 29),
307
+ 2021: (OCT, 18),
308
+ 2022: (OCT, 8),
309
+ 2023: (SEP, 27),
310
+ 2024: (SEP, 16),
311
+ 2025: (SEP, 5),
312
+ }
313
+
314
+
315
+ class NE(Niger):
316
+ pass
317
+
318
+
319
+ class NER(Niger):
320
+ pass
@@ -33,7 +33,7 @@ class Nigeria(
33
33
  observed_label = "%s (observed)"
34
34
  start_year = 1979
35
35
 
36
- def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
36
+ def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
37
37
  """
38
38
  Args:
39
39
  islamic_show_estimated:
@@ -10,21 +10,105 @@
10
10
  # Website: https://github.com/vacanza/holidays
11
11
  # License: MIT (see LICENSE file)
12
12
 
13
+ from gettext import gettext as tr
14
+
15
+ from holidays.calendars import _CustomIslamicHolidays
16
+ from holidays.calendars.gregorian import (
17
+ GREGORIAN_CALENDAR,
18
+ MAR,
19
+ APR,
20
+ MAY,
21
+ JUN,
22
+ JUL,
23
+ AUG,
24
+ SEP,
25
+ OCT,
26
+ NOV,
27
+ )
13
28
  from holidays.calendars.julian import JULIAN_CALENDAR
14
- from holidays.groups import ChristianHolidays, IslamicHolidays, InternationalHolidays
15
- from holidays.holiday_base import HolidayBase
29
+ from holidays.constants import (
30
+ ALBANIAN,
31
+ BOSNIAN,
32
+ CATHOLIC,
33
+ HEBREW,
34
+ ISLAMIC,
35
+ ORTHODOX,
36
+ PUBLIC,
37
+ ROMA,
38
+ SERBIAN,
39
+ TURKISH,
40
+ VLACH,
41
+ )
42
+ from holidays.groups import (
43
+ ChristianHolidays,
44
+ HebrewCalendarHolidays,
45
+ InternationalHolidays,
46
+ IslamicHolidays,
47
+ StaticHolidays,
48
+ )
49
+ from holidays.observed_holiday_base import ObservedHolidayBase, SUN_TO_NEXT_MON
16
50
 
17
51
 
18
- class NorthMacedonia(HolidayBase, ChristianHolidays, InternationalHolidays, IslamicHolidays):
52
+ class NorthMacedonia(
53
+ ObservedHolidayBase,
54
+ ChristianHolidays,
55
+ HebrewCalendarHolidays,
56
+ InternationalHolidays,
57
+ IslamicHolidays,
58
+ StaticHolidays,
59
+ ):
19
60
  """North Macedonia holidays.
20
61
 
21
62
  References:
22
63
  * <https://en.wikipedia.org/wiki/Public_holidays_in_North_Macedonia>
64
+ * [Law on Holidays 21/98](https://web.archive.org/web/20250404064336/https://www.mtsp.gov.mk/content/pdf/dokumenti/Zakon_Praznici_na_RM%20(2_2).pdf)
65
+ * [Law Amending Law on Holidays 18/2007](https://web.archive.org/web/20250505061325/https://www.mtsp.gov.mk/content/pdf/dokumenti/Zakon_Izmenuvanje_Praznici_na_RM%20(2_2).pdf)
66
+
67
+ Checked With:
68
+ * [Non-working days program](https://web.archive.org/web/20250420034141/https://mtsp.gov.mk/programa-za-nerabotni-denovi.nspx)
69
+ * [2010](https://web.archive.org/web/20250430235227/https://www.mtsp.gov.mk/WBStorage/Files/programadeseta.doc)
70
+ * [2011](https://web.archive.org/web/20250501104555/https://www.mtsp.gov.mk/WBStorage/Files/programaedinaeseta.doc)
71
+ * [2012](https://web.archive.org/web/20250501001337/https://www.mtsp.gov.mk/WBStorage/Files/programadvanaeseta.doc)
72
+ * [2013](https://web.archive.org/web/20250430234446/https://www.mtsp.gov.mk/WBStorage/Files/programa_trinaeseta_nova.doc)
73
+ * [2014](https://web.archive.org/web/20241206035550/https://www.mtsp.gov.mk/WBStorage/Files/programa_nerabotni_denovi_2014.pdf)
74
+ * [2015](https://web.archive.org/web/20240304070837/https://www.mtsp.gov.mk/content/pdf/Programa_nerabotni_denovi_2015.pdf)
75
+ * [2016](https://web.archive.org/web/20241206052140/https://www.mtsp.gov.mk/content/pdf/Programa_nerabotni_2016.pdf)
76
+ * [2017](https://web.archive.org/web/20240629115141/https://www.mtsp.gov.mk/content/pdf/19.10._Програма%20на%20неработни%20денови%20за%202017%20година.pdf)
77
+ * [2018](https://web.archive.org/web/20240630201651/https://www.mtsp.gov.mk/content/pdf/programi/Програма%20на%20неработни%20денови%20за%202018%20година.pdf)
78
+ * [2019](https://web.archive.org/web/20240629172352/https://www.mtsp.gov.mk/content/pdf/programi/Programa_na_nerabotni_denovi_za_2019_godina..pdf)
79
+ * [2020](https://web.archive.org/web/20240629104945/https://www.mtsp.gov.mk/content/pdf/dokumenti/2019/Програма%20на%20неработни%20денови%20за%202020%20година%201.pdf)
80
+ * [2021](https://web.archive.org/web/20250502065435/https://www.mtsp.gov.mk/content/Програма%20на%20неработни%20денови%20за%202021%20година%20PDF.pdf)
81
+ * [2022](https://web.archive.org/web/20250420054039/https://www.mtsp.gov.mk/content/word/2021/nerabotni/2022_programa_praznici_nerabotni_2.doc)
82
+ * [2023](https://web.archive.org/web/20250420050919/https://mtsp.gov.mk/content/word/programi/2022/programa_nerabotni_2023.doc)
83
+ * [2024](https://web.archive.org/web/20250420060645/https://www.mtsp.gov.mk/content/word/programi/2023/programa_nerabotni_2024_mkd.doc)
84
+ * [2025](https://web.archive.org/web/20250421022811/https://www.mtsp.gov.mk/content/word/2024/programa_nerabotni_2025.docx)
23
85
  """
24
86
 
25
87
  country = "MK"
88
+ default_language = "mk"
89
+ # %s (estimated).
90
+ estimated_label = tr("%s (проценето)")
91
+ # %s (observed).
92
+ observed_label = tr("%s (неработен ден)")
93
+ # %s (observed, estimated).
94
+ observed_estimated_label = tr("%s (неработен ден, проценето)")
95
+ start_year = 1999
96
+ supported_categories = (
97
+ ALBANIAN,
98
+ BOSNIAN,
99
+ CATHOLIC,
100
+ HEBREW,
101
+ ISLAMIC,
102
+ ORTHODOX,
103
+ PUBLIC,
104
+ ROMA,
105
+ SERBIAN,
106
+ TURKISH,
107
+ VLACH,
108
+ )
109
+ supported_languages = ("en_US", "mk", "uk")
26
110
 
27
- def __init__(self, islamic_show_estimated: bool = True, *args, **kwargs):
111
+ def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
28
112
  """
29
113
  Args:
30
114
  islamic_show_estimated:
@@ -32,32 +116,141 @@ class NorthMacedonia(HolidayBase, ChristianHolidays, InternationalHolidays, Isla
32
116
  if holiday date is estimated.
33
117
  """
34
118
  ChristianHolidays.__init__(self, JULIAN_CALENDAR)
119
+ HebrewCalendarHolidays.__init__(self)
35
120
  InternationalHolidays.__init__(self)
36
- IslamicHolidays.__init__(self, show_estimated=islamic_show_estimated)
121
+ IslamicHolidays.__init__(
122
+ self, cls=NorthMacedoniaIslamicHolidays, show_estimated=islamic_show_estimated
123
+ )
124
+ StaticHolidays.__init__(self, NorthMacedoniaStaticHolidays)
125
+ kwargs.setdefault("observed_rule", SUN_TO_NEXT_MON)
37
126
  super().__init__(*args, **kwargs)
38
127
 
39
128
  def _populate_public_holidays(self):
40
- self._add_new_years_day("New Year's Day")
129
+ # New Year's Day.
130
+ name = tr("Нова Година")
131
+ self._add_observed(self._add_new_years_day(name))
132
+ if self._year <= 2007:
133
+ self._add_observed(self._add_new_years_day_two(name))
134
+
135
+ if self._year >= 2008:
136
+ # Christmas Day.
137
+ self._add_observed(self._add_christmas_day(tr("Божиќ")))
138
+
139
+ if self._year >= 2007:
140
+ # Easter Monday.
141
+ self._add_easter_monday(tr("Велигден"))
142
+
143
+ # Labor Day.
144
+ name = tr("Ден на трудот")
145
+ self._add_observed(self._add_labor_day(name))
146
+ if self._year <= 2006:
147
+ self._add_observed(self._add_labor_day_two(name))
148
+
149
+ if self._year >= 2007:
150
+ self._add_observed(
151
+ self._add_holiday_may_24(
152
+ # Saints Cyril and Methodius Day.
153
+ tr("Светите Кирил и Методиј - Ден на сесловенските просветители")
154
+ )
155
+ )
156
+
157
+ # Republic Day.
158
+ self._add_observed(self._add_holiday_aug_2(tr("Ден на Републиката")))
159
+
160
+ # Independence Day.
161
+ self._add_observed(self._add_holiday_sep_8(tr("Ден на независноста")))
162
+
163
+ # National Uprising Day.
164
+ self._add_observed(self._add_holiday_oct_11(tr("Ден на народното востание")))
165
+
166
+ if self._year >= 2007:
167
+ self._add_observed(
168
+ # Macedonian Revolutionary Struggle Day.
169
+ self._add_holiday_oct_23(tr("Ден на македонската револуционерна борба"))
170
+ )
171
+
172
+ # Saint Clement of Ohrid Day.
173
+ self._add_observed(self._add_holiday_dec_8(tr("Свети Климент Охридски")))
174
+
175
+ if self._year >= 2007:
176
+ # Eid al-Fitr.
177
+ for dt in self._add_eid_al_fitr_day(tr("Рамазан Бајрам")):
178
+ self._add_observed(dt)
179
+
180
+ def _populate_albanian_holidays(self):
181
+ if self._year >= 2007:
182
+ # Albanian Alphabet Day.
183
+ self._add_holiday_nov_22(tr("Ден на Албанската азбука"))
184
+
185
+ def _populate_bosnian_holidays(self):
186
+ if self._year >= 2007:
187
+ # International Bosniaks Day.
188
+ self._add_holiday_sep_28(tr("Меѓународен ден на Бошњаците"))
189
+
190
+ def _populate_catholic_holidays(self):
191
+ # Easter Monday.
192
+ self._add_easter_monday(tr("Велигден"), GREGORIAN_CALENDAR)
41
193
 
42
- self._add_christmas_day("Christmas Day (Orthodox)")
194
+ if self._year >= 2007:
195
+ # All Saints' Day.
196
+ self._add_all_saints_day(tr("Сите Светци"))
43
197
 
44
- self._add_easter_monday("Easter Monday (Orthodox)")
198
+ # Christmas Day.
199
+ self._add_christmas_day(tr("Божиќ"), GREGORIAN_CALENDAR)
45
200
 
46
- self._add_labor_day("Labour Day")
201
+ def _populate_hebrew_holidays(self):
202
+ # Yom Kippur.
203
+ self._add_yom_kippur(tr("Јом Кипур"))
47
204
 
48
- self._add_holiday_may_24("Saints Cyril and Methodius Day")
205
+ def _populate_islamic_holidays(self):
206
+ if self._year >= 2007:
207
+ # Eid al-Adha.
208
+ self._add_eid_al_adha_day(tr("Курбан Бајрам"))
49
209
 
50
- self._add_holiday_aug_2("Republic Day")
210
+ def _populate_orthodox_holidays(self):
211
+ if self._year <= 2007:
212
+ # Christmas Day.
213
+ self._add_christmas_day(tr("Божиќ"))
51
214
 
52
- self._add_holiday_sep_8("Independence Day")
215
+ if self._year <= 2006:
216
+ # Easter Monday.
217
+ self._add_easter_monday(tr("Велигден"))
53
218
 
54
- self._add_holiday_oct_11("Day of Macedonian Uprising in 1941")
219
+ if self._year >= 2007:
220
+ # Christmas Eve.
221
+ self._add_christmas_eve(tr("Бадник"))
55
222
 
56
- self._add_holiday_oct_23("Day of the Macedonian Revolutionary Struggle")
223
+ # Epiphany.
224
+ self._add_epiphany_day(tr("Богојавление"))
57
225
 
58
- self._add_holiday_dec_8("Saint Clement of Ohrid Day")
226
+ # Good Friday.
227
+ self._add_good_friday(tr("Велики Петок"))
59
228
 
60
- self._add_eid_al_fitr_day("Eid al-Fitr")
229
+ # Dormition of the Mother of God.
230
+ self._add_assumption_of_mary_day(tr("Успение на Пресвета Богородица"))
231
+
232
+ # Pentecost.
233
+ self._add_holiday_47_days_past_easter(tr("Духовден"))
234
+
235
+ def _populate_roma_holidays(self):
236
+ if self._year >= 2007:
237
+ # International Romani Day.
238
+ self._add_holiday_apr_8(tr("Меѓународен ден на Ромите"))
239
+
240
+ def _populate_serbian_holidays(self):
241
+ if self._year >= 2008:
242
+ # Saint Sava's Day.
243
+ self._add_holiday_jan_27(tr("Свети Сава"))
244
+
245
+ def _populate_turkish_holidays(self):
246
+ if self._year >= 2007:
247
+ # Turkish Language Teaching Day.
248
+ self._add_holiday_dec_21(tr("Ден на настава на турски јазик"))
249
+
250
+ def _populate_vlach_holidays(self):
251
+ if self._year >= 2007:
252
+ # Vlachs National Day.
253
+ self._add_holiday_may_23(tr("Национален ден на Власите"))
61
254
 
62
255
 
63
256
  class MK(NorthMacedonia):
@@ -66,3 +259,62 @@ class MK(NorthMacedonia):
66
259
 
67
260
  class MKD(NorthMacedonia):
68
261
  pass
262
+
263
+
264
+ class NorthMacedoniaIslamicHolidays(_CustomIslamicHolidays):
265
+ EID_AL_ADHA_DATES = {
266
+ 2010: (NOV, 16),
267
+ 2011: (NOV, 6),
268
+ 2012: (OCT, 25),
269
+ 2013: (OCT, 15),
270
+ 2014: (OCT, 4),
271
+ 2015: (SEP, 24),
272
+ 2016: (SEP, 12),
273
+ 2017: (SEP, 1),
274
+ 2018: (AUG, 21),
275
+ 2019: (AUG, 11),
276
+ 2020: (JUL, 31),
277
+ 2021: (JUL, 20),
278
+ 2022: (JUL, 9),
279
+ 2023: (JUN, 28),
280
+ 2024: (JUN, 16),
281
+ 2025: (JUN, 6),
282
+ }
283
+
284
+ EID_AL_FITR_DATES = {
285
+ 2010: (SEP, 9),
286
+ 2011: (AUG, 30),
287
+ 2012: (AUG, 19),
288
+ 2013: (AUG, 8),
289
+ 2014: (JUL, 28),
290
+ 2015: (JUL, 17),
291
+ 2016: (JUL, 5),
292
+ 2017: (JUN, 25),
293
+ 2018: (JUN, 15),
294
+ 2019: (JUN, 4),
295
+ 2020: (MAY, 24),
296
+ 2021: (MAY, 13),
297
+ 2022: (MAY, 2),
298
+ 2023: (APR, 21),
299
+ 2024: (APR, 10),
300
+ 2025: (MAR, 30),
301
+ }
302
+
303
+
304
+ class NorthMacedoniaStaticHolidays:
305
+ """North Macedonia special holidays.
306
+
307
+ References:
308
+ * <https://web.archive.org/web/20250201212849/https://mk.usembassy.gov/alert-presidential-and-parliamentary-elections-on-may-8-2024/>
309
+ """
310
+
311
+ # Election Day.
312
+ election_day = tr("Ден на изборите")
313
+
314
+ special_public_holidays = {
315
+ # Election Day.
316
+ 2024: (
317
+ (APR, 24, election_day),
318
+ (MAY, 8, election_day),
319
+ ),
320
+ }