summaryrefslogtreecommitdiff
path: root/spec/mspec/lib/mspec/helpers/fs.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/mspec/lib/mspec/helpers/fs.rb')
-rw-r--r--spec/mspec/lib/mspec/helpers/fs.rb62
1 files changed, 62 insertions, 0 deletions
diff --git a/spec/mspec/lib/mspec/helpers/fs.rb b/spec/mspec/lib/mspec/helpers/fs.rb
new file mode 100644
index 0000000000..ee33f5fec0
--- /dev/null
+++ b/spec/mspec/lib/mspec/helpers/fs.rb
@@ -0,0 +1,62 @@
+class Object
+ # Copies a file
+ def cp(source, dest)
+ File.open(dest, "w") do |d|
+ File.open(source, "r") do |s|
+ while data = s.read(1024)
+ d.write data
+ end
+ end
+ end
+ end
+
+ # Creates each directory in path that does not exist.
+ def mkdir_p(path)
+ parts = File.expand_path(path).split %r[/|\\]
+ name = parts.shift
+ parts.each do |part|
+ name = File.join name, part
+
+ if File.file? name
+ raise ArgumentError, "path component of #{path} is a file"
+ end
+
+ Dir.mkdir name unless File.directory? name
+ end
+ end
+
+ # Recursively removes all files and directories in +path+
+ # if +path+ is a directory. Removes the file if +path+ is
+ # a file.
+ def rm_r(*paths)
+ paths.each do |path|
+ path = File.expand_path path
+
+ prefix = SPEC_TEMP_DIR
+ unless path[0, prefix.size] == prefix
+ raise ArgumentError, "#{path} is not prefixed by #{prefix}"
+ end
+
+ # File.symlink? needs to be checked first as
+ # File.exist? returns false for dangling symlinks
+ if File.symlink? path
+ File.unlink path
+ elsif File.directory? path
+ Dir.entries(path).each { |x| rm_r "#{path}/#{x}" unless x =~ /^\.\.?$/ }
+ Dir.rmdir path
+ elsif File.exist? path
+ File.delete path
+ end
+ end
+ end
+
+ # Creates a file +name+. Creates the directory for +name+
+ # if it does not exist.
+ def touch(name, mode="w")
+ mkdir_p File.dirname(name)
+
+ File.open(name, mode) do |f|
+ yield f if block_given?
+ end
+ end
+end