cliutil: Add diff_year function.
This commit is contained in:
parent
4615364538
commit
a27d68beab
4 changed files with 33 additions and 26 deletions
|
@ -255,6 +255,17 @@ def add_version_argument(parser: argparse.ArgumentParser) -> argparse.Action:
|
||||||
def date_arg(arg: str) -> datetime.date:
|
def date_arg(arg: str) -> datetime.date:
|
||||||
return datetime.datetime.strptime(arg, '%Y-%m-%d').date()
|
return datetime.datetime.strptime(arg, '%Y-%m-%d').date()
|
||||||
|
|
||||||
|
def diff_year(date: datetime.date, diff: int) -> datetime.date:
|
||||||
|
new_year = date.year + diff
|
||||||
|
try:
|
||||||
|
return date.replace(year=new_year)
|
||||||
|
except ValueError:
|
||||||
|
# The original date is Feb 29, which doesn't exist in the new year.
|
||||||
|
if diff < 0:
|
||||||
|
return datetime.date(new_year, 2, 28)
|
||||||
|
else:
|
||||||
|
return datetime.date(new_year, 3, 1)
|
||||||
|
|
||||||
def year_or_date_arg(arg: str) -> Union[int, datetime.date]:
|
def year_or_date_arg(arg: str) -> Union[int, datetime.date]:
|
||||||
"""Get either a date or a year (int) from an argument string
|
"""Get either a date or a year (int) from an argument string
|
||||||
|
|
||||||
|
|
|
@ -339,17 +339,6 @@ metadata to match. A single ticket number is a shortcut for
|
||||||
args.report_type = ReportType.ODS
|
args.report_type = ReportType.ODS
|
||||||
return args
|
return args
|
||||||
|
|
||||||
def diff_year(date: datetime.date, diff: int) -> datetime.date:
|
|
||||||
new_year = date.year + diff
|
|
||||||
try:
|
|
||||||
return date.replace(year=new_year)
|
|
||||||
except ValueError:
|
|
||||||
# The original date is Feb 29, which doesn't exist in the new year.
|
|
||||||
if diff < 0:
|
|
||||||
return datetime.date(new_year, 2, 28)
|
|
||||||
else:
|
|
||||||
return datetime.date(new_year, 3, 1)
|
|
||||||
|
|
||||||
def main(arglist: Optional[Sequence[str]]=None,
|
def main(arglist: Optional[Sequence[str]]=None,
|
||||||
stdout: TextIO=sys.stdout,
|
stdout: TextIO=sys.stdout,
|
||||||
stderr: TextIO=sys.stderr,
|
stderr: TextIO=sys.stderr,
|
||||||
|
@ -365,9 +354,9 @@ def main(arglist: Optional[Sequence[str]]=None,
|
||||||
if args.start_date is None:
|
if args.start_date is None:
|
||||||
args.stop_date = datetime.date.today()
|
args.stop_date = datetime.date.today()
|
||||||
else:
|
else:
|
||||||
args.stop_date = diff_year(args.start_date, 1)
|
args.stop_date = cliutil.diff_year(args.start_date, 1)
|
||||||
if args.start_date is None:
|
if args.start_date is None:
|
||||||
args.start_date = diff_year(args.stop_date, -1)
|
args.start_date = cliutil.diff_year(args.stop_date, -1)
|
||||||
|
|
||||||
returncode = 0
|
returncode = 0
|
||||||
books_loader = config.books_loader()
|
books_loader = config.books_loader()
|
||||||
|
|
|
@ -747,17 +747,6 @@ metadata to match. A single ticket number is a shortcut for
|
||||||
args.accounts = list(LedgerODS.ACCOUNT_COLUMNS)
|
args.accounts = list(LedgerODS.ACCOUNT_COLUMNS)
|
||||||
return args
|
return args
|
||||||
|
|
||||||
def diff_year(date: datetime.date, diff: int) -> datetime.date:
|
|
||||||
new_year = date.year + diff
|
|
||||||
try:
|
|
||||||
return date.replace(year=new_year)
|
|
||||||
except ValueError:
|
|
||||||
# The original date is Feb 29, which doesn't exist in the new year.
|
|
||||||
if diff < 0:
|
|
||||||
return datetime.date(new_year, 2, 28)
|
|
||||||
else:
|
|
||||||
return datetime.date(new_year, 3, 1)
|
|
||||||
|
|
||||||
def main(arglist: Optional[Sequence[str]]=None,
|
def main(arglist: Optional[Sequence[str]]=None,
|
||||||
stdout: TextIO=sys.stdout,
|
stdout: TextIO=sys.stdout,
|
||||||
stderr: TextIO=sys.stderr,
|
stderr: TextIO=sys.stderr,
|
||||||
|
@ -771,11 +760,11 @@ def main(arglist: Optional[Sequence[str]]=None,
|
||||||
|
|
||||||
today = datetime.date.today()
|
today = datetime.date.today()
|
||||||
if args.start_date is None:
|
if args.start_date is None:
|
||||||
args.start_date = diff_year(today, -1)
|
args.start_date = cliutil.diff_year(today, -1)
|
||||||
if args.stop_date is None:
|
if args.stop_date is None:
|
||||||
args.stop_date = today + datetime.timedelta(days=30)
|
args.stop_date = today + datetime.timedelta(days=30)
|
||||||
elif args.stop_date is None:
|
elif args.stop_date is None:
|
||||||
args.stop_date = diff_year(args.start_date, 1)
|
args.stop_date = cliutil.diff_year(args.start_date, 1)
|
||||||
|
|
||||||
returncode = 0
|
returncode = 0
|
||||||
books_loader = config.books_loader()
|
books_loader = config.books_loader()
|
||||||
|
|
|
@ -218,3 +218,21 @@ def test_version_argument(argparser, capsys, arg):
|
||||||
stdout, _ = capsys.readouterr()
|
stdout, _ = capsys.readouterr()
|
||||||
lines = iter(stdout.splitlines())
|
lines = iter(stdout.splitlines())
|
||||||
assert re.match(r'^test_cliutil version \d+\.\d+\.\d+', next(lines, "<EOF>"))
|
assert re.match(r'^test_cliutil version \d+\.\d+\.\d+', next(lines, "<EOF>"))
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('date,diff,expected', [
|
||||||
|
(datetime.date(2010, 2, 28), 0, datetime.date(2010, 2, 28)),
|
||||||
|
(datetime.date(2010, 2, 28), 1, datetime.date(2011, 2, 28)),
|
||||||
|
(datetime.date(2010, 2, 28), 2, datetime.date(2012, 2, 28)),
|
||||||
|
(datetime.date(2010, 2, 28), -1, datetime.date(2009, 2, 28)),
|
||||||
|
(datetime.date(2010, 2, 28), -2, datetime.date(2008, 2, 28)),
|
||||||
|
(datetime.date(2012, 2, 29), 2, datetime.date(2014, 3, 1)),
|
||||||
|
(datetime.date(2012, 2, 29), 4, datetime.date(2016, 2, 29)),
|
||||||
|
(datetime.date(2012, 2, 29), -2, datetime.date(2010, 2, 28)),
|
||||||
|
(datetime.date(2012, 2, 29), -4, datetime.date(2008, 2, 29)),
|
||||||
|
(datetime.date(2010, 3, 1), 1, datetime.date(2011, 3, 1)),
|
||||||
|
(datetime.date(2010, 3, 1), 2, datetime.date(2012, 3, 1)),
|
||||||
|
(datetime.date(2010, 3, 1), -1, datetime.date(2009, 3, 1)),
|
||||||
|
(datetime.date(2010, 3, 1), -2, datetime.date(2008, 3, 1)),
|
||||||
|
])
|
||||||
|
def test_diff_year(date, diff, expected):
|
||||||
|
assert cliutil.diff_year(date, diff) == expected
|
||||||
|
|
Loading…
Reference in a new issue