Skip to content

Commit b0f56f7

Browse files
authored
Merge pull request #123 from dh-tech/feature/rename-hijri
Use `islamic` for Islamic/Hijri calendar classes #120
2 parents 7e3dd84 + f442724 commit b0f56f7

File tree

17 files changed

+120
-120
lines changed

17 files changed

+120
-120
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ Currently available converters are "ISO8601" and "EDTF" and supported calendars.
158158

159159
### Calendars
160160

161-
All `Undate` objects are calendar aware, and date converters include support for parsing and working with dates from other calendars. The Gregorian calendar is used by default; currently `undate` supports the Hijri Islamic calendar and the Anno Mundi Hebrew calendar based on calendar convertion logic implemented in the [convertdate](https://convertdate.readthedocs.io/en/latest/)package.
161+
All `Undate` objects are calendar aware, and date converters include support for parsing and working with dates from other calendars. The Gregorian calendar is used by default; currently `undate` supports the Islamic Hijri calendar and the Hebrew Anno Mundi calendar based on calendar conversion logic implemented in the [convertdate](https://convertdate.readthedocs.io/en/latest/) package.
162162

163163
Dates are stored with the year, month, day and appropriate precision for the original calendar; internally, earliest and latest dates are calculated in Gregorian / Proleptic Gregorian calendar for standardized comparison across dates from different calendars.
164164

docs/undate/converters.rst

+6-6
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,15 @@ Gregorian
3939
.. automodule:: undate.converters.calendars.gregorian
4040
:members:
4141

42-
Hijri (Islamic calendar)
43-
^^^^^^^^^^^^^^^^^^^^^^^^
42+
Hebrew Anno Mundi calendar
43+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4444

45-
.. automodule:: undate.converters.calendars.hijri.converter
45+
.. automodule:: undate.converters.calendars.hebrew.converter
4646
:members:
4747

48-
Anno Mundi (Hebrew calendar)
49-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
48+
Islamic Hijri calendar
49+
^^^^^^^^^^^^^^^^^^^^^^^^
5050

51-
.. automodule:: undate.converters.calendars.hebrew.converter
51+
.. automodule:: undate.converters.calendars.islamic.converter
5252
:members:
5353

src/undate/converters/base.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
implementing date converters, which can provide support for
44
parsing and generating dates in different formats.
55
The converter subclass :class:`undate.converters.BaseCalendarConverter`
6-
provides additional functionaly needed for calendar conversion.
6+
provides additional functionality needed for calendar conversion.
77
88
To add support for a new date converter:
99
@@ -23,10 +23,10 @@
2323
2424
- Create a new file under ``undate/converters/calendars/``
2525
- For converters with sufficient complexity, you may want to create a submodule;
26-
see ``undate.converters.calendars.hijri`` for an example.
26+
see ``undate.converters.calendars.islamic`` for an example.
2727
- Extend ``BaseCalendarConverter`` and implement ``parse`` and ``to_string``
2828
formatter methods as desired/appropriate for your converter as well as the
29-
additional methods for ``max_month``, ``max_day``, and convertion ``to_gregorian``
29+
additional methods for ``max_month``, ``max_day``, and conversion ``to_gregorian``
3030
calendar.
3131
- Import your calendar in ``undate/converters/calendars/__init__.py`` and include in `__all__``
3232
- Add unit tests for the new calendar logic under ``tests/test_converters/calendars/``
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from undate.converters.calendars.gregorian import GregorianDateConverter
2-
from undate.converters.calendars.hijri import HijriDateConverter
32
from undate.converters.calendars.hebrew import HebrewDateConverter
3+
from undate.converters.calendars.islamic import IslamicDateConverter
44

5-
__all__ = ["HijriDateConverter", "GregorianDateConverter", "HebrewDateConverter"]
5+
__all__ = ["GregorianDateConverter", "HebrewDateConverter", "IslamicDateConverter"]

src/undate/converters/calendars/hijri/__init__.py

-3
This file was deleted.

src/undate/converters/calendars/hijri/parser.py

-9
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from undate.converters.calendars.islamic.converter import IslamicDateConverter
2+
3+
__all__ = ["IslamicDateConverter"]

src/undate/converters/calendars/hijri/converter.py renamed to src/undate/converters/calendars/islamic/converter.py

+15-15
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,24 @@
55

66
from undate import Undate, UndateInterval
77
from undate.converters.base import BaseCalendarConverter
8-
from undate.converters.calendars.hijri.parser import hijri_parser
9-
from undate.converters.calendars.hijri.transformer import HijriDateTransformer
8+
from undate.converters.calendars.islamic.parser import islamic_parser
9+
from undate.converters.calendars.islamic.transformer import IslamicDateTransformer
1010

1111

12-
class HijriDateConverter(BaseCalendarConverter):
12+
class IslamicDateConverter(BaseCalendarConverter):
1313
"""
14-
Converter for Hijri / Islamic calendar.
14+
Converter for Islamic Hijri calendar.
1515
16-
Support for parsing Hijri dates and converting to Undate and UndateInterval
16+
Support for parsing Islamic Hijri dates and converting to Undate and UndateInterval
1717
objects in the Gregorian calendar.
1818
"""
1919

20-
#: converter name: Hijri
21-
name: str = "Hijri"
22-
calendar_name: str = "Hijrī"
20+
#: converter name: Islamic
21+
name: str = "Islamic"
22+
calendar_name: str = "Islamic"
2323

2424
def __init__(self):
25-
self.transformer = HijriDateTransformer()
25+
self.transformer = IslamicDateTransformer()
2626

2727
def max_day(self, year: int, month: int) -> int:
2828
"""maximum numeric day for the specified year and month in this calendar"""
@@ -44,24 +44,24 @@ def to_gregorian(self, year: int, month: int, day: int) -> tuple[int, int, int]:
4444

4545
def parse(self, value: str) -> Union[Undate, UndateInterval]:
4646
"""
47-
Parse a Hijri date string and return an :class:`~undate.undate.Undate` or
47+
Parse an Islamic/Hijri date string and return an :class:`~undate.undate.Undate` or
4848
:class:`~undate.undate.UndateInterval`.
49-
The Hijri date string is preserved in the undate label.
49+
The Islamic/Hijri date string is preserved in the undate label.
5050
"""
5151
if not value:
5252
raise ValueError("Parsing empty string is not supported")
5353

5454
# parse the input string, then transform to undate object
5555
try:
56-
# parse the string with our Hijri date parser
57-
parsetree = hijri_parser.parse(value)
56+
# parse the string with our Islamic Hijri date parser
57+
parsetree = islamic_parser.parse(value)
5858
# transform the parse tree into an undate or undate interval
5959
undate_obj = self.transformer.transform(parsetree)
6060
# set the original date as a label, with the calendar name
6161
undate_obj.label = f"{value} {self.calendar_name}"
6262
return undate_obj
6363
except UnexpectedCharacters as err:
64-
raise ValueError(f"Could not parse '{value}' as a Hijri date") from err
64+
raise ValueError(f"Could not parse '{value}' as an Islamic date") from err
6565

6666
# do we need to support conversion the other direction?
67-
# i.e., generate a Hijri date from an abitrary undate or undate interval?
67+
# i.e., generate an Islamic Hijri date from an arbitrary undate or undate interval?

src/undate/converters/calendars/hijri/hijri.lark renamed to src/undate/converters/calendars/islamic/islamic.lark

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
// only support day month year format for now
55
// parser requires numeric day and year to be distinguished based on order
6-
hijri_date: day month year | month year | year
6+
islamic_date: day month year | month year | year
77

88
// TODO: handle date ranges?
99

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import pathlib
2+
3+
from lark import Lark
4+
5+
grammar_path = pathlib.Path(__file__).parent / "islamic.lark"
6+
7+
with open(grammar_path) as grammar:
8+
# NOTE: LALR parser is faster but can't be used due to ambiguity between years and days
9+
islamic_parser = Lark(grammar.read(), start="islamic_date", strict=True)

src/undate/converters/calendars/hijri/transformer.py renamed to src/undate/converters/calendars/islamic/transformer.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
from undate import Undate, Calendar
44

55

6-
class HijriUndate(Undate):
7-
"""Undate convience subclass; sets default calendar to Hijri."""
6+
class IslamicUndate(Undate):
7+
"""Undate convience subclass; sets default calendar to Islamic."""
88

9-
calendar = Calendar.HIJRI
9+
calendar = Calendar.ISLAMIC
1010

1111

12-
class HijriDateTransformer(Transformer):
13-
"""Transform a Hijri date parse tree and return an Undate or
12+
class IslamicDateTransformer(Transformer):
13+
"""Transform an Islamic Hijri date parse tree and return an Undate or
1414
UndateInterval."""
1515

16-
def hijri_date(self, items):
16+
def islamic_date(self, items):
1717
parts = {}
1818
for child in items:
1919
if child.data in ["year", "month", "day"]:
@@ -24,7 +24,7 @@ def hijri_date(self, items):
2424

2525
# initialize and return an undate with islamic year, month, day and
2626
# islamic calendar
27-
return HijriUndate(**parts)
27+
return IslamicUndate(**parts)
2828

2929
# year translation is not needed since we want a tree with name year
3030
# this is equivalent to a no-op

src/undate/undate.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ class Calendar(StrEnum):
2727
"""Supported calendars"""
2828

2929
GREGORIAN = auto()
30-
HIJRI = auto()
3130
HEBREW = auto()
31+
ISLAMIC = auto()
3232

3333
@staticmethod
3434
def get_converter(calendar):

tests/test_converters/test_base.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from undate.converters.calendars import (
66
GregorianDateConverter,
77
HebrewDateConverter,
8-
HijriDateConverter,
8+
IslamicDateConverter,
99
)
1010

1111

@@ -36,12 +36,12 @@ def test_parse_to_string(self):
3636

3737
def test_subclasses(self):
3838
# define a nested subclass
39-
class SubSubConverter(HijriDateConverter):
39+
class SubSubConverter(IslamicDateConverter):
4040
pass
4141

4242
subclasses = BaseDateConverter.subclasses()
4343
assert BaseCalendarConverter not in subclasses
44-
assert HijriDateConverter in subclasses
44+
assert IslamicDateConverter in subclasses
4545
assert HebrewDateConverter in subclasses
4646
assert GregorianDateConverter in subclasses
4747
assert SubSubConverter in subclasses

0 commit comments

Comments
 (0)