Completed
Push — master ( 327bd3...378eb3 )
by Carlos Eduardo
11s
created

parse_napp()   B

Complexity

Conditions 2

Size

Total Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 6
Bugs 2 Features 0
Metric Value
cc 2
c 6
b 2
f 0
dl 0
loc 30
rs 8.8571
1
"""kytos - The kytos command line.
2
3
You are at the "napps" command.
4
5
Usage:
6
       kytos napps create
7
       kytos napps upload
8
       kytos napps delete    <napp>...
9
       kytos napps list
10
       kytos napps install   <napp>...
11
       kytos napps uninstall <napp>...
12
       kytos napps enable    (all| <napp>...)
13
       kytos napps disable   (all| <napp>...)
14
       kytos napps search    <pattern>
15
       kytos napps -h | --help
16
17
Options:
18
19
  -h, --help    Show this screen.
20
21
Common napps subcommands:
22
23
  create        Create a bootstrap NApp structure for development.
24
  upload        Upload current NApp to Kytos repository.
25
  delete        Delete NApps from NApps Server.
26
  list          List all NApps installed into your system.
27
  install       Install a local or remote NApp into a controller.
28
  uninstall     Remove a NApp from your controller.
29
  enable        Enable a installed NApp.
30
  disable       Disable a NApp.
31
  search        Search for NApps in NApps Server.
32
33
"""
34
import re
35
import sys
36
37
from docopt import docopt
38
39
from kytos.cli.commands.napps.api import NAppsAPI
40
from kytos.utils.exceptions import KytosException
41
42
43
def parse(argv):
44
    """Parse cli args."""
45
    args = docopt(__doc__, argv=argv)
46
    try:
47
        call(sys.argv[2], args)
48
    except KytosException as e:
49
        print("Error parsing args: {}".format(e))
50
        exit()
51
52
53
def call(subcommand, args):
54
    """Call a subcommand passing the args."""
55
    args['<napp>'] = parse_napps(args['<napp>'])
56
    func = getattr(NAppsAPI, subcommand)
57
    func(args)
58
59
60
def parse_napps(napp_ids):
61
    """Return a list of tuples with username, napp_name and version.
62
63
    napp_ids elements are of the form username/name[:version]
64
    (version is optional). If no version is found, it will be None.
65
66
    If napp_ids is equal to 'all', this string will be returned.
67
68
    Args:
69
        napp_ids (list): NApps from the cli.
70
71
    Return:
72
        list: list of tuples with (username, napp_name, version).
73
74
    Raises:
75
        KytosException: If a NApp has not the form _username/name_.
76
    """
77
    if 'all' in napp_ids:
78
        return 'all'
79
80
    return [parse_napp(napp_id) for napp_id in napp_ids]
81
82
83
def parse_napp(napp_id):
84
    """Convert a napp_id in tuple with username, napp name and version.
85
86
    Args:
87
        napp_id: String with the form 'username/napp[:version]' (version is
88
                  optional). If no version is found, it will be None.
89
90
    Returns:
91
        tuple: A tuple with (username, napp, version)
92
93
    Raises:
94
        KytosException: If a NApp has not the form _username/name_.
95
    """
96
    # `napp_id` regex, composed by two mandatory parts (username, napp_name)
97
    # and one optional (version).
98
    # username and napp_name need to start with a letter, are composed of
99
    # letters, numbers and uderscores and must have at least three characters.
100
    # They are separated by a colon.
101
    # version is optional and can take any format. Is is separated by a hyphen,
102
    # if a version is defined.
103
    regex = r'([a-zA-Z][a-zA-Z0-9_]{2,})/([a-zA-Z][a-zA-Z0-9_]{2,}):?(.+)?'
104
    compiled_regex = re.compile(regex)
105
106
    matched = compiled_regex.fullmatch(napp_id)
107
108
    if not matched:
109
        msg = '"{}" NApp has not the form username/napp_name[:version].'
110
        raise KytosException(msg.format(napp_id))
111
112
    return matched.groups()
113