7824: Updated arv-ls to use CollectionReader's keys() API instead of the old all_file...
authorLucas Di Pentima <lucas@curoverse.com>
Thu, 23 Mar 2017 21:38:41 +0000 (18:38 -0300)
committerLucas Di Pentima <lucas@curoverse.com>
Thu, 23 Mar 2017 21:38:41 +0000 (18:38 -0300)
sdk/python/arvados/commands/ls.py

index a2f2e542754f7e2e44edbd5673cf36d2c5d130af..eded11ae259fdb7aa04b349c74008a9a98e46fc7 100755 (executable)
@@ -3,6 +3,7 @@
 from __future__ import print_function
 
 import argparse
+import collections
 import sys
 
 import arvados
@@ -10,6 +11,8 @@ import arvados.commands._util as arv_cmd
 
 from arvados._version import __version__
 
+FileInfo = collections.namedtuple('FileInfo', ['stream_name', 'name', 'size'])
+
 def parse_args(args):
     parser = argparse.ArgumentParser(
         description='List contents of a manifest',
@@ -26,10 +29,10 @@ def parse_args(args):
     return parser.parse_args(args)
 
 def size_formatter(coll_file):
-    return "{:>10}".format((coll_file.size() + 1023) / 1024)
+    return "{:>10}".format((coll_file.size + 1023) / 1024)
 
 def name_formatter(coll_file):
-    return "{}/{}".format(coll_file.stream_name(), coll_file.name)
+    return "{}/{}".format(coll_file.stream_name, coll_file.name)
 
 def main(args, stdout, stderr, api_client=None):
     args = parse_args(args)
@@ -40,7 +43,6 @@ def main(args, stdout, stderr, api_client=None):
     try:
         cr = arvados.CollectionReader(args.locator, api_client=api_client,
                                       num_retries=args.retries)
-        cr.normalize()
     except (arvados.errors.ArgumentError,
             arvados.errors.NotFoundError) as error:
         print("arv-ls: error fetching collection: {}".format(error),
@@ -52,7 +54,17 @@ def main(args, stdout, stderr, api_client=None):
         formatters.append(size_formatter)
     formatters.append(name_formatter)
 
-    for f in cr.all_files():
+    for f in files_in_collection(cr):
         print(*(info_func(f) for info_func in formatters), file=stdout)
 
     return 0
+
+def files_in_collection(c, stream_name='.'):
+    for i in sorted(c.keys()):
+        if isinstance(c[i], arvados.arvfile.ArvadosFile):
+            yield FileInfo(stream_name=stream_name,
+                           name=i,
+                           size=c[i].size())
+        elif isinstance(c[i], arvados.collection.Subcollection):
+            for f in files_in_collection(c[i], "{}/{}".format(stream_name, i)):
+                yield f