From a0af6eee276f331347894f7f8109fb3069df792a Mon Sep 17 00:00:00 2001 From: brain_face Date: Tue, 14 Apr 2020 13:46:52 +0200 Subject: [PATCH] Added rudimentary relative date functionality --- Pipfile | 1 + kosmorro | 0 kosmorrolib/main.py | 33 ++++++++++++++++++++++++++------- 3 files changed, 27 insertions(+), 7 deletions(-) mode change 100644 => 100755 kosmorro diff --git a/Pipfile b/Pipfile index 3cedc4d..89e84bb 100644 --- a/Pipfile +++ b/Pipfile @@ -16,6 +16,7 @@ tabulate = "*" numpy = ">=1.17.0,<2.0.0" termcolor = "*" latex = "*" +dateutil = ">=2.8.1" [requires] python_version = "3" diff --git a/kosmorro b/kosmorro old mode 100644 new mode 100755 diff --git a/kosmorrolib/main.py b/kosmorrolib/main.py index e03dd89..41c7b38 100644 --- a/kosmorrolib/main.py +++ b/kosmorrolib/main.py @@ -22,6 +22,7 @@ import re import sys from datetime import date +from dateutil.relativedelta import relativedelta from termcolor import colored from kosmorrolib.version import VERSION @@ -99,14 +100,32 @@ def main(): return 0 -def get_date(yyyymmdd: str) -> date: - if not re.match(r'^\d{4}-\d{2}-\d{2}$', yyyymmdd): - raise ValueError(_('The date {date} does not match the required YYYY-MM-DD format.').format(date=yyyymmdd)) +def get_date(date_arg: str) -> date: + if re.match(r'^\d{4}-\d{2}-\d{2}$', date_arg): + try: + return date.fromisoformat(date_arg) + except ValueError as error: + raise ValueError(_('The date {date} is not valid: {error}').format(date=date_arg, error=error.args[0])) + elif re.match(r'^([+-])(([0-9]+)y)?[ ]?(([0-9]+)m)?[ ]?(([0-9]+)d)?$', date_arg): + def get_offset(date_arg: str, signifier: str): + if re.search(r'([0-9]+)' + signifier, date_arg): + return int(re.search(r'[+-]?([0-9]+)' + signifier, date_arg).group(0)[:-1]) + else: + return 0 + + days = get_offset(date_arg, 'd') + months = get_offset(date_arg, 'm') + years = get_offset(date_arg, 'y') + + + if date_arg[0] == '+': + return date.today() + relativedelta(days=days, months=months, years=years) + else: + return date.today() - relativedelta(days=days, months=months, years=years) + + else: + raise ValueError(_('The date {date} does not match the required YYYY-MM-DD format or the offset format.').format(date=date_arg)) - try: - return date.fromisoformat(yyyymmdd) - except ValueError as error: - raise ValueError(_('The date {date} is not valid: {error}').format(date=yyyymmdd, error=error.args[0])) def get_dumpers() -> {str: dumper.Dumper}: