From adbfd0dfb93bb32c1855990958f491226bb25009 Mon Sep 17 00:00:00 2001 From: meshya Date: Tue, 2 Dec 2025 18:26:25 +0330 Subject: [PATCH 1/3] feat: add custom format support for date and datetime classes --- jdatetime/__init__.py | 21 ++++++++++++++------- tests/test_jdate.py | 5 +++++ tests/test_jdatetime.py | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/jdatetime/__init__.py b/jdatetime/__init__.py index 015452a..7abd258 100644 --- a/jdatetime/__init__.py +++ b/jdatetime/__init__.py @@ -383,6 +383,10 @@ def __repr__(self): def __str__(self): return self.strftime('%Y-%m-%d') + def __format__(self, _format): + _format = _format or '%Y-%m-%d' + return self.strftime(_format) + def __add__(self, timedelta): """x.__add__(y) <==> x+y""" if isinstance(timedelta, py_datetime.timedelta): @@ -548,13 +552,6 @@ def isoformat(self): """Return a string representing the date in ISO 8601 format, 'YYYY-MM-DD'""" return self.strftime('%Y-%m-%d') - def __format__(self, format): - """ - PEP-3101 - Make string formating work! - """ - return self.strftime(format) - # strftime helper functions def _strftime_get_attr_value(self, attr, fmt, fb=None): try: @@ -1201,6 +1198,16 @@ def __str__(self): tz = self.strftime('%z') return self.strftime('%Y-%m-%d %H:%M:%S') + f'{mil}{tz}' + def __format__(self, _format): + if _format == 's': + return str(int(self.timestamp())) + if _format == 'f': + return str(self.timestamp()) + if _format: + return self.strftime(_format) + else: + return self.__str__() + def aslocale(self, locale): return datetime( self.year, diff --git a/tests/test_jdate.py b/tests/test_jdate.py index d9ec0ab..77b4cc9 100644 --- a/tests/test_jdate.py +++ b/tests/test_jdate.py @@ -184,3 +184,8 @@ def test_fromisoformat(self): with self.assertRaises(TypeError, msg='fromisoformat: argument must be str'): jdatetime.date.fromisoformat(1) + + def test_format(self): + d = jdatetime.date(1402, 5, 15) + self.assertEqual(f'{d}', '1402-05-15') + self.assertEqual(f'{d:%Y/%m/%d}', '1402/05/15') diff --git a/tests/test_jdatetime.py b/tests/test_jdatetime.py index 128ddd2..313729b 100644 --- a/tests/test_jdatetime.py +++ b/tests/test_jdatetime.py @@ -1062,3 +1062,17 @@ def test_unknown_type_operations(self): r"unsupported operand type\(s\) for \-=: 'datetime' and 'object'", ): dt -= unknown_type + + +class TestFormat(TestCase): + def test_date_format(self): + d = jdatetime.date(1402, 5, 15) + self.assertEqual(f'{d}', '1402-05-15') + self.assertEqual(f'{d:%Y/%m/%d}', '1402/05/15') + + def test_datetime_format(self): + dt = jdatetime.datetime(1402, 5, 15, 12, 30, 45) + self.assertEqual(f'{dt}', '1402-05-15 12:30:45') + self.assertEqual(f'{dt:%Y/%m/%d %H:%M}', '1402/05/15 12:30') + self.assertIn('.', f'{dt:f}') # float timestamp + self.assertNotIn('.', f'{dt:s}') # int timestamp From 35e3723ab948dd368cd3a33e80b6a877bf6a21d7 Mon Sep 17 00:00:00 2001 From: meshya Date: Tue, 2 Dec 2025 18:26:40 +0330 Subject: [PATCH 2/3] chore: add venv to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 535ff30..e509da2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.pyc build *.swp +venv .tags tags From 8e73e0555c3e08bc0ab64d0e4a92a7355a579d9a Mon Sep 17 00:00:00 2001 From: meshya Date: Tue, 2 Dec 2025 18:32:53 +0330 Subject: [PATCH 3/3] no need to different class --- tests/test_jdatetime.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_jdatetime.py b/tests/test_jdatetime.py index 313729b..41faa16 100644 --- a/tests/test_jdatetime.py +++ b/tests/test_jdatetime.py @@ -1063,8 +1063,6 @@ def test_unknown_type_operations(self): ): dt -= unknown_type - -class TestFormat(TestCase): def test_date_format(self): d = jdatetime.date(1402, 5, 15) self.assertEqual(f'{d}', '1402-05-15')