diff --git a/soypak/cli/parser.py b/soypak/cli/parser.py index ca5fcbc..45d85f5 100644 --- a/soypak/cli/parser.py +++ b/soypak/cli/parser.py @@ -16,13 +16,15 @@ class OverrideHelpFormatter(argparse.RawDescriptionHelpFormatter, argparse.HelpF return super().add_usage(usage, actions, groups, 'Usage: ') -class SoypakParser(argparse.ArgumentParser): +class _SoypakParser(argparse.ArgumentParser): """soypak parsing and translating program arguments given by `sys.argv`. - Class constructs a custom help message display which is shown with arguments `-h|--help` or when an invalid argument - is passed. There is mangling of attributes in in the parent class to provide a modern, simplistic, and coherent help - message display found with other package managers. + Class is to not be directly constructed and initialised. Use `SoypakParser` which implements a singleton pattern and + controls this class. """ + + _action_groups__ = [] + def __init__(self) -> None: self.NAME = module_info.__title__ USAGE = "%(prog)s [options] [arguments]" @@ -56,13 +58,10 @@ class SoypakParser(argparse.ArgumentParser): self.add_argument("command", nargs='?') # overwrite the action group. @Note: this is to give custom positional arguments in the help message but aren't - # actual arguments. They are stored in the "command" attribute (defined above). - # :@TODO: When commands are registered, allow the register to submit info for the action group. This overwrite - # will then be configured using all the register commands. - self._positionals._group_actions = [] - ### argparse._StoreAction(option_strings=[], dest=cmd, help=desc) + # actual arguments. They are stored in the "command" action (defined above). + self._positionals._group_actions = _SoypakParser._action_groups__ - # optional arguments + # optional arguments - stored in the Namespace self.add_argument("--version", action="store_true", help="show the program's version number and exit") @@ -71,4 +70,28 @@ class SoypakParser(argparse.ArgumentParser): # we use `parse_known_args` to allow for splitting of largs/rargs self.namespace, self.rargs = self.parse_known_args() + # return just the command collected and the rargs return (self.namespace.command, self.rargs) + + +class SoypakParser: + """soypak parsing and translating program arguments given by `sys.argv`. + + Class constructs a custom help message display which is shown with arguments `-h|--help` or when an invalid argument + is passed. There is mangling of attributes in in the parent class to provide a modern, simplistic, and coherent help + message display found with other package managers. + """ + # Singleton pattern + __instance__ = None + def __new__(cls) -> _SoypakParser: + if not SoypakParser.__instance__: + SoypakParser.__instance__ = _SoypakParser() + + return SoypakParser.__instance__ + + + @staticmethod + def add_action_command(*, cmd, help): + _SoypakParser._action_groups__.append( + argparse._StoreAction(option_strings=[], dest=cmd, help=help) + )