Add File::delete and alias File::unlink. Get those, plus FileUtils.rm to work properly with hard links. Closes #8
This commit is contained in:
parent
bdcdc26d49
commit
c00d450662
@ -33,5 +33,13 @@ module FakeFS
|
|||||||
name
|
name
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def delete(node = self)
|
||||||
|
if node == self
|
||||||
|
parent.delete(self)
|
||||||
|
else
|
||||||
|
super(node.name)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -15,6 +15,10 @@ module FakeFS
|
|||||||
links << file unless links.include?(file)
|
links << file unless links.include?(file)
|
||||||
file.inode = self
|
file.inode = self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def unlink(file)
|
||||||
|
links.delete(file)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def initialize(name = nil, parent = nil)
|
def initialize(name = nil, parent = nil)
|
||||||
@ -59,5 +63,10 @@ module FakeFS
|
|||||||
def to_s
|
def to_s
|
||||||
File.join(parent.to_s, name)
|
File.join(parent.to_s, name)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def delete
|
||||||
|
inode.unlink(self)
|
||||||
|
parent.delete(self)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -15,10 +15,14 @@ module FakeFS
|
|||||||
FileSystem.find(target)
|
FileSystem.find(target)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def delete
|
||||||
|
parent.delete(self)
|
||||||
|
end
|
||||||
|
|
||||||
def respond_to?(method)
|
def respond_to?(method)
|
||||||
entry.respond_to?(method)
|
entry.respond_to?(method)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def method_missing(*args, &block)
|
def method_missing(*args, &block)
|
||||||
|
@ -135,6 +135,24 @@ module FakeFS
|
|||||||
0
|
0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.delete(file_name, *additional_file_names)
|
||||||
|
if !exists?(file_name)
|
||||||
|
raise Errno::ENOENT, "No such file or directory - #{file_name}"
|
||||||
|
end
|
||||||
|
|
||||||
|
FileUtils.rm(file_name)
|
||||||
|
|
||||||
|
additional_file_names.each do |file_name|
|
||||||
|
FileUtils.rm(file_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
additional_file_names.size + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
alias_method :unlink, :delete
|
||||||
|
end
|
||||||
|
|
||||||
def self.symlink(source, dest)
|
def self.symlink(source, dest)
|
||||||
FileUtils.ln_s(source, dest)
|
FileUtils.ln_s(source, dest)
|
||||||
end
|
end
|
||||||
|
@ -66,8 +66,8 @@ module FakeFS
|
|||||||
end
|
end
|
||||||
|
|
||||||
def delete(path)
|
def delete(path)
|
||||||
if dir = FileSystem.find(path)
|
if node = FileSystem.find(path)
|
||||||
dir.parent.delete(dir.name)
|
node.delete
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -970,6 +970,96 @@ class FakeFSTest < Test::Unit::TestCase
|
|||||||
assert_equal File::Stat, File.stat("/foo").class
|
assert_equal File::Stat, File.stat("/foo").class
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_can_delete_file_with_delete
|
||||||
|
FileUtils.touch("/foo")
|
||||||
|
|
||||||
|
File.delete("/foo")
|
||||||
|
|
||||||
|
assert !File.exists?("/foo")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_can_delete_multiple_files_with_delete
|
||||||
|
FileUtils.touch("/foo")
|
||||||
|
FileUtils.touch("/bar")
|
||||||
|
|
||||||
|
File.delete("/foo", "/bar")
|
||||||
|
|
||||||
|
assert !File.exists?("/foo")
|
||||||
|
assert !File.exists?("/bar")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_delete_raises_argument_error_with_no_filename_given
|
||||||
|
assert_raises ArgumentError do
|
||||||
|
File.delete
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_delete_returns_number_one_when_given_one_arg
|
||||||
|
FileUtils.touch("/foo")
|
||||||
|
|
||||||
|
assert_equal 1, File.delete("/foo")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_delete_returns_number_two_when_given_two_args
|
||||||
|
FileUtils.touch("/foo")
|
||||||
|
FileUtils.touch("/bar")
|
||||||
|
|
||||||
|
assert_equal 2, File.delete("/foo", "/bar")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_delete_raises_error_when_first_file_does_not_exist
|
||||||
|
assert_raises Errno::ENOENT do
|
||||||
|
File.delete("/foo")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_delete_does_not_raise_error_when_second_file_does_not_exist
|
||||||
|
FileUtils.touch("/foo")
|
||||||
|
|
||||||
|
assert_nothing_raised do
|
||||||
|
File.delete("/foo", "/bar")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_unlink_is_alias_for_delete
|
||||||
|
assert_equal File.method(:unlink), File.method(:delete)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_unlink_removes_only_one_file_content
|
||||||
|
File.open("/foo", "w") { |f| f << "some_content" }
|
||||||
|
File.link("/foo", "/bar")
|
||||||
|
|
||||||
|
File.unlink("/bar")
|
||||||
|
File.read("/foo") == "some_content"
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_link_reports_correct_stat_info_after_unlinking
|
||||||
|
File.open("/foo", "w") { |f| f << "some_content" }
|
||||||
|
File.link("/foo", "/bar")
|
||||||
|
|
||||||
|
File.unlink("/bar")
|
||||||
|
assert_equal 1, File.stat("/foo").nlink
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_delete_works_with_symlink
|
||||||
|
FileUtils.touch("/foo")
|
||||||
|
File.symlink("/foo", "/bar")
|
||||||
|
|
||||||
|
File.unlink("/bar")
|
||||||
|
|
||||||
|
assert File.exists?("/foo")
|
||||||
|
assert !File.exists?("/bar")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_delete_works_with_symlink_source
|
||||||
|
FileUtils.touch("/foo")
|
||||||
|
File.symlink("/foo", "/bar")
|
||||||
|
|
||||||
|
File.unlink("/foo")
|
||||||
|
|
||||||
|
assert !File.exists?("/foo")
|
||||||
|
end
|
||||||
|
|
||||||
def here(fname)
|
def here(fname)
|
||||||
RealFile.expand_path(RealFile.dirname(__FILE__)+'/'+fname)
|
RealFile.expand_path(RealFile.dirname(__FILE__)+'/'+fname)
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user