Source code for majis.itl.cli

"""ITL CLI module."""

import sys
from argparse import ArgumentParser
from pathlib import Path

from ..misc import read_evf
from .export import save_csv, save_itl, save_xlsm
from .reader import read_itl


[docs] def cli(argv: list | None = None): """ITL command line interface.""" parser = ArgumentParser(description='MAJIS ITL toolbox') parser.add_argument( 'itl', help='Input ITL filename(s). If multiple files are provided ' 'they will be concatenated.', nargs='*', metavar='input.itl', ) parser.add_argument( '-o', '--output', help='Output filename, it could be either ITL, CSV or XLSM. ' 'If none provided, the results will be displayed (only for ITL and CSV).', metavar='output.[itl|csv|xlsm]', default='', ) parser.add_argument( '-f', '--force', action='store_true', help='Overwrite the output file if already exists.', ) parser.add_argument( '-t', '--time-ref', help='Input events time reference(s). ' 'If multiple values are required use an `events.evf` file.', metavar='"YYYY-MM-DDTHH:MM:SS REF_NAME (COUNT = N)"', ) parser.add_argument( '-r', '--relative-to', help='Reference time to be used for relative time output.', metavar='"YYYY-MM-DDTHH:MM:SS REF_NAME (COUNT = N)"', ) parser.add_argument( '--timeline', help='Original timeline to append. ' 'If no explicit `--output` is provided new observations ' 'will be append in this file.', metavar='timeline.xlsm', ) parser.add_argument( '--header', help='ITL custom file header.', metavar='"# my-custom-header"', ) parser.add_argument( '--overlap', action='store_true', help='Allow blocks overlap.', ) parser.add_argument( '--csv', action='store_true', help='Display the ITL as CSV.', ) parser.add_argument( '--csv-sep', help='CSV separator (default: ";")', default=';', metavar='separator', ) args, _ = parser.parse_known_args(argv) refs = read_evf(args.time_ref) events = [read_itl(itl, refs=refs, flat=True) for itl in args.itl] if args.output: if not args.force and Path(args.output).exists(): raise FileExistsError(args.output) if args.output.endswith('.itl'): save_itl( args.output, *events, ref=args.relative_to, header=args.header, overlap=args.overlap, ) elif args.output.endswith('.csv'): save_csv( args.output, *events, ref=args.relative_to, sep=args.csv_sep, overlap=args.overlap, ) elif args.output.endswith('.xlsm'): save_xlsm( args.output, *events, timeline=args.timeline, ca_ref=args.relative_to, overlap=args.overlap, ) else: raise ValueError( 'Only `.itl`|`.csv`|`.xlsm` extension are accepted ' f'(not `{Path(args.output).suffix}`)' ) sys.stdout.write(f'ITL saved in: {args.output}\n') elif args.timeline: save_xlsm( None, *events, timeline=args.timeline, ca_ref=args.relative_to, overlap=args.overlap, ) sys.stdout.write(f'ITL appended to: {args.timeline}\n') elif args.csv: sys.stdout.write( '\n'.join(save_csv(None, *events, sep=args.csv_sep, overlap=args.overlap)) + '\n' ) else: sys.stdout.write( '\n'.join( save_itl( None, *events, ref=args.relative_to, header=args.header, overlap=args.overlap, ) ) + '\n' )