holidays 0.48__py3-none-any.whl → 0.50__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 (71) hide show
  1. holidays/__init__.py +12 -1
  2. holidays/calendars/gregorian.py +22 -7
  3. holidays/calendars/persian.py +3 -2
  4. holidays/calendars/thai.py +24 -20
  5. holidays/countries/__init__.py +1 -0
  6. holidays/countries/angola.py +2 -2
  7. holidays/countries/aruba.py +2 -3
  8. holidays/countries/botswana.py +19 -9
  9. holidays/countries/cambodia.py +7 -8
  10. holidays/countries/canada.py +2 -1
  11. holidays/countries/chile.py +14 -11
  12. holidays/countries/curacao.py +3 -4
  13. holidays/countries/finland.py +2 -2
  14. holidays/countries/georgia.py +17 -1
  15. holidays/countries/greenland.py +96 -0
  16. holidays/countries/hongkong.py +398 -133
  17. holidays/countries/isle_of_man.py +3 -8
  18. holidays/countries/israel.py +13 -13
  19. holidays/countries/italy.py +163 -133
  20. holidays/countries/japan.py +52 -33
  21. holidays/countries/jersey.py +11 -9
  22. holidays/countries/laos.py +7 -23
  23. holidays/countries/madagascar.py +2 -3
  24. holidays/countries/malaysia.py +545 -235
  25. holidays/countries/monaco.py +4 -6
  26. holidays/countries/netherlands.py +2 -3
  27. holidays/countries/new_zealand.py +5 -5
  28. holidays/countries/russia.py +18 -4
  29. holidays/countries/saudi_arabia.py +2 -3
  30. holidays/countries/south_korea.py +17 -4
  31. holidays/countries/sweden.py +2 -3
  32. holidays/countries/switzerland.py +18 -17
  33. holidays/deprecation.py +33 -0
  34. holidays/financial/__init__.py +1 -0
  35. holidays/financial/ice_futures_europe.py +47 -0
  36. holidays/financial/ny_stock_exchange.py +17 -4
  37. holidays/groups/chinese.py +2 -3
  38. holidays/groups/christian.py +18 -19
  39. holidays/groups/islamic.py +2 -2
  40. holidays/groups/persian.py +2 -2
  41. holidays/helpers.py +9 -3
  42. holidays/holiday_base.py +18 -15
  43. holidays/locale/da/LC_MESSAGES/GL.mo +0 -0
  44. holidays/locale/da/LC_MESSAGES/GL.po +91 -0
  45. holidays/locale/en_US/LC_MESSAGES/GE.mo +0 -0
  46. holidays/locale/en_US/LC_MESSAGES/GE.po +8 -4
  47. holidays/locale/en_US/LC_MESSAGES/GL.mo +0 -0
  48. holidays/locale/en_US/LC_MESSAGES/GL.po +92 -0
  49. holidays/locale/en_US/LC_MESSAGES/MY.mo +0 -0
  50. holidays/locale/en_US/LC_MESSAGES/MY.po +250 -0
  51. holidays/locale/en_US/LC_MESSAGES/RU.mo +0 -0
  52. holidays/locale/en_US/LC_MESSAGES/RU.po +11 -2
  53. holidays/locale/ka/LC_MESSAGES/GE.mo +0 -0
  54. holidays/locale/ka/LC_MESSAGES/GE.po +8 -4
  55. holidays/locale/kl/LC_MESSAGES/GL.mo +0 -0
  56. holidays/locale/kl/LC_MESSAGES/GL.po +91 -0
  57. holidays/locale/ms_MY/LC_MESSAGES/MY.mo +0 -0
  58. holidays/locale/ms_MY/LC_MESSAGES/MY.po +250 -0
  59. holidays/locale/ru/LC_MESSAGES/RU.mo +0 -0
  60. holidays/locale/ru/LC_MESSAGES/RU.po +11 -2
  61. holidays/locale/uk/LC_MESSAGES/GE.mo +0 -0
  62. holidays/locale/uk/LC_MESSAGES/GE.po +8 -4
  63. holidays/mixins.py +31 -0
  64. holidays/observed_holiday_base.py +66 -37
  65. holidays/registry.py +12 -1
  66. {holidays-0.48.dist-info → holidays-0.50.dist-info}/AUTHORS +3 -0
  67. {holidays-0.48.dist-info → holidays-0.50.dist-info}/METADATA +14 -6
  68. {holidays-0.48.dist-info → holidays-0.50.dist-info}/RECORD +71 -57
  69. {holidays-0.48.dist-info → holidays-0.50.dist-info}/LICENSE +0 -0
  70. {holidays-0.48.dist-info → holidays-0.50.dist-info}/WHEEL +0 -0
  71. {holidays-0.48.dist-info → holidays-0.50.dist-info}/top_level.txt +0 -0
