python-hebrewdate 0.9__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.
@@ -0,0 +1,433 @@
1
+ from enum import IntEnum
2
+
3
+ from date import Weekday
4
+ from hebrewdate import HebrewDate, HebrewMonth
5
+
6
+
7
+ class HebrewHolidayId(IntEnum):
8
+ NONE = 0
9
+ PESACH = 1
10
+ PESACH_VII = 3
11
+ YOM_HASHOAH = 5
12
+ YOM_HAZIKARON = 6
13
+ YOM_HAATZMAUT = 7
14
+ PESACH_SHENI = 8
15
+ LAG_BOMER = 9
16
+ YOM_YERUSHALAYIM = 10
17
+ SHAVUOT = 11
18
+ FAST_OF_TAMMUZ = 13
19
+ FAST_OF_AV = 14
20
+ TU_BAV = 15
21
+ ROSH_HASHANA = 16
22
+ ROSH_HASHANA_II = 17
23
+ TZOM_GEDALIAH = 18
24
+ YOM_KIPPUR = 19
25
+ SUKKOT = 20
26
+ HOSHANA_RABA = 22
27
+ SHEMINI_ATZERET = 23
28
+ SIMCHAT_TORAH = 24
29
+ SIMCHAT_TORAH_SHEMINI_ATZERETH = 25
30
+ CHANUKKA_I = 26
31
+ CHANUKKA_II = 27
32
+ CHANUKKA_III = 28
33
+ CHANUKKA_IV = 29
34
+ CHANUKKA_V = 30
35
+ CHANUKKA_VI = 31
36
+ CHANUKKA_VII = 32
37
+ CHANUKKA_VIII = 33
38
+ FAST_OF_TEVET = 34
39
+ TU_BSHEVAT = 35
40
+ FAST_OF_ESTHER = 36
41
+ PURIM = 37
42
+ SHUSHAN_PURIM = 38
43
+
44
+
45
+ class DiasporaHolidayId(IntEnum):
46
+ PESACH_II = 2
47
+ SUKKOT_II = 21
48
+
49
+
50
+ class HebrewSecondYomTovId(IntEnum):
51
+ PESACH_VIII = 4
52
+ SHAVUOT_II = 12
53
+
54
+
55
+ class HebrewHoliday:
56
+ def __init__(self, hebrewDate):
57
+ year = hebrewDate.year
58
+ month = hebrewDate.month
59
+ day = hebrewDate.day
60
+
61
+ self.hebrewDate = hebrewDate
62
+ self.id = HebrewHolidayId.NONE
63
+
64
+ if month == HebrewMonth.NISAN:
65
+ if day == 15:
66
+ self.id = HebrewHolidayId.PESACH
67
+ elif day == 21:
68
+ self.id = HebrewHolidayId.PESACH_VII
69
+ else:
70
+ # 27 Nisan can only ever fall on Sun/Tue/Thu/Fri.
71
+ # Friday -> advance to Thursday (26); Sunday -> postpone to Monday (28);
72
+ # Tue/Thu -> observed on the 27th itself.
73
+ testDate = HebrewDate(year, HebrewMonth.NISAN, 27)
74
+ if testDate.dayofweek == Weekday.FRIDAY:
75
+ if day == 26:
76
+ self.id = HebrewHolidayId.YOM_HASHOAH
77
+ elif year >= 5757 and testDate.dayofweek == Weekday.SUNDAY:
78
+ if day == 28:
79
+ self.id = HebrewHolidayId.YOM_HASHOAH
80
+ elif day == 27:
81
+ self.id = HebrewHolidayId.YOM_HASHOAH
82
+
83
+ if month == HebrewMonth.IYAR:
84
+ # 4 Iyar can only ever fall on Sun/Tue/Thu/Fri.
85
+ # Tuesday-Wednesday: normative, no shift (4/5 Iyar).
86
+ # Thursday-Friday: advance one day to avoid running into Shabbat (3/4 Iyar).
87
+ # Friday-Saturday: advance two days (2/3 Iyar).
88
+ # Sunday-Monday (since 5764): postpone one day to avoid Motzei-Shabbat
89
+ # preparations (5/6 Iyar); before the reform, observed 4/5 Iyar as normal.
90
+ nominal4 = HebrewDate(year, HebrewMonth.IYAR, 4).dayofweek
91
+ if nominal4 == Weekday.THURSDAY:
92
+ zikaronDay, atzmautDay = 3, 4
93
+ elif nominal4 == Weekday.FRIDAY:
94
+ zikaronDay, atzmautDay = 2, 3
95
+ elif nominal4 == Weekday.SUNDAY and year >= 5764:
96
+ zikaronDay, atzmautDay = 5, 6
97
+ else:
98
+ zikaronDay, atzmautDay = 4, 5
99
+
100
+ if day == zikaronDay:
101
+ self.id = HebrewHolidayId.YOM_HAZIKARON
102
+ elif day == atzmautDay:
103
+ self.id = HebrewHolidayId.YOM_HAATZMAUT
104
+
105
+ if day == 14:
106
+ self.id = HebrewHolidayId.PESACH_SHENI
107
+ elif day == 18:
108
+ self.id = HebrewHolidayId.LAG_BOMER
109
+ elif day == 28:
110
+ self.id = HebrewHolidayId.YOM_YERUSHALAYIM
111
+
112
+ if month == HebrewMonth.SIVAN:
113
+ if day == 6:
114
+ self.id = HebrewHolidayId.SHAVUOT
115
+
116
+ if month == HebrewMonth.TAMMUZ:
117
+ # 17 Tammuz never falls on Friday, but can fall on Shabbat; postpone to Sunday.
118
+ fastDate = HebrewDate(year, HebrewMonth.TAMMUZ, 17)
119
+ if fastDate.dayofweek == Weekday.SATURDAY:
120
+ if day == 18:
121
+ self.id = HebrewHolidayId.FAST_OF_TAMMUZ
122
+ elif day == 17:
123
+ self.id = HebrewHolidayId.FAST_OF_TAMMUZ
124
+
125
+ if month == HebrewMonth.AV:
126
+ # 9 Av never falls on Friday, but can fall on Shabbat; postpone to Sunday.
127
+ fastDate = HebrewDate(year, HebrewMonth.AV, 9)
128
+ if fastDate.dayofweek == Weekday.SATURDAY:
129
+ if day == 10:
130
+ self.id = HebrewHolidayId.FAST_OF_AV
131
+ elif day == 9:
132
+ self.id = HebrewHolidayId.FAST_OF_AV
133
+ if day == 15:
134
+ self.id = HebrewHolidayId.TU_BAV
135
+
136
+ if month == HebrewMonth.TISHREI:
137
+ if day == 1:
138
+ self.id = HebrewHolidayId.ROSH_HASHANA
139
+ elif day == 2:
140
+ self.id = HebrewHolidayId.ROSH_HASHANA_II
141
+ else:
142
+ # 3 Tishrei never falls on Friday, but can fall on Shabbat; postpone to Sunday.
143
+ tzomDate = HebrewDate(year, HebrewMonth.TISHREI, 3)
144
+ if tzomDate.dayofweek == Weekday.SATURDAY:
145
+ if day == 4:
146
+ self.id = HebrewHolidayId.TZOM_GEDALIAH
147
+ elif day == 3:
148
+ self.id = HebrewHolidayId.TZOM_GEDALIAH
149
+
150
+ if day == 10:
151
+ self.id = HebrewHolidayId.YOM_KIPPUR
152
+ elif day == 15:
153
+ self.id = HebrewHolidayId.SUKKOT
154
+ elif day == 21:
155
+ self.id = HebrewHolidayId.HOSHANA_RABA
156
+ elif day == 22:
157
+ self.id = HebrewHolidayId.SIMCHAT_TORAH_SHEMINI_ATZERETH
158
+
159
+ if month in (HebrewMonth.KISLEV, HebrewMonth.TEVET):
160
+ if month == HebrewMonth.KISLEV and day >= 25:
161
+ self.id = HebrewHolidayId(HebrewHolidayId.CHANUKKA_I + (day - 25))
162
+
163
+ if month == HebrewMonth.TEVET:
164
+ if day == 10:
165
+ self.id = HebrewHolidayId.FAST_OF_TEVET
166
+ kislevDays = HebrewDate.numdaysinmonth(year, HebrewMonth.KISLEV)
167
+ if kislevDays == 29 and day <= 3:
168
+ self.id = HebrewHolidayId(HebrewHolidayId.CHANUKKA_I + (4 + day))
169
+ if kislevDays == 30 and day <= 2:
170
+ self.id = HebrewHolidayId(HebrewHolidayId.CHANUKKA_I + (5 + day))
171
+
172
+ if month == HebrewMonth.SHEVAT and day == 15:
173
+ self.id = HebrewHolidayId.TU_BSHEVAT
174
+
175
+ monthEsther = HebrewDate.numMonthInYear(year)
176
+ if month == monthEsther:
177
+ # 13 Adar never falls on Friday, but can fall on Shabbat; advance to Thursday.
178
+ fastDate = HebrewDate(year, monthEsther, 13)
179
+ if fastDate.dayofweek == Weekday.SATURDAY:
180
+ if day == 11:
181
+ self.id = HebrewHolidayId.FAST_OF_ESTHER
182
+ elif day == 13:
183
+ self.id = HebrewHolidayId.FAST_OF_ESTHER
184
+ if day == 14:
185
+ self.id = HebrewHolidayId.PURIM
186
+ elif day == 15:
187
+ self.id = HebrewHolidayId.SHUSHAN_PURIM
188
+
189
+ @property
190
+ def is_shabbat(self):
191
+ return self.hebrewDate.dayofweek == 7
192
+
193
+ @property
194
+ def is_rest_day(self):
195
+ if self.hebrewDate.dayofweek == 7:
196
+ return True
197
+ return self.id in (
198
+ HebrewHolidayId.ROSH_HASHANA,
199
+ HebrewHolidayId.ROSH_HASHANA_II,
200
+ HebrewHolidayId.YOM_KIPPUR,
201
+ HebrewHolidayId.SUKKOT,
202
+ HebrewHolidayId.PESACH,
203
+ HebrewHolidayId.PESACH_VII,
204
+ HebrewHolidayId.SHAVUOT,
205
+ HebrewHolidayId.SIMCHAT_TORAH_SHEMINI_ATZERETH,
206
+ )
207
+
208
+ @property
209
+ def is_festive(self):
210
+ return self.id in (
211
+ HebrewHolidayId.PURIM,
212
+ HebrewHolidayId.SHUSHAN_PURIM,
213
+ HebrewHolidayId.LAG_BOMER,
214
+ HebrewHolidayId.TU_BAV,
215
+ HebrewHolidayId.CHANUKKA_I,
216
+ HebrewHolidayId.CHANUKKA_II,
217
+ HebrewHolidayId.CHANUKKA_III,
218
+ HebrewHolidayId.CHANUKKA_IV,
219
+ HebrewHolidayId.CHANUKKA_V,
220
+ HebrewHolidayId.CHANUKKA_VI,
221
+ HebrewHolidayId.CHANUKKA_VII,
222
+ HebrewHolidayId.CHANUKKA_VIII,
223
+ )
224
+
225
+ @property
226
+ def is_fast(self):
227
+ return self.id in (
228
+ HebrewHolidayId.FAST_OF_TAMMUZ,
229
+ HebrewHolidayId.FAST_OF_AV,
230
+ HebrewHolidayId.TZOM_GEDALIAH,
231
+ HebrewHolidayId.FAST_OF_TEVET,
232
+ HebrewHolidayId.FAST_OF_ESTHER,
233
+ HebrewHolidayId.YOM_KIPPUR,
234
+ )
235
+
236
+ @property
237
+ def is_national(self):
238
+ return self.id in (
239
+ HebrewHolidayId.YOM_HASHOAH,
240
+ HebrewHolidayId.YOM_HAZIKARON,
241
+ HebrewHolidayId.YOM_HAATZMAUT,
242
+ HebrewHolidayId.YOM_YERUSHALAYIM,
243
+ )
244
+
245
+ @property
246
+ def moed(self):
247
+ month = self.hebrewDate.month
248
+ day = self.hebrewDate.day
249
+ if month == HebrewMonth.NISAN and 15 <= day <= 21:
250
+ return HebrewHoliday(HebrewDate(self.hebrewDate.year, HebrewMonth.NISAN, 15))
251
+ if month == HebrewMonth.TISHREI and 15 <= day <= 21:
252
+ return HebrewHoliday(HebrewDate(self.hebrewDate.year, HebrewMonth.TISHREI, 15))
253
+ return None
254
+
255
+ @property
256
+ def erev(self):
257
+ if HebrewHoliday(self.hebrewDate.next).id in (
258
+ HebrewHolidayId.PESACH,
259
+ HebrewHolidayId.SHAVUOT,
260
+ HebrewHolidayId.ROSH_HASHANA,
261
+ HebrewHolidayId.YOM_KIPPUR,
262
+ HebrewHolidayId.SUKKOT,
263
+ HebrewHolidayId.FAST_OF_AV,
264
+ HebrewHolidayId.YOM_HAZIKARON,
265
+ HebrewHolidayId.YOM_HAATZMAUT,
266
+ ):
267
+ return HebrewHoliday(self.hebrewDate.next)
268
+ return None
269
+
270
+ @property
271
+ def diaspora(self):
272
+ month = self.hebrewDate.month
273
+ day = self.hebrewDate.day
274
+
275
+ if month == HebrewMonth.NISAN:
276
+ if day == 16:
277
+ return DiasporaHolidayId.PESACH_II
278
+ if day == 22:
279
+ return HebrewSecondYomTovId.PESACH_VIII
280
+
281
+ if month == HebrewMonth.SIVAN and day == 7:
282
+ return HebrewSecondYomTovId.SHAVUOT_II
283
+
284
+ if month == HebrewMonth.TISHREI and day == 16:
285
+ return DiasporaHolidayId.SUKKOT_II
286
+
287
+ return self.id
288
+
289
+ @property
290
+ def is_solemn(self):
291
+ return self.id in (
292
+ HebrewHolidayId.YOM_HASHOAH,
293
+ HebrewHolidayId.YOM_HAZIKARON,
294
+ )
295
+
296
+ def __repr__(self):
297
+ return f"HebrewHoliday({self.id.name})"
298
+
299
+ @staticmethod
300
+ def holidays(year):
301
+ first = HebrewDate(year, HebrewMonth.TISHREI, 1)
302
+ last = HebrewDate(year + 1, HebrewMonth.TISHREI, 1)
303
+ dates = []
304
+ h = first
305
+ while h.ordinal < last.ordinal:
306
+ if HebrewHoliday(h).id != HebrewHolidayId.NONE:
307
+ dates.append(h)
308
+ h = h.next
309
+ return dates
310
+
311
+
312
+ class HolidayNames:
313
+ NAMES_EN = [
314
+ "",
315
+ "Pesach",
316
+ "Pesach II",
317
+ "Pesach VII",
318
+ "Pesach VIII",
319
+ "Yom HaShoah",
320
+ "Yom HaZikaron",
321
+ "Yom HaAtzmaut",
322
+ "Pesach Sheni",
323
+ "Lag BaOmer",
324
+ "Yom Yerushalayim",
325
+ "Shavuot",
326
+ "Shavuot II",
327
+ "Fast of Tammuz",
328
+ "Fast of Av",
329
+ "Tu B'Av",
330
+ "Rosh Hashanah",
331
+ "Rosh Hashanah II",
332
+ "Fast of Gedaliah",
333
+ "Yom Kippur",
334
+ "Sukkot",
335
+ "Sukkot II",
336
+ "Hoshana Rabbah",
337
+ "Shemini Atzeret",
338
+ "Simchat Torah",
339
+ "Simchat Torah / Shemini Atzeret",
340
+ "Chanukkah I",
341
+ "Chanukkah II",
342
+ "Chanukkah III",
343
+ "Chanukkah IV",
344
+ "Chanukkah V",
345
+ "Chanukkah VI",
346
+ "Chanukkah VII",
347
+ "Chanukkah VIII",
348
+ "Fast of Tevet",
349
+ "Tu BiShvat",
350
+ "Fast of Esther",
351
+ "Purim",
352
+ "Shushan Purim",
353
+ ]
354
+ NAMES_HE = [
355
+ "",
356
+ "פסח",
357
+ "פסח שני (גלות)",
358
+ "פסח שביעי",
359
+ "פסח שמיני (גלות)",
360
+ "יום השואה",
361
+ "יום הזיכרון",
362
+ "יום העצמאות",
363
+ "פסח שני",
364
+ "ל״ג בעומר",
365
+ "יום ירושלים",
366
+ "שבועות",
367
+ "שבועות שני (גלות)",
368
+ "תענית תמוז",
369
+ "תענית אב",
370
+ "ט״ו באב",
371
+ "ראש השנה",
372
+ "ראש השנה ב׳",
373
+ "צום גדליה",
374
+ "יום כיפור",
375
+ "סוכות",
376
+ "סוכות שני (גלות)",
377
+ "הושענא רבה",
378
+ "שמיני עצרת",
379
+ "שמחת תורה",
380
+ "שמחת תורה / שמיני עצרת",
381
+ "חנוכה א׳",
382
+ "חנוכה ב׳",
383
+ "חנוכה ג׳",
384
+ "חנוכה ד׳",
385
+ "חנוכה ה׳",
386
+ "חנוכה ו׳",
387
+ "חנוכה ז׳",
388
+ "חנוכה ח׳",
389
+ "תענית טבת",
390
+ "ט״ו בשבט",
391
+ "תענית אסתר",
392
+ "פורים",
393
+ "שושן פורים",
394
+ ]
395
+
396
+ def __init__(self, lang, id):
397
+ self.lang = lang
398
+ self.id = id
399
+
400
+ def name(self):
401
+ if self.lang == 'en':
402
+ return self.NAMES_EN[self.id]
403
+ return self.NAMES_HE[self.id]
404
+
405
+
406
+ if __name__ == "__main__":
407
+ import time as _systime
408
+ from date import Date
409
+
410
+ now = _systime.localtime()
411
+ today = Date(now.tm_year, now.tm_mon, now.tm_mday)
412
+ hToday = HebrewDate.fromdate(today)
413
+
414
+ year = hToday.year
415
+
416
+ yearStart = HebrewDate(year, HebrewMonth.TISHREI, 1)
417
+ yearEnd = HebrewDate(year + 1, HebrewMonth.TISHREI, 1)
418
+
419
+ print(f"Holidays in Hebrew year {year}")
420
+ print()
421
+
422
+ hDate = yearStart
423
+ while hDate.ordinal < yearEnd.ordinal:
424
+ holiday = HebrewHoliday(hDate)
425
+ diasporaId = holiday.diaspora
426
+ if holiday.id != HebrewHolidayId.NONE or diasporaId != holiday.id:
427
+ gDate = Date.fromordinal(hDate.ordinal)
428
+ localName = HolidayNames('en', holiday.id).name() if holiday.id != HebrewHolidayId.NONE else ""
429
+ line = f"{gDate.year}-{gDate.month:02d}-{gDate.day:02d} {localName}"
430
+ if diasporaId != holiday.id:
431
+ line += f"{HolidayNames('en', diasporaId).name()} (diaspora)"
432
+ print(line)
433
+ hDate = hDate.next