nominaldelta

nominal difference of date/datetime
git clone https://git.ce9e.org/nominaldelta.git

commit
3b091d7fe707956f9b3c029faa8ceb131d876a21
parent
3c7d7fabcb01d82cc361d8415663db573ed51124
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2024-08-31 14:29
fix: diff inheritance

Diffstat

M nominaldelta.py 39 ++++++++++++++-------------------------
M test.py 7 +++++++

2 files changed, 21 insertions, 25 deletions


diff --git a/nominaldelta.py b/nominaldelta.py

@@ -52,27 +52,6 @@ def binary_search(a, b, delta):
   52    52     return lower * delta
   53    53 
   54    54 
   55    -1 def date_diff(a, b, *, allow_months=True):
   56    -1     if a > b:
   57    -1         return -date_diff(b, a)
   58    -1     delta = NominalDelta()
   59    -1     if allow_months:
   60    -1         delta += binary_search(a, b, NominalDelta(months=1))
   61    -1     days = b.toordinal() - (a + delta).toordinal()
   62    -1     return delta + NominalDelta(days=days)
   63    -1 
   64    -1 
   65    -1 def dt_diff(a, b, *, allow_months=True):
   66    -1     if a > b:
   67    -1         return -dt_diff(b, a)
   68    -1     delta = date_diff(a, b, allow_months=allow_months)
   69    -1     seconds = b.timestamp() - (a + delta).timestamp()
   70    -1     if seconds < 0:
   71    -1         delta -= NominalDelta(days=1)
   72    -1         seconds = b.timestamp() - (a + delta).timestamp()
   73    -1     return delta + NominalDelta(seconds=seconds)
   74    -1 
   75    -1 
   76    55 class NominalDelta:
   77    56     def __init__(
   78    57         self: Self,
@@ -159,8 +138,18 @@ class NominalDelta:
  159   138 
  160   139     @classmethod
  161   140     def diff(cls: type[Self], a: Date, b: Date, *, allow_months: bool = True) -> Self:
  162    -1         if isinstance(a, datetime) and isinstance(b, datetime):
  163    -1             return dt_diff(a, b, allow_months=allow_months)
  164    -1         elif isinstance(a, date) and isinstance(b, date):
  165    -1             return date_diff(a, b, allow_months=allow_months)
   -1   141         if isinstance(a, date) and isinstance(b, date):
   -1   142             if a > b:
   -1   143                 return -cls.diff(b, a)
   -1   144             delta = cls()
   -1   145             if allow_months:
   -1   146                 delta += binary_search(a, b, cls(months=1))
   -1   147             delta += cls(days=b.toordinal() - (a + delta).toordinal())
   -1   148             if isinstance(a, datetime) and isinstance(b, datetime):
   -1   149                 seconds = b.timestamp() - (a + delta).timestamp()
   -1   150                 if seconds < 0:
   -1   151                     delta -= cls(days=1)
   -1   152                     seconds = b.timestamp() - (a + delta).timestamp()
   -1   153                 delta += cls(seconds=seconds)
   -1   154             return delta
  166   155         raise TypeError('Unsupported types')

diff --git a/test.py b/test.py

@@ -402,3 +402,10 @@ class DiffTests(unittest.TestCase):
  402   402             ),
  403   403             NominalDelta(days=989, seconds=75287),
  404   404         )
   -1   405 
   -1   406     def test_inheritance(self):
   -1   407         class ChildClass(NominalDelta):
   -1   408             pass
   -1   409 
   -1   410         delta = ChildClass.diff(date(1970, 1, 15), date(1970, 2, 15))
   -1   411         self.assertEqual(type(delta), ChildClass)