FileTest.relative?

It seems FileTest lacks a relative? method (and conversely absolute?). I need such a method. I went to write one but found my self not
100% certain about it being cross-platform. I wrote:

module FileTest
module_function

def relative?(path)
  /\A[\/\\]/ !~ File.expand_path(path)
end

end

To put it in English, I expand the path and then simply check for a
leading ‘/’ or ‘’.

I noticed Pathname has a relative? method and I looked at it. It’s
seems a bit bulky:

if File::ALT_SEPARATOR
  SEPARATOR_LIST = "#{Regexp.quote File::ALT_SEPARATOR}

#{Regexp.quote File::SEPARATOR}"
SEPARATOR_PAT = /[#{SEPARATOR_LIST}]/
else
SEPARATOR_LIST = “#{Regexp.quote File::SEPARATOR}”
SEPARATOR_PAT = /#{Regexp.quote File::SEPARATOR}/
end

def relative?
  path = @path
  while r = chop_basename(path)
    path, basename = r
  end
  path == ''
end

def chop_basename(path)
  base = File.basename(path)
  if /\A#{SEPARATOR_PAT}?\z/o =~ base
    return nil
  else
    return path[0, path.rindex(base)], base
  end
end
private :chop_basename

Is all that really necessary? My version may be too simplistic, but
surely there is more concise way to do this?

On Tue, Dec 21, 2010 at 3:35 PM, Intransition [email protected]
wrote:

It seems FileTest lacks a relative? method (and conversely absolute? ). I need such a method. I went to write one but found my self not
100% certain about it being cross-platform. I wrote:

Pathname has both #absolute? and #relative?, as well as some other
nice methods for figuring out what a path means. Maybe look there?

Ben

On Dec 21, 8:35pm, Intransition [email protected] wrote:

end

Is all that really necessary? My version may be too simplistic, but
surely there is more concise way to do this?

Your code is not contemplating drive letters.

On Dec 21, 6:52pm, Luis L. [email protected] wrote:

Your code is not contemplating drive letters.

Good point.

On Wed, 22 Dec 2010 09:06:04 +0900, Intransition wrote:

On Dec 21, 6:52 pm, Luis L. [email protected] wrote:

Your code is not contemplating drive letters.

Good point.

On Windows, a path without a drive letter that only starts in a single
backslash would be relative (becuase it’s relative to the current drive
letter.) A double backslash would be an absolute UNC name.