diff --git a/stubs/pyluach/@tests/stubtest_allowlist.txt b/stubs/pyluach/@tests/stubtest_allowlist.txt new file mode 100644 index 000000000000..7d6b35fd3a3a --- /dev/null +++ b/stubs/pyluach/@tests/stubtest_allowlist.txt @@ -0,0 +1,2 @@ +# Module with no public API, for internal use only: +pyluach.gematria diff --git a/stubs/pyluach/METADATA.toml b/stubs/pyluach/METADATA.toml new file mode 100644 index 000000000000..2297c2a2eb84 --- /dev/null +++ b/stubs/pyluach/METADATA.toml @@ -0,0 +1,2 @@ +version = "2.2.*" +upstream_repository = "https://github.com/simlist/pyluach" diff --git a/stubs/pyluach/pyluach/__init__.pyi b/stubs/pyluach/pyluach/__init__.pyi new file mode 100644 index 000000000000..c5dd95466063 --- /dev/null +++ b/stubs/pyluach/pyluach/__init__.pyi @@ -0,0 +1,3 @@ +from typing import Final + +__version__: Final[str] diff --git a/stubs/pyluach/pyluach/dates.pyi b/stubs/pyluach/pyluach/dates.pyi new file mode 100644 index 000000000000..f4d1f8d78608 --- /dev/null +++ b/stubs/pyluach/pyluach/dates.pyi @@ -0,0 +1,106 @@ +import abc +import datetime +from collections.abc import Generator +from enum import Enum +from typing import TypedDict, overload, type_check_only +from typing_extensions import Self + +@type_check_only +class _DateDict(TypedDict): + year: int + month: int + day: int + +class Rounding(Enum): + PREVIOUS_DAY = 1 + NEXT_DAY = 2 + EXCEPTION = 3 + +class BaseDate(abc.ABC, metaclass=abc.ABCMeta): + @property + @abc.abstractmethod + def jd(self) -> float: ... + @abc.abstractmethod + def to_heb(self) -> HebrewDate: ... + def __hash__(self) -> int: ... + def __add__(self, other: float) -> BaseDate: ... + @overload + def __sub__(self, other: float) -> BaseDate: ... + @overload + def __sub__(self, other: BaseDate) -> int: ... + def __eq__(self, other: object) -> bool: ... + def __ne__(self, other: object) -> bool: ... + def __lt__(self, other: object) -> bool: ... + def __gt__(self, other: object) -> bool: ... + def __le__(self, other: object) -> bool: ... + def __ge__(self, other: object) -> bool: ... + def weekday(self) -> int: ... + def isoweekday(self) -> int: ... + def shabbos(self) -> Self: ... + def fast_day(self, hebrew: bool = False) -> str | None: ... + def festival( + self, israel: bool = False, hebrew: bool = False, include_working_days: bool = True, prefix_day: bool = False + ) -> str | None: ... + def holiday(self, israel: bool = False, hebrew: bool = False, prefix_day: bool = False) -> str | None: ... + +class CalendarDateMixin: + year: int + month: int + day: int + def __init__(self, year: int, month: int, day: int, jd: float | None = None) -> None: ... + def __iter__(self) -> Generator[int]: ... + def tuple(self) -> tuple[int, int, int]: ... + def dict(self) -> _DateDict: ... + def replace(self, year: int | None = None, month: int | None = None, day: int | None = None) -> Self: ... + +class JulianDay(BaseDate): + day: float + def __init__(self, day: float) -> None: ... + @property + def jd(self) -> float: ... + @staticmethod + def from_pydate(pydate: datetime.date) -> JulianDay: ... + @staticmethod + def today() -> JulianDay: ... + def to_greg(self) -> GregorianDate: ... + def to_heb(self) -> HebrewDate: ... + def to_pydate(self) -> datetime.date: ... + +class GregorianDate(BaseDate, CalendarDateMixin): + def __init__(self, year: int, month: int, day: int, jd: float | None = None) -> None: ... + def __format__(self, fmt: str) -> str: ... + def strftime(self, fmt: str) -> str: ... + @property + def jd(self) -> float: ... + @classmethod + def from_pydate(cls, pydate: datetime.date) -> Self: ... + @staticmethod + def today() -> GregorianDate: ... + def is_leap(self) -> bool: ... + def to_jd(self) -> JulianDay: ... + def to_heb(self) -> HebrewDate: ... + def to_pydate(self) -> datetime.date: ... + +class HebrewDate(BaseDate, CalendarDateMixin): + def __init__(self, year: int, month: int, day: int, jd: float | None = None) -> None: ... + def __format__(self, fmt: str) -> str: ... + @property + def jd(self) -> float: ... + @staticmethod + def from_pydate(pydate: datetime.date) -> HebrewDate: ... + @staticmethod + def today() -> HebrewDate: ... + def to_jd(self) -> JulianDay: ... + def to_greg(self) -> GregorianDate: ... + def to_pydate(self) -> datetime.date: ... + def to_heb(self) -> HebrewDate: ... + def month_name(self, hebrew: bool = False) -> str: ... + def hebrew_day(self, withgershayim: bool = True) -> str: ... + def hebrew_year(self, thousands: bool = False, withgershayim: bool = True) -> str: ... + def hebrew_date_string(self, thousands: bool = False) -> str: ... + def add( + self, years: int = 0, months: int = 0, days: int = 0, adar1: bool | None = False, rounding: Rounding = Rounding.NEXT_DAY + ) -> HebrewDate: ... + def subtract( + self, years: int = 0, months: int = 0, days: int = 0, adar1: bool | None = False, rounding: Rounding = Rounding.NEXT_DAY + ) -> HebrewDate: ... diff --git a/stubs/pyluach/pyluach/hebrewcal.pyi b/stubs/pyluach/pyluach/hebrewcal.pyi new file mode 100644 index 000000000000..4eed2968f558 --- /dev/null +++ b/stubs/pyluach/pyluach/hebrewcal.pyi @@ -0,0 +1,141 @@ +import calendar +import datetime +from collections.abc import Generator +from typing import Literal, TypedDict, overload, type_check_only +from typing_extensions import Self + +from .dates import BaseDate, HebrewDate + +@type_check_only +class _MoladDict(TypedDict): + weekday: int + hours: int + parts: int + +@type_check_only +class _MoladAnnouncementDict(TypedDict): + weekday: int + hour: int + minutes: int + parts: int + +class IllegalMonthError(ValueError): + month: int + def __init__(self, month: int) -> None: ... + +class IllegalWeekdayError(ValueError): + weekday: int + def __init__(self, weekday: int) -> None: ... + +class Year: + year: int + leap: bool + def __init__(self, year: int) -> None: ... + def __len__(self) -> int: ... + def __eq__(self, other: object) -> bool: ... + def __add__(self, other: int) -> Year: ... + @overload + def __sub__(self, other: int) -> Year: ... + @overload + def __sub__(self, other: Year) -> int: ... + def __gt__(self, other: Year) -> bool: ... + def __ge__(self, other: Year) -> bool: ... + def __lt__(self, other: Year) -> bool: ... + def __le__(self, other: Year) -> bool: ... + def __iter__(self) -> Generator[int]: ... + def monthscount(self) -> Literal[12, 13]: ... + def itermonths(self) -> Generator[Month]: ... + def iterdays(self) -> Generator[int]: ... + def iterdates(self) -> Generator[HebrewDate]: ... + @classmethod + def from_date(cls, date: BaseDate) -> Self: ... + @classmethod + def from_pydate(cls, pydate: datetime.date) -> Self: ... + def year_string(self, thousands: bool = False) -> str: ... + +class Month: + year: int + month: int + def __init__(self, year: int, month: int) -> None: ... + def __len__(self) -> int: ... + def __iter__(self) -> Generator[int]: ... + def __eq__(self, other: object) -> bool: ... + def __add__(self, other: int) -> Month: ... + @overload + def __sub__(self, other: int) -> Month: ... + @overload + def __sub__(self, other: Month) -> int: ... + def __gt__(self, other: Month) -> bool: ... + def __ge__(self, other: Month) -> bool: ... + def __lt__(self, other: Month) -> bool: ... + def __le__(self, other: Month) -> bool: ... + @classmethod + def from_date(cls, date: BaseDate) -> Month: ... + @classmethod + def from_pydate(cls, pydate: datetime.date) -> Month: ... + def month_name(self, hebrew: bool = False) -> str: ... + def month_string(self, thousands: bool = False) -> str: ... + def starting_weekday(self) -> int: ... + def iterdates(self) -> Generator[HebrewDate]: ... + def molad(self) -> _MoladDict: ... + def molad_announcement(self) -> _MoladAnnouncementDict: ... + +def to_hebrew_numeral(num: int, thousands: bool = False, withgershayim: bool = True) -> str: ... + +class HebrewCalendar(calendar.Calendar): + hebrewnumerals: bool + hebrewweekdays: bool + hebrewmonths: bool + hebrewyear: bool + def __init__( + self, + firstweekday: int = 1, + hebrewnumerals: bool = True, + hebrewweekdays: bool = False, + hebrewmonths: bool = False, + hebrewyear: bool = False, + ) -> None: ... + @property + def firstweekday(self) -> int: ... + @firstweekday.setter + def firstweekday(self, thefirstweekday: int) -> None: ... + def iterweekdays(self) -> Generator[int]: ... + def itermonthdates(self, year: int, month: int) -> Generator[HebrewDate]: ... # type: ignore[override] + def itermonthdays(self, year: int, month: int) -> Generator[int]: ... + def itermonthdays2(self, year: int, month: int) -> Generator[tuple[int, int]]: ... + def itermonthdays3(self, year: int, month: int) -> Generator[tuple[int, int, int]]: ... + def itermonthdays4(self, year: int, month: int) -> Generator[tuple[int, int, int, int]]: ... + def yeardatescalendar(self, year: int, width: int = 3) -> list[list[list[list[HebrewDate]]]]: ... # type: ignore[override] + def yeardays2calendar(self, year: int, width: int = 3) -> list[list[list[list[tuple[int, int]]]]]: ... + def yeardayscalendar(self, year: int, width: int = 3) -> list[list[list[list[int]]]]: ... + def monthdatescalendar(self, year: int, month: int) -> list[list[HebrewDate]]: ... # type: ignore[override] + +class HebrewHTMLCalendar(HebrewCalendar, calendar.HTMLCalendar): + rtl: bool + def __init__( + self, + firstweekday: int = 1, + hebrewnumerals: bool = True, + hebrewweekdays: bool = False, + hebrewmonths: bool = False, + hebrewyear: bool = False, + rtl: bool = False, + ) -> None: ... + def formatday(self, day: int, weekday: int) -> str: ... + def formatweekday(self, day: int) -> str: ... + def formatyearnumber(self, theyear: int) -> int | str: ... + def formatmonthname(self, theyear: int, themonth: int, withyear: bool = True) -> str: ... + def formatmonth(self, theyear: int, themonth: int, withyear: bool = True) -> str: ... + def formatyear(self, theyear: int, width: int = 3) -> str: ... + +class HebrewTextCalendar(HebrewCalendar, calendar.TextCalendar): + def formatday(self, day: int, weekday: int, width: int) -> str: ... + def formatweekday(self, day: int, width: int) -> str: ... + def formatmonthname(self, theyear: int, themonth: int, width: int = 0, withyear: bool = True) -> str: ... + def formatyear(self, theyear: int, w: int = 2, l: int = 1, c: int = 6, m: int = 3) -> str: ... + +def fast_day(date: BaseDate, hebrew: bool = False) -> str | None: ... +def festival( + date: BaseDate, israel: bool = False, hebrew: bool = False, include_working_days: bool = True, prefix_day: bool = False +) -> str | None: ... +def holiday(date: BaseDate, israel: bool = False, hebrew: bool = False, prefix_day: bool = False) -> str | None: ... diff --git a/stubs/pyluach/pyluach/parshios.pyi b/stubs/pyluach/pyluach/parshios.pyi new file mode 100644 index 000000000000..8aa2f848dede --- /dev/null +++ b/stubs/pyluach/pyluach/parshios.pyi @@ -0,0 +1,13 @@ +from collections import OrderedDict +from collections.abc import Generator +from typing import Final + +from .dates import BaseDate, HebrewDate + +PARSHIOS: Final[list[str]] +PARSHIOS_HEBREW: Final[list[str]] + +def getparsha(date: BaseDate, israel: bool = False) -> list[int] | None: ... +def getparsha_string(date: BaseDate, israel: bool = False, hebrew: bool = False) -> str | None: ... +def iterparshios(year: int, israel: bool = False) -> Generator[list[int] | None]: ... +def parshatable(year: int, israel: bool = False) -> OrderedDict[HebrewDate, list[int] | None]: ... diff --git a/stubs/pyluach/pyluach/utils.pyi b/stubs/pyluach/pyluach/utils.pyi new file mode 100644 index 000000000000..2c0f3e71e30f --- /dev/null +++ b/stubs/pyluach/pyluach/utils.pyi @@ -0,0 +1,32 @@ +from enum import Enum +from typing import Final + +class _Days(Enum): + ROSH_HASHANA = "Rosh Hashana" + YOM_KIPPUR = "Yom Kippur" + SUCCOS = "Succos" + SHMINI_ATZERES = "Shmini Atzeres" + SIMCHAS_TORAH = "Simchas Torah" + CHANUKA = "Chanuka" + TU_BSHVAT = "Tu B'shvat" + PURIM_KATAN = "Purim Katan" + PURIM = "Purim" + SHUSHAN_PURIM = "Shushan Purim" + PESACH = "Pesach" + PESACH_SHENI = "Pesach Sheni" + LAG_BAOMER = "Lag Ba'omer" + SHAVUOS = "Shavuos" + TU_BAV = "Tu B'av" + TZOM_GEDALIA = "Tzom Gedalia" + TENTH_OF_TEVES = "10 of Teves" + TAANIS_ESTHER = "Taanis Esther" + SEVENTEENTH_OF_TAMUZ = "17 of Tamuz" + NINTH_OF_AV = "9 of Av" + +MONTH_NAMES: Final[list[str]] +MONTH_NAMES_HEBREW: Final[list[str]] +FAST_DAYS: Final[list[str]] +FAST_DAYS_HEBREW: Final[list[str]] +FESTIVALS: Final[list[str]] +FESTIVALS_HEBREW: Final[list[str]] +WEEKDAYS: Final[dict[int, str]]