> -----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