@@ -10,10 +10,10 @@
10
10
  # Website: https://github.com/vacanza/python-holidays
11
11
  # License: MIT (see LICENSE file)
12
12
 
13
- from datetime import timedelta as td
14
13
  from gettext import gettext as tr
15
14
 
16
15
  from holidays.calendars import _HebrewLunisolar
16
+ from holidays.calendars.gregorian import _timedelta
17
17
  from holidays.calendars.hebrew import (
18
18
  HANUKKAH,
19
19
  INDEPENDENCE_DAY,
@@ -73,7 +73,7 @@ class Israel(ObservedHolidayBase):
73
73
  name = tr("ראש השנה")
74
74
  rosh_hashanah_dt = self._get_holiday(ROSH_HASHANAH)
75
75
  self._add_holiday(name, rosh_hashanah_dt)
76
- self._add_holiday(name, rosh_hashanah_dt + td(days=+1))
76
+ self._add_holiday(name, _timedelta(rosh_hashanah_dt, +1))
77
77
 
78
78
  # Yom Kippur (Day of Atonement).
79
79
  self._add_holiday(tr("יום כיפור"), self._get_holiday(YOM_KIPPUR))
@@ -83,13 +83,13 @@ class Israel(ObservedHolidayBase):
83
83
  sukkot_dt = self._get_holiday(SUKKOT)
84
84
  self._add_holiday(name, sukkot_dt)
85
85
  # Simchat Torah / Shemini Atzeret.
86
- self._add_holiday(tr("שמחת תורה/שמיני עצרת"), sukkot_dt + td(days=+7))
86
+ self._add_holiday(tr("שמחת תורה/שמיני עצרת"), _timedelta(sukkot_dt, +7))
87
87
 
88
88
  passover_dt = self._get_holiday(PASSOVER)
89
89
  # Pesach (Passover).
90
90
  self._add_holiday(tr("פסח"), passover_dt)
91
91
  # Shvi'i shel Pesach (Seventh day of Passover)
92
- self._add_holiday(tr("שביעי של פסח"), passover_dt + td(days=+6))
92
+ self._add_holiday(tr("שביעי של פסח"), _timedelta(passover_dt, +6))
93
93
 
94
94
  # Yom Ha-Atzmaut (Independence Day).
95
95
  name = tr("יום העצמאות")
@@ -114,11 +114,11 @@ class Israel(ObservedHolidayBase):
114
114
  sukkot_dt = self._get_holiday(SUKKOT)
115
115
  for offset in range(1, 6):
116
116
  # Chol HaMoed Sukkot (Feast of Tabernacles holiday).
117
- self._add_holiday(tr("חול המועד סוכות"), sukkot_dt + td(days=offset))
117
+ self._add_holiday(tr("חול המועד סוכות"), _timedelta(sukkot_dt, offset))
118
118
 
119
119
  if self._year >= 2008:
120
120
  # Sigd.
121
- self._add_holiday(tr("סיגד"), self._get_holiday(YOM_KIPPUR) + td(days=+49))
121
+ self._add_holiday(tr("סיגד"), _timedelta(self._get_holiday(YOM_KIPPUR), +49))
122
122
 
123
123
  # Purim.
124
124
  self._add_holiday(tr("פורים"), self._get_holiday(PURIM))
@@ -126,12 +126,12 @@ class Israel(ObservedHolidayBase):
126
126
  passover_dt = self._get_holiday(PASSOVER)
127
127
  for offset in range(1, 6):
128
128
  # Chol HaMoed Pesach (Passover holiday).
129
- self._add_holiday(tr("חול המועד פסח"), passover_dt + td(days=offset))
129
+ self._add_holiday(tr("חול המועד פסח"), _timedelta(passover_dt, offset))
130
130
 
131
131
  if self._year >= 1963:
132
132
  # Yom Hazikaron (Fallen Soldiers and Victims of Terrorism Remembrance Day).
133
133
  name = tr("יום הזיכרון לחללי מערכות ישראל ונפגעי פעולות האיבה")
134
- remembrance_day_dt = self._get_holiday(INDEPENDENCE_DAY) + td(days=-1)
134
+ remembrance_day_dt = _timedelta(self._get_holiday(INDEPENDENCE_DAY), -1)
135
135
  rule = THU_TO_PREV_WED + FRI_TO_PREV_WED
136
136
  if self._year >= 2004:
137
137
  rule += SUN_TO_NEXT_MON
@@ -141,7 +141,7 @@ class Israel(ObservedHolidayBase):
141
141
 
142
142
  if self._year >= 1998:
143
143
  # Yom Yerushalayim (Jerusalem Day).
144
- self._add_holiday(tr("יום ירושלים"), self._get_holiday(LAG_BAOMER) + td(days=+10))
144
+ self._add_holiday(tr("יום ירושלים"), _timedelta(self._get_holiday(LAG_BAOMER), +10))
145
145
 
146
146
  # Tisha B'Av (Tisha B'Av, fast).
147
147
  name = tr("תשעה באב")
@@ -160,18 +160,18 @@ class Israel(ObservedHolidayBase):
160
160
  sukkot_dt = self._get_holiday(SUKKOT)
161
161
  for offset in range(1, 6):
162
162
  # Chol HaMoed Sukkot (Feast of Tabernacles holiday).
163
- self._add_holiday(tr("חול המועד סוכות"), sukkot_dt + td(days=offset))
163
+ self._add_holiday(tr("חול המועד סוכות"), _timedelta(sukkot_dt, offset))
164
164
 
165
165
  for year in (self._year - 1, self._year):
166
166
  hanukkah_dt = _HebrewLunisolar._get_holiday(HANUKKAH, year)
167
167
  for offset in range(8):
168
168
  # Hanukkah.
169
- self._add_holiday(tr("חנוכה"), hanukkah_dt + td(days=offset))
169
+ self._add_holiday(tr("חנוכה"), _timedelta(hanukkah_dt, offset))
170
170
 
171
171
  # Ta`anit Ester (Fast of Esther).
172
172
  name = tr("תענית אסתר")
173
173
  purim_dt = self._get_holiday(PURIM)
174
- taanit_ester_dt = purim_dt + td(days=-1)
174
+ taanit_ester_dt = _timedelta(purim_dt, -1)
175
175
  is_observed, _ = self._add_observed(taanit_ester_dt, name, SAT_TO_PREV_THU)
176
176
  if not is_observed:
177
177
  self._add_holiday(name, taanit_ester_dt)
@@ -182,7 +182,7 @@ class Israel(ObservedHolidayBase):
182
182
  passover_dt = self._get_holiday(PASSOVER)
183
183
  for offset in range(1, 6):
184
184
  # Chol HaMoed Pesach (Passover holiday).
185
- self._add_holiday(tr("חול המועד פסח"), passover_dt + td(days=offset))
185
+ self._add_holiday(tr("חול המועד פסח"), _timedelta(passover_dt, offset))
186
186
 
187
187
  # Lag Ba'omer (Lag BaOmer).
188
188
  self._add_holiday(tr('ל"ג בעומר'), self._get_holiday(LAG_BAOMER))
@@ -10,131 +10,128 @@
10
10
  # Website: https://github.com/vacanza/python-holidays
11
11
  # License: MIT (see LICENSE file)
12
12
 
13
- from datetime import timedelta as td
14
-
15
- from holidays.groups import ChristianHolidays, InternationalHolidays
13
+ from holidays.calendars.gregorian import MAR
14
+ from holidays.groups import ChristianHolidays, InternationalHolidays, StaticHolidays
16
15
  from holidays.holiday_base import HolidayBase
17
16
 
18
17
 
19
- class Italy(HolidayBase, ChristianHolidays, InternationalHolidays):
18
+ class Italy(HolidayBase, ChristianHolidays, InternationalHolidays, StaticHolidays):
19
+ """
20
+ References:
21
+ - https://en.wikipedia.org/wiki/Public_holidays_in_Italy
22
+ - `Provinces holidays <https://it.wikipedia.org/wiki/Santi_patroni_cattolici_delle_citt%C3%A0_capoluogo_di_provincia_italiane>`_ # noqa: E501
23
+ """
24
+
20
25
  country = "IT"
21
- # Reference: https://it.wikipedia.org/wiki/Province_d%27Italia
22
- # Please maintain in alphabetical order for easy updating in the future
23
- # The alphabetical order is except cities of provinces with multiple head
24
- # cities that directly follows the main province id like BT, Barletta,
25
- # Andria, Trani, for easily grouping them.
26
- # In that case if you use the 2 char id you'll take the first Santo
27
- # Patrono defined. If you want one specific you'll have to use
28
- # the full name of the city like "Andria" instead of "BT".
29
26
  subdivisions = (
30
27
  # Provinces.
31
- "AG",
32
- "AL",
33
- "AN",
34
- "AO",
35
- "AP",
36
- "AQ",
37
- "AR",
38
- "AT",
39
- "AV",
40
- "BA",
41
- "BG",
42
- "BI",
43
- "BL",
44
- "BN",
45
- "BO",
46
- "BR",
47
- "BS",
48
- "BT",
49
- "BZ",
50
- "CA",
51
- "CB",
52
- "CE",
53
- "CH",
54
- "CL",
55
- "CN",
56
- "CO",
57
- "CR",
58
- "CS",
59
- "CT",
60
- "CZ",
61
- "EN",
62
- "FC",
63
- "FE",
64
- "FG",
65
- "FI",
66
- "FM",
67
- "FR",
68
- "GE",
69
- "GO",
70
- "GR",
71
- "IM",
72
- "IS",
73
- "KR",
74
- "LC",
75
- "LE",
76
- "LI",
77
- "LO",
78
- "LT",
79
- "LU",
80
- "MB",
81
- "MC",
82
- "ME",
83
- "MI",
84
- "MN",
85
- "MO",
86
- "MS",
87
- "MT",
88
- "NA",
89
- "NO",
90
- "NU",
91
- "OR",
92
- "PA",
93
- "PC",
94
- "PD",
95
- "PE",
96
- "PG",
97
- "PI",
98
- "PN",
99
- "PO",
100
- "PR",
101
- "PT",
102
- "PU",
103
- "PV",
104
- "PZ",
105
- "RA",
106
- "RC",
107
- "RE",
108
- "RG",
109
- "RI",
110
- "RM",
111
- "RN",
112
- "RO",
113
- "SA",
114
- "SI",
115
- "SO",
116
- "SP",
117
- "SR",
118
- "SS",
119
- "SU",
120
- "SV",
121
- "TA",
122
- "TE",
123
- "TN",
124
- "TO",
125
- "TP",
126
- "TR",
127
- "TS",
128
- "TV",
129
- "UD",
130
- "VA",
131
- "VB",
132
- "VC",
133
- "VE",
134
- "VI",
135
- "VR",
136
- "VT",
137
- "VV",
28
+ "AG", # Agrigento.
29
+ "AL", # Alessandria.
30
+ "AN", # Ancona.
31
+ "AO", # Aosta (deprecated).
32
+ "AP", # Ascoli Piceno.
33
+ "AQ", # L'Aquila.
34
+ "AR", # Arezzo.
35
+ "AT", # Asti.
36
+ "AV", # Avellino.
37
+ "BA", # Bari.
38
+ "BG", # Bergamo.
39
+ "BI", # Biella.
40
+ "BL", # Belluno.
41
+ "BN", # Benevento.
42
+ "BO", # Bologna.
43
+ "BR", # Brindisi.
44
+ "BS", # Brescia.
45
+ "BT", # Barletta-Andria-Trani.
46
+ "BZ", # Bolzano.
47
+ "CA", # Cagliari.
48
+ "CB", # Campobasso.
49
+ "CE", # Caserta.
50
+ "CH", # Chieti.
51
+ "CL", # Caltanissetta.
52
+ "CN", # Cuneo.
53
+ "CO", # Como.
54
+ "CR", # Cremona.
55
+ "CS", # Cosenza.
56
+ "CT", # Catania.
57
+ "CZ", # Catanzaro.
58
+ "EN", # Enna.
59
+ "FC", # Forlì-Cesena.
60
+ "FE", # Ferrara.
61
+ "FG", # Foggia.
62
+ "FI", # Firenze.
63
+ "FM", # Fermo.
64
+ "FR", # Frosinone.
65
+ "GE", # Genova.
66
+ "GO", # Gorizia.
67
+ "GR", # Grosseto.
68
+ "IM", # Imperia.
69
+ "IS", # Isernia.
70
+ "KR", # Crotone.
71
+ "LC", # Lecco.
72
+ "LE", # Lecce.
73
+ "LI", # Livorno.
74
+ "LO", # Lodi.
75
+ "LT", # Latina.
76
+ "LU", # Lucca.
77
+ "MB", # Monza e Brianza.
78
+ "MC", # Macerata.
79
+ "ME", # Messina.
80
+ "MI", # Milano.
81
+ "MN", # Mantova.
82
+ "MO", # Modena.
83
+ "MS", # Massa-Carrara.
84
+ "MT", # Matera.
85
+ "NA", # Napoli.
86
+ "NO", # Novara.
87
+ "NU", # Nuoro.
88
+ "OR", # Oristano.
89
+ "PA", # Palermo.
90
+ "PC", # Piacenza.
91
+ "PD", # Padova.
92
+ "PE", # Pescara.
93
+ "PG", # Perugia.
94
+ "PI", # Pisa.
95
+ "PN", # Pordenone.
96
+ "PO", # Prato.
97
+ "PR", # Parma.
98
+ "PT", # Pistoia.
99
+ "PU", # Pesaro e Urbino.
100
+ "PV", # Pavia.
101
+ "PZ", # Potenza.
102
+ "RA", # Ravenna.
103
+ "RC", # Reggio Calabria.
104
+ "RE", # Reggio Emilia.
105
+ "RG", # Ragusa.
106
+ "RI", # Rieti.
107
+ "RM", # Roma.
108
+ "RN", # Rimini.
109
+ "RO", # Rovigo.
110
+ "SA", # Salerno.
111
+ "SI", # Siena.
112
+ "SO", # Sondrio.
113
+ "SP", # La Spezia.
114
+ "SR", # Siracusa.
115
+ "SS", # Sassari.
116
+ "SU", # Sud Sardegna.
117
+ "SV", # Savona.
118
+ "TA", # Taranto.
119
+ "TE", # Teramo.
120
+ "TN", # Trento.
121
+ "TO", # Torino.
122
+ "TP", # Trapani.
123
+ "TR", # Terni.
124
+ "TS", # Trieste.
125
+ "TV", # Treviso.
126
+ "UD", # Udine.
127
+ "VA", # Varese.
128
+ "VB", # Verbano-Cusio-Ossola.
129
+ "VC", # Vercelli.
130
+ "VE", # Venezia.
131
+ "VI", # Vicenza.
132
+ "VR", # Verona.
133
+ "VT", # Viterbo.
134
+ "VV", # Vibo Valentia.
138
135
  # Cities.
139
136
  "Andria",
140
137
  "Barletta",
@@ -150,6 +147,7 @@ class Italy(HolidayBase, ChristianHolidays, InternationalHolidays):
150
147
  def __init__(self, *args, **kwargs):
151
148
  ChristianHolidays.__init__(self)
152
149
  InternationalHolidays.__init__(self)
150
+ StaticHolidays.__init__(self, cls=ItalyStaticHolidays)
153
151
  super().__init__(*args, **kwargs)
154
152
 
155
153
  def _populate_public_holidays(self):
@@ -159,6 +157,10 @@ class Italy(HolidayBase, ChristianHolidays, InternationalHolidays):
159
157
  # Epiphany.
160
158
  self._add_epiphany_day("Epifania del Signore")
161
159
 
160
+ if self._year <= 1976:
161
+ # Saint Joseph's Day.
162
+ self._add_saint_josephs_day("San Giuseppe")
163
+
162
164
  # Easter Sunday.
163
165
  self._add_easter_sunday("Pasqua di Resurrezione")
164
166
 
@@ -176,27 +178,39 @@ class Italy(HolidayBase, ChristianHolidays, InternationalHolidays):
176
178
  # Republic Day.
177
179
  self._add_holiday_jun_2("Festa della Repubblica")
178
180
 
181
+ if self._year <= 1976:
182
+ # Ascension Day.
183
+ self._add_ascension_thursday("Ascensione Nostro Signore")
184
+
185
+ # Saints Peter and Paul.
186
+ self._add_saints_peter_and_paul_day("Santi Pietro e Paolo")
187
+
188
+ # Corpus Christi.
189
+ self._add_corpus_christi_day("Corpus Domini")
190
+
179
191
  # Assumption Of Mary Day.
180
192
  self._add_assumption_of_mary_day("Assunzione della Vergine")
181
193
 
182
194
  # All Saints' Day.
183
195
  self._add_all_saints_day("Tutti i Santi")
184
196
 
185
- # Immaculate Conception Day.
197
+ if self._year <= 1976:
198
+ # National Unity and Armed Forces Day.
199
+ self._add_holiday_nov_4("Giornata dell'Unità Nazionale e delle Forze Armate")
200
+
201
+ # Immaculate Conception.
186
202
  self._add_immaculate_conception_day("Immacolata Concezione")
187
203
 
188
204
  # Christmas Day.
189
205
  self._add_christmas_day("Natale")
190
206
 
191
- self._add_christmas_day_two("Santo Stefano")
207
+ if self._year >= 1947:
208
+ # Saint Stephen's Day.
209
+ self._add_christmas_day_two("Santo Stefano")
192
210
 
193
211
  if self.subdiv == "Forlì":
194
212
  self._populate_subdiv_forli_public_holidays()
195
213
 
196
- # Provinces holidays.
197
- # https://it.wikipedia.org/wiki/Santi_patroni_cattolici_delle_citt%C3%A0_capoluogo_di_provincia_italiane
198
- # Please maintain in alphabetical order for easy updating in the future.
199
-
200
214
  def _populate_subdiv_ag_public_holidays(self):
201
215
  self._add_holiday_feb_25("San Gerlando")
202
216
 
@@ -243,11 +257,12 @@ class Italy(HolidayBase, ChristianHolidays, InternationalHolidays):
243
257
  self._add_holiday_oct_4("San Petronio")
244
258
 
245
259
  def _populate_subdiv_br_public_holidays(self):
246
- self._add_holiday_1st_sun_of_sep("San Teodoro d'Amasea e San Lorenzo da Brindisi")
260
+ self._add_holiday_1st_sun_of_sep("San Lorenzo da Brindisi")
247
261
 
248
262
  def _populate_subdiv_bs_public_holidays(self):
249
263
  self._add_holiday_feb_15("Santi Faustino e Giovita")
250
264
 
265
+ # Barletta-Andria-Trani
251
266
  def _populate_subdiv_bt_public_holidays(self):
252
267
  self._add_holiday_may_3("San Nicola Pellegrino")
253
268
  self._add_holiday_3rd_sun_of_sep("San Riccardo di Andria")
@@ -293,6 +308,7 @@ class Italy(HolidayBase, ChristianHolidays, InternationalHolidays):
293
308
  def _populate_subdiv_en_public_holidays(self):
294
309
  self._add_holiday_jul_2("Madonna della Visitazione")
295
310
 
311
+ # Forlì-Cesena
296
312
  def _populate_subdiv_fc_public_holidays(self):
297
313
  self._add_holiday_feb_4("Madonna del Fuoco")
298
314
  self._add_saint_johns_day("San Giovanni Battista")
@@ -307,8 +323,8 @@ class Italy(HolidayBase, ChristianHolidays, InternationalHolidays):
307
323
  self._add_saint_johns_day("San Giovanni Battista")
308
324
 
309
325
  def _populate_subdiv_fm_public_holidays(self):
310
- aug_15 = self._add_assumption_of_mary_day("Maria Santissima Assunta")
311
- self._add_holiday("Maria Santissima Assunta", aug_15 + td(days=+1))
326
+ self._add_assumption_of_mary_day("Maria Santissima Assunta")
327
+ self._add_holiday_aug_16("Maria Santissima Assunta")
312
328
 
313
329
  def _populate_subdiv_fr_public_holidays(self):
314
330
  self._add_holiday_jun_20("San Silverio")
@@ -344,7 +360,8 @@ class Italy(HolidayBase, ChristianHolidays, InternationalHolidays):
344
360
  self._add_holiday_jan_19("San Bassiano")
345
361
 
346
362
  def _populate_subdiv_lt_public_holidays(self):
347
- self._add_holiday_apr_25("San Marco evangelista")
363
+ self._add_holiday_apr_25("San Marco Evangelista")
364
+ self._add_holiday_jul_6("Santa Maria Goretti")
348
365
 
349
366
  def _populate_subdiv_lu_public_holidays(self):
350
367
  self._add_holiday_jul_12("San Paolino di Lucca")
@@ -386,7 +403,7 @@ class Italy(HolidayBase, ChristianHolidays, InternationalHolidays):
386
403
  self._add_holiday_feb_13("Sant'Archelao")
387
404
 
388
405
  def _populate_subdiv_pa_public_holidays(self):
389
- self._add_holiday_jul_15("San Giovanni")
406
+ self._add_holiday_jul_15("Santa Rosalia")
390
407
 
391
408
  def _populate_subdiv_pc_public_holidays(self):
392
409
  self._add_holiday_jul_4("Sant'Antonino di Piacenza")
@@ -398,7 +415,8 @@ class Italy(HolidayBase, ChristianHolidays, InternationalHolidays):
398
415
  self._add_holiday_oct_10("San Cetteo")
399
416
 
400
417
  def _populate_subdiv_pg_public_holidays(self):
401
- self._add_holiday_jan_29("Sant'Ercolano e San Lorenzo")
418
+ self._add_holiday_aug_11("Santa Chiara d'Assisi")
419
+ self._add_holiday_oct_4("San Francesco d'Assisi")
402
420
 
403
421
  def _populate_subdiv_pi_public_holidays(self):
404
422
  self._add_holiday_jun_17("San Ranieri")
@@ -416,6 +434,7 @@ class Italy(HolidayBase, ChristianHolidays, InternationalHolidays):
416
434
  def _populate_subdiv_pt_public_holidays(self):
417
435
  self._add_saint_james_day("San Jacopo")
418
436
 
437
+ # Pesaro e Urbino
419
438
  def _populate_subdiv_pu_public_holidays(self):
420
439
  self._add_holiday_jun_1("San Crescentino")
421
440
  self._add_holiday_sep_24("San Terenzio di Pesaro")
@@ -436,7 +455,8 @@ class Italy(HolidayBase, ChristianHolidays, InternationalHolidays):
436
455
  self._add_holiday_nov_24("San Prospero Vescovo")
437
456
 
438
457
  def _populate_subdiv_rg_public_holidays(self):
439
- self._add_saint_georges_day("San Giorgio")
458
+ self._add_saint_georges_day("San Giorgio Martire")
459
+ self._add_holiday_aug_29("San Giovanni Battista")
440
460
 
441
461
  def _populate_subdiv_ri_public_holidays(self):
442
462
  self._add_holiday_dec_4("Santa Barbara")
@@ -469,6 +489,7 @@ class Italy(HolidayBase, ChristianHolidays, InternationalHolidays):
469
489
  self._add_holiday_dec_6("San Nicola")
470
490
 
471
491
  def _populate_subdiv_su_public_holidays(self):
492
+ # Carbonia.
472
493
  self._add_holiday_4_days_past_2nd_sun_of_may("San Ponziano")
473
494
 
474
495
  def _populate_subdiv_sv_public_holidays(self):
@@ -514,7 +535,7 @@ class Italy(HolidayBase, ChristianHolidays, InternationalHolidays):
514
535
  self._add_holiday_apr_25("San Marco Evangelista")
515
536
 
516
537
  def _populate_subdiv_vi_public_holidays(self):
517
- self._add_holiday_apr_25("San Marco")
538
+ self._add_nativity_of_mary_day("Madonna di Monte Berico")
518
539
 
519
540
  def _populate_subdiv_vr_public_holidays(self):
520
541
  self._add_holiday_may_21("San Zeno")
@@ -553,3 +574,12 @@ class IT(Italy):
553
574
 
554
575
  class ITA(Italy):
555
576
  pass
577
+
578
+
579
+ class ItalyStaticHolidays:
580
+ # Anniversary of the Unification of Italy.
581
+ anniversary_of_unification = "Anniversario dell'Unità d'Italia"
582
+ special_public_holidays = {
583
+ 1961: (MAR, 17, anniversary_of_unification),
584
+ 2011: (MAR, 17, anniversary_of_unification),
585
+ }
@@ -11,18 +11,28 @@
11
11
  # License: MIT (see LICENSE file)
12
12
 
13
13
  from datetime import date
14
- from datetime import timedelta as td
15
14
  from gettext import gettext as tr
16
- from typing import Tuple
17
-
18
- from holidays.calendars.gregorian import FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV
15
+ from typing import Set, Tuple
16
+
17
+ from holidays.calendars.gregorian import (
18
+ FEB,
19
+ MAR,
20
+ APR,
21
+ MAY,
22
+ JUN,
23
+ JUL,
24
+ AUG,
25
+ SEP,
26
+ OCT,
27
+ NOV,
28
+ _timedelta,
29
+ )
19
30
  from holidays.constants import BANK, PUBLIC
20
31
  from holidays.groups import InternationalHolidays, StaticHolidays
21
- from holidays.helpers import _normalize_tuple
22
- from holidays.holiday_base import HolidayBase
32
+ from holidays.observed_holiday_base import ObservedHolidayBase, SUN_TO_NEXT_WORKDAY
23
33
 
24
34
 
25
- class Japan(HolidayBase, InternationalHolidays, StaticHolidays):
35
+ class Japan(ObservedHolidayBase, InternationalHolidays, StaticHolidays):
26
36
  """
27
37
  References:
28
38
 
@@ -38,8 +48,33 @@ class Japan(HolidayBase, InternationalHolidays, StaticHolidays):
38
48
  def __init__(self, *args, **kwargs) -> None:
39
49
  InternationalHolidays.__init__(self)
40
50
  StaticHolidays.__init__(self, cls=JapanStaticHolidays)
51
+ kwargs.setdefault("observed_rule", SUN_TO_NEXT_WORKDAY)
41
52
  super().__init__(*args, **kwargs)
42
53
 
54
+ def _populate_observed(self, dts: Set[date]) -> None:
55
+ # When a national holiday falls on Sunday, next working day
56
+ # shall become a public holiday (振替休日) - substitute holidays.
57
+ for dt in sorted(dts):
58
+ is_observed, dt_observed = self._add_observed(
59
+ dt,
60
+ # Substitute Holiday.
61
+ name=tr("振替休日"),
62
+ show_observed_label=False,
63
+ )
64
+ if is_observed:
65
+ dts.add(dt_observed) # type: ignore[arg-type]
66
+
67
+ # A weekday between national holidays becomes
68
+ # a holiday too (国民の休日) - national holidays.
69
+ for dt in dts:
70
+ if _timedelta(dt, +2) not in dts:
71
+ continue
72
+ dt_observed = _timedelta(dt, +1)
73
+ if self._is_sunday(dt_observed) or dt_observed in dts:
74
+ continue
75
+ # National Holiday.
76
+ self._add_holiday(tr("国民の休日"), dt_observed)
77
+
43
78
  def _populate_public_holidays(self):
44
79
  if self._year < 1949 or self._year > 2099:
45
80
  raise NotImplementedError
@@ -161,32 +196,7 @@ class Japan(HolidayBase, InternationalHolidays, StaticHolidays):
161
196
  dts_observed.add(self._add_holiday_dec_23(tr("天皇誕生日")))
162
197
 
163
198
  if self.observed:
164
- for month, day, _ in _normalize_tuple(
165
- self.special_public_holidays.get(self._year, ())
166
- ):
167
- dts_observed.add(date(self._year, month, day))
168
-
169
- # When a national holiday falls on Sunday, next working day
170
- # shall become a public holiday (振替休日) - substitute holidays.
171
- for dt in dts_observed.copy():
172
- if not self._is_sunday(dt):
173
- continue
174
- dt_observed = dt + td(days=+1)
175
- while dt_observed in dts_observed:
176
- dt_observed += td(days=+1)
177
- # Substitute Holiday.
178
- dts_observed.add(self._add_holiday(tr("振替休日"), dt_observed))
179
-
180
- # A weekday between national holidays becomes
181
- # a holiday too (国民の休日) - citizens' holidays.
182
- for dt in dts_observed:
183
- if dt + td(days=+2) not in dts_observed:
184
- continue
185
- dt_observed = dt + td(days=+1)
186
- if self._is_sunday(dt_observed) or dt_observed in dts_observed:
187
- continue
188
- # National Holiday.
189
- self._add_holiday(tr("国民の休日"), dt_observed)
199
+ self._populate_observed(dts_observed)
190
200
 
191
201
  def _populate_bank_holidays(self):
192
202
  if self._year < 1949 or self._year > 2099:
@@ -235,6 +245,8 @@ class JPN(Japan):
235
245
 
236
246
 
237
247
  class JapanStaticHolidays:
248
+ national_holiday = tr("国民の休日")
249
+
238
250
  special_public_holidays = {
239
251
  1959: (APR, 10, tr("結婚の儀")), # The Crown Prince marriage ceremony.
240
252
  1989: (FEB, 24, tr("大喪の礼")), # State Funeral of Emperor Shōwa.
@@ -245,3 +257,10 @@ class JapanStaticHolidays:
245
257
  (OCT, 22, tr("即位礼正殿の儀が行われる日")), # Enthronement ceremony.
246
258
  ),
247
259
  }
260
+
261
+ special_public_holidays_observed = {
262
+ 2019: (
263
+ (APR, 30, national_holiday),
264
+ (MAY, 2, national_holiday),
265
+ ),
266
+ }