From e5b3a58e1106fe71d781995560f8b197dbaecbca Mon Sep 17 00:00:00 2001 From: Brett Smith Date: Mon, 12 May 2014 17:29:55 -0400 Subject: [PATCH] 2753: Add Workbench Collection#files_tree. --- apps/workbench/app/models/collection.rb | 21 ++++++++++++++++ apps/workbench/test/unit/collection_test.rb | 27 +++++++++++++++++++++ services/api/test/fixtures/collections.yml | 21 ++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/apps/workbench/app/models/collection.rb b/apps/workbench/app/models/collection.rb index 6022d82433..2346a27859 100644 --- a/apps/workbench/app/models/collection.rb +++ b/apps/workbench/app/models/collection.rb @@ -22,6 +22,27 @@ class Collection < ArvadosBase end end + def files_tree + tree = files.group_by { |file_spec| File.split(file_spec.first) } + # Fill in entries for empty directories. + tree.keys.map { |basedir, _| File.split(basedir) }.each do |splitdir| + until tree.include?(splitdir) + tree[splitdir] = [] + splitdir = File.split(splitdir.first) + end + end + dir_to_tree = lambda do |dirname| + # First list subdirectories, with their files inside. + subnodes = tree.keys.select { |bd, td| (bd == dirname) and (td != '.') } + .sort.flat_map do |parts| + [parts + [nil]] + dir_to_tree.call(File.join(parts)) + end + # Then extend that list with files in this directory. + subnodes + tree[File.split(dirname)] + end + dir_to_tree.call('.') + end + def attribute_editable?(attr) false end diff --git a/apps/workbench/test/unit/collection_test.rb b/apps/workbench/test/unit/collection_test.rb index bbfc98350f..512ad47c34 100644 --- a/apps/workbench/test/unit/collection_test.rb +++ b/apps/workbench/test/unit/collection_test.rb @@ -13,4 +13,31 @@ class CollectionTest < ActiveSupport::TestCase assert_equal false, Collection.is_empty_blob_locator?(x) end end + + def get_files_tree(coll_name) + use_token :admin + Collection.find(api_fixture('collections')[coll_name]['uuid']).files_tree + end + + test "easy files_tree" do + files_in = lambda do |dirname| + (1..3).map { |n| [dirname, "file#{n}", 0] } + end + assert_equal([['.', 'dir1', nil], ['./dir1', 'subdir', nil]] + + files_in['./dir1/subdir'] + files_in['./dir1'] + + [['.', 'dir2', nil]] + files_in['./dir2'] + files_in['.'], + get_files_tree('multilevel_collection_1'), + "Collection file tree was malformed") + end + + test "files_tree with files deep in subdirectories" do + # This test makes sure files_tree generates synthetic directory entries. + # The manifest doesn't list directories with no files. + assert_equal([['.', 'dir1', nil], ['./dir1', 'sub1', nil], + ['./dir1/sub1', 'a', 0], ['./dir1/sub1', 'b', 0], + ['.', 'dir2', nil], ['./dir2', 'sub2', nil], + ['./dir2/sub2', 'c', 0], ['./dir2/sub2', 'd', 0]], + get_files_tree('multilevel_collection_2'), + "Collection file tree was malformed") + end end diff --git a/services/api/test/fixtures/collections.yml b/services/api/test/fixtures/collections.yml index ce05d18f0d..26f5f48fde 100644 --- a/services/api/test/fixtures/collections.yml +++ b/services/api/test/fixtures/collections.yml @@ -37,3 +37,24 @@ baz_file: modified_at: 2014-02-03T17:22:54Z updated_at: 2014-02-03T17:22:54Z manifest_text: ". 73feffa4b7f6bb68e44cf984c85f6e88+3 0:3:baz\n" + +multilevel_collection_1: + uuid: 1fd08fc162a5c6413070a8bd0bffc818+150 + owner_uuid: qr1hi-tpzed-000000000000000 + created_at: 2014-02-03T17:22:54Z + modified_by_client_uuid: zzzzz-ozdt8-brczlopd8u8d0jr + modified_by_user_uuid: zzzzz-tpzed-d9tiejq69daie8f + modified_at: 2014-02-03T17:22:54Z + updated_at: 2014-02-03T17:22:54Z + manifest_text: ". 0:0:file1 0:0:file2 0:0:file3\n./dir1 0:0:file1 0:0:file2 0:0:file3\n./dir1/subdir 0:0:file1 0:0:file2 0:0:file3\n./dir2 0:0:file1 0:0:file2 0:0:file3\n" + +multilevel_collection_2: + # All of this collection's files are deep in subdirectories. + uuid: 80cf6dd2cf079dd13f272ec4245cb4a8+48 + owner_uuid: qr1hi-tpzed-000000000000000 + created_at: 2014-02-03T17:22:54Z + modified_by_client_uuid: zzzzz-ozdt8-brczlopd8u8d0jr + modified_by_user_uuid: zzzzz-tpzed-d9tiejq69daie8f + modified_at: 2014-02-03T17:22:54Z + updated_at: 2014-02-03T17:22:54Z + manifest_text: "./dir1/sub1 0:0:a 0:0:b\n./dir2/sub2 0:0:c 0:0:d\n" -- 2.30.2