diff options
| -rw-r--r-- | mrblib/file.rb | 61 | ||||
| -rw-r--r-- | test/file.rb | 2 |
2 files changed, 39 insertions, 24 deletions
diff --git a/mrblib/file.rb b/mrblib/file.rb index 86074c3e3..f84bd0ed3 100644 --- a/mrblib/file.rb +++ b/mrblib/file.rb @@ -19,34 +19,47 @@ class File < IO end def self.join(*names) - if names.size == 0 - "" - elsif names.size == 1 - names[0] - else - if names[0][-1] == File::SEPARATOR - s = names[0][0..-2] - else - s = names[0].dup - end - (1..names.size-2).each { |i| - t = names[i] - if t[0] == File::SEPARATOR and t[-1] == File::SEPARATOR - t = t[1..-2] - elsif t[0] == File::SEPARATOR - t = t[1..-1] - elsif t[-1] == File::SEPARATOR - t = t[0..-2] + return "" if names.empty? + + names.map! do |name| + case name + when String + name + when Array + if names == name + raise ArgumentError, "recursive array" end - s += File::SEPARATOR + t if t != "" - } - if names[-1][0] == File::SEPARATOR - s += File::SEPARATOR + names[-1][1..-1] + join(*name) else - s += File::SEPARATOR + names[-1] + raise TypeError, "no implicit conversion of #{name.class} into String" end - s end + + return names[0] if names.size == 1 + + if names[0][-1] == File::SEPARATOR + s = names[0][0..-2] + else + s = names[0].dup + end + + (1..names.size-2).each { |i| + t = names[i] + if t[0] == File::SEPARATOR and t[-1] == File::SEPARATOR + t = t[1..-2] + elsif t[0] == File::SEPARATOR + t = t[1..-1] + elsif t[-1] == File::SEPARATOR + t = t[0..-2] + end + s += File::SEPARATOR + t if t != "" + } + if names[-1][0] == File::SEPARATOR + s += File::SEPARATOR + names[-1][1..-1] + else + s += File::SEPARATOR + names[-1] + end + s end def self.expand_path(path, default_dir = '.') diff --git a/test/file.rb b/test/file.rb index 029454ea5..48a6eea9d 100644 --- a/test/file.rb +++ b/test/file.rb @@ -77,6 +77,8 @@ assert('File.join') do assert_equal "/a/b/c", File.join("/a", "b", "c") assert_equal "a/b/c/", File.join("a", "b", "c/") assert_equal "a/b/c", File.join("a/", "/b/", "/c") + assert_equal "a/b/c", File.join(["a", "b", "c"]) + assert_equal "a/b/c", File.join("a", ["b", ["c"]]) end assert('File.realpath') do |
