From e1eabe76d75d783655c5e3513b9c6e0ffbfd9b52 Mon Sep 17 00:00:00 2001 From: Radhika Chippada Date: Sat, 18 Apr 2015 22:22:14 -0400 Subject: [PATCH] 5179: update files method to move dir parts to streamname. --- sdk/ruby/lib/arvados/keep.rb | 5 +++++ sdk/ruby/test/sdk_fixtures.rb | 2 ++ sdk/ruby/test/test_keep_manifest.rb | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/sdk/ruby/lib/arvados/keep.rb b/sdk/ruby/lib/arvados/keep.rb index e4f62083b0..a1f418b2b5 100644 --- a/sdk/ruby/lib/arvados/keep.rb +++ b/sdk/ruby/lib/arvados/keep.rb @@ -165,6 +165,11 @@ module Keep if @files.nil? file_sizes = Hash.new(0) each_file_spec do |streamname, _, filesize, filename| + if filename.include?('/') + parts = filename.rpartition('/') + streamname = streamname + parts[1] + parts[0] # ./dir_parts + filename = parts[2] + end file_sizes[[streamname, filename]] += filesize end @files = file_sizes.each_pair.map do |(streamname, filename), size| diff --git a/sdk/ruby/test/sdk_fixtures.rb b/sdk/ruby/test/sdk_fixtures.rb index 52d7377f80..80dfabfdeb 100644 --- a/sdk/ruby/test/sdk_fixtures.rb +++ b/sdk/ruby/test/sdk_fixtures.rb @@ -54,6 +54,8 @@ module SDKFixtures NONNORMALIZED_MANIFEST = ["./dir2 #{random_block} 0:0:z 0:0:y 0:0:x", "./dir1 #{random_block} 0:0:p 0:0:o 0:0:n\n"].join("\n") + MULTILEVEL_MANIFEST_WITH_DIRS_IN_FILENAMES = + [". #{random_block(10)} 0:3:file1 3:3:dir1/file1 6:3:dir1/dir2/file1\n"].join("") ### Non-tree manifests # These manifests follow the spec, but they express a structure that can't diff --git a/sdk/ruby/test/test_keep_manifest.rb b/sdk/ruby/test/test_keep_manifest.rb index f1f1a530ce..18b58ca9a1 100644 --- a/sdk/ruby/test/test_keep_manifest.rb +++ b/sdk/ruby/test/test_keep_manifest.rb @@ -208,4 +208,22 @@ class ManifestTest < Minitest::Test assert !file_name.empty?, "empty file_name in #{name} fixture" end end + + def test_multilevel_collection_with_dirs_in_filenames + manifest = Keep::Manifest.new(MULTILEVEL_MANIFEST_WITH_DIRS_IN_FILENAMES) + + seen = Hash.new { |this, key| this[key] = [] } + + manifest.files.each do |stream, basename, size| + refute(seen[stream].include?(basename), "each_file repeated #{stream}/#{basename}") + assert_equal(3, size, "wrong size for #{stream}/#{basename}") + seen[stream] << basename + end + + assert_equal(%w(. ./dir1 ./dir1/dir2), seen.keys) + + seen.each_pair do |stream, basenames| + assert_equal(%w(file1), basenames.sort, "wrong file list for #{stream}") + end + end end -- 2.39.5