Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / one_command.py @ 761e0cbf

History | View | Annotate | Download (3.5 kB)

1
# Copyright 2012-2013 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.command
33

    
34
from logging import getLogger
35

    
36
from kamaki.cli import get_command_group, set_command_params
37
from kamaki.cli import print_subcommands_help, exec_cmd, update_parser_help
38
from kamaki.cli import _groups_help, _load_spec_module
39

    
40

    
41
kloger = getLogger('kamaki')
42

    
43

    
44
def _get_cmd_tree_from_spec(spec, cmd_tree_list):
45
    for tree in cmd_tree_list:
46
        if tree.name == spec:
47
            return tree
48
    return None
49

    
50

    
51
def _get_best_match_from_cmd_tree(cmd_tree, unparsed):
52
    matched = [term for term in unparsed if not term.startswith('-')]
53
    while matched:
54
        try:
55
            return cmd_tree.get_command('_'.join(matched))
56
        except KeyError:
57
            matched = matched[:-1]
58
    return None
59

    
60

    
61
def run(parser, _help):
62
    group = get_command_group(list(parser.unparsed), parser.arguments)
63
    if not group:
64
        parser.parser.print_help()
65
        _groups_help(parser.arguments)
66
        exit(0)
67

    
68
    nonargs = [term for term in parser.unparsed if not term.startswith('-')]
69
    set_command_params(nonargs)
70

    
71
    global _best_match
72
    _best_match = []
73

    
74
    spec_module = _load_spec_module(group, parser.arguments, '_commands')
75

    
76
    cmd_tree = _get_cmd_tree_from_spec(group, spec_module._commands)
77

    
78
    if _best_match:
79
        cmd = cmd_tree.get_command('_'.join(_best_match))
80
    else:
81
        cmd = _get_best_match_from_cmd_tree(cmd_tree, parser.unparsed)
82
        _best_match = cmd.path.split('_')
83
    if cmd is None:
84
        kloger.info(
85
            'Unexpected error: failed to load command (-d for details)')
86
        exit(1)
87

    
88
    update_parser_help(parser, cmd)
89

    
90
    if _help or not cmd.is_command:
91
        parser.parser.print_help()
92
        print_subcommands_help(cmd)
93
        exit(0)
94

    
95
    cls = cmd.get_class()
96
    executable = cls(parser.arguments)
97
    parser.update_arguments(executable.arguments)
98
    #parsed, unparsed = parse_known_args(parser, executable.arguments)
99
    for term in _best_match:
100
            parser.unparsed.remove(term)
101
    exec_cmd(executable, parser.unparsed, parser.parser.print_help)