Skip to content
Snippets Groups Projects
Select Git revision
  • 4a184c68f49d56a72c6556e5fc114922dbfaf5e2
  • main default protected
2 results

userspace_comm.c

Blame
  • cli.py 3.69 KiB
    import argparse
    import logging
    from pathlib import Path
    import sys
    
    from rmmd.update import AbortedByUser, UpdateOptions, update
    from rmmd.validate import RmmdValidationError, validate_rmmd
    
    def _add_validate_args(parser: argparse.ArgumentParser):
        parser.add_argument(
            '--schema',
            help='Path to schema file',
            metavar='SCHEMA',
            required=True,
            type=Path)
        parser.add_argument(
            'rmmd',
            help='Path to RMMD file to validate',
            metavar='RMMD',
            type=Path)
        
    
    def _add_update_args(parser: argparse.ArgumentParser):
        parser.add_argument(
            'source',
            help='File to take data from',
            metavar='SOURCE',
            type=Path)
        parser.add_argument(
            'target',
            help='File to update (will be overwritten!)',
            metavar='TARGET',
            type=Path)
        parser.add_argument(
            '--root',
            help='Root directory of the project. Default: current working directory.',
            metavar='ROOT',
            type=Path,
            default=Path.cwd()
        )
        parser.add_argument(
            '--species',
            help='Path to JSON/YAML file containing species information',
            metavar='SPECIES_FILE',
            type=Path,
            default=None
        )
        ## mutually exclusive group:
        backup_grp = parser.add_mutually_exclusive_group()
        backup_grp.add_argument(
            '--backup',
            help='Create a backup of the target file',
            action='store_true',
            dest='backup',
            default=True
        )
        backup_grp.add_argument(
            '--no-backup',
            help='Do not create a backup of the target file',
            action='store_false',
            dest='backup',
            default=True
        )
        
    def _parent_parser() -> argparse.ArgumentParser:
        parent_parser = argparse.ArgumentParser(add_help=False)
        parent_parser.add_argument(
            '-v', '--verbose',
            help='Enable verbose logging',
            action='store_true'
        )
    
        return parent_parser
    
    def main():
        logger = logging.getLogger()
        logger.setLevel(logging.INFO)
        formatter = logging.Formatter('%(message)s')
        # use sdtout as logging.INFO is used as standard output for user
        handler = logging.StreamHandler(stream=sys.stdout)
        handler.setFormatter(formatter)
        logger.addHandler(handler)
    
        parent = _parent_parser()   # contains arguments that should always be there
        parser = argparse.ArgumentParser(parents=[parent])
        subparsers = parser.add_subparsers(dest='_cmd_')
    
        validate_parser = subparsers.add_parser('validate', parents= [parent])
        _add_validate_args(validate_parser)
    
        update_parser = subparsers.add_parser('update', parents= [parent])
        _add_update_args(update_parser)
    
        args = parser.parse_args()
    
        if args.verbose:
            logger.setLevel(logging.DEBUG)
    
    
        if args._cmd_ == 'validate':
            try:
                validate_rmmd(args.rmmd, args.schema)
            except RmmdValidationError as err:
                logging.error(err)
                exit(1)
            except Exception as err:
                logging.error(err)
                logging.debug('An error occurred.', exc_info=err)
                exit(1)
            else:
                logging.info('Validation successful.')
        elif args._cmd_ == 'update':
            try:
                opts = UpdateOptions(
                    root=args.root,
                    species_json=args.species,
                    backup=args.backup
                )
                update(args.source, args.target, opts)
            except AbortedByUser as err:
                logging.info(err)
                exit(0)
            except Exception as err:
                logging.error(err)
                logging.debug('An error occurred.', exc_info=err)
                exit(1)
        else:
            parser.print_help()
    
    if __name__ == '__main__':
        main()