Issue #10011 has been updated by Jack Nagel.


At the end of the day, I just want something more friendly than a `NoMethodError` from inside the method, so I won't stand in the way of progress, but...

>1. I didn't want to call Pathname::new if we already had been passed a Pathname (or class that inherits from that) - I think preserving the original subclass is important

I'm not sure how important that is in this case. This method only requires a Pathname so that it can call `cleanpath` on it, after which it is converted into a string. I guess someone may have overridden `cleanpath` in a subclass, but since calling it is just an implementation detail of `relative_path_from` I would argue that there is no expectation it will be called. Or am I missing a different reason?

>2. I wanted an nice exception, related to trying to create the Pathname, raise right at that point, to explain where the user had gone wrong.

I see your point, though I do think TypeError is more appropriate. And it would be consistent with, for example:

```ruby
File.rename "a", Object.new # => TypeError: no implicit conversion of Object into String
```

It seems ArgumentError is usually raised when there is something "wrong" with the argument (there are two examples in the body of `relative_path_from`) and TypeError when the incorrect type is passed.


----------------------------------------
Bug #10011: Passing a string to Pathname#relative_path_from results in NoMethodError
https://bugs.ruby-lang.org/issues/10011#change-47693

* Author: Jack Nagel
* Status: Open
* Priority: Normal
* Assignee: 
* Category: 
* Target version: 
* ruby -v: ruby 2.2.0dev (2014-07-05 trunk 46706) [x86_64-darwin13]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
When a string is passed to Pathname#relative_path_from, a NoMethodError is raised.

```
irb(main):001:0> require "pathname"
=> true
irb(main):002:0> Pathname.new("/usr/bin/cc").relative_path_from Pathname.new("/usr/bin")
=> #<Pathname:cc>
irb(main):003:0> Pathname.new("/usr/bin/cc").relative_path_from("/usr/bin")
NoMethodError: undefined method `cleanpath' for "/usr/bin":String
	from /Users/jacknagel/.rubies/ruby-2.2.0/lib/ruby/2.2.0/pathname.rb:493:in `relative_path_from'
	from (irb):3
	from /Users/jacknagel/.rubies/ruby-2.2.0/bin/irb:11:in `<main>'
```

I think either converting the argument to a Pathname or raising TypeError would be acceptable here.



-- 
https://bugs.ruby-lang.org/