From: "Berger, Daniel" Date: 2004-12-08T05:51:11+09:00 Subject: Pathname needs a makeover Hi all, I've taken a look at the Pathname class. In my humble opinion, it needs a makeover. Here are a list of how I think it ought to behave: - A pathname is a string. Therefore, it should be a subclass of String - It should be possible to break a pathname down into component parts and iterate over them. Therefore, it should mixin Enumerable. - It should not implement methods that raise errors if the pathname does not exist. - It should work for both Unix and Win32 style pathnames. - It should make private methods private. Here are the specific problems I have with the current class: - Many methods are implemented manually that could be avoided by subclassing the String class and mixing in the Enumerable module. - The to_a method does not return something useful. - Some methods that I suspect should be private (e.g. cleanpath_aggressive) should be made private. - Some of the methods require that the pathname actually exist. IMHO, since a pathname is just a string, and we don't know (or care) if it exists, we should not implement methods that raise an error if it doesn't exist. Below is an incomplete version of what I had in mind (it still needs realpath, cleanpath, etc), but you should get the drift. What do folks think? Regards, Dan class Pathname < String include Enumerable VERSION = "1.0.0" def initialize(path) @path = path @sep = (File::ALT_SEPARATOR) && (@path =~ /\\/) ? File::ALT_SEPARATOR : File::SEPARATOR end def to_a a = @path.split(@sep) a.delete("") a end # Needed for Enumerable def each yield @path.split(@sep) end # Return '/' if Unix, or the volume name on Widnows def root @path.split(@sep).first.empty? ? @path[0].chr : @path.split(@sep).first end # File::Stat Methods def blockdev? File.blockdev?(@path) end def chardev? File.chardev?(@path) end def directory? File.directory?(@path) end def executable? File.executable?(@path) end def executable_real? File.executable_real?(@path) end def exist? File.exist?(@path) end alias :exists? :exist? def file? File.file?(@path) end def grpowned? File.grpowned?(@path) end def owned? File.owned?(@path) end def pipe? File.pipe?(@path) end def readable? File.readable(@path) end def readable_real? File.readable_real?(@path) end def setgid? File.setgid?(@path) end def setuid? File.setuid?(@path) end def size? File.size?(@path) end def socket? File.socket?(@path) end def sticky? File.sticky?(@path) end def symlink? File.symlink?(@path) end def world_readable? File.world_readable?(@path) end def world_writable? File.world_writable?(@path) end def writable? File.writable?(@path) end def writable_real? File.writable_real?(@path) end def zero? File.zero?(@path) end end