module Grizzled::FileUtil

This module and its submodules contain various file-related utility methods.

Public Instance Methods

make_directory_tree(directory, tree) click to toggle source

Create a file/directory hierarchy. The hash table specifies the entries, using the following rules.

  • A hash entry whose value is another hash table is taken to be a directory and will be recursively created.

  • A hash entry with a String value is a file, whose contents are the string.

  • A hash entry with an Enumerable value is a file, whose contents are the enumerable values, rendered as strings.

  • Anything else is an error.

For instance, this hash:

tree = {"foo" =>
          {"bar"   => {"a" => "File a's contents",
                       "b" => "File b's contents"},
           "baz"   => {"c" => "Blah blah blah"},
           "xyzzy" => "Yadda yadda yadda"}}

results in this directory tree:

foo/
    bar/
        a   # File a's contents
        b   # File a's contents

    baz/
        c   # Blah blah blah

    xyzzy   # Yadda yadda yadda

The keys should be simple file names, with no file separators (i.e., no parent directories).

Parameters:

directory

The starting directory, which is created if it does not exist.

tree

The entry tree, as described above

Returns:

A Dir object for directory, for convenience.

# File lib/grizzled/fileutil.rb, line 98
def make_directory_tree(directory, tree)

  require 'fileutils'

  if File.exists? directory
    if not File.directory? directory
      raise BadDirectoryTreeKey.new("Directory '#{directory}' already " +
                                    "exists and isn't a directory.")
    end
  else
    Dir.mkdir directory
  end

  FileUtils.cd directory do
    tree.each do |entry, contents|
      if entry.include? File::SEPARATOR
        raise BadDirectoryTreeKey.new("File tree key '#{key}' contains " +
                                      "illegal file separator character.");
      end

      # Must test Hash first, because Hash is Enumerable.

      if contents.kind_of? Hash
        # This is a directory
        make_directory_tree(entry, contents)

      elsif contents.kind_of? Enumerable
        File.open(File.join(entry), 'w') do |f|
          contents.each {|thing| f.write(thing.to_s)}
        end

      elsif contents.kind_of? String
        File.open(entry, "w") do |f|
          f.write(contents)
        end
      else
        raise BadDirectoryTreeValue.new(entry, contents)
      end
    end
  end

  return Dir.new(directory)
end