feat(cli): add flexible positional day argument
- Add parse_date_arg() to utils.py supporting YYYY-MM-DD, MM-DD, and DD-MM formats with either - or / as separator - Add AmbiguousDateError for two-part dates valid as both MM-DD and DD-MM - Replace --day flag with a positional optional argument (defaults to today) - Remove old _parse_date() helper from cli.py
This commit is contained in:
parent
715e0988dc
commit
267ad5b1b5
5 changed files with 170 additions and 25 deletions
|
|
@ -6,7 +6,7 @@ from datetime import date
|
|||
from .output import print_summary, write_csv
|
||||
from .parser import aggregate_rows, filter_rows_by_date, parse_document
|
||||
from .projects import load_project_map
|
||||
from .utils import format_date
|
||||
from .utils import AmbiguousDateError, format_date, parse_date_arg
|
||||
|
||||
|
||||
def build_parser() -> argparse.ArgumentParser:
|
||||
|
|
@ -44,8 +44,12 @@ def build_parser() -> argparse.ArgumentParser:
|
|||
default=None,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--date",
|
||||
help="Date to use in the output (DD/MM/YY). Defaults to today.",
|
||||
"day",
|
||||
nargs="?",
|
||||
help=(
|
||||
"Day to extract timesheets for. Accepts YYYY-MM-DD, MM-DD, or DD-MM "
|
||||
"(- or / as separator). Defaults to today."
|
||||
),
|
||||
default=None,
|
||||
)
|
||||
parser.add_argument(
|
||||
|
|
@ -76,26 +80,21 @@ def _resolve_token(args: argparse.Namespace) -> str:
|
|||
return token
|
||||
|
||||
|
||||
def _parse_date(date_str: str | None) -> date:
|
||||
"""Parse DD/MM/YY date string, or return today."""
|
||||
if date_str is None:
|
||||
return date.today()
|
||||
try:
|
||||
from datetime import datetime
|
||||
|
||||
return datetime.strptime(date_str, "%d/%m/%y").date()
|
||||
except ValueError:
|
||||
print(
|
||||
f"Error: invalid date format {date_str!r}, expected DD/MM/YY.",
|
||||
file=sys.stderr,
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def main() -> None:
|
||||
args = build_parser().parse_args()
|
||||
|
||||
target_date = _parse_date(args.date)
|
||||
if args.day is None:
|
||||
target_date = date.today()
|
||||
else:
|
||||
try:
|
||||
target_date = parse_date_arg(args.day)
|
||||
except AmbiguousDateError as e:
|
||||
print(f"Error: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
except ValueError as e:
|
||||
print(f"Error: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
date_str = format_date(target_date)
|
||||
|
||||
if args.joplin:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue