port python2.x code to python3.x
[tools/itest-core.git] / spm / cli.py
1 import os
2 import functools
3 import argparse
4 import spm
5 from spm import core, __version__
6 from jinja2 import Environment, FileSystemLoader
7 try:
8     from collections import OrderedDict
9 except ImportError:
10     from ordereddict import OrderedDict
11
12
13 def generate_report(data):
14     template_dirs = os.path.join(os.path.dirname(spm.__file__), 'templates')
15     jinja2_env = Environment(loader=FileSystemLoader(template_dirs))
16     template = jinja2_env.get_template('report.html')
17     return template.render(data)
18
19
20 def subparser(func):
21     @functools.wraps(func)
22     def wrapper(parser):
23         splitted = func.__doc__.split('\n')
24         name = func.__name__.split('_')[0]
25         subpar = parser.add_parser(name, help=splitted[0],
26                                    description='\n'.join(splitted[1:]))
27         return func(subpar)
28     return wrapper
29
30
31 @subparser
32 def install_parser(parser):
33     """install package
34     Examples:
35         $ spm install -r http://download.tizen.org/tools/latest-release gbs
36     """
37     parser.add_argument('-r', '--repo', help='repo url')
38     parser.add_argument('pkg', help='package name')
39
40     def handler(args):
41         distro = core.distro
42         distro.uninstall(args.pkg)
43         if args.repo:
44             distro.make_repo('tools', args.repo)
45         print(distro.check_version(args.pkg))
46         distro.clean()
47         distro.refresh()
48         distro.install(args.pkg)
49
50     parser.set_defaults(handler=handler)
51     return parser
52
53
54 @subparser
55 def upgrade_parser(parser):
56     """upgrade package
57     Examples:
58         $ spm upgrade --from repo1 --to repo2 gbs
59     """
60     parser.add_argument('--from', dest='oldrepo', help='upgrade from repo url')
61     parser.add_argument('--to', help='upgrade to repo url')
62     parser.add_argument('pkg', help='package name')
63     parser.add_argument('--html-dir', help='html directory')
64
65     def handler(args):
66         data = {}
67         data['package'] = args.pkg
68         data['type'] = 'upgrade'
69         data['install_repo'] = args.oldrepo
70         data['upgrade_repo'] = args.to
71         data['package_list'] = OrderedDict()
72         distro = core.distro
73         distro.uninstall(args.pkg)
74         if args.to:
75             distro.make_repo('tools', args.to)
76         distro.clean()
77         distro.refresh()
78         distro.install(args.pkg)
79         dependencies = distro.get_package_dependency(args.pkg)
80         if dependencies:
81             for pkg in dependencies:
82                 _, version = distro.check_version(pkg)
83                 data['package_list'][pkg] = {'install': version}
84         distro.uninstall(args.pkg)
85         if args.oldrepo:
86             distro.make_repo('tools', args.oldrepo)
87         distro.clean()
88         distro.refresh()
89         distro.install(args.pkg)
90         if dependencies:
91             for pkg in dependencies:
92                 _, version = distro.check_version(pkg)
93                 data['package_list'][pkg].update(before=version)
94         if args.to:
95             distro.make_repo('tools', args.to)
96         distro.refresh()
97         distro.install(args.pkg)
98         if dependencies:
99             for pkg in dependencies:
100                 _, version = distro.check_version(pkg)
101                 data['package_list'][pkg].update(after=version)
102         if args.html_dir:
103             with open("%s/index.html" % args.html_dir, 'w') as f:
104                 f.write(generate_report(data))
105
106     parser.set_defaults(handler=handler)
107     return parser
108
109
110 @subparser
111 def version_parser(parser):
112     """query package version
113     Example:
114         $ spm version gbs
115     """
116     parser.add_argument('pkg', help='package name')
117
118     def handler(args):
119         distro = core.distro
120         packages = distro.get_package_dependency(args.pkg)
121         if packages:
122             for pkg in packages:
123                 print(distro.check_version(pkg))
124         else:
125             print(distro.check_version(args.pkg))
126
127     parser.set_defaults(handler=handler)
128     return parser
129
130
131 def main():
132     parser = argparse.ArgumentParser(
133         prog='spm',
134         description='Smart package management tool on linux',
135         epilog='Try spm --help for help on specific subcommand')
136     parser.add_argument('-V', '--version',
137                         action='version', version=__version__)
138     subparsers = parser.add_subparsers(title='subcommands')
139     for name, obj in globals().items():
140         if name.endswith('_parser') and callable(obj):
141             obj(subparsers)
142     args = parser.parse_args()
143     args.handler(args)
144
145 if __name__ == '__main__':
146     main()