persiantools 4.0.0__tar.gz → 4.0.3__tar.gz
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.
- {persiantools-4.0.0/persiantools.egg-info → persiantools-4.0.3}/PKG-INFO +1 -1
- {persiantools-4.0.0 → persiantools-4.0.3}/persiantools/__init__.py +1 -1
- {persiantools-4.0.0 → persiantools-4.0.3}/persiantools/jdatetime.py +25 -33
- {persiantools-4.0.0 → persiantools-4.0.3/persiantools.egg-info}/PKG-INFO +1 -1
- {persiantools-4.0.0 → persiantools-4.0.3}/tests/test_jalalidate.py +59 -2
- {persiantools-4.0.0 → persiantools-4.0.3}/tests/test_jalalidatetime.py +4 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/LICENSE +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/MANIFEST.in +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/README.md +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/persiantools/characters.py +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/persiantools/digits.py +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/persiantools/utils.py +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/persiantools.egg-info/SOURCES.txt +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/persiantools.egg-info/dependency_links.txt +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/persiantools.egg-info/not-zip-safe +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/persiantools.egg-info/requires.txt +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/persiantools.egg-info/top_level.txt +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/pyproject.toml +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/setup.cfg +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/setup.py +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/tests/test_characters.py +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/tests/test_digits.py +0 -0
- {persiantools-4.0.0 → persiantools-4.0.3}/tests/test_utils.py +0 -0
|
@@ -247,9 +247,10 @@ class JalaliDate:
|
|
|
247
247
|
days %= 12053
|
|
248
248
|
jalali_year += 4 * (days // 1461)
|
|
249
249
|
days %= 1461
|
|
250
|
-
jalali_year += (days - 1) // 365
|
|
251
250
|
|
|
251
|
+
# Correct for the leap year case
|
|
252
252
|
if days > 365:
|
|
253
|
+
jalali_year += (days - 1) // 365
|
|
253
254
|
days = (days - 1) % 365
|
|
254
255
|
|
|
255
256
|
# Determine the Jalali month and day
|
|
@@ -265,63 +266,54 @@ class JalaliDate:
|
|
|
265
266
|
|
|
266
267
|
def to_gregorian(self):
|
|
267
268
|
"""based on jdf.scr.ir"""
|
|
269
|
+
year = self.year + 1595
|
|
268
270
|
month = self.month
|
|
269
271
|
day = self.day
|
|
270
|
-
year = self.year
|
|
271
272
|
|
|
272
|
-
#
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
days = (365 * year) + (year // 33) * 8 + ((year % 33) + 3) // 4
|
|
279
|
-
days += 78 + day + days_in_month
|
|
273
|
+
# Calculate the total number of days
|
|
274
|
+
days = -355668 + (365 * year) + ((year // 33) * 8) + (((year % 33) + 3) // 4) + day
|
|
275
|
+
if month < 7:
|
|
276
|
+
days += (month - 1) * 31
|
|
277
|
+
else:
|
|
278
|
+
days += ((month - 7) * 30) + 186
|
|
280
279
|
|
|
281
|
-
|
|
280
|
+
# Determine the Gregorian year
|
|
281
|
+
gregorian_year = 400 * (days // 146097)
|
|
282
282
|
days %= 146097
|
|
283
283
|
|
|
284
284
|
if days > 36524:
|
|
285
285
|
days -= 1
|
|
286
286
|
gregorian_year += 100 * (days // 36524)
|
|
287
287
|
days %= 36524
|
|
288
|
-
|
|
289
288
|
if days >= 365:
|
|
290
289
|
days += 1
|
|
291
290
|
|
|
292
291
|
gregorian_year += 4 * (days // 1461)
|
|
293
292
|
days %= 1461
|
|
294
|
-
gregorian_year += (days - 1) // 365
|
|
295
|
-
|
|
296
293
|
if days > 365:
|
|
294
|
+
gregorian_year += (days - 1) // 365
|
|
297
295
|
days = (days - 1) % 365
|
|
298
296
|
|
|
299
297
|
gregorian_day = days + 1
|
|
300
298
|
|
|
299
|
+
# Handle leap years for February day count adjustment
|
|
300
|
+
if (gregorian_year % 4 == 0 and gregorian_year % 100 != 0) or (gregorian_year % 400 == 0):
|
|
301
|
+
feb_days = 29
|
|
302
|
+
else:
|
|
303
|
+
feb_days = 28
|
|
304
|
+
|
|
301
305
|
# Days in each month of the Gregorian calendar
|
|
302
|
-
gregorian_days_in_month = [
|
|
303
|
-
0,
|
|
304
|
-
31,
|
|
305
|
-
29 if (gregorian_year % 4 == 0 and gregorian_year % 100 != 0) or gregorian_year % 400 == 0 else 28,
|
|
306
|
-
31,
|
|
307
|
-
30,
|
|
308
|
-
31,
|
|
309
|
-
30,
|
|
310
|
-
31,
|
|
311
|
-
31,
|
|
312
|
-
30,
|
|
313
|
-
31,
|
|
314
|
-
30,
|
|
315
|
-
31,
|
|
316
|
-
]
|
|
306
|
+
gregorian_days_in_month = [0, 31, feb_days, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
|
317
307
|
|
|
318
308
|
# Determine the Gregorian month
|
|
319
|
-
|
|
320
|
-
|
|
309
|
+
gregorian_month = 1
|
|
310
|
+
for days_in_month in gregorian_days_in_month[1:]:
|
|
311
|
+
if gregorian_day <= days_in_month:
|
|
321
312
|
break
|
|
322
|
-
gregorian_day -=
|
|
313
|
+
gregorian_day -= days_in_month
|
|
314
|
+
gregorian_month += 1
|
|
323
315
|
|
|
324
|
-
return date(gregorian_year,
|
|
316
|
+
return date(gregorian_year, gregorian_month, gregorian_day)
|
|
325
317
|
|
|
326
318
|
@classmethod
|
|
327
319
|
def today(cls):
|
|
@@ -14,8 +14,6 @@ class TestJalaliDate(TestCase):
|
|
|
14
14
|
self.assertEqual(JalaliDate(1367, 2, 14).to_gregorian(), date(1988, 5, 4))
|
|
15
15
|
self.assertEqual(JalaliDate(1395, 3, 21).to_gregorian(), date(2016, 6, 10))
|
|
16
16
|
self.assertEqual(JalaliDate(1395, 12, 9).to_gregorian(), date(2017, 2, 27))
|
|
17
|
-
self.assertEqual(JalaliDate(1395, 12, 30).to_gregorian(), date(2017, 3, 20))
|
|
18
|
-
self.assertEqual(JalaliDate(1396, 1, 1).to_gregorian(), date(2017, 3, 21))
|
|
19
17
|
self.assertEqual(JalaliDate(1400, 6, 31).to_gregorian(), date(2021, 9, 22))
|
|
20
18
|
self.assertEqual(JalaliDate(1396, 7, 27).to_gregorian(), date(2017, 10, 19))
|
|
21
19
|
self.assertEqual(JalaliDate(1397, 11, 29).to_gregorian(), date(2019, 2, 18))
|
|
@@ -23,6 +21,32 @@ class TestJalaliDate(TestCase):
|
|
|
23
21
|
self.assertEqual(JalaliDate(1400, 4, 25).to_gregorian(), date(2021, 7, 16))
|
|
24
22
|
self.assertEqual(JalaliDate(1400, 12, 20).to_gregorian(), date(2022, 3, 11))
|
|
25
23
|
self.assertEqual(JalaliDate(1403, 1, 5).to_gregorian(), date(2024, 3, 24))
|
|
24
|
+
self.assertEqual(JalaliDate(1402, 10, 10).to_gregorian(), date(2023, 12, 31))
|
|
25
|
+
self.assertEqual(JalaliDate(1403, 10, 11).to_gregorian(), date(2024, 12, 31))
|
|
26
|
+
self.assertEqual(JalaliDate(1403, 2, 23).to_gregorian(), date(2024, 5, 12))
|
|
27
|
+
self.assertEqual(JalaliDate(1403, 4, 3).to_gregorian(), date(2024, 6, 23))
|
|
28
|
+
|
|
29
|
+
self.assertEqual(JalaliDate(1391, 12, 30).to_gregorian(), date(2013, 3, 20))
|
|
30
|
+
self.assertEqual(JalaliDate(1395, 12, 30).to_gregorian(), date(2017, 3, 20))
|
|
31
|
+
self.assertEqual(JalaliDate(1399, 12, 30).to_gregorian(), date(2021, 3, 20))
|
|
32
|
+
self.assertEqual(JalaliDate(1403, 12, 30).to_gregorian(), date(2025, 3, 20))
|
|
33
|
+
|
|
34
|
+
self.assertEqual(JalaliDate(1378, 10, 11).to_gregorian(), date(2000, 1, 1))
|
|
35
|
+
self.assertEqual(JalaliDate(1379, 10, 12).to_gregorian(), date(2001, 1, 1))
|
|
36
|
+
self.assertEqual(JalaliDate(1390, 10, 11).to_gregorian(), date(2012, 1, 1))
|
|
37
|
+
self.assertEqual(JalaliDate(1393, 10, 11).to_gregorian(), date(2015, 1, 1))
|
|
38
|
+
self.assertEqual(JalaliDate(1398, 10, 11).to_gregorian(), date(2020, 1, 1))
|
|
39
|
+
self.assertEqual(JalaliDate(1399, 10, 12).to_gregorian(), date(2021, 1, 1))
|
|
40
|
+
self.assertEqual(JalaliDate(1402, 10, 11).to_gregorian(), date(2024, 1, 1))
|
|
41
|
+
self.assertEqual(JalaliDate(1403, 10, 12).to_gregorian(), date(2025, 1, 1))
|
|
42
|
+
|
|
43
|
+
self.assertEqual(JalaliDate(1367, 1, 1).to_gregorian(), date(1988, 3, 21))
|
|
44
|
+
self.assertEqual(JalaliDate(1396, 1, 1).to_gregorian(), date(2017, 3, 21))
|
|
45
|
+
self.assertEqual(JalaliDate(1399, 1, 1).to_gregorian(), date(2020, 3, 20))
|
|
46
|
+
self.assertEqual(JalaliDate(1400, 1, 1).to_gregorian(), date(2021, 3, 21))
|
|
47
|
+
self.assertEqual(JalaliDate(1402, 1, 1).to_gregorian(), date(2023, 3, 21))
|
|
48
|
+
self.assertEqual(JalaliDate(1403, 1, 1).to_gregorian(), date(2024, 3, 20))
|
|
49
|
+
self.assertEqual(JalaliDate(1404, 1, 1).to_gregorian(), date(2025, 3, 21))
|
|
26
50
|
|
|
27
51
|
self.assertEqual(JalaliDate.today().to_gregorian(), date.today())
|
|
28
52
|
|
|
@@ -33,6 +57,11 @@ class TestJalaliDate(TestCase):
|
|
|
33
57
|
self.assertEqual(JalaliDate(date(2000, 1, 1)), JalaliDate(1378, 10, 11))
|
|
34
58
|
self.assertEqual(JalaliDate(date(2017, 10, 19)), JalaliDate(1396, 7, 27))
|
|
35
59
|
self.assertEqual(JalaliDate(date(2019, 2, 18)), JalaliDate(1397, 11, 29))
|
|
60
|
+
self.assertEqual(JalaliDate(date(2020, 3, 20)), JalaliDate(1399, 1, 1))
|
|
61
|
+
self.assertEqual(JalaliDate(date(2021, 3, 21)), JalaliDate(1400, 1, 1))
|
|
62
|
+
self.assertEqual(JalaliDate(date(2023, 3, 21)), JalaliDate(1402, 1, 1))
|
|
63
|
+
self.assertEqual(JalaliDate(date(2025, 1, 1)), JalaliDate(1403, 10, 12))
|
|
64
|
+
|
|
36
65
|
self.assertEqual(JalaliDate.to_jalali(1990, 9, 23), JalaliDate(1369, 7, 1))
|
|
37
66
|
self.assertEqual(JalaliDate.to_jalali(1990, 9, 23), JalaliDate(1369, 7, 1))
|
|
38
67
|
self.assertEqual(JalaliDate.to_jalali(2013, 9, 16), JalaliDate(1392, 6, 25))
|
|
@@ -40,6 +69,28 @@ class TestJalaliDate(TestCase):
|
|
|
40
69
|
self.assertEqual(JalaliDate.to_jalali(2021, 2, 11), JalaliDate(1399, 11, 23))
|
|
41
70
|
self.assertEqual(JalaliDate.to_jalali(2021, 7, 16), JalaliDate(1400, 4, 25))
|
|
42
71
|
self.assertEqual(JalaliDate.to_jalali(2024, 3, 24), JalaliDate(1403, 1, 5))
|
|
72
|
+
self.assertEqual(JalaliDate.to_jalali(2020, 3, 19), JalaliDate(1398, 12, 29))
|
|
73
|
+
self.assertEqual(JalaliDate.to_jalali(2023, 12, 31), JalaliDate(1402, 10, 10))
|
|
74
|
+
self.assertEqual(JalaliDate.to_jalali(2024, 12, 31), JalaliDate(1403, 10, 11))
|
|
75
|
+
self.assertEqual(JalaliDate.to_jalali(2024, 5, 12), JalaliDate(1403, 2, 23))
|
|
76
|
+
self.assertEqual(JalaliDate.to_jalali(2024, 6, 23), JalaliDate(1403, 4, 3))
|
|
77
|
+
|
|
78
|
+
self.assertEqual(JalaliDate.to_jalali(2021, 3, 20), JalaliDate(1399, 12, 30))
|
|
79
|
+
self.assertEqual(JalaliDate.to_jalali(2025, 3, 20), JalaliDate(1403, 12, 30))
|
|
80
|
+
|
|
81
|
+
self.assertEqual(JalaliDate.to_jalali(2000, 1, 1), JalaliDate(1378, 10, 11))
|
|
82
|
+
self.assertEqual(JalaliDate.to_jalali(2012, 1, 1), JalaliDate(1390, 10, 11))
|
|
83
|
+
self.assertEqual(JalaliDate.to_jalali(2013, 1, 1), JalaliDate(1391, 10, 12))
|
|
84
|
+
self.assertEqual(JalaliDate.to_jalali(2020, 1, 1), JalaliDate(1398, 10, 11))
|
|
85
|
+
self.assertEqual(JalaliDate.to_jalali(2024, 1, 1), JalaliDate(1402, 10, 11))
|
|
86
|
+
self.assertEqual(JalaliDate.to_jalali(2025, 1, 1), JalaliDate(1403, 10, 12))
|
|
87
|
+
|
|
88
|
+
self.assertEqual(JalaliDate.to_jalali(1988, 3, 21), JalaliDate(1367, 1, 1))
|
|
89
|
+
self.assertEqual(JalaliDate.to_jalali(2019, 3, 21), JalaliDate(1398, 1, 1))
|
|
90
|
+
self.assertEqual(JalaliDate.to_jalali(2020, 3, 20), JalaliDate(1399, 1, 1))
|
|
91
|
+
self.assertEqual(JalaliDate.to_jalali(2021, 3, 21), JalaliDate(1400, 1, 1))
|
|
92
|
+
self.assertEqual(JalaliDate.to_jalali(2024, 3, 20), JalaliDate(1403, 1, 1))
|
|
93
|
+
self.assertEqual(JalaliDate.to_jalali(2025, 3, 21), JalaliDate(1404, 1, 1))
|
|
43
94
|
|
|
44
95
|
self.assertEqual(JalaliDate(date.today()), JalaliDate.today())
|
|
45
96
|
|
|
@@ -58,6 +109,7 @@ class TestJalaliDate(TestCase):
|
|
|
58
109
|
self.assertEqual(JalaliDate.check_date(1399, 11, 31), False)
|
|
59
110
|
self.assertEqual(JalaliDate.check_date(1400, 4, 25), True)
|
|
60
111
|
self.assertEqual(JalaliDate.check_date(1400, 12, 30), False)
|
|
112
|
+
self.assertEqual(JalaliDate.check_date(1403, 4, 3), True)
|
|
61
113
|
self.assertEqual(JalaliDate.check_date(1403, 12, 30), True)
|
|
62
114
|
|
|
63
115
|
def test_completeday(self):
|
|
@@ -228,6 +280,7 @@ class TestJalaliDate(TestCase):
|
|
|
228
280
|
self.assertEqual(JalaliDate(1397, 11, 29).week_of_year(), 49)
|
|
229
281
|
self.assertEqual(JalaliDate(1399, 1, 2).week_of_year(), 2)
|
|
230
282
|
self.assertEqual(JalaliDate(1403, 1, 5).week_of_year(), 2)
|
|
283
|
+
self.assertEqual(JalaliDate(1403, 4, 3).week_of_year(), 15)
|
|
231
284
|
|
|
232
285
|
self.assertEqual(JalaliDate(1367, 2, 14).weekday(), 4)
|
|
233
286
|
self.assertEqual(JalaliDate(1393, 1, 1).weekday(), 6)
|
|
@@ -240,6 +293,7 @@ class TestJalaliDate(TestCase):
|
|
|
240
293
|
self.assertEqual(JalaliDate(1397, 1, 1).weekday(), 4)
|
|
241
294
|
self.assertEqual(JalaliDate(1397, 11, 29).weekday(), 2)
|
|
242
295
|
self.assertEqual(JalaliDate(1400, 1, 1).weekday(), 1)
|
|
296
|
+
self.assertEqual(JalaliDate(1403, 4, 3).isoweekday(), 2)
|
|
243
297
|
self.assertEqual(JalaliDate(1400, 1, 1).isoweekday(), 2)
|
|
244
298
|
self.assertEqual(JalaliDate(1396, 7, 27).isoweekday(), 6)
|
|
245
299
|
self.assertEqual(JalaliDate(1397, 11, 29).isoweekday(), 3)
|
|
@@ -260,6 +314,8 @@ class TestJalaliDate(TestCase):
|
|
|
260
314
|
self.assertTrue(JalaliDate(1367, 2, 14) <= date(1988, 5, 4))
|
|
261
315
|
self.assertFalse(JalaliDate(1367, 2, 14) >= JalaliDate(1369, 1, 1))
|
|
262
316
|
self.assertTrue(JalaliDate(1397, 11, 29) >= JalaliDate(1397, 11, 10))
|
|
317
|
+
self.assertTrue(JalaliDate(1403, 12, 30) > JalaliDate(1403, 12, 29))
|
|
318
|
+
self.assertTrue(JalaliDate(1404, 1, 1) > JalaliDate(1403, 12, 30))
|
|
263
319
|
|
|
264
320
|
self.assertEqual(JalaliDate(1395, 3, 21) + timedelta(days=2), JalaliDate(1395, 3, 23))
|
|
265
321
|
self.assertEqual(JalaliDate(1396, 7, 27) + timedelta(days=4), JalaliDate(1396, 8, 1))
|
|
@@ -271,6 +327,7 @@ class TestJalaliDate(TestCase):
|
|
|
271
327
|
self.assertEqual(JalaliDate(1395, 3, 21) - date(2016, 5, 3), timedelta(days=38))
|
|
272
328
|
self.assertEqual(JalaliDate(1395, 12, 30) - JalaliDate(1395, 1, 1), timedelta(days=365))
|
|
273
329
|
self.assertEqual(JalaliDate(1403, 1, 1) - JalaliDate(1402, 12, 29), timedelta(days=1))
|
|
330
|
+
self.assertEqual(JalaliDate(1404, 1, 1) - JalaliDate(1403, 12, 29), timedelta(days=2))
|
|
274
331
|
|
|
275
332
|
self.assertFalse(JalaliDate(1367, 2, 14) == (1367, 2, 14))
|
|
276
333
|
self.assertFalse(JalaliDate(1367, 2, 14) == "")
|
|
@@ -22,6 +22,10 @@ class TestJalaliDateTime(TestCase):
|
|
|
22
22
|
JalaliDateTime(1399, 11, 23, 13, 12, 0, 0).to_gregorian(),
|
|
23
23
|
datetime(2021, 2, 11, 13, 12, 0, 0),
|
|
24
24
|
)
|
|
25
|
+
self.assertEqual(
|
|
26
|
+
JalaliDateTime(1404, 1, 1, 13, 12, 0, 0).to_gregorian(),
|
|
27
|
+
datetime(2025, 3, 21, 13, 12, 0, 0),
|
|
28
|
+
)
|
|
25
29
|
|
|
26
30
|
def test_gregorian_to_shamsi(self):
|
|
27
31
|
self.assertEqual(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|