11308: Futurize stage2.
[arvados.git] / sdk / python / arvados / commands / ls.py
1 #!/usr/bin/env python
2
3 from __future__ import print_function
4 from __future__ import division
5
6 from past.utils import old_div
7 import argparse
8 import sys
9
10 import arvados
11 import arvados.commands._util as arv_cmd
12
13 from arvados._version import __version__
14
15 def parse_args(args):
16     parser = argparse.ArgumentParser(
17         description='List contents of a manifest',
18         parents=[arv_cmd.retry_opt])
19
20     parser.add_argument('locator', type=str,
21                         help="""Collection UUID or locator""")
22     parser.add_argument('-s', action='store_true',
23                         help="""List file sizes, in KiB.""")
24     parser.add_argument('--version', action='version',
25                         version="%s %s" % (sys.argv[0], __version__),
26                         help='Print version and exit.')
27
28     return parser.parse_args(args)
29
30 def size_formatter(coll_file):
31     return "{:>10}".format(old_div((coll_file.size() + 1023), 1024))
32
33 def name_formatter(coll_file):
34     return "{}/{}".format(coll_file.stream_name(), coll_file.name)
35
36 def main(args, stdout, stderr, api_client=None):
37     args = parse_args(args)
38
39     if api_client is None:
40         api_client = arvados.api('v1')
41
42     try:
43         cr = arvados.CollectionReader(args.locator, api_client=api_client,
44                                       num_retries=args.retries)
45         cr.normalize()
46     except (arvados.errors.ArgumentError,
47             arvados.errors.NotFoundError) as error:
48         print("arv-ls: error fetching collection: {}".format(error),
49               file=stderr)
50         return 1
51
52     formatters = []
53     if args.s:
54         formatters.append(size_formatter)
55     formatters.append(name_formatter)
56
57     for f in cr.all_files():
58         print(*(info_func(f) for info_func in formatters), file=stdout)
59
60     return 0