> -----Original Message----- > From: Tanaka Akira [mailto:akr / m17n.org] > Sent: Monday, May 23, 2005 4:53 AM > To: ruby-core / ruby-lang.org > Subject: Re: [ ruby-Patches-1939 ] Pathname, totally revamped > > > In article <200505211934.j4LJYaJt003878 / rubyforge.org>, > noreply / rubyforge.org writes: > > > * The cleanpath method works differently. > > How different? One test in particular stood out when I reimplemented cleanpath: assert_equal('../../d', Pathname.new('a/b/../../../../c/../d').cleanpath.to_s) The current definition of cleanpath says, "Returns clean pathname of +self+ with consecutive slashes and useless dots removed.". For the above test I would have expected "d" as the result. In my implementation, that is what is returned. The other difference is that my implementation removes trailing '/' characters and unnecessary '.' characters. Here's a test from the current implementation: assert_equal('/a/.', Pathname.new('/a/.').cleanpath(true).to_s) My implementation simply returns "/a". > > The 'facade' requirement can be removed and that module can > be inlined > > if you don't like the dependency. It's only about 20 lines of code. > > Is it possible to document the methods defined by facade using RDoc? Yes, I merely removed the rdoc comments for the sake of brevity. If you download the 'facade' package from the RAA you will see the comments in facade.rb. > > # Convert forward slashes to backslashes on Win32 > > path.tr!("/",@sep) if File::ALT_SEPARATOR > > I think it's not Rubyish. > See [ruby-talk:52429]. Ok, I took Mark's suggestion (and changed the reliance on File::ALT_SEPARATOR) and changed that to: @win32 = PLATFORM.match("mswin32") path = path.tr("/",@sep) if @win32 > > # Returns the root directory of the path, or '.' if > there is no root > > # directory. > > # > > # On Unix, this means the '/' character. On Win32 > systems, this can > > # refer to the drive letter, or the server and share > path if the path > > # is a UNC path. > > def root > > dir = "." > > if File::ALT_SEPARATOR > > # We only want the portion up to the first '\0' > > if @@PathStripToRoot.call(self) > 0 > > dir = self.split(0.chr).first > > end > > else > > dir = File.dirname(self) > > while dir != "/" && dir != "." > > dir = File.dirname(dir) > > end > > end > > dir = "." if dir.empty? > > dir > > end > > The root method returns a string (not pathname). Is it intentional? Yes, but if folks think it's better to have it return Pathname.new(dir), that's fine with me. > In article <20050522135045.25083.qmail / web50301.mail.yahoo.com>, > Daniel Berger <djberg96 / yahoo.com> writes: > > > First, "+" works as you would expect. > > Pathname.new("a") + Pathname.new("b") results in > > "a/b". > > If Pathname inherits String, Pathname is-a String. > So some people (in some context) that Pathname.new("a") + > Pathname.new("b") results in "ab" as String. I have explicitly decreed that the behavior of '+' is different. It's documented - people will just have to accept it. Otherwise, we should never override any method in a subclass, because hey, people might not expect different behavior. BTW, if people want "ab" then they can still use "<<", e.g. Pathname.new("a") << Pathname.new("b"). So yes, it's possible to have both behaviors. :) Regards, Dan