Path management in ruby

Hi list,

While playing and coding with ruby, I found it often useful to have a better
way to handle paths that in the actual version. I think it would be nice to
have an unified way to manage paths.

$:.class => Array
ENV['PATH'] => String

<code>
class Path < Array
  def initialize(path = nil)
    if path.kind_of? String
      paths = path.split(':')
      paths.each do |p|
        push p
      end
    elsif path.kind_of? Array
      path.each do |p|
        push p
      end
    end
  end

  def find(filename, ext=nil)
    each do |path|
      filepath = File.join(path, filename)
      return filepath if File.exist?( filepath )
      if ext
        filepath = File.join(path, filename + ext)
        return filepath if File.exist?( filepath )
      end
    end
    return nil
  end
  alias :include? find

  # TODO : The join symbol changes between the platforms. Make this dependent
of the platform.
  def to_s
    join(':')
  end

end

p = Path.new($:)
p.include? 'ipaddr.rb'
=> "/usr/lib/ruby/1.8/ipaddr.rb"
</code>

···

--
Cheers,
  zimba.tm

weblog : http://zimba.oree.ch

Have you seen the Pathname and Pathname2 modules? They're part of the standard library. They are also platform independant and give you all the features of File, FileUtils, and more.

-Payton

zimba.tm wrote:

···

Hi list,

While playing and coding with ruby, I found it often useful to have a better way to handle paths that in the actual version. I think it would be nice to have an unified way to manage paths.

$:.class => Array
ENV['PATH'] => String

<code>
class Path < Array
  def initialize(path = nil)
    if path.kind_of? String
      paths = path.split(':')
      paths.each do |p|
        push p
      end
    elsif path.kind_of? Array
      path.each do |p|
        push p
      end
    end
  end

  def find(filename, ext=nil)
    each do |path|
      filepath = File.join(path, filename)
      return filepath if File.exist?( filepath )
      if ext
        filepath = File.join(path, filename + ext)
        return filepath if File.exist?( filepath )
      end
    end
    return nil
  end
  alias :include? find

  # TODO : The join symbol changes between the platforms. Make this dependent of the platform.
  def to_s
    join(':')
  end

end

p = Path.new($:)
p.include? 'ipaddr.rb'
=> "/usr/lib/ruby/1.8/ipaddr.rb"
</code>