|
15 | 15 | import pathlib |
16 | 16 | import inspect |
17 | 17 | from collections import OrderedDict |
18 | | -from datetime import datetime, timedelta |
| 18 | +from datetime import datetime, timedelta, date as dt_date |
19 | 19 |
|
20 | 20 |
|
21 | 21 | # ZFS connection classes |
@@ -389,24 +389,25 @@ def get_snapshot(self, name): |
389 | 389 | # (dt_from --> dt_to) | (dt_from --> dt_from + tdelta) | (dt_to - tdelta --> dt_to) | (dt_from --> now) |
390 | 390 | def find_snapshots(self, find_opts:dict) -> list: |
391 | 391 |
|
392 | | - def __assert(k, types): |
| 392 | + def __assert(k, types, default=None, to_datetime=False): |
393 | 393 | if k == 'find_opts': |
394 | 394 | v=find_opts |
395 | 395 | else: |
396 | | - if not k in find_opts: return None |
| 396 | + if not k in find_opts: return default |
397 | 397 | v = find_opts[k] |
398 | | - bOk=False |
399 | | - for t in types: |
400 | | - if isinstance(v, t): bOk=True |
401 | | - assert bOk, 'Invalid type for param {}. Expecting {} but got: {}'.format(k, types, type(v)) |
| 398 | + assert isinstance(v, types), 'Invalid type for param {}. Expecting {} but got: {}'.format(k, types, type(v)) |
| 399 | + |
| 400 | + if to_datetime and not isinstance(v, datetime): |
| 401 | + return datetime(v.year, v.month, v.day) |
402 | 402 | return v |
403 | | - find_opts = __assert('find_opts', [dict]) |
404 | | - name = __assert('name', [str]) |
405 | | - dt_from = __assert('dt_from', [datetime]) |
406 | | - dt_to = __assert('dt_to', [datetime]) |
407 | | - tdelta = __assert('tdelta', [str, timedelta]) |
408 | | - index = __assert('index', [bool]) |
409 | | - contains = __assert('contains', [str]) |
| 403 | + |
| 404 | + find_opts = {} if find_opts is None else __assert('find_opts', (dict)) |
| 405 | + name = __assert('name', (str)) |
| 406 | + dt_from = __assert('dt_from', (datetime, dt_date), None, True) |
| 407 | + dt_to = __assert('dt_to', (datetime, dt_date), None, True) |
| 408 | + tdelta = __assert('tdelta', (str, timedelta)) |
| 409 | + index = __assert('index', (bool), False) |
| 410 | + contains = __assert('contains', (str)) |
410 | 411 |
|
411 | 412 | if not contains is None: |
412 | 413 | if not os.path.exists(contains): |
@@ -436,7 +437,16 @@ def __fil_dt(snap): |
436 | 437 | f=__fil_dt |
437 | 438 |
|
438 | 439 | elif not tdelta is None and dt_from is None and dt_to is None: |
439 | | - (dt_f, dt_t) = (datetime.now() - buildTimedelta(tdelta), datetime.now()) |
| 440 | + tdelta = tdelta if isinstance(tdelta, timedelta) else buildTimedelta(tdelta) |
| 441 | + (dt_f, dt_t) = (datetime.now() - tdelta, datetime.now()) |
| 442 | + f=__fil_dt |
| 443 | + |
| 444 | + elif not dt_from is None and not dt_to is None: |
| 445 | + if not tdelta is None: |
| 446 | + raise KeyError("tdelta cannot be specified when both dt_from and dt_to are specified") |
| 447 | + if dt_from >= dt_to: |
| 448 | + raise KeyError("dt_from ({}) must be < dt_to ({})".format(dt_from, dt_to)) |
| 449 | + (dt_f, dt_t) = (dt_from, dt_to) |
440 | 450 | f=__fil_dt |
441 | 451 |
|
442 | 452 | else: |
@@ -836,12 +846,7 @@ def calcDateRange(tdelta:str, dt_from:datetime=None, dt_to:datetime=None) -> tup |
836 | 846 | elif dt_to and not isinstance(dt_to, datetime): |
837 | 847 | raise KeyError('dt_to must be a datetime') |
838 | 848 |
|
839 | | - |
840 | | - if isinstance(tdelta, timedelta): |
841 | | - td = tdelta |
842 | | - |
843 | | - else: |
844 | | - td = buildTimedelta(tdelta) |
| 849 | + td = tdelta if isinstance(tdelta, timedelta) else buildTimedelta(tdelta) |
845 | 850 |
|
846 | 851 | if dt_from: |
847 | 852 | return (dt_from, (dt_from + td)) |
|
0 commit comments