I am wondering about the current behavior of Pathname#join, too. Are there any useful use cases for Pathname.new('/a').join('/c', '/b').to_s #=> "/b"
I believe that Pathname#join
acts kinda like cd
in the shell: cd x
is "go deeper to x
level" while cd /x
si "go to the root, then into /x
folder".
I believe it can be useful and desired behavior when working with configs for some authoring systems and devops tools, where you take from config "do 'action' by path 'path'", and config can specify lot of actions relative to app folder (like touch: "tmp/restart.txt"
), but eventually want to specify something to do in relative-from-root folder (like read: "/etc/myapp/settings.ini"
). Without following the specification "/
at the beginning means go to root" it becomes rather ugly.
In other words, this:
# I am just trying to merge pathes explicitly, and receive "unexpected" result:
Pathname.new('foo').merge('/bar')
— might seem "weird", while this:
@app_path = Path.new(__dir__)
# ...
@app_path.join(action.target_path) # when target_path is "/foo/bar", it allows to act outside of base dir
— is desirable (and is NOT achievable if Pathname's
behavior will be changed)
I assume that those finding the behavior less logical think about paths about "just some abstract strings" and Pathname#join
as a fancy way to write Array#join(SYSTEM_PATH_DELIMITER)
. But Pathname
tries to represent "filesystem path object" in a meaningful way, consistent with filesystem's intuitions.