예제 #1
0
def main(sysargs=None):
    # Assign sysargs if not set
    sysargs = sys.argv[1:] if sysargs is None else sysargs

    # Create a top level parser
    parser = argparse.ArgumentParser(
        description="{0} command".format(COMMAND_NAME)
    )

    # Generate a list of verbs available
    verbs = list_verbs(VERBS_ENTRY_POINT)

    # Create the subparsers for each verb and collect the arg preprocessors
    argument_preprocessors, verb_subparsers = create_subparsers(
        parser,
        COMMAND_NAME,
        verbs,
        VERBS_ENTRY_POINT,
        sysargs,
    )

    # Determine the verb, splitting arguments into pre and post verb
    verb, pre_verb_args, post_verb_args = split_arguments_by_verb(sysargs)

    # Short circuit -h and --help
    if '-h' in pre_verb_args or '--help' in pre_verb_args:
        parser.print_help()
        sys.exit(0)

    # Error on no verb provided
    if verb is None:
        print(parser.format_usage())
        sys.exit("Error: No verb provided.")
    # Error on unknown verb provided
    if verb not in verbs:
        print(parser.format_usage())
        sys.exit("Error: Unknown verb '{0}' provided.".format(verb))

    # Short circuit -h and --help for verbs
    if '-h' in post_verb_args or '--help' in post_verb_args:
        verb_subparsers[verb].print_help()
        sys.exit(0)

    # First allow the verb's argument preprocessor to strip any args
    # and return any "extra" information it wants as a dict
    processed_post_verb_args, extras = \
        argument_preprocessors[verb](post_verb_args)
    # Then allow argparse to process the left over post-verb arguments along
    # with the pre-verb arguments and the verb itself
    args = parser.parse_args(pre_verb_args + [verb] + processed_post_verb_args)
    # Extend the argparse result with the extras from the preprocessor
    for key, value in extras.items():
        setattr(args, key, value)

    # Finally call the subparser's main function with the processed args
    # and the extras which the preprocessor may have returned
    sys.exit(args.main(args) or 0)
예제 #2
0
    def test_split_arguments_by_verb(self):
        args = ['--cmd-arg1', 'verb', '--verb-arg1', '--verb-arg2']
        expected = ('verb', ['--cmd-arg1'], ['--verb-arg1', '--verb-arg2'])
        self.assertEqual(verb_pattern.split_arguments_by_verb(args), expected)

        args = ['verb', '--verb-arg1', '--verb-arg2']
        expected = ('verb', [], ['--verb-arg1', '--verb-arg2'])
        self.assertEqual(verb_pattern.split_arguments_by_verb(args), expected)

        args = ['--cmd-arg1', 'verb']
        expected = ('verb', ['--cmd-arg1'], [])
        self.assertEqual(verb_pattern.split_arguments_by_verb(args), expected)

        args = ['verb']
        expected = ('verb', [], [])
        self.assertEqual(verb_pattern.split_arguments_by_verb(args), expected)

        args = ['--cmd-arg1']
        expected = (None, ['--cmd-arg1'], [])
        self.assertEqual(verb_pattern.split_arguments_by_verb(args), expected)
예제 #3
0
    def test_split_arguments_by_verb(self):
        args = ['--cmd-arg1', 'verb', '--verb-arg1', '--verb-arg2']
        expected = ('verb', ['--cmd-arg1'], ['--verb-arg1', '--verb-arg2'])
        self.assertEqual(verb_pattern.split_arguments_by_verb(args), expected)

        args = ['verb', '--verb-arg1', '--verb-arg2']
        expected = ('verb', [], ['--verb-arg1', '--verb-arg2'])
        self.assertEqual(verb_pattern.split_arguments_by_verb(args), expected)

        args = ['--cmd-arg1', 'verb']
        expected = ('verb', ['--cmd-arg1'], [])
        self.assertEqual(verb_pattern.split_arguments_by_verb(args), expected)

        args = ['verb']
        expected = ('verb', [], [])
        self.assertEqual(verb_pattern.split_arguments_by_verb(args), expected)

        args = ['--cmd-arg1']
        expected = (None, ['--cmd-arg1'], [])
        self.assertEqual(verb_pattern.split_arguments_by_verb(args), expected)