- 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 5455 -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 -164 -165 -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 -175 -176 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)