Source code for hmrc.cli.registry

"""HMRC command line registry"""

from argparse import ArgumentParser, Action
from collections.abc import Mapping
from dataclasses import dataclass, field
from typing import Dict
from pkg_resources import iter_entry_points

__all__ = [
    'HMRC_CLI_COMMAND',
    'CommandRegistry',
    'commands',
    'main',
]


HMRC_CLI_COMMAND = 'hmrc.cli.command'
"""HMRC command line entry point name"""


[docs]@dataclass class CommandRegistry(Mapping): """Command registry""" parser: ArgumentParser """Argument parser for this (sub)command""" subcommands: Dict[str, 'CommandRegistry'] = None """Subcommands of this (sub)command""" subparsers: Action = field(default=None, repr=False) """Argument parser subparsers object (if subcommands exist)""" def __getitem__(self, key): # Create subcommands dictionary and subparsers object, if applicable if self.subcommands is None: self.subcommands = {} self.subparsers = self.parser.add_subparsers( dest='subcommand', title='subcommands', required=True, ) # Create subcommand, if applicable if key not in self.subcommands: subparser = self.subparsers.add_parser(key) self.subcommands[key] = type(self)(subparser) return self.subcommands[key] def __iter__(self): return iter(self.subcommands) def __len__(self): return len(self.subcommands)
[docs] def register(self, group): """Register command entry points""" for entry_point in iter_entry_points(group): subcommand = self for name in entry_point.name.split(): subcommand = subcommand[name] cls = entry_point.load() subcommand.parser.set_defaults(cls=cls) cls.init_parser(subcommand.parser)
[docs] def parse(self, args=None): """Parse arguments""" return self.parser.parse_args(args)
[docs] def command(self, args=None): """Construct command""" args = self.parse(args) return args.cls(args)
commands = CommandRegistry(ArgumentParser()) """Registry of all commands"""
[docs]def main(args=None): """Command line entry point""" command = commands.command(args) output = command() if output is not None: print('\n'.join(output) if isinstance(output, list) else output)
# Register all known commands commands.register(HMRC_CLI_COMMAND) if __name__ == '__main__': main